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  }