| [!fuzz] skip | |
| [short] skip | |
| env GOCACHE=$WORK/cache | |
| # This test uses -vet=off to suppress vet, as vet's "tests" analyzer would | |
| # otherwise statically report the problems we are trying to observe dynamically. | |
| # Test that running a fuzz target that returns without failing or calling | |
| # f.Fuzz fails and causes a non-zero exit status. | |
| ! go test -vet=off noop_fuzz_test.go | |
| ! stdout ^ok | |
| stdout FAIL | |
| # Test that fuzzing a fuzz target that returns without failing or calling | |
| # f.Fuzz fails and causes a non-zero exit status. | |
| ! go test -vet=off -fuzz=Fuzz -fuzztime=1x noop_fuzz_test.go | |
| ! stdout ^ok | |
| stdout FAIL | |
| # Test that calling f.Error in a fuzz target causes a non-zero exit status. | |
| ! go test -vet=off -fuzz=Fuzz -fuzztime=1x error_fuzz_test.go | |
| ! stdout ^ok | |
| stdout FAIL | |
| # Test that calling f.Fatal in a fuzz target causes a non-zero exit status. | |
| ! go test -vet=off fatal_fuzz_test.go | |
| ! stdout ^ok | |
| stdout FAIL | |
| # Test that successful test exits cleanly. | |
| go test -vet=off success_fuzz_test.go | |
| stdout ^ok | |
| ! stdout FAIL | |
| # Test that successful fuzzing exits cleanly. | |
| go test -vet=off -fuzz=Fuzz -fuzztime=1x success_fuzz_test.go | |
| stdout ok | |
| ! stdout FAIL | |
| # Test that calling f.Fatal while fuzzing causes a non-zero exit status. | |
| ! go test -vet=off -fuzz=Fuzz -fuzztime=1x fatal_fuzz_test.go | |
| ! stdout ^ok | |
| stdout FAIL | |
| # Test error with seed corpus in f.Fuzz | |
| ! go test -vet=off -run Fuzz_error -vet=off fuzz_add_test.go | |
| ! stdout ^ok | |
| stdout FAIL | |
| stdout 'error here' | |
| [short] stop | |
| # Test that calling panic(nil) in a fuzz target causes a non-zero exit status. | |
| ! go test -vet=off panic_fuzz_test.go | |
| ! stdout ^ok | |
| stdout FAIL | |
| # Test that skipped test exits cleanly. | |
| go test -vet=off skipped_fuzz_test.go | |
| stdout ok | |
| ! stdout FAIL | |
| # Test that f.Fatal within f.Fuzz panics | |
| ! go test -vet=off fatal_fuzz_fn_fuzz_test.go | |
| ! stdout ^ok | |
| ! stdout 'fatal here' | |
| stdout FAIL | |
| stdout 'fuzz target' | |
| # Test that f.Error within f.Fuzz panics | |
| ! go test -vet=off error_fuzz_fn_fuzz_test.go | |
| ! stdout ^ok | |
| ! stdout 'error here' | |
| stdout FAIL | |
| stdout 'fuzz target' | |
| # Test that f.Fail within f.Fuzz panics | |
| ! go test -vet=off fail_fuzz_fn_fuzz_test.go | |
| ! stdout ^ok | |
| stdout FAIL | |
| stdout 'fuzz target' | |
| # Test that f.Skip within f.Fuzz panics | |
| ! go test -vet=off skip_fuzz_fn_fuzz_test.go | |
| ! stdout ^ok | |
| ! stdout 'skip here' | |
| stdout FAIL | |
| stdout 'fuzz target' | |
| # Test that f.Skipped within f.Fuzz panics | |
| ! go test -vet=off skipped_fuzz_fn_fuzz_test.go | |
| ! stdout ^ok | |
| ! stdout 'f.Skipped is' | |
| stdout FAIL | |
| stdout 'fuzz target' | |
| stdout 't.Skipped is false' | |
| # Test that runtime.Goexit within the fuzz function is an error. | |
| ! go test -vet=off goexit_fuzz_fn_fuzz_test.go | |
| ! stdout ^ok | |
| stdout FAIL | |
| # Test that a call to f.Fatal after the Fuzz func is executed. | |
| ! go test -vet=off fatal_after_fuzz_func_fuzz_test.go | |
| ! stdout ok | |
| stdout FAIL | |
| # Test that missing *T in f.Fuzz causes a non-zero exit status. | |
| ! go test -vet=off incomplete_fuzz_call_fuzz_test.go | |
| ! stdout ^ok | |
| stdout FAIL | |
| # Test that a panic in the Cleanup func is executed. | |
| ! go test -vet=off cleanup_fuzz_test.go | |
| ! stdout ^ok | |
| stdout FAIL | |
| stdout 'failed some precondition' | |
| # Test success with seed corpus in f.Fuzz | |
| go test -vet=off -run Fuzz_pass -vet=off fuzz_add_test.go | |
| stdout ok | |
| ! stdout FAIL | |
| ! stdout 'off by one error' | |
| # Test fatal with seed corpus in f.Fuzz | |
| ! go test -vet=off -run Fuzz_fatal -vet=off fuzz_add_test.go | |
| ! stdout ^ok | |
| stdout FAIL | |
| stdout 'fatal here' | |
| # Test panic with seed corpus in f.Fuzz | |
| ! go test -vet=off -run Fuzz_panic -vet=off fuzz_add_test.go | |
| ! stdout ^ok | |
| stdout FAIL | |
| stdout 'off by one error' | |
| # Test panic(nil) with seed corpus in f.Fuzz | |
| ! go test -vet=off -run Fuzz_nilPanic -vet=off fuzz_add_test.go | |
| ! stdout ^ok | |
| stdout FAIL | |
| # Test panic with unsupported seed corpus | |
| ! go test -vet=off -run Fuzz_unsupported -vet=off fuzz_add_test.go | |
| ! stdout ^ok | |
| stdout FAIL | |
| # Test panic with different number of args to f.Add | |
| ! go test -vet=off -run Fuzz_addDifferentNumber -vet=off fuzz_add_test.go | |
| ! stdout ^ok | |
| stdout FAIL | |
| # Test panic with different type of args to f.Add | |
| ! go test -vet=off -run Fuzz_addDifferentType -vet=off fuzz_add_test.go | |
| ! stdout ^ok | |
| stdout FAIL | |
| # Test that the wrong type given with f.Add will fail. | |
| ! go test -vet=off -run Fuzz_wrongType -vet=off fuzz_add_test.go | |
| ! stdout ^ok | |
| stdout '\[string int\], want \[\[\]uint8 int8\]' | |
| stdout FAIL | |
| # Test fatal with testdata seed corpus | |
| ! go test -vet=off -run Fuzz_fail corpustesting/fuzz_testdata_corpus_test.go | |
| ! stdout ^ok | |
| stdout FAIL | |
| stdout 'fatal here' | |
| # Test pass with testdata seed corpus | |
| go test -vet=off -run Fuzz_pass corpustesting/fuzz_testdata_corpus_test.go | |
| stdout ok | |
| ! stdout FAIL | |
| ! stdout 'fatal here' | |
| # Test pass with testdata and f.Add seed corpus | |
| go test -vet=off -run Fuzz_passString corpustesting/fuzz_testdata_corpus_test.go | |
| stdout ok | |
| ! stdout FAIL | |
| # Fuzzing pass with testdata and f.Add seed corpus (skip running tests first) | |
| go test -vet=off -run=None -fuzz=Fuzz_passString corpustesting/fuzz_testdata_corpus_test.go -fuzztime=10x | |
| stdout ok | |
| ! stdout FAIL | |
| # Fuzzing pass with testdata and f.Add seed corpus | |
| go test -vet=off -run=Fuzz_passString -fuzz=Fuzz_passString corpustesting/fuzz_testdata_corpus_test.go -fuzztime=10x | |
| stdout ok | |
| ! stdout FAIL | |
| # Test panic with malformed seed corpus | |
| ! go test -vet=off -run Fuzz_fail corpustesting/fuzz_testdata_corpus_test.go | |
| ! stdout ^ok | |
| stdout FAIL | |
| # Test pass with file in other nested testdata directory | |
| go test -vet=off -run Fuzz_inNestedDir corpustesting/fuzz_testdata_corpus_test.go | |
| stdout ok | |
| ! stdout FAIL | |
| ! stdout 'fatal here' | |
| # Test fails with file containing wrong type | |
| ! go test -vet=off -run Fuzz_wrongType corpustesting/fuzz_testdata_corpus_test.go | |
| ! stdout ^ok | |
| stdout FAIL | |
| -- noop_fuzz_test.go -- | |
| package noop_fuzz | |
| import "testing" | |
| func Fuzz(f *testing.F) {} | |
| -- error_fuzz_test.go -- | |
| package error_fuzz | |
| import "testing" | |
| func Fuzz(f *testing.F) { | |
| f.Error("error in target") | |
| } | |
| -- fatal_fuzz_test.go -- | |
| package fatal_fuzz | |
| import "testing" | |
| func Fuzz(f *testing.F) { | |
| f.Fatal("fatal in target") | |
| } | |
| -- panic_fuzz_test.go -- | |
| package panic_fuzz | |
| import "testing" | |
| func Fuzz_panic(f *testing.F) { | |
| panic(nil) | |
| } | |
| -- success_fuzz_test.go -- | |
| package success_fuzz | |
| import "testing" | |
| func Fuzz(f *testing.F) { | |
| f.Fuzz(func (*testing.T, []byte) {}) | |
| } | |
| -- skipped_fuzz_test.go -- | |
| package skipped_fuzz | |
| import "testing" | |
| func Fuzz(f *testing.F) { | |
| f.Skip() | |
| } | |
| -- fatal_fuzz_fn_fuzz_test.go -- | |
| package fatal_fuzz_fn_fuzz | |
| import "testing" | |
| func Fuzz(f *testing.F) { | |
| f.Add([]byte("aa")) | |
| f.Fuzz(func(t *testing.T, b []byte) { | |
| f.Fatal("fatal here") | |
| }) | |
| } | |
| -- error_fuzz_fn_fuzz_test.go -- | |
| package error_fuzz_fn_fuzz | |
| import "testing" | |
| func Fuzz(f *testing.F) { | |
| f.Add([]byte("aa")) | |
| f.Fuzz(func(t *testing.T, b []byte) { | |
| f.Error("error here") | |
| }) | |
| } | |
| -- fail_fuzz_fn_fuzz_test.go -- | |
| package skip_fuzz_fn_fuzz | |
| import "testing" | |
| func Fuzz(f *testing.F) { | |
| f.Add([]byte("aa")) | |
| f.Fuzz(func(t *testing.T, b []byte) { | |
| f.Fail() | |
| }) | |
| } | |
| -- skip_fuzz_fn_fuzz_test.go -- | |
| package skip_fuzz_fn_fuzz | |
| import "testing" | |
| func Fuzz(f *testing.F) { | |
| f.Add([]byte("aa")) | |
| f.Fuzz(func(t *testing.T, b []byte) { | |
| f.Skip("skip here") | |
| }) | |
| } | |
| -- skipped_fuzz_fn_fuzz_test.go -- | |
| package skipped_fuzz_fn_fuzz | |
| import "testing" | |
| func Fuzz(f *testing.F) { | |
| f.Add([]byte("aa")) | |
| f.Fuzz(func(t *testing.T, b []byte) { | |
| t.Logf("t.Skipped is %t\n", t.Skipped()) | |
| t.Logf("f.Skipped is %t\n", f.Skipped()) | |
| }) | |
| } | |
| -- goexit_fuzz_fn_fuzz_test.go -- | |
| package goexit_fuzz_fn_fuzz | |
| import "testing" | |
| func Fuzz(f *testing.F) { | |
| f.Add([]byte("aa")) | |
| f.Fuzz(func(t *testing.T, b []byte) { | |
| runtime.Goexit() | |
| }) | |
| } | |
| -- fatal_after_fuzz_func_fuzz_test.go -- | |
| package fatal_after_fuzz_func_fuzz | |
| import "testing" | |
| func Fuzz(f *testing.F) { | |
| f.Fuzz(func(t *testing.T, b []byte) { | |
| // no-op | |
| }) | |
| f.Fatal("this shouldn't be called") | |
| } | |
| -- incomplete_fuzz_call_fuzz_test.go -- | |
| package incomplete_fuzz_call_fuzz | |
| import "testing" | |
| func Fuzz(f *testing.F) { | |
| f.Fuzz(func(b []byte) { | |
| // this is missing *testing.T as the first param, so should panic | |
| }) | |
| } | |
| -- cleanup_fuzz_test.go -- | |
| package cleanup_fuzz_test | |
| import "testing" | |
| func Fuzz(f *testing.F) { | |
| f.Cleanup(func() { | |
| panic("failed some precondition") | |
| }) | |
| f.Fuzz(func(t *testing.T, b []byte) { | |
| // no-op | |
| }) | |
| } | |
| -- fuzz_add_test.go -- | |
| package fuzz_add | |
| import "testing" | |
| func add(f *testing.F) { | |
| f.Helper() | |
| f.Add([]byte("123")) | |
| f.Add([]byte("12345")) | |
| f.Add([]byte("")) | |
| } | |
| func Fuzz_pass(f *testing.F) { | |
| add(f) | |
| f.Fuzz(func(t *testing.T, b []byte) { | |
| if len(b) == -1 { | |
| t.Fatal("fatal here") // will not be executed | |
| } | |
| }) | |
| } | |
| func Fuzz_error(f *testing.F) { | |
| add(f) | |
| f.Fuzz(func(t *testing.T, b []byte) { | |
| if len(b) == 3 { | |
| t.Error("error here") | |
| } | |
| }) | |
| } | |
| func Fuzz_fatal(f *testing.F) { | |
| add(f) | |
| f.Fuzz(func(t *testing.T, b []byte) { | |
| if len(b) == 0 { | |
| t.Fatal("fatal here") | |
| } | |
| }) | |
| } | |
| func Fuzz_panic(f *testing.F) { | |
| add(f) | |
| f.Fuzz(func(t *testing.T, b []byte) { | |
| if len(b) == 5 { | |
| panic("off by one error") | |
| } | |
| }) | |
| } | |
| func Fuzz_nilPanic(f *testing.F) { | |
| add(f) | |
| f.Fuzz(func(t *testing.T, b []byte) { | |
| if len(b) == 3 { | |
| panic(nil) | |
| } | |
| }) | |
| } | |
| func Fuzz_unsupported(f *testing.F) { | |
| m := make(map[string]bool) | |
| f.Add(m) | |
| f.Fuzz(func(*testing.T, []byte) {}) | |
| } | |
| func Fuzz_addDifferentNumber(f *testing.F) { | |
| f.Add([]byte("a")) | |
| f.Add([]byte("a"), []byte("b")) | |
| f.Fuzz(func(*testing.T, []byte) {}) | |
| } | |
| func Fuzz_addDifferentType(f *testing.F) { | |
| f.Add(false) | |
| f.Add(1234) | |
| f.Fuzz(func(*testing.T, []byte) {}) | |
| } | |
| func Fuzz_wrongType(f *testing.F) { | |
| f.Add("hello", 50) | |
| f.Fuzz(func(*testing.T, []byte, int8) {}) | |
| } | |
| -- corpustesting/fuzz_testdata_corpus_test.go -- | |
| package fuzz_testdata_corpus | |
| import "testing" | |
| func fuzzFn(f *testing.F) { | |
| f.Helper() | |
| f.Fuzz(func(t *testing.T, b []byte) { | |
| if string(b) == "12345" { | |
| t.Fatal("fatal here") | |
| } | |
| }) | |
| } | |
| func Fuzz_fail(f *testing.F) { | |
| fuzzFn(f) | |
| } | |
| func Fuzz_pass(f *testing.F) { | |
| fuzzFn(f) | |
| } | |
| func Fuzz_passString(f *testing.F) { | |
| f.Add("some seed corpus") | |
| f.Fuzz(func(*testing.T, string) {}) | |
| } | |
| func Fuzz_panic(f *testing.F) { | |
| f.Fuzz(func(t *testing.T, b []byte) {}) | |
| } | |
| func Fuzz_inNestedDir(f *testing.F) { | |
| f.Fuzz(func(t *testing.T, b []byte) {}) | |
| } | |
| func Fuzz_wrongType(f *testing.F) { | |
| f.Fuzz(func(t *testing.T, b []byte) {}) | |
| } | |
| -- corpustesting/testdata/fuzz/Fuzz_fail/1 -- | |
| go test fuzz v1 | |
| []byte("12345") | |
| -- corpustesting/testdata/fuzz/Fuzz_pass/1 -- | |
| go test fuzz v1 | |
| []byte("00000") | |
| -- corpustesting/testdata/fuzz/Fuzz_passString/1 -- | |
| go test fuzz v1 | |
| string("hello") | |
| -- corpustesting/testdata/fuzz/Fuzz_panic/1 -- | |
| malformed | |
| -- corpustesting/testdata/fuzz/Fuzz_inNestedDir/anotherdir/1 -- | |
| go test fuzz v1 | |
| []byte("12345") | |
| -- corpustesting/testdata/fuzz/Fuzz_wrongType/1 -- | |
| go test fuzz v1 | |
| int("00000") | |