@@ -46,6 +46,8 @@ func FuzzMain(f *testing.F) {
46
46
// Used for debug falied fuzz corpus
47
47
func TestCorpus (t * testing.T ) {
48
48
fuzzMain (t , []byte ("[1\x00 " ))
49
+ fuzzMain (t , []byte ("\" \\ uDE1D\\ uDE1D\\ uDEDD\\ uDE1D\\ uDE1D\\ uDE1D\\ uDE1D\\ uDEDD\\ uDE1D\" " ))
50
+ // fuzzMain(t, []byte(`{"":null}`))
49
51
}
50
52
51
53
var target = sonic .ConfigStd
@@ -59,7 +61,7 @@ func fuzzMain(t *testing.T, data []byte) {
59
61
if ! json .Valid (data ) {
60
62
return
61
63
}
62
- for _ , typ := range []func () interface {}{
64
+ for i , typ := range []func () interface {}{
63
65
func () interface {} { return new (interface {}) },
64
66
func () interface {} { return new (map [string ]interface {}) },
65
67
func () interface {} { return new ([]interface {}) },
@@ -70,9 +72,10 @@ func fuzzMain(t *testing.T, data []byte) {
70
72
// func() interface{} { return new(json.Number) },
71
73
// func() interface{} { return new(S) },
72
74
} {
73
- sv , jv := typ (), typ ()
74
- serr := target .Unmarshal ([]byte (data ), sv )
75
- jerr := json .Unmarshal ([]byte (data ), jv )
75
+ var sv = typ ()
76
+ var jv = typ ()
77
+ serr := target .Unmarshal (data , sv )
78
+ jerr := json .Unmarshal (data , jv )
76
79
require .Equal (t , serr != nil , jerr != nil ,
77
80
dump (data , jv , jerr , sv , serr ))
78
81
if jerr != nil {
@@ -87,7 +90,7 @@ func fuzzMain(t *testing.T, data []byte) {
87
90
require .NoError (t , jerr , dump (v , jout , jerr , sout , serr ))
88
91
89
92
{
90
- sv , jv : = typ (), typ ()
93
+ sv , jv = typ (), typ ()
91
94
serr := target .Unmarshal (sout , sv )
92
95
jerr := json .Unmarshal (jout , jv )
93
96
require .Equalf (t , serr != nil , jerr != nil , dump (data , jv , jerr , sv , serr ))
@@ -97,6 +100,20 @@ func fuzzMain(t *testing.T, data []byte) {
97
100
require .Equal (t , sv , jv , dump (data , jv , jerr , sv , serr ))
98
101
}
99
102
103
+ // fuzz ast MarshalJSON API
104
+ if i == 0 {
105
+ root , aerr := sonic .Get (data )
106
+ require .Equal (t , aerr , nil )
107
+ aerr = root .LoadAll ()
108
+ require .Equal (t , aerr , nil , dump (data , jv , jerr , root , aerr ))
109
+ aout , aerr := root .MarshalJSON ()
110
+ require .Equal (t , aerr , nil )
111
+ sv = typ ()
112
+ serr := json .Unmarshal (aout , sv )
113
+ require .Equal (t , serr , nil )
114
+ require .Equal (t , sv , jv , dump (data , jv , jerr , sv , serr ))
115
+ }
116
+
100
117
if m , ok := sv .(* map [string ]interface {}); ok {
101
118
fuzzDynamicStruct (t , jout , * m )
102
119
fuzzASTGetFromObject (t , jout , * m )
0 commit comments