| [!fuzz-instrumented] skip | |
| [short] skip | |
| env GOCACHE=$WORK/cache | |
| # Fuzz cache should not exist after a regular test run. | |
| go test . | |
| exists $GOCACHE | |
| ! exists $GOCACHE/fuzz | |
| # Fuzzing should write interesting values to the cache. | |
| go test -fuzz=FuzzY -fuzztime=100x . | |
| go run ./contains_files $GOCACHE/fuzz/example.com/y/FuzzY | |
| # 'go clean -cache' should not delete the fuzz cache. | |
| go clean -cache | |
| exists $GOCACHE/fuzz | |
| # 'go clean -fuzzcache' should delete the fuzz cache but not the build cache. | |
| go build -x ./empty | |
| stderr '(compile|gccgo)( |\.exe).*empty.go' | |
| go clean -fuzzcache | |
| ! exists $GOCACHE/fuzz | |
| go build -x ./empty | |
| ! stderr '(compile|gccgo)( |\.exe).*empty.go' | |
| # Fuzzing indicates that one new interesting value was found with an empty | |
| # corpus, and the total size of the cache is now 1. | |
| go clean -fuzzcache | |
| go test -fuzz=FuzzEmpty -fuzztime=10000x . | |
| stdout 'new interesting: 1' | |
| stdout 'total: 1' | |
| # Fuzzing again with a small fuzztime does not find any other interesting | |
| # values but still indicates that the cache size is 1. | |
| go test -fuzz=FuzzEmpty -fuzztime=2x . | |
| stdout 'new interesting: 0' | |
| stdout 'total: 1' | |
| ! go clean -fuzzcache example.com/y | |
| stderr 'go: clean -fuzzcache cannot be used with package arguments' | |
| -- go.mod -- | |
| module example.com/y | |
| go 1.16 | |
| -- y_test.go -- | |
| package y | |
| import ( | |
| "io" | |
| "testing" | |
| ) | |
| func FuzzEmpty(f *testing.F) { | |
| f.Fuzz(func (*testing.T, []byte) {}) | |
| } | |
| func FuzzY(f *testing.F) { | |
| f.Add([]byte("y")) | |
| f.Fuzz(func(t *testing.T, b []byte) { Y(io.Discard, b) }) | |
| } | |
| -- y.go -- | |
| package y | |
| import ( | |
| "bytes" | |
| "io" | |
| ) | |
| func Y(w io.Writer, b []byte) { | |
| if !bytes.Equal(b, []byte("y")) { | |
| w.Write([]byte("not equal")) | |
| } | |
| } | |
| -- empty/empty.go -- | |
| package empty | |
| -- contains_files/contains_files.go -- | |
| package main | |
| import ( | |
| "fmt" | |
| "path/filepath" | |
| "io/ioutil" | |
| "os" | |
| ) | |
| func main() { | |
| infos, err := ioutil.ReadDir(filepath.Clean(os.Args[1])) | |
| if err != nil { | |
| fmt.Fprintln(os.Stderr, err) | |
| os.Exit(1) | |
| } | |
| if len(infos) == 0 { | |
| os.Exit(1) | |
| } | |
| } | |