| # 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) |
| } |
| } |