# TODO(jayconrod): support shared memory on more platforms. [!darwin] [!linux] [!windows] skip [short] skip # There are no seed values, so 'go test' should finish quickly. go test # Fuzzing should exit 0 after fuzztime, even if timeout is short. go test -timeout=10ms -fuzz=FuzzFast -fuzztime=5s # We should see the same behavior when invoking the test binary directly. go test -c exec ./fuzz.test$GOEXE -test.timeout=10ms -test.fuzz=FuzzFast -test.fuzztime=5s -test.parallel=1 -test.fuzzcachedir=$WORK/cache # Timeout should not cause inputs to be written as crashers. ! exists testdata/fuzz # When we use fuzztime with an "x" suffix, it runs a specific number of times. # This fuzz function creates a file with a unique name ($pid.$count) on each run. # We count the files to find the number of runs. mkdir count env GOCACHE=$WORK/tmp go test -fuzz=FuzzCount -fuzztime=1000x -fuzzminimizetime=1x go run check_file_count.go 1000 -- go.mod -- module fuzz go 1.16 -- fuzz_fast_test.go -- package fuzz_test import "testing" func FuzzFast(f *testing.F) { f.Fuzz(func (*testing.T, []byte) {}) } -- fuzz_count_test.go -- package fuzz import ( "fmt" "os" "testing" ) func FuzzCount(f *testing.F) { pid := os.Getpid() n := 0 f.Fuzz(func(t *testing.T, _ []byte) { name := fmt.Sprintf("count/%v.%d", pid, n) if err := os.WriteFile(name, nil, 0666); err != nil { t.Fatal(err) } n++ }) } -- check_file_count.go -- // +build ignore package main import ( "fmt" "os" "strconv" ) func main() { dir, err := os.ReadDir("count") if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } got := len(dir) want, _ := strconv.Atoi(os.Args[1]) if got != want { fmt.Fprintf(os.Stderr, "got %d files; want %d\n", got, want) os.Exit(1) } }