Search Apps Documentation Source Content File Folder Download Copy Actions Download

validators_test.gno

3.32 Kb · 97 lines
 1// Tests for stateless v3.
 2//
 3// State isolation: gno's test runner constructs a fresh testParams
 4// per top-level TestXxx, but t.Run subtests share the same map.
 5// Each subtest below seeds (or clears) the valset slots it cares
 6// about up front; do the same when adding cases.
 7package validators
 8
 9import (
10	"chain"
11	"testing"
12
13	"gno.land/p/nt/urequire/v0"
14)
15
16const (
17	// Three distinct deterministic test pubkeys (and the addresses
18	// they derive to) used across the cases below. Stable across
19	// runs.
20	pubKeyA = "gpub1pggj7ard9eg82cjtv4u52epjx56nzwgjyg9zq3ds6sdvc0shfkq02h6xx5g0jp04aadexfnpsmgjxu72xz9y30aqfrlpny"
21	pubKeyB = "gpub1pggj7ard9eg82cjtv4u52epjx56nzwgjyg9zqwpdwpd0f9fvqla089ndw5g9hcsufad77fml2vlu73fk8q8sh8v72cza5p"
22	pubKeyC = "gpub1pgfj7ard9eg82cjtv4u4xetrwqer2dntxyfzxz3pqddddqg2glc8x4fl7vxjlnr7p5a3czm5kcdp4239sg6yqdc4rc2r5cjrffs"
23
24	module    = "node"
25	submodule = "valset"
26	currKey   = "current"
27	propKey   = "proposed"
28	dirtyKey  = "dirty"
29)
30
31func resetValset(t *testing.T) {
32	t.Helper()
33	testing.SetSysParamStrings(module, submodule, currKey, []string{})
34	testing.SetSysParamStrings(module, submodule, propKey, []string{})
35	testing.SetSysParamBool(module, submodule, dirtyKey, false)
36}
37
38func mustAddr(t *testing.T, pk string) address {
39	t.Helper()
40	a, err := chain.PubKeyAddress(pk)
41	urequire.NoError(t, err, "valid pubkey")
42	return a
43}
44
45func TestEffectiveView_DirtyFalseReadsCurrent(t *testing.T) {
46	resetValset(t)
47	testing.SetSysParamStrings(module, submodule, currKey, []string{pubKeyA + ":10"})
48
49	addrA := mustAddr(t, pubKeyA)
50	urequire.True(t, IsValidator(addrA), "A in current")
51	urequire.Equal(t, 1, len(GetValidators()))
52}
53
54func TestEffectiveView_DirtyTrueReadsProposed(t *testing.T) {
55	resetValset(t)
56	testing.SetSysParamStrings(module, submodule, currKey, []string{pubKeyA + ":10"})
57	testing.SetSysParamStrings(module, submodule, propKey, []string{pubKeyA + ":10", pubKeyB + ":1"})
58	testing.SetSysParamBool(module, submodule, dirtyKey, true)
59
60	addrA := mustAddr(t, pubKeyA)
61	addrB := mustAddr(t, pubKeyB)
62	urequire.True(t, IsValidator(addrA), "A still visible")
63	urequire.True(t, IsValidator(addrB), "B visible via proposed")
64	urequire.Equal(t, 2, len(GetValidators()))
65}
66
67func TestGetValidator_ReturnsParsedEntry(t *testing.T) {
68	resetValset(t)
69	testing.SetSysParamStrings(module, submodule, currKey, []string{pubKeyA + ":42"})
70
71	v := GetValidator(mustAddr(t, pubKeyA))
72	urequire.Equal(t, uint64(42), v.VotingPower)
73	urequire.Equal(t, pubKeyA, v.PubKey)
74}
75
76func TestRender_DefaultTestHeight(t *testing.T) {
77	resetValset(t)
78	testing.SetSysParamStrings(module, submodule, currKey, []string{pubKeyA + ":10"})
79
80	out := Render("")
81	// gnovm/pkg/test/test.go sets DefaultHeight = 123.
82	urequire.Equal(t,
83		"## Valset at height 123\n\n- #0: "+mustAddr(t, pubKeyA).String()+" (10)\n",
84		out)
85}
86
87// The same-block accumulation, panic-on-remove-of-missing,
88// panic-on-add-of-existing, and pubkey-validation tests for the
89// signing-keyed NewProposalRequest/newValsetChangeExecutor were
90// removed alongside the function itself. Equivalent coverage for
91// the operator-keyed flow lives in proposal_test.gno
92// (TestNewValidatorProposalRequest_*) and cache_test.gno
93// (TestRotateValoperSigningKey_AccumulatesAcrossSameBlock).
94//
95// Empty-final-set rejection in the executor still applies; it's
96// covered by TestNewValidatorProposalRequest_RemoveOperator in
97// proposal_test.gno.