git.frostfs.info/TrueCloudLab/frostfs-sdk-go@v0.0.0-20241022124111-5361f0ecebd3/netmap/policy_decode_test.go (about) 1 package netmap 2 3 import ( 4 "strings" 5 "testing" 6 7 "github.com/stretchr/testify/require" 8 ) 9 10 var validPlacementPolicy = []string{ 11 `REP 2 12 CBF 2 13 SELECT 2 FROM *`, 14 `REP 1 IN X 15 CBF 1 16 SELECT 2 IN SAME Location FROM * AS X`, 17 18 `REP 1 IN X 19 REP 2 IN Y 20 CBF 1 21 SELECT 2 FROM * AS X 22 SELECT 3 FROM * AS Y`, 23 24 `REP 1 IN X 25 SELECT 2 IN City FROM Good AS X 26 FILTER Country EQ RU AS FromRU 27 FILTER Country EQ EN AS FromEN 28 FILTER @FromRU AND @FromEN AND Rating GT 7 AS Good`, 29 30 `REP 7 IN SPB 31 SELECT 1 IN City FROM SPBSSD AS SPB 32 FILTER City EQ SPB AND SSD EQ true OR City EQ SPB AND Rating GE 5 AS SPBSSD`, 33 34 `REP 7 IN SPB 35 SELECT 1 IN City FROM SPBSSD AS SPB 36 FILTER NOT (NOT (City EQ SPB) AND SSD EQ true OR City EQ SPB AND Rating GE 5) AS SPBSSD`, 37 38 `REP 1 IN FNODE 39 CBF 1 40 SELECT 1 FROM F AS FNODE 41 FILTER Node EQ '10.78.8.11' AS F`, 42 43 `UNIQUE 44 REP 1 45 REP 1`, 46 `EC 1.2 IN X 47 SELECT 3 IN City FROM * AS X`, 48 } 49 50 func TestDecodeString(t *testing.T) { 51 var p PlacementPolicy 52 53 for _, testCase := range validPlacementPolicy { 54 require.NoError(t, p.DecodeString(testCase), "unable parse %s", testCase) 55 var b strings.Builder 56 require.NoError(t, p.WriteStringTo(&b)) 57 require.Equal(t, testCase, b.String()) 58 } 59 60 invalidTestCases := map[string]error{ 61 `?REP 1`: errSyntaxError, 62 `REP 1 trailing garbage`: errSyntaxError, 63 `REP 1 REP 1 SELECT 4 FROM *`: errUnnamedSelector, 64 `REP 1 SELECT 4 FROM * SELECT 1 FROM *`: errUnnamedSelector, 65 `REP 1 IN X SELECT 4 FROM *`: errUnknownSelector, 66 `REP 1 IN X REP 2 SELECT 4 FROM * AS X FILTER 'UN-LOCODE' EQ 'RU LED' AS F`: errRedundantFilter, 67 } 68 69 for i := range invalidTestCases { 70 require.ErrorIs(t, p.DecodeString(i), invalidTestCases[i], "#%s", i) 71 } 72 }