/
config_test.go
125 lines (104 loc) · 3.01 KB
/
config_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
// Copyright (C) 2024 Storj Labs, Inc.
// See LICENSE for copying information.
package nodeselection
import (
"testing"
"github.com/stretchr/testify/require"
"storj.io/common/identity/testidentity"
"storj.io/common/storj"
"storj.io/common/storj/location"
"storj.io/storj/satellite/metabase"
)
func TestParsedConfig(t *testing.T) {
config, err := LoadConfig("config_test.yaml")
require.NoError(t, err)
require.Len(t, config, 2)
{
// checking filters
require.True(t, config[1].NodeFilter.Match(&SelectedNode{
CountryCode: location.Germany,
}))
require.False(t, config[1].NodeFilter.Match(&SelectedNode{
CountryCode: location.Russia,
}))
require.Equal(t, "eu-1", config[1].Name)
}
{
// checking one invariant
node := func(ix int, owner string) SelectedNode {
return SelectedNode{
ID: testidentity.MustPregeneratedSignedIdentity(ix, storj.LatestIDVersion()).ID,
Tags: NodeTags{
{
Name: "owner",
Value: []byte(owner),
},
},
}
}
piece := func(ix int, nodeIx int) metabase.Piece {
return metabase.Piece{
Number: uint16(ix), StorageNode: testidentity.MustPregeneratedSignedIdentity(nodeIx, storj.LatestIDVersion()).ID,
}
}
result := config[0].Invariant(
metabase.Pieces{
piece(1, 1),
piece(3, 2),
piece(5, 3),
piece(9, 4),
piece(10, 5),
piece(11, 6),
},
[]SelectedNode{
node(1, "dery"),
node(2, "blathy"),
node(3, "blathy"),
node(4, "zipernowsky"),
node(5, "zipernowsky"),
node(6, "zipernowsky"),
})
// last zipernowsky is too much, as we allow only 2
require.Equal(t, 1, result.Count())
}
{
// checking a selector
selected, err := config[0].Selector([]*SelectedNode{
{
Vetted: false,
},
}, nil)(1, nil, nil)
// having: new, requires: 0% unvetted = 100% vetted
require.Len(t, selected, 0)
require.NoError(t, err)
}
}
func TestFilterFromString(t *testing.T) {
filter, err := FilterFromString(`exclude(nodelist("filter_testdata.txt"))`)
require.NoError(t, err)
require.False(t, filter.Match(&SelectedNode{
ID: testidentity.MustPregeneratedIdentity(1, storj.LatestIDVersion()).ID,
}))
require.True(t, filter.Match(&SelectedNode{
ID: testidentity.MustPregeneratedIdentity(3, storj.LatestIDVersion()).ID,
}))
}
func TestSelectorFromString(t *testing.T) {
selector, err := SelectorFromString(`filter(exclude(nodelist("filter_testdata.txt")),random())`)
require.NoError(t, err)
// initialize the node space
var nodes []*SelectedNode
for i := 0; i < 10; i++ {
nodes = append(nodes, &SelectedNode{
ID: testidentity.MustPregeneratedIdentity(i, storj.LatestIDVersion()).ID,
})
}
initialized := selector(nodes, nil)
for i := 0; i < 100; i++ {
selected, err := initialized(1, []storj.NodeID{}, nil)
require.NoError(t, err)
require.Len(t, selected, 1)
require.NotEqual(t, testidentity.MustPregeneratedIdentity(1, storj.LatestIDVersion()).ID, selected[0].ID)
require.NotEqual(t, testidentity.MustPregeneratedIdentity(1, storj.LatestIDVersion()).ID, selected[0].ID)
}
}