From 02c936f397c7bb9e1e7ca4e71b548f4deaaa32a1 Mon Sep 17 00:00:00 2001 From: Dmitrii Stepanov Date: Thu, 2 May 2024 17:13:08 +0300 Subject: [PATCH] [#216] netmap: Add policy decode fuzz test Signed-off-by: Dmitrii Stepanov --- go.mod | 1 + go.sum | 6 +++--- netmap/policy_decode_test.go | 26 +++++++++++++------------- netmap/policy_fuzz.go | 14 ++++++++++++++ netmap/policy_fuzz_test.go | 17 +++++++++++++++++ 5 files changed, 48 insertions(+), 16 deletions(-) create mode 100644 netmap/policy_fuzz.go create mode 100644 netmap/policy_fuzz_test.go diff --git a/go.mod b/go.mod index d600ded1..88eaaf05 100644 --- a/go.mod +++ b/go.mod @@ -34,6 +34,7 @@ require ( github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20230615193820-9185820289ce // indirect github.com/nspcc-dev/rfc6979 v0.2.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/rogpeppe/go-internal v1.8.1 // indirect github.com/twmb/murmur3 v1.1.8 // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/goleak v1.2.1 // indirect diff --git a/go.sum b/go.sum index 754d2d7c..f9212b23 100644 --- a/go.sum +++ b/go.sum @@ -31,8 +31,6 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -git.frostfs.info/TrueCloudLab/frostfs-api-go/v2 v2.16.1-0.20240422151450-df9b65324a4c h1:RFDrNsF2e+EJfaB8lZrRRxNjQkLfM09gnEyudvGuc10= -git.frostfs.info/TrueCloudLab/frostfs-api-go/v2 v2.16.1-0.20240422151450-df9b65324a4c/go.mod h1:OBDSr+DqV1z4VDouoX3YMleNc4DPBVBWTG3WDT2PK1o= git.frostfs.info/TrueCloudLab/frostfs-api-go/v2 v2.16.1-0.20240427200446-67c6f305b21f h1:YyjsQNtrngQzIKOUtApXoi5r5pewatM+cXfpY19vZWo= git.frostfs.info/TrueCloudLab/frostfs-api-go/v2 v2.16.1-0.20240427200446-67c6f305b21f/go.mod h1:OBDSr+DqV1z4VDouoX3YMleNc4DPBVBWTG3WDT2PK1o= git.frostfs.info/TrueCloudLab/frostfs-contract v0.0.0-20230307110621-19a8ef2d02fb h1:S/TrbOOu9qEXZRZ9/Ddw7crnxbBUQLo68PSzQWYrc9M= @@ -302,6 +300,7 @@ github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -334,8 +333,9 @@ github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1 github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XFkP+Eg= +github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= diff --git a/netmap/policy_decode_test.go b/netmap/policy_decode_test.go index f42d3b55..536d66b4 100644 --- a/netmap/policy_decode_test.go +++ b/netmap/policy_decode_test.go @@ -7,50 +7,50 @@ import ( "github.com/stretchr/testify/require" ) -func TestDecodeString(t *testing.T) { - testCases := []string{ - `REP 2 +var validPlacementPolicy = []string{ + `REP 2 CBF 2 SELECT 2 FROM *`, - `REP 1 IN X + `REP 1 IN X CBF 1 SELECT 2 IN SAME Location FROM * AS X`, - `REP 1 IN X + `REP 1 IN X REP 2 IN Y CBF 1 SELECT 2 FROM * AS X SELECT 3 FROM * AS Y`, - `REP 1 IN X + `REP 1 IN X SELECT 2 IN City FROM Good AS X FILTER Country EQ RU AS FromRU FILTER Country EQ EN AS FromEN FILTER @FromRU AND @FromEN AND Rating GT 7 AS Good`, - `REP 7 IN SPB + `REP 7 IN SPB SELECT 1 IN City FROM SPBSSD AS SPB FILTER City EQ SPB AND SSD EQ true OR City EQ SPB AND Rating GE 5 AS SPBSSD`, - `REP 7 IN SPB + `REP 7 IN SPB SELECT 1 IN City FROM SPBSSD AS SPB FILTER NOT (NOT (City EQ SPB) AND SSD EQ true OR City EQ SPB AND Rating GE 5) AS SPBSSD`, - `REP 1 IN FNODE + `REP 1 IN FNODE CBF 1 SELECT 1 FROM F AS FNODE FILTER Node EQ '10.78.8.11' AS F`, - `UNIQUE + `UNIQUE REP 1 REP 1`, - `EC 1.2 IN X + `EC 1.2 IN X SELECT 3 IN City FROM * AS X`, - } +} +func TestDecodeString(t *testing.T) { var p PlacementPolicy - for _, testCase := range testCases { + for _, testCase := range validPlacementPolicy { require.NoError(t, p.DecodeString(testCase), "unable parse %s", testCase) var b strings.Builder require.NoError(t, p.WriteStringTo(&b)) diff --git a/netmap/policy_fuzz.go b/netmap/policy_fuzz.go new file mode 100644 index 00000000..40088e95 --- /dev/null +++ b/netmap/policy_fuzz.go @@ -0,0 +1,14 @@ +//go:build gofuzz +// +build gofuzz + +package netmap + +func DoFuzzPlacementPolicyDecode(data []byte) int { + p := string(data) + if p == "" { + return 0 + } + var pp PlacementPolicy + _ = pp.DecodeString(p) + return 1 +} diff --git a/netmap/policy_fuzz_test.go b/netmap/policy_fuzz_test.go new file mode 100644 index 00000000..35b69a46 --- /dev/null +++ b/netmap/policy_fuzz_test.go @@ -0,0 +1,17 @@ +//go:build gofuzz +// +build gofuzz + +package netmap + +import ( + "testing" +) + +func FuzzDecodeString(f *testing.F) { + for _, pp := range validPlacementPolicy { + f.Add([]byte(pp)) + } + f.Fuzz(func(t *testing.T, data []byte) { + DoFuzzPlacementPolicyDecode(data) + }) +}