[!fuzz] skip [short] skip # Cleanup should run after F.Skip. go test -run=FuzzTargetSkip stdout cleanup # Cleanup should run after F.Fatal. ! go test -run=FuzzTargetFatal stdout cleanup # Cleanup should run after an unexpected runtime.Goexit. ! go test -run=FuzzTargetGoexit stdout cleanup # Cleanup should run after panic. ! go test -run=FuzzTargetPanic stdout cleanup # Cleanup should run in fuzz function on seed corpus. go test -v -run=FuzzFunction stdout '(?s)inner.*outer' # TODO(jayconrod): test cleanup while fuzzing. For now, the worker process's # stdout and stderr is connected to the coordinator's, but it should eventually # be connected to os.DevNull, so we wouldn't see t.Log output. -- go.mod -- module cleanup go 1.15 -- cleanup_test.go -- package cleanup import ( "runtime" "testing" ) func FuzzTargetSkip(f *testing.F) { f.Cleanup(func() { f.Log("cleanup") }) f.Skip() } func FuzzTargetFatal(f *testing.F) { f.Cleanup(func() { f.Log("cleanup") }) f.Fatal() } func FuzzTargetGoexit(f *testing.F) { f.Cleanup(func() { f.Log("cleanup") }) runtime.Goexit() } func FuzzTargetPanic(f *testing.F) { f.Cleanup(func() { f.Log("cleanup") }) panic("oh no") } func FuzzFunction(f *testing.F) { f.Add([]byte{0}) f.Cleanup(func() { f.Log("outer") }) f.Fuzz(func(t *testing.T, b []byte) { t.Cleanup(func() { t.Logf("inner") }) }) }