"io"
"os"
"os/signal"
+ "reflect"
"regexp"
"runtime/pprof"
"strings"
)
// TestDeps is an implementation of the testing.testDeps interface,
-// suitable for passing to testing.MainStart.
+// suitable for passing to [testing.MainStart].
type TestDeps struct{}
var matchPat string
testlog.SetPanicOnExit0(v)
}
-func (TestDeps) CoordinateFuzzing(timeout time.Duration, parallel int, seed []fuzz.CorpusEntry, corpusDir, cacheDir string) error {
+func (TestDeps) CoordinateFuzzing(
+ timeout time.Duration,
+ limit int64,
+ minimizeTimeout time.Duration,
+ minimizeLimit int64,
+ parallel int,
+ seed []fuzz.CorpusEntry,
+ types []reflect.Type,
+ corpusDir,
+ cacheDir string) (err error) {
// Fuzzing may be interrupted with a timeout or if the user presses ^C.
// In either case, we'll stop worker processes gracefully and save
// crashers and interesting values.
- ctx, cancel := context.WithCancel(context.Background())
- if timeout > 0 {
- ctx, cancel = context.WithTimeout(ctx, timeout)
- }
- ctx, stop := signal.NotifyContext(ctx, os.Interrupt)
- defer stop()
+ ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt)
defer cancel()
- err := fuzz.CoordinateFuzzing(ctx, parallel, seed, corpusDir, cacheDir)
+ err = fuzz.CoordinateFuzzing(ctx, fuzz.CoordinateFuzzingOpts{
+ Log: os.Stderr,
+ Timeout: timeout,
+ Limit: limit,
+ MinimizeTimeout: minimizeTimeout,
+ MinimizeLimit: minimizeLimit,
+ Parallel: parallel,
+ Seed: seed,
+ Types: types,
+ CorpusDir: corpusDir,
+ CacheDir: cacheDir,
+ })
if err == ctx.Err() {
return nil
}
return err
}
-func (TestDeps) RunFuzzWorker(fn func([]byte) error) error {
+func (TestDeps) RunFuzzWorker(fn func(fuzz.CorpusEntry) error) error {
// Worker processes may or may not receive a signal when the user presses ^C
// On POSIX operating systems, a signal sent to a process group is delivered
// to all processes in that group. This is not the case on Windows.
// If the worker is interrupted, return quickly and without error.
// If only the coordinator process is interrupted, it tells each worker
// process to stop by closing its "fuzz_in" pipe.
- ctx, cancel := context.WithCancel(context.Background())
- ctx, stop := signal.NotifyContext(ctx, os.Interrupt)
- defer stop()
+ ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt)
defer cancel()
err := fuzz.RunFuzzWorker(ctx, fn)
if err == ctx.Err() {
return nil
}
- return nil
+ return err
+}
+
+func (TestDeps) ReadCorpus(dir string, types []reflect.Type) ([]fuzz.CorpusEntry, error) {
+ return fuzz.ReadCorpus(dir, types)
+}
+
+func (TestDeps) CheckCorpus(vals []any, types []reflect.Type) error {
+ return fuzz.CheckCorpus(vals, types)
+}
+
+func (TestDeps) ResetCoverage() {
+ fuzz.ResetCoverage()
}
-func (TestDeps) ReadCorpus(dir string) ([]fuzz.CorpusEntry, error) {
- return fuzz.ReadCorpus(dir)
+func (TestDeps) SnapshotCoverage() {
+ fuzz.SnapshotCoverage()
}