package testdeps
import (
"bufio"
"context"
"internal/fuzz"
"internal/testlog"
"io"
"os"
"os/signal"
"reflect"
"regexp"
"runtime/pprof"
"strings"
"sync"
"time"
)
var Cover bool
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 ()
}
var CoverMode string
var Covered string
var CoverSelectedPackages []string
var (
CoverSnapshotFunc func () float64
CoverProcessTestDirFunc func (dir string , cfile string , cm string , cpkg string , w io .Writer , selpkgs []string ) error
CoverMarkProfileEmittedFunc func (val bool )
)
func (TestDeps ) InitRuntimeCoverage () (mode string , tearDown func (string , string ) (string , error ), snapcov func () float64 ) {
if CoverMode == "" {
return
}
return CoverMode , coverTearDown , CoverSnapshotFunc
}
func coverTearDown(coverprofile string , gocoverdir string ) (string , error ) {
var err error
if gocoverdir == "" {
gocoverdir , err = os .MkdirTemp ("" , "gocoverdir" )
if err != nil {
return "error setting GOCOVERDIR: bad os.MkdirTemp return" , err
}
defer os .RemoveAll (gocoverdir )
}
CoverMarkProfileEmittedFunc (true )
cmode := CoverMode
if err := CoverProcessTestDirFunc (gocoverdir , coverprofile , cmode , Covered , os .Stdout , CoverSelectedPackages ); err != nil {
return "error generating coverage report" , err
}
return "" , nil
}
The pages are generated with Golds v0.7.0-preview . (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 @zigo_101 (reachable from the left QR code) to get the latest news of Golds .