1package validators
2
3import (
4 "testing"
5
6 "std"
7
8 "gno.land/p/demo/avl"
9 "gno.land/p/demo/testutils"
10 "gno.land/p/demo/uassert"
11 "gno.land/p/demo/ufmt"
12 "gno.land/p/sys/validators"
13)
14
15// generateTestValidators generates a dummy validator set
16func generateTestValidators(count int) []validators.Validator {
17 vals := make([]validators.Validator, 0, count)
18
19 for i := 0; i < count; i++ {
20 val := validators.Validator{
21 Address: testutils.TestAddress(ufmt.Sprintf("%d", i)),
22 PubKey: "public-key",
23 VotingPower: 10,
24 }
25
26 vals = append(vals, val)
27 }
28
29 return vals
30}
31
32func TestValidators_AddRemove(t *testing.T) {
33 // Clear any changes
34 changes = avl.NewTree()
35
36 var (
37 vals = generateTestValidators(100)
38 initialHeight = int64(123)
39 )
40
41 // Add in the validators
42 for _, val := range vals {
43 addValidator(val)
44
45 // Make sure the validator is added
46 uassert.True(t, vp.IsValidator(val.Address))
47
48 std.TestSkipHeights(1)
49 }
50
51 for i := initialHeight; i < initialHeight+int64(len(vals)); i++ {
52 // Make sure the changes are saved
53 chs := GetChanges(i)
54
55 // We use the funky index calculation to make sure
56 // changes are properly handled for each block span
57 uassert.Equal(t, initialHeight+int64(len(vals))-i, int64(len(chs)))
58
59 for index, val := range vals[i-initialHeight:] {
60 // Make sure the changes are equal to the additions
61 ch := chs[index]
62
63 uassert.Equal(t, val.Address, ch.Address)
64 uassert.Equal(t, val.PubKey, ch.PubKey)
65 uassert.Equal(t, val.VotingPower, ch.VotingPower)
66 }
67 }
68
69 // Save the beginning height for the removal
70 initialRemoveHeight := std.GetHeight()
71
72 // Clear any changes
73 changes = avl.NewTree()
74
75 // Remove the validators
76 for _, val := range vals {
77 removeValidator(val.Address)
78
79 // Make sure the validator is removed
80 uassert.False(t, vp.IsValidator(val.Address))
81
82 std.TestSkipHeights(1)
83 }
84
85 for i := initialRemoveHeight; i < initialRemoveHeight+int64(len(vals)); i++ {
86 // Make sure the changes are saved
87 chs := GetChanges(i)
88
89 // We use the funky index calculation to make sure
90 // changes are properly handled for each block span
91 uassert.Equal(t, initialRemoveHeight+int64(len(vals))-i, int64(len(chs)))
92
93 for index, val := range vals[i-initialRemoveHeight:] {
94 // Make sure the changes are equal to the additions
95 ch := chs[index]
96
97 uassert.Equal(t, val.Address, ch.Address)
98 uassert.Equal(t, val.PubKey, ch.PubKey)
99 uassert.Equal(t, uint64(0), ch.VotingPower)
100 }
101 }
102}
validators_test.gno
2.41 Kb ยท 102 lines