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  }