Bladeren bron

Merge pull request #134 from thockin/output_tests

Add a fuzz test for non-JSON input
Tao Wen 8 jaren geleden
bovenliggende
commit
0d604da7d7
1 gewijzigde bestanden met toevoegingen van 72 en 0 verwijderingen
  1. 72 0
      unmarshal_input_test.go

+ 72 - 0
unmarshal_input_test.go

@@ -0,0 +1,72 @@
+package jsoniter
+
+import (
+	"encoding/json"
+	"reflect"
+	"testing"
+
+	fuzz "github.com/google/gofuzz"
+)
+
+func Test_NilInput(t *testing.T) {
+	var jb []byte // nil
+	var out string
+	err := Unmarshal(jb, &out)
+	if err == nil {
+		t.Errorf("Expected error")
+	}
+}
+
+func Test_EmptyInput(t *testing.T) {
+	jb := []byte("")
+	var out string
+	err := Unmarshal(jb, &out)
+	if err == nil {
+		t.Errorf("Expected error")
+	}
+}
+
+func Test_RandomInput_Bytes(t *testing.T) {
+	fz := fuzz.New().NilChance(0)
+	for i := 0; i < 10000; i++ {
+		var jb []byte
+		fz.Fuzz(&jb)
+		testRandomInput(t, jb)
+	}
+}
+
+func Test_RandomInput_String(t *testing.T) {
+	fz := fuzz.New().NilChance(0)
+	for i := 0; i < 10000; i++ {
+		var js string
+		fz.Fuzz(&js)
+		jb := []byte(js)
+		testRandomInput(t, jb)
+	}
+}
+
+func testRandomInput(t *testing.T, jb []byte) {
+	var outString string
+	testRandomInputTo(t, jb, &outString)
+
+	var outInt int
+	testRandomInputTo(t, jb, &outInt)
+
+	var outStruct struct{}
+	testRandomInputTo(t, jb, &outStruct)
+
+	var outSlice []string
+	testRandomInputTo(t, jb, &outSlice)
+}
+
+func testRandomInputTo(t *testing.T, jb []byte, out interface{}) {
+	err := Unmarshal(jb, out)
+	if err == nil {
+		// Cross-check stdlib to see if we just happened to fuzz a legit value.
+		err := json.Unmarshal(jb, out)
+		if err != nil {
+			t.Fatalf("Expected error unmarshaling as %s:\nas string: %q\nas bytes: %v",
+				reflect.TypeOf(out).Elem().Kind(), string(jb), jb)
+		}
+	}
+}