poa_test.gno

5.17 Kb ยท 237 lines
  1package poa
  2
  3import (
  4	"testing"
  5
  6	"gno.land/p/nt/testutils"
  7	"gno.land/p/nt/uassert"
  8	"gno.land/p/nt/urequire"
  9	"gno.land/p/sys/validators"
 10
 11	"gno.land/p/nt/ufmt"
 12)
 13
 14// generateTestValidators generates a dummy validator set
 15func generateTestValidators(count int) []validators.Validator {
 16	vals := make([]validators.Validator, 0, count)
 17
 18	for i := 0; i < count; i++ {
 19		val := validators.Validator{
 20			Address:     testutils.TestAddress(ufmt.Sprintf("%d", i)),
 21			PubKey:      "public-key",
 22			VotingPower: 1,
 23		}
 24
 25		vals = append(vals, val)
 26	}
 27
 28	return vals
 29}
 30
 31func TestPoA_AddValidator_Invalid(t *testing.T) {
 32	t.Parallel()
 33
 34	t.Run("validator already in set", func(t *testing.T) {
 35		t.Parallel()
 36
 37		var (
 38			proposalAddress = testutils.TestAddress("caller")
 39			proposalKey     = "public-key"
 40
 41			initialSet = generateTestValidators(1)
 42		)
 43
 44		initialSet[0].Address = proposalAddress
 45		initialSet[0].PubKey = proposalKey
 46
 47		// Create the protocol with an initial set
 48		p := NewPoA(WithInitialSet(initialSet))
 49
 50		// Attempt to add the validator
 51		_, err := p.AddValidator(proposalAddress, proposalKey, 1)
 52		uassert.ErrorIs(t, err, validators.ErrValidatorExists)
 53	})
 54
 55	t.Run("invalid voting power", func(t *testing.T) {
 56		t.Parallel()
 57
 58		var (
 59			proposalAddress = testutils.TestAddress("caller")
 60			proposalKey     = "public-key"
 61		)
 62
 63		// Create the protocol with no initial set
 64		p := NewPoA()
 65
 66		// Attempt to add the validator
 67		_, err := p.AddValidator(proposalAddress, proposalKey, 0)
 68		uassert.ErrorIs(t, err, ErrInvalidVotingPower)
 69	})
 70}
 71
 72func TestPoA_AddValidator(t *testing.T) {
 73	t.Parallel()
 74
 75	var (
 76		proposalAddress = testutils.TestAddress("caller")
 77		proposalKey     = "public-key"
 78	)
 79
 80	// Create the protocol with no initial set
 81	p := NewPoA()
 82
 83	// Attempt to add the validator
 84	_, err := p.AddValidator(proposalAddress, proposalKey, 1)
 85	uassert.NoError(t, err)
 86
 87	// Make sure the validator is added
 88	if !p.IsValidator(proposalAddress) || p.validators.Size() != 1 {
 89		t.Fatal("address is not validator")
 90	}
 91}
 92
 93func TestPoA_RemoveValidator_Invalid(t *testing.T) {
 94	t.Parallel()
 95
 96	t.Run("proposed removal not in set", func(t *testing.T) {
 97		t.Parallel()
 98
 99		var (
100			proposalAddress = testutils.TestAddress("caller")
101			initialSet      = generateTestValidators(1)
102		)
103
104		initialSet[0].Address = proposalAddress
105
106		// Create the protocol with an initial set
107		p := NewPoA(WithInitialSet(initialSet))
108
109		// Attempt to remove the validator
110		_, err := p.RemoveValidator(testutils.TestAddress("totally random"))
111		uassert.ErrorIs(t, err, validators.ErrValidatorMissing)
112	})
113}
114
115func TestPoA_RemoveValidator(t *testing.T) {
116	t.Parallel()
117
118	var (
119		proposalAddress = testutils.TestAddress("caller")
120		initialSet      = generateTestValidators(1)
121	)
122
123	initialSet[0].Address = proposalAddress
124
125	// Create the protocol with an initial set
126	p := NewPoA(WithInitialSet(initialSet))
127
128	// Attempt to remove the validator
129	_, err := p.RemoveValidator(proposalAddress)
130	urequire.NoError(t, err)
131
132	// Make sure the validator is removed
133	if p.IsValidator(proposalAddress) || p.validators.Size() != 0 {
134		t.Fatal("address is validator")
135	}
136}
137
138func TestPoA_GetValidator(t *testing.T) {
139	t.Parallel()
140
141	t.Run("validator not in set", func(t *testing.T) {
142		t.Parallel()
143
144		// Create the protocol with no initial set
145		p := NewPoA()
146
147		// Attempt to get the voting power
148		_, err := p.GetValidator(testutils.TestAddress("caller"))
149		uassert.ErrorIs(t, err, validators.ErrValidatorMissing)
150	})
151
152	t.Run("validator fetched", func(t *testing.T) {
153		t.Parallel()
154
155		var (
156			address_XXX = testutils.TestAddress("caller")
157			pubKey      = "public-key"
158			votingPower = uint64(10)
159
160			initialSet = generateTestValidators(1)
161		)
162
163		initialSet[0].Address = address_XXX
164		initialSet[0].PubKey = pubKey
165		initialSet[0].VotingPower = votingPower
166
167		// Create the protocol with an initial set
168		p := NewPoA(WithInitialSet(initialSet))
169
170		// Get the validator
171		val, err := p.GetValidator(address_XXX)
172		urequire.NoError(t, err)
173
174		// Validate the address
175		if val.Address != address_XXX {
176			t.Fatal("invalid address")
177		}
178
179		// Validate the voting power
180		if val.VotingPower != votingPower {
181			t.Fatal("invalid voting power")
182		}
183
184		// Validate the public key
185		if val.PubKey != pubKey {
186			t.Fatal("invalid public key")
187		}
188	})
189}
190
191func TestPoA_GetValidators(t *testing.T) {
192	t.Parallel()
193
194	t.Run("empty set", func(t *testing.T) {
195		t.Parallel()
196
197		// Create the protocol with no initial set
198		p := NewPoA()
199
200		// Attempt to get the voting power
201		vals := p.GetValidators()
202
203		if len(vals) != 0 {
204			t.Fatal("validator set is not empty")
205		}
206	})
207
208	t.Run("validator set fetched", func(t *testing.T) {
209		t.Parallel()
210
211		initialSet := generateTestValidators(10)
212
213		// Create the protocol with an initial set
214		p := NewPoA(WithInitialSet(initialSet))
215
216		// Get the validator set
217		vals := p.GetValidators()
218
219		if len(vals) != len(initialSet) {
220			t.Fatal("returned validator set mismatch")
221		}
222
223		for _, val := range vals {
224			for _, initialVal := range initialSet {
225				if val.Address != initialVal.Address {
226					continue
227				}
228
229				// Validate the voting power
230				uassert.Equal(t, val.VotingPower, initialVal.VotingPower)
231
232				// Validate the public key
233				uassert.Equal(t, val.PubKey, initialVal.PubKey)
234			}
235		}
236	})
237}