xref: /aosp_15_r20/external/golang-protobuf/internal/fuzztest/fuzztest.go (revision 1c12ee1efe575feb122dbf939ff15148a3b3e8f2)
1*1c12ee1eSDan Willemsen// Copyright 2019 The Go Authors. All rights reserved.
2*1c12ee1eSDan Willemsen// Use of this source code is governed by a BSD-style
3*1c12ee1eSDan Willemsen// license that can be found in the LICENSE file.
4*1c12ee1eSDan Willemsen
5*1c12ee1eSDan Willemsen// Package fuzztest contains a common fuzzer test.
6*1c12ee1eSDan Willemsenpackage fuzztest
7*1c12ee1eSDan Willemsen
8*1c12ee1eSDan Willemsenimport (
9*1c12ee1eSDan Willemsen	"flag"
10*1c12ee1eSDan Willemsen	"io/ioutil"
11*1c12ee1eSDan Willemsen	"os"
12*1c12ee1eSDan Willemsen	"path/filepath"
13*1c12ee1eSDan Willemsen	"sort"
14*1c12ee1eSDan Willemsen	"testing"
15*1c12ee1eSDan Willemsen)
16*1c12ee1eSDan Willemsen
17*1c12ee1eSDan Willemsenvar corpus = flag.String("corpus", "corpus", "directory containing the fuzzer corpus")
18*1c12ee1eSDan Willemsen
19*1c12ee1eSDan Willemsen// Test executes a fuzz function for every entry in the corpus.
20*1c12ee1eSDan Willemsenfunc Test(t *testing.T, fuzz func(b []byte) int) {
21*1c12ee1eSDan Willemsen	dir, err := os.Open(*corpus)
22*1c12ee1eSDan Willemsen	if err != nil {
23*1c12ee1eSDan Willemsen		t.Fatal(err)
24*1c12ee1eSDan Willemsen	}
25*1c12ee1eSDan Willemsen	infos, err := dir.Readdir(0)
26*1c12ee1eSDan Willemsen	if err != nil {
27*1c12ee1eSDan Willemsen		t.Fatal(err)
28*1c12ee1eSDan Willemsen
29*1c12ee1eSDan Willemsen	}
30*1c12ee1eSDan Willemsen	var names []string
31*1c12ee1eSDan Willemsen	for _, info := range infos {
32*1c12ee1eSDan Willemsen		names = append(names, info.Name())
33*1c12ee1eSDan Willemsen	}
34*1c12ee1eSDan Willemsen	sort.Strings(names)
35*1c12ee1eSDan Willemsen	for _, name := range names {
36*1c12ee1eSDan Willemsen		t.Run(name, func(t *testing.T) {
37*1c12ee1eSDan Willemsen			b, err := ioutil.ReadFile(filepath.Join(*corpus, name))
38*1c12ee1eSDan Willemsen			if err != nil {
39*1c12ee1eSDan Willemsen				t.Fatal(err)
40*1c12ee1eSDan Willemsen			}
41*1c12ee1eSDan Willemsen			b = b[:len(b):len(b)] // set cap to len
42*1c12ee1eSDan Willemsen			fuzz(b)
43*1c12ee1eSDan Willemsen		})
44*1c12ee1eSDan Willemsen	}
45*1c12ee1eSDan Willemsen}
46