]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/csv: add a Fuzz function
authorRomain Baugue <romain.baugue@elwinar.com>
Tue, 30 Apr 2019 13:41:26 +0000 (15:41 +0200)
committerBrad Fitzpatrick <bradfitz@golang.org>
Tue, 30 Apr 2019 15:03:04 +0000 (15:03 +0000)
Adds a sample Fuzz test function to package encoding/csv based on
https://github.com/dvyukov/go-fuzz-corpus/blob/master/csv/main.go

Updates #19109
Updates #31309

Change-Id: Ieb0cb6caa1df72dbb7e29df4bdeed0bfa91187d3
Reviewed-on: https://go-review.googlesource.com/c/go/+/174302
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/encoding/csv/fuzz.go [new file with mode: 0644]

diff --git a/src/encoding/csv/fuzz.go b/src/encoding/csv/fuzz.go
new file mode 100644 (file)
index 0000000..dc33893
--- /dev/null
@@ -0,0 +1,70 @@
+// 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.
+
+// +build gofuzz
+
+package csv
+
+import (
+       "bytes"
+       "fmt"
+       "reflect"
+)
+
+func Fuzz(data []byte) int {
+       score := 0
+       buf := new(bytes.Buffer)
+
+       for _, tt := range []Reader{
+               Reader{},
+               Reader{Comma: ';'},
+               Reader{Comma: '\t'},
+               Reader{LazyQuotes: true},
+               Reader{TrimLeadingSpace: true},
+               Reader{Comment: '#'},
+               Reader{Comment: ';'},
+       } {
+               r := NewReader(bytes.NewReader(data))
+               r.Comma = tt.Comma
+               r.Comment = tt.Comment
+               r.LazyQuotes = tt.LazyQuotes
+               r.TrimLeadingSpace = tt.TrimLeadingSpace
+
+               records, err := r.ReadAll()
+               if err != nil {
+                       continue
+               }
+               score = 1
+
+               buf.Reset()
+               w := NewWriter(buf)
+               w.Comma = tt.Comma
+               err = w.WriteAll(records)
+               if err != nil {
+                       fmt.Printf("writer  = %#v\n", w)
+                       fmt.Printf("records = %v\n", records)
+                       panic(err)
+               }
+
+               r = NewReader(buf)
+               r.Comma = tt.Comma
+               r.Comment = tt.Comment
+               r.LazyQuotes = tt.LazyQuotes
+               r.TrimLeadingSpace = tt.TrimLeadingSpace
+               result, err := r.ReadAll()
+               if err != nil {
+                       fmt.Printf("reader  = %#v\n", r)
+                       fmt.Printf("records = %v\n", records)
+                       panic(err)
+               }
+
+               if !reflect.DeepEqual(records, result) {
+                       fmt.Println("records = \n", records)
+                       fmt.Println("result  = \n", records)
+                       panic("not equal")
+               }
+       }
+
+       return score
+}