[short] skip 'links and runs a test binary' [!fuzz] skip 'tests SIGINT behavior for interrupting fuzz tests' [GOOS:windows] skip 'windows does not support os.Interrupt' ? go test -json -fuzz FuzzInterrupt -run '^$' -parallel 1 stdout -count=1 '"Action":"pass","Package":"example","Test":"FuzzInterrupt"' stdout -count=1 '"Action":"pass","Package":"example","Elapsed":' mkdir $WORK/fuzzcache go test -c . -fuzz=. -o example_test.exe ? go tool test2json -p example -t ./example_test.exe -test.v -test.paniconexit0 -test.fuzzcachedir $WORK/fuzzcache -test.fuzz FuzzInterrupt -test.run '^$' -test.parallel 1 stdout -count=1 '"Action":"pass","Package":"example","Test":"FuzzInterrupt"' stdout -count=1 '"Action":"pass","Package":"example","Elapsed":' -- go.mod -- module example go 1.20 -- example_test.go -- package example_test import ( "fmt" "os" "strconv" "testing" "strings" "time" ) func FuzzInterrupt(f *testing.F) { pids := os.Getenv("GO_TEST_INTERRUPT_PIDS") if pids == "" { // This is the main test process. // Set the environment variable for fuzz workers. pid := os.Getpid() ppid := os.Getppid() os.Setenv("GO_TEST_INTERRUPT_PIDS", fmt.Sprintf("%d,%d", ppid, pid)) } sentInterrupt := false f.Fuzz(func(t *testing.T, orig string) { if !sentInterrupt { // Simulate a ctrl-C on the keyboard by sending SIGINT // to the main test process and its parent. for _, pid := range strings.Split(pids, ",") { i, err := strconv.Atoi(pid) if err != nil { t.Fatal(err) } if p, err := os.FindProcess(i); err == nil { p.Signal(os.Interrupt) sentInterrupt = true // Only send interrupts once. } } } time.Sleep(1 * time.Millisecond) // Delay the fuzzer a bit to avoid wasting CPU. }) }