| [!fuzz] skip | |
| # Check that if a worker does not call F.Fuzz or calls F.Fail first, | |
| # 'go test' exits non-zero and no crasher is recorded. | |
| [short] skip | |
| env GOCACHE=$WORK/cache | |
| ! go test -fuzz=FuzzReturn | |
| ! exists testdata | |
| ! go test -fuzz=FuzzSkip | |
| ! exists testdata | |
| ! go test -fuzz=FuzzFail | |
| ! exists testdata | |
| ! go test -fuzz=FuzzPanic | |
| ! exists testdata | |
| ! go test -fuzz=FuzzNilPanic | |
| ! exists testdata | |
| ! go test -fuzz=FuzzGoexit | |
| ! exists testdata | |
| ! go test -fuzz=FuzzExit | |
| ! exists testdata | |
| -- go.mod -- | |
| module m | |
| go 1.17 | |
| -- fuzz_fail_test.go -- | |
| package fuzz_fail | |
| import ( | |
| "flag" | |
| "os" | |
| "runtime" | |
| "testing" | |
| ) | |
| func isWorker() bool { | |
| f := flag.Lookup("test.fuzzworker") | |
| if f == nil { | |
| return false | |
| } | |
| get, ok := f.Value.(flag.Getter) | |
| if !ok { | |
| return false | |
| } | |
| return get.Get() == interface{}(true) | |
| } | |
| func FuzzReturn(f *testing.F) { | |
| if isWorker() { | |
| return | |
| } | |
| f.Fuzz(func(*testing.T, []byte) {}) | |
| } | |
| func FuzzSkip(f *testing.F) { | |
| if isWorker() { | |
| f.Skip() | |
| } | |
| f.Fuzz(func(*testing.T, []byte) {}) | |
| } | |
| func FuzzFail(f *testing.F) { | |
| if isWorker() { | |
| f.Fail() | |
| } | |
| f.Fuzz(func(*testing.T, []byte) {}) | |
| } | |
| func FuzzPanic(f *testing.F) { | |
| if isWorker() { | |
| panic("nope") | |
| } | |
| f.Fuzz(func(*testing.T, []byte) {}) | |
| } | |
| func FuzzNilPanic(f *testing.F) { | |
| if isWorker() { | |
| panic(nil) | |
| } | |
| f.Fuzz(func(*testing.T, []byte) {}) | |
| } | |
| func FuzzGoexit(f *testing.F) { | |
| if isWorker() { | |
| runtime.Goexit() | |
| } | |
| f.Fuzz(func(*testing.T, []byte) {}) | |
| } | |
| func FuzzExit(f *testing.F) { | |
| if isWorker() { | |
| os.Exit(99) | |
| } | |
| f.Fuzz(func(*testing.T, []byte) {}) | |
| } | |