aboutsummaryrefslogtreecommitdiffhomepage
path: root/projects/go-json-iterator/fuzz_json.go
blob: c057a63bf393e7df2bfdb546499447646f2071d4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// Copyright 2015 go-fuzz project authors. All rights reserved.
// Use of this source code is governed by Apache 2 LICENSE.
// Modified from original file https://github.com/dvyukov/go-fuzz-corpus/blob/master/json/json.go

package jsonfuzz

import (
	"encoding/json"
	"fmt"
	jsoniter "github.com/json-iterator/go"
	"reflect"
)

func Fuzz(data []byte) int {
	score := 0
	for _, ctor := range []func() interface{}{
		//func() interface{} { return nil },
		func() interface{} { return new([]interface{}) },
		func() interface{} { m := map[string]string{}; return &m },
		func() interface{} { m := map[string]interface{}{}; return &m },
		func() interface{} { return new(S) },
	} {
		v := ctor()
		if jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal(data, v) != nil {
			continue
		}
		score = 1
		vj := ctor()
		err := json.Unmarshal(data, vj)
		if err != nil {
			panic(err)
		}
		if !reflect.DeepEqual(v, vj) {
			fmt.Printf("v0: %#v\n", v)
			fmt.Printf("v1: %#v\n", vj)
			panic("not equal")
		}

		data1, err := jsoniter.ConfigCompatibleWithStandardLibrary.Marshal(v)
		if err != nil {
			panic(err)
		}
		v1 := ctor()
		if jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal(data1, v1) != nil {
			continue
		}
		if !reflect.DeepEqual(v, v1) {
			fmt.Printf("v0: %#v\n", v)
			fmt.Printf("v1: %#v\n", v1)
			panic("not equal")
		}
	}
	return score
}

type S struct {
	A int    `json:",omitempty"`
	B string `json:"B1,omitempty"`
	C float64
	D bool
	E uint8
	F []byte
	G interface{}
	H map[string]interface{}
	I map[string]string
	J []interface{}
	K []string
	L S1
	M *S1
	N *int
	O **int
	//	P json.RawMessage
	Q Marshaller
	R int `json:"-"`
	S int `json:",string"`
}

type S1 struct {
	A int
	B string
}

type Marshaller struct {
	v string
}

func (m *Marshaller) MarshalJSON() ([]byte, error) {
	return jsoniter.ConfigCompatibleWithStandardLibrary.Marshal(m.v)
}

func (m *Marshaller) UnmarshalJSON(data []byte) error {
	return jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal(data, &m.v)
}