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 # a 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=25s -test.fuzzcachedir=$GOCACHE/fuzz
14 go run check_file/main.go $GOCACHE/fuzz/FuzzCovMin abcd
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.Fuzz(func(t *testing.T, data []byte) {
26 if len(data) >= 4 && data[0] == 'a' && data[1] == 'b' && data[2] == 'c' && data[3] == 'd' {
27 return
28 }
29 })
30 }
31
32 -- check_file/main.go --
33 package main
34
35 import (
36 "bytes"
37 "fmt"
38 "os"
39 "path/filepath"
40 "regexp"
41 "strconv"
42 )
43
44 func checkFile(name, expected string) (bool, error) {
45 data, err := os.ReadFile(name)
46 if err != nil {
47 return false, err
48 }
49 for _, line := range bytes.Split(data, []byte("\n")) {
50 m := valRe.FindSubmatch(line)
51 if m == nil {
52 continue
53 }
54 fmt.Println(strconv.Unquote(string(m[1])))
55 if s, err := strconv.Unquote(string(m[1])); err != nil {
56 return false, err
57 } else if s == expected {
58 return true, nil
59 }
60 }
61 return false, nil
62 }
63
64 var valRe = regexp.MustCompile(`^\[\]byte\(([^)]+)\)$`)
65
66 func main() {
67 dir, expected := os.Args[1], os.Args[2]
68 ents, err := os.ReadDir(dir)
69 if err != nil {
70 fmt.Fprintln(os.Stderr, err)
71 os.Exit(1)
72 }
73 for _, ent := range ents {
74 name := filepath.Join(dir, ent.Name())
75 if good, err := checkFile(name, expected); err != nil {
76 fmt.Fprintln(os.Stderr, err)
77 os.Exit(1)
78 } else if good {
79 os.Exit(0)
80 }
81 }
82 fmt.Fprintln(os.Stderr, "input over minimized")
83 os.Exit(1)
84 }
85
View as plain text