frostfs-sdk-go/netmap/filter_test.go
Airat Arifullin 6281a25556
All checks were successful
/ DCO (pull_request) Successful in 1m17s
/ Lint (pull_request) Successful in 2m7s
/ Tests (1.19) (pull_request) Successful in 5m56s
/ Tests (1.20) (pull_request) Successful in 6m37s
[#100] types: Make sdk types as protobuf wrappers
Signed-off-by: Airat Arifullin a.arifullin@yadro.com
2023-07-12 19:08:37 +03:00

96 lines
2.5 KiB
Go

package netmap
import (
"errors"
"testing"
netmapgrpc "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/netmap/grpc"
"github.com/golang/protobuf/proto"
"github.com/stretchr/testify/require"
)
func TestContext_ProcessFilters(t *testing.T) {
fs := []Filter{
newFilter("StorageSSD", "Storage", "SSD", netmapgrpc.Operation_EQ),
newFilter("GoodRating", "Rating", "4", netmapgrpc.Operation_GE),
newFilter("Main", "", "", netmapgrpc.Operation_AND,
newFilter("StorageSSD", "", "", 0),
newFilter("", "IntField", "123", netmapgrpc.Operation_LT),
newFilter("GoodRating", "", "", 0)),
}
c := newContext(NetMap{})
p := newPlacementPolicy(1, nil, nil, fs)
require.NoError(t, c.processFilters(p))
require.Equal(t, 3, len(c.processedFilters))
for _, f := range fs {
require.True(t, proto.Equal(f.m, c.processedFilters[f.m.GetName()]))
}
require.Equal(t, uint64(4), c.numCache[fs[1].m.GetValue()])
require.Equal(t, uint64(123), c.numCache[fs[2].m.GetFilters()[1].GetValue()])
}
func TestContext_ProcessFiltersInvalid(t *testing.T) {
errTestCases := []struct {
name string
filter Filter
err error
}{
{
"UnnamedTop",
newFilter("", "Storage", "SSD", netmapgrpc.Operation_EQ),
errUnnamedTopFilter,
},
{
"InvalidReference",
newFilter("Main", "", "", netmapgrpc.Operation_AND,
newFilter("StorageSSD", "", "", 0)),
errFilterNotFound,
},
{
"NonEmptyKeyed",
newFilter("Main", "Storage", "SSD", netmapgrpc.Operation_EQ,
newFilter("StorageSSD", "", "", 0)),
errNonEmptyFilters,
},
{
"InvalidNumber",
newFilter("Main", "Rating", "three", netmapgrpc.Operation_GE),
errInvalidNumber,
},
{
"InvalidOp",
newFilter("Main", "Rating", "3", 0),
errInvalidFilterOp,
},
{
"InvalidName",
newFilter("*", "Rating", "3", netmapgrpc.Operation_GE),
errInvalidFilterName,
},
}
for _, tc := range errTestCases {
t.Run(tc.name, func(t *testing.T) {
c := newContext(NetMap{})
p := newPlacementPolicy(1, nil, nil, []Filter{tc.filter})
err := c.processFilters(p)
require.True(t, errors.Is(err, tc.err), "got: %v", err)
})
}
}
func TestFilter_MatchSimple_InvalidOp(t *testing.T) {
b := NewNodeInfo()
b.SetAttribute("Rating", "4")
b.SetAttribute("Country", "Germany")
f := newFilter("Main", "Rating", "5", netmapgrpc.Operation_EQ)
c := newContext(NetMap{})
p := newPlacementPolicy(1, nil, nil, []Filter{f})
require.NoError(t, c.processFilters(p))
// just for the coverage
f.m.SetOp(0)
require.False(t, c.match(f.m, &b))
}