gecko/snow/validators/set_test.go

175 lines
4.5 KiB
Go

// (c) 2019-2020, Ava Labs, Inc. All rights reserved.
// See the file LICENSE for licensing terms.
package validators
import (
"math"
"testing"
"github.com/ava-labs/gecko/ids"
)
func TestSetSet(t *testing.T) {
vdr0 := NewValidator(ids.ShortEmpty, 1)
vdr1_0 := NewValidator(ids.NewShortID([20]byte{0xFF}), 1)
// Should replace vdr1_0, because later additions replace earlier ones
vdr1_1 := NewValidator(ids.NewShortID([20]byte{0xFF}), math.MaxInt64-1)
// Should be discarded, because it has a weight of 0
vdr2 := NewValidator(ids.NewShortID([20]byte{0xAA}), 0)
s := NewSet()
s.Set([]Validator{vdr0, vdr1_0, vdr1_1, vdr2})
if !s.Contains(vdr0.ID()) {
t.Fatal("Should have contained vdr0", vdr0.ID())
}
if !s.Contains(vdr1_0.ID()) {
t.Fatal("Should have contained vdr1", vdr1_0.ID())
}
if sampled := s.Sample(1); !sampled[0].ID().Equals(vdr1_0.ID()) {
t.Fatal("Should have sampled vdr1")
}
if len := s.Len(); len != 2 {
t.Fatalf("Got size %d, expected 2", len)
}
}
func TestSamplerSample(t *testing.T) {
vdr0 := GenerateRandomValidator(1)
vdr1 := GenerateRandomValidator(math.MaxInt64 - 1)
s := NewSet()
s.Add(vdr0)
if sampled := s.Sample(1); len(sampled) != 1 {
t.Fatalf("Should have sampled 1 validator")
} else if !sampled[0].ID().Equals(vdr0.ID()) {
t.Fatalf("Should have sampled vdr0")
} else if s.Len() != 1 {
t.Fatalf("Wrong size")
}
s.Add(vdr1)
if sampled := s.Sample(1); len(sampled) != 1 {
t.Fatalf("Should have sampled 1 validator")
} else if !sampled[0].ID().Equals(vdr1.ID()) {
t.Fatalf("Should have sampled vdr1")
} else if s.Len() != 2 {
t.Fatalf("Wrong size")
}
if sampled := s.Sample(2); len(sampled) != 2 {
t.Fatalf("Should have sampled 2 validators")
} else if !sampled[1].ID().Equals(vdr0.ID()) {
t.Fatalf("Should have sampled vdr0")
} else if !sampled[0].ID().Equals(vdr1.ID()) {
t.Fatalf("Should have sampled vdr1")
}
if sampled := s.Sample(3); len(sampled) != 2 {
t.Fatalf("Should have sampled 2 validators")
} else if !sampled[1].ID().Equals(vdr0.ID()) {
t.Fatalf("Should have sampled vdr0")
} else if !sampled[0].ID().Equals(vdr1.ID()) {
t.Fatalf("Should have sampled vdr1")
}
if list := s.List(); len(list) != 2 {
t.Fatalf("Should have returned 2 validators")
} else if !list[0].ID().Equals(vdr0.ID()) {
t.Fatalf("Should have returned vdr0")
} else if !list[1].ID().Equals(vdr1.ID()) {
t.Fatalf("Should have returned vdr1")
}
}
func TestSamplerDuplicate(t *testing.T) {
vdr0 := GenerateRandomValidator(1)
vdr1_0 := GenerateRandomValidator(math.MaxInt64 - 1)
vdr1_1 := NewValidator(vdr1_0.ID(), 0)
s := NewSet()
s.Add(vdr0)
s.Add(vdr1_0)
if sampled := s.Sample(1); len(sampled) != 1 {
t.Fatalf("Should have sampled 1 validator")
} else if !sampled[0].ID().Equals(vdr1_0.ID()) {
t.Fatalf("Should have sampled vdr1")
}
s.Add(vdr1_1)
if sampled := s.Sample(1); len(sampled) != 1 {
t.Fatalf("Should have sampled 1 validator")
} else if !sampled[0].ID().Equals(vdr0.ID()) {
t.Fatalf("Should have sampled vdr0")
}
if sampled := s.Sample(2); len(sampled) != 1 {
t.Fatalf("Should have only sampled 1 validator")
} else if !sampled[0].ID().Equals(vdr0.ID()) {
t.Fatalf("Should have sampled vdr0")
}
s.Remove(vdr1_1.ID())
if sampled := s.Sample(2); len(sampled) != 1 {
t.Fatalf("Should have only sampled 1 validator")
} else if !sampled[0].ID().Equals(vdr0.ID()) {
t.Fatalf("Should have sampled vdr0")
}
}
func TestSamplerSimple(t *testing.T) {
vdr := GenerateRandomValidator(1)
s := NewSet()
s.Add(vdr)
if sampled := s.Sample(1); len(sampled) != 1 {
t.Fatalf("Should have sampled 1 validator")
}
}
func TestSamplerContains(t *testing.T) {
vdr := GenerateRandomValidator(1)
s := NewSet()
s.Add(vdr)
if !s.Contains(vdr.ID()) {
t.Fatalf("Should have contained validator")
}
s.Remove(vdr.ID())
if s.Contains(vdr.ID()) {
t.Fatalf("Shouldn't have contained validator")
}
}
func TestSamplerString(t *testing.T) {
vdr0 := NewValidator(ids.ShortEmpty, 1)
vdr1 := NewValidator(
ids.NewShortID([20]byte{
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
}),
math.MaxInt64-1,
)
s := NewSet()
s.Add(vdr0)
s.Add(vdr1)
expected := "Validator Set: (Size = 2)\n" +
" Validator[0]: 111111111111111111116DBWJs, 1\n" +
" Validator[1]: QLbz7JHiBTspS962RLKV8GndWFwdYhk6V, 9223372036854775806"
if str := s.String(); str != expected {
t.Fatalf("Got:\n%s\nExpected:\n%s", str, expected)
}
}