Text file
src/cmd/go/testdata/script/test_fuzz_minimize_dirty_cov.txt
1 # Test that minimization doesn't use dirty coverage snapshots when it
2 # is unable to actually minimize the input. We do this by checking that
3 # an expected value appears in the cache. If a dirty coverage map is used
4 # (i.e. the coverage map generated during the last minimization step,
5 # rather than the map provided with the initial input) then this value
6 # is unlikely to appear in the cache, since the map generated during
7 # the last minimization step should not increase the coverage.
8
9 [short] skip
10 [!fuzz-instrumented] skip
11
12 env GOCACHE=$WORK/gocache
13 go test -fuzz=FuzzCovMin -fuzztime=500000x -test.fuzzcachedir=$GOCACHE/fuzz
14 go run check_file/main.go $GOCACHE/fuzz/FuzzCovMin ab
15
16 -- go.mod --
17 module test
18
19 -- covmin_test.go --
20 package covmin
21
22 import "testing"
23
24 func FuzzCovMin(f *testing.F) {
25 f.Add([]byte("aa"))
26 f.Fuzz(func(t *testing.T, data []byte) {
27 if len(data) == 2 && data[0] == 'a' && data[1] == 'b' {
28 return
29 }
30 })
31 }
32
33 -- check_file/main.go --
34 package main
35
36 import (
37 "bytes"
38 "fmt"
39 "os"
40 "path/filepath"
41 "regexp"
42 "strconv"
43 )
44
45 func checkFile(name, expected string) (bool, error) {
46 data, err := os.ReadFile(name)
47 if err != nil {
48 return false, err
49 }
50 for _, line := range bytes.Split(data, []byte("\n")) {
51 m := valRe.FindSubmatch(line)
52 if m == nil {
53 continue
54 }
55 fmt.Println(strconv.Unquote(string(m[1])))
56 if s, err := strconv.Unquote(string(m[1])); err != nil {
57 return false, err
58 } else if s == expected {
59 return true, nil
60 }
61 }
62 return false, nil
63 }
64
65 var valRe = regexp.MustCompile(`^\[\]byte\(([^)]+)\)$`)
66
67 func main() {
68 dir, expected := os.Args[1], os.Args[2]
69 ents, err := os.ReadDir(dir)
70 if err != nil {
71 fmt.Fprintln(os.Stderr, err)
72 os.Exit(1)
73 }
74 for _, ent := range ents {
75 name := filepath.Join(dir, ent.Name())
76 if good, err := checkFile(name, expected); err != nil {
77 fmt.Fprintln(os.Stderr, err)
78 os.Exit(1)
79 } else if good {
80 os.Exit(0)
81 }
82 }
83 fmt.Fprintln(os.Stderr, "input over minimized")
84 os.Exit(1)
85 }
86
View as plain text