| // Copyright 2019 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // Package fuzztest contains a common fuzzer test. |
| package fuzztest |
| |
| import ( |
| "flag" |
| "io/ioutil" |
| "os" |
| "path/filepath" |
| "sort" |
| "testing" |
| ) |
| |
| var corpus = flag.String("corpus", "corpus", "directory containing the fuzzer corpus") |
| |
| // Test executes a fuzz function for every entry in the corpus. |
| func Test(t *testing.T, fuzz func(b []byte) int) { |
| dir, err := os.Open(*corpus) |
| if err != nil { |
| t.Fatal(err) |
| } |
| infos, err := dir.Readdir(0) |
| if err != nil { |
| t.Fatal(err) |
| |
| } |
| var names []string |
| for _, info := range infos { |
| names = append(names, info.Name()) |
| } |
| sort.Strings(names) |
| for _, name := range names { |
| t.Run(name, func(t *testing.T) { |
| b, err := ioutil.ReadFile(filepath.Join(*corpus, name)) |
| if err != nil { |
| t.Fatal(err) |
| } |
| b = b[:len(b):len(b)] // set cap to len |
| fuzz(b) |
| }) |
| } |
| } |