|  | // 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" | 
|  | "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 := os.ReadFile(filepath.Join(*corpus, name)) | 
|  | if err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  | b = b[:len(b):len(b)] // set cap to len | 
|  | fuzz(b) | 
|  | }) | 
|  | } | 
|  | } |