forked from TrueCloudLab/neoneo-go
422a80f483
Signed-off-by: Evgeniy Stratonikov <evgeniy@nspcc.ru>
83 lines
1.9 KiB
Go
83 lines
1.9 KiB
Go
package oracle
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestFilter(t *testing.T) {
|
|
js := `{
|
|
"Stores": [ "Lambton Quay", "Willis Street" ],
|
|
"Manufacturers": [
|
|
{
|
|
"Name": "Acme Co",
|
|
"Products": [
|
|
{ "Name": "Anvil", "Price": 50 }
|
|
]
|
|
},
|
|
{
|
|
"Name": "Contoso",
|
|
"Products": [
|
|
{ "Name": "Elbow Grease", "Price": 99.95 },
|
|
{ "Name": "Headlight Fluid", "Price": 4 }
|
|
]
|
|
}
|
|
]
|
|
}`
|
|
|
|
testCases := []struct {
|
|
result, path string
|
|
}{
|
|
{"[]", "$.Name"},
|
|
{`["Acme Co"]`, "$.Manufacturers[0].Name"},
|
|
{`[50]`, "$.Manufacturers[0].Products[0].Price"},
|
|
{`["Elbow Grease"]`, "$.Manufacturers[1].Products[0].Name"},
|
|
{`[{"Name":"Elbow Grease","Price":99.95}]`, "$.Manufacturers[1].Products[0]"},
|
|
}
|
|
|
|
for _, tc := range testCases {
|
|
t.Run(tc.path, func(t *testing.T) {
|
|
actual, err := filter([]byte(js), tc.path)
|
|
require.NoError(t, err)
|
|
require.Equal(t, tc.result, string(actual))
|
|
})
|
|
}
|
|
|
|
t.Run("not an UTF-8", func(t *testing.T) {
|
|
_, err := filter([]byte{0xFF}, "Manufacturers[0].Name")
|
|
require.Error(t, err)
|
|
})
|
|
}
|
|
|
|
func TestFilterOOM(t *testing.T) {
|
|
construct := func(depth, width int) string {
|
|
data := `$`
|
|
for i := 0; i < depth; i++ {
|
|
data = data + `[0`
|
|
for j := 1; j < width; j++ {
|
|
data = data + `,0`
|
|
}
|
|
data = data + `]`
|
|
}
|
|
return data
|
|
}
|
|
t.Run("good", func(t *testing.T) {
|
|
expected := "[" + strings.Repeat("{},", 1023) + "{}]"
|
|
data := construct(2, 32)
|
|
actual, err := filter([]byte("[[{}]]"), data)
|
|
require.NoError(t, err)
|
|
require.JSONEq(t, expected, string(actual))
|
|
})
|
|
t.Run("too big", func(t *testing.T) {
|
|
data := construct(3, 32)
|
|
_, err := filter([]byte("[[[[[[{}]]]]]]"), data)
|
|
require.Error(t, err)
|
|
})
|
|
t.Run("no oom", func(t *testing.T) {
|
|
data := construct(6, 64)
|
|
_, err := filter([]byte("[[[[[[{}]]]]]]"), data)
|
|
require.Error(t, err)
|
|
})
|
|
}
|