package testdeps
import (
"bufio"
"context"
"internal/fuzz"
"internal/testlog"
"io"
"os"
"os/signal"
"reflect"
"regexp"
"runtime/pprof"
"strings"
"sync"
"time"
)
type TestDeps struct {}
var matchPat string
var matchRe *regexp .Regexp
func (TestDeps ) MatchString (pat , str string ) (result bool , err error ) {
if matchRe == nil || matchPat != pat {
matchPat = pat
matchRe , err = regexp .Compile (matchPat )
if err != nil {
return
}
}
return matchRe .MatchString (str ), nil
}
func (TestDeps ) StartCPUProfile (w io .Writer ) error {
return pprof .StartCPUProfile (w )
}
func (TestDeps ) StopCPUProfile () {
pprof .StopCPUProfile ()
}
func (TestDeps ) WriteProfileTo (name string , w io .Writer , debug int ) error {
return pprof .Lookup (name ).WriteTo (w , debug )
}
var ImportPath string
func (TestDeps ) ImportPath () string {
return ImportPath
}
type testLog struct {
mu sync .Mutex
w *bufio .Writer
set bool
}
func (l *testLog ) Getenv (key string ) {
l .add ("getenv" , key )
}
func (l *testLog ) Open (name string ) {
l .add ("open" , name )
}
func (l *testLog ) Stat (name string ) {
l .add ("stat" , name )
}
func (l *testLog ) Chdir (name string ) {
l .add ("chdir" , name )
}
func (l *testLog ) add (op , name string ) {
if strings .Contains (name , "\n" ) || name == "" {
return
}
l .mu .Lock ()
defer l .mu .Unlock ()
if l .w == nil {
return
}
l .w .WriteString (op )
l .w .WriteByte (' ' )
l .w .WriteString (name )
l .w .WriteByte ('\n' )
}
var log testLog
func (TestDeps ) StartTestLog (w io .Writer ) {
log .mu .Lock ()
log .w = bufio .NewWriter (w )
if !log .set {
log .set = true
testlog .SetLogger (&log )
log .w .WriteString ("# test log\n" )
}
log .mu .Unlock ()
}
func (TestDeps ) StopTestLog () error {
log .mu .Lock ()
defer log .mu .Unlock ()
err := log .w .Flush ()
log .w = nil
return err
}
func (TestDeps ) SetPanicOnExit0 (v bool ) {
testlog .SetPanicOnExit0 (v )
}
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 ) {
ctx , cancel := signal .NotifyContext (context .Background (), os .Interrupt )
defer cancel ()
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 (fuzz .CorpusEntry ) error ) error {
ctx , cancel := signal .NotifyContext (context .Background (), os .Interrupt )
defer cancel ()
err := fuzz .RunFuzzWorker (ctx , fn )
if err == ctx .Err () {
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 ) SnapshotCoverage () {
fuzz .SnapshotCoverage ()
}
The pages are generated with Golds v0.6.6 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds .