blob: bb88ead106d6e0d8fe6a19f73011ad01edd0f298 [file] [log] [blame] [edit]
[!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")