package caesar import ( "bytes" "flag" "io" "io/ioutil" "os" "testing" ) var ( runFuzz bool fuzzInput string ) func TestMain(m *testing.M) { flag.BoolVar(&runFuzz, "fuzz", false, "run the fuzz tests") flag.StringVar(&fuzzInput, "fuzz.input", "", "input file for fuzz test") flag.Parse() os.Exit(m.Run()) } func TestFuzz(t *testing.T) { if !runFuzz { t.Skip("skipping fuzz test") } f, err := os.Open(fuzzInput) if err != nil { t.Fatalf("could not open fuzz input: %v", err) } defer f.Close() data, err := ioutil.ReadAll(f) if err != nil { t.Fatalf("could not read fuzz input: %v", err) } buf := bytes.NewBuffer(data) for { // read input inp, err := buf.ReadBytes('\t') if err == io.EOF { return } else if err != nil { t.Fatalf("read error: %v", err) } // read expected output exp, err := buf.ReadBytes('\n') if err == io.EOF { t.Fatalf("found input with no matching output") } else if err != nil { t.Fatalf("read error: %v", err) } if len(inp) < 2 || len(exp) < 2 { t.Fatalf("malformed input") } result := Encode(string(inp[:len(inp)-2])) if result != string(exp[:len(exp)-2]) { t.Logf("input: %s", inp) t.Logf("output: %s", result) t.Logf("expected: %s", exp) t.Fail() } } Encode(string(data)) }