git.frostfs.info/TrueCloudLab/frostfs-sdk-go@v0.0.0-20241022124111-5361f0ecebd3/netmap/filter_test.go (about) 1 package netmap 2 3 import ( 4 "errors" 5 "testing" 6 7 "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/netmap" 8 "github.com/stretchr/testify/require" 9 ) 10 11 func TestContext_ProcessFilters(t *testing.T) { 12 fs := []Filter{ 13 newFilter("StorageSSD", "Storage", "SSD", netmap.EQ), 14 newFilter("GoodRating", "Rating", "4", netmap.GE), 15 newFilter("Main", "", "", netmap.AND, 16 newFilter("StorageSSD", "", "", 0), 17 newFilter("", "IntField", "123", netmap.LT), 18 newFilter("GoodRating", "", "", 0)), 19 } 20 21 c := newContext(NetMap{}) 22 p := newPlacementPolicy(1, nil, nil, fs) 23 require.NoError(t, c.processFilters(p)) 24 require.Equal(t, 3, len(c.processedFilters)) 25 for _, f := range fs { 26 require.Equal(t, f.m, *c.processedFilters[f.m.GetName()]) 27 } 28 29 require.Equal(t, uint64(4), c.numCache[fs[1].m.GetValue()]) 30 require.Equal(t, uint64(123), c.numCache[fs[2].m.GetFilters()[1].GetValue()]) 31 } 32 33 func TestContext_ProcessFiltersInvalid(t *testing.T) { 34 errTestCases := []struct { 35 name string 36 filter Filter 37 err error 38 }{ 39 { 40 "UnnamedTop", 41 newFilter("", "Storage", "SSD", netmap.EQ), 42 errUnnamedTopFilter, 43 }, 44 { 45 "InvalidReference", 46 newFilter("Main", "", "", netmap.AND, 47 newFilter("StorageSSD", "", "", 0)), 48 errFilterNotFound, 49 }, 50 { 51 "NonEmptyKeyed", 52 newFilter("Main", "Storage", "SSD", netmap.EQ, 53 newFilter("StorageSSD", "", "", 0)), 54 errNonEmptyFilters, 55 }, 56 { 57 "InvalidNumber", 58 newFilter("Main", "Rating", "three", netmap.GE), 59 errInvalidNumber, 60 }, 61 { 62 "InvalidOp", 63 newFilter("Main", "Rating", "3", 0), 64 errInvalidFilterOp, 65 }, 66 { 67 "InvalidName", 68 newFilter("*", "Rating", "3", netmap.GE), 69 errInvalidFilterName, 70 }, 71 } 72 for _, tc := range errTestCases { 73 t.Run(tc.name, func(t *testing.T) { 74 c := newContext(NetMap{}) 75 p := newPlacementPolicy(1, nil, nil, []Filter{tc.filter}) 76 err := c.processFilters(p) 77 require.True(t, errors.Is(err, tc.err), "got: %v", err) 78 }) 79 } 80 } 81 82 func TestFilter_MatchSimple_InvalidOp(t *testing.T) { 83 var b NodeInfo 84 b.SetAttribute("Rating", "4") 85 b.SetAttribute("Country", "Germany") 86 87 f := newFilter("Main", "Rating", "5", netmap.EQ) 88 c := newContext(NetMap{}) 89 p := newPlacementPolicy(1, nil, nil, []Filter{f}) 90 require.NoError(t, c.processFilters(p)) 91 92 // just for the coverage 93 f.m.SetOp(0) 94 require.False(t, c.match(&f.m, b)) 95 }