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