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) } } }