test/fuzz: add test to reproduce found fuzz errors

This commit is contained in:
William Banfield
2021-07-23 12:24:33 -04:00
parent 2abfe20114
commit cbdf0072fc
3 changed files with 56 additions and 4 deletions

View File

@@ -0,0 +1,33 @@
package server_test
import (
"fmt"
"io/ioutil"
"os"
"testing"
"github.com/stretchr/testify/require"
"github.com/tendermint/tendermint/test/fuzz/rpc/jsonrpc/server"
)
const testdataDir = "./testdata"
func TestServerOnTestData(t *testing.T) {
entries, err := os.ReadDir(testdataDir)
require.NoError(t, err)
for _, e := range entries {
entry := e
t.Run(entry.Name(), func(t *testing.T) {
defer func() {
r := recover()
require.Nilf(t, r, "testdata test panic")
}()
f, err := os.Open(fmt.Sprintf("%s/%s", testdataDir, e.Name()))
require.NoError(t, err)
input, err := ioutil.ReadAll(f)
require.NoError(t, err)
server.Fuzz(input)
})
}
}

View File

@@ -1,4 +1,4 @@
package handler
package server
import (
"bytes"
@@ -39,11 +39,29 @@ func Fuzz(data []byte) int {
if err := res.Body.Close(); err != nil {
panic(err)
}
if len(blob) > 0 {
recv := new(types.RPCResponse)
if err := json.Unmarshal(blob, recv); err != nil {
if len(blob) == 0 {
return 1
}
if inputJSONIsSlice(data) {
recv := []types.RPCResponse{}
if err := json.Unmarshal(blob, &recv); err != nil {
panic(err)
}
return 1
}
recv := &types.RPCResponse{}
if err := json.Unmarshal(blob, recv); err != nil {
panic(err)
}
return 1
}
func inputJSONIsSlice(input []byte) bool {
slice := []interface{}{}
err := json.Unmarshal(input, &slice)
if err != nil {
return false
}
return true
}