Skip to content

Commit

Permalink
more fuzz
Browse files Browse the repository at this point in the history
  • Loading branch information
AsterDY committed Jan 19, 2024
1 parent 83facca commit 7b9ccc3
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 36 deletions.
2 changes: 1 addition & 1 deletion fuzz/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ fuzz:
file2fuzz -o ${corpusdir} ./go-fuzz-corpus/json/corpus/* ./corpus/*

run:
SONIC_FUZZ_MEM_LIMIT=2 GOMAXPROCS=4 GOARCH=amd64 go test -fuzz=${testname} -v -fuzztime 5m
SONIC_FUZZ_MEM_LIMIT=2 GOMAXPROCS=4 GOARCH=amd64 go test -fuzz=${testname} -v -fuzztime 10m

clean:
rm -rf ./go-fuzz-corpus/
Expand Down
21 changes: 15 additions & 6 deletions fuzz/ast_fuzz_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import (
"testing"

"github.com/bytedance/sonic"
"github.com/bytedance/sonic/ast"
"github.com/davecgh/go-spew/spew"
"github.com/stretchr/testify/require"
)
Expand All @@ -50,21 +51,29 @@ func fuzzASTGetFromObject(t *testing.T, v []byte, m map[string]interface{}) {
nn, _ := sonic.GetValueFromString(nj)
nv, err := nn.Interface()
require.NoErrorf(t, err, "error in node set\n%s", msg)
require.Equal(t, m, nv)
require.Equalf(t, m, nv, msg)
}
}

func fuzzASTGetFromArray(t *testing.T, data []byte, a []interface{}) {
func fuzzASTGetFromArray(t *testing.T, v []byte, a []interface{}) {
i := 0
data := string(v)
for ; i < len(a); i++ {
msg := fmt.Sprintf("Data:\n%s\nIndex:\n%d\n", spew.Sdump(data), i)
node, err := sonic.GetValue(data, i)
node, err := sonic.GetValueFromString(data, i)
require.NoErrorf(t, err, "error in ast get index\n%s", msg)
v, err := node.Interface()
require.NoErrorf(t, err, "error in node convert\n%s", msg)
require.Equalf(t, v, a[i], "error in node equal\n%sGot:\n%s\nExp:\n%s\n",
msg, spew.Sdump(v), spew.Sdump(a[i]))
require.Equalf(t, v, a[i], "error in node equal\n%sGot:\n%s\nExp:\n%s\n", msg, spew.Sdump(v), spew.Sdump(a[i]))
next, err := sonic.DeleteFromString(data, i)
require.NoErrorf(t, err, "error in node delete\n%s", msg)
nj := ast.NewValueJSON(next)
err = nj.AddAny(i, v)
require.NoErrorf(t, err, "error in node add\n%s", msg)
nv, err := nj.Interface()
require.NoErrorf(t, err, "error in node set\n%s", msg)
require.Equalf(t, a, nv, msg)
}
_, err := sonic.GetValue(data, i)
_, err := sonic.GetValueFromString(data, i)
require.Errorf(t, err, "no error in ast get out of range\nData:\n%s\n", spew.Sdump(data))
}
58 changes: 29 additions & 29 deletions fuzz/fuzz_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,16 +53,16 @@ func TestCorpus(t *testing.T) {
var target = sonic.ConfigStd

func fuzzMain(t *testing.T, data []byte) {
// fuzzValidate(t, data)
// fuzzHtmlEscape(t, data)
fuzzValidate(t, data)
fuzzHtmlEscape(t, data)
// fuzz ast get api, should not panic here.
fuzzAst(t, data)
// Only fuzz the validate json here.
if !json.Valid(data) {
return
}
// fuzzStream(t, data)
for _, typ := range []func() interface{}{
fuzzStream(t, data)
for i, typ := range []func() interface{}{
func() interface{} { return new(interface{}) },
func() interface{} { return new(map[string]interface{}) },
func() interface{} { return new([]interface{}) },
Expand Down Expand Up @@ -90,33 +90,33 @@ func fuzzMain(t *testing.T, data []byte) {
require.NoError(t, serr, dump(v, jout, jerr, sout, serr))
require.NoError(t, jerr, dump(v, jout, jerr, sout, serr))

// {
// sv, jv = typ(), typ()
// serr := target.Unmarshal(sout, sv)
// jerr := json.Unmarshal(jout, jv)
// require.Equalf(t, serr != nil, jerr != nil, dump(data, jv, jerr, sv, serr))
// if jerr != nil {
// continue
// }
// require.Equal(t, sv, jv, dump(data, jv, jerr, sv, serr))
// }

// // fuzz ast MarshalJSON API
// if i == 0 {
// root, aerr := sonic.Get(data)
// require.Equal(t, aerr, nil)
// aerr = root.LoadAll()
// require.Equal(t, aerr, nil, dump(data, jv, jerr, root, aerr))
// aout, aerr := root.MarshalJSON()
// require.Equal(t, aerr, nil)
// sv = typ()
// serr := json.Unmarshal(aout, sv)
// require.Equal(t, serr, nil)
// require.Equal(t, sv, jv, dump(data, jv, jerr, sv, serr))
// }
{
sv, jv = typ(), typ()
serr := target.Unmarshal(sout, sv)
jerr := json.Unmarshal(jout, jv)
require.Equalf(t, serr != nil, jerr != nil, dump(data, jv, jerr, sv, serr))
if jerr != nil {
continue
}
require.Equal(t, sv, jv, dump(data, jv, jerr, sv, serr))
}

// fuzz ast MarshalJSON API
if i == 0 {
root, aerr := sonic.Get(data)
require.Equal(t, aerr, nil)
aerr = root.LoadAll()
require.Equal(t, aerr, nil, dump(data, jv, jerr, root, aerr))
aout, aerr := root.MarshalJSON()
require.Equal(t, aerr, nil)
sv = typ()
serr := json.Unmarshal(aout, sv)
require.Equal(t, serr, nil)
require.Equal(t, sv, jv, dump(data, jv, jerr, sv, serr))
}

if m, ok := sv.(*map[string]interface{}); ok {
// fuzzDynamicStruct(t, jout, *m)
fuzzDynamicStruct(t, jout, *m)
fuzzASTGetFromObject(t, jout, *m)
}
if a, ok := sv.(*[]interface{}); ok {
Expand Down

0 comments on commit 7b9ccc3

Please sign in to comment.