1// Copyright 2021 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package json
6
7import (
8	"bytes"
9	"io"
10	"testing"
11)
12
13func FuzzUnmarshalJSON(f *testing.F) {
14	f.Add([]byte(`{
15"object": {
16	"slice": [
17		1,
18		2.0,
19		"3",
20		[4],
21		{5: {}}
22	]
23},
24"slice": [[]],
25"string": ":)",
26"int": 1e5,
27"float": 3e-9"
28}`))
29
30	f.Fuzz(func(t *testing.T, b []byte) {
31		for _, typ := range []func() interface{}{
32			func() interface{} { return new(interface{}) },
33			func() interface{} { return new(map[string]interface{}) },
34			func() interface{} { return new([]interface{}) },
35		} {
36			i := typ()
37			if err := Unmarshal(b, i); err != nil {
38				return
39			}
40
41			encoded, err := Marshal(i)
42			if err != nil {
43				t.Fatalf("failed to marshal: %s", err)
44			}
45
46			if err := Unmarshal(encoded, i); err != nil {
47				t.Fatalf("failed to roundtrip: %s", err)
48			}
49		}
50	})
51}
52
53func FuzzDecoderToken(f *testing.F) {
54	f.Add([]byte(`{
55"object": {
56	"slice": [
57		1,
58		2.0,
59		"3",
60		[4],
61		{5: {}}
62	]
63},
64"slice": [[]],
65"string": ":)",
66"int": 1e5,
67"float": 3e-9"
68}`))
69
70	f.Fuzz(func(t *testing.T, b []byte) {
71		r := bytes.NewReader(b)
72		d := NewDecoder(r)
73		for {
74			_, err := d.Token()
75			if err != nil {
76				if err == io.EOF {
77					break
78				}
79				return
80			}
81		}
82	})
83}
84