github.com/MetalBlockchain/metalgo@v1.11.9/snow/consensus/snowball/unary_snowflake_test.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package snowball 5 6 import ( 7 "testing" 8 9 "github.com/stretchr/testify/require" 10 ) 11 12 func UnarySnowflakeStateTest(t *testing.T, sf *unarySnowflake, expectedConfidences []int, expectedFinalized bool) { 13 require := require.New(t) 14 15 require.Equal(expectedConfidences, sf.confidence) 16 require.Equal(expectedFinalized, sf.Finalized()) 17 } 18 19 func TestUnarySnowflake(t *testing.T) { 20 require := require.New(t) 21 22 alphaPreference, alphaConfidence := 1, 2 23 beta := 2 24 terminationConditions := newSingleTerminationCondition(alphaConfidence, beta) 25 26 sf := newUnarySnowflake(alphaPreference, terminationConditions) 27 28 sf.RecordPoll(alphaConfidence) 29 UnarySnowflakeStateTest(t, &sf, []int{1}, false) 30 31 sf.RecordUnsuccessfulPoll() 32 UnarySnowflakeStateTest(t, &sf, []int{0}, false) 33 34 sf.RecordPoll(alphaConfidence) 35 UnarySnowflakeStateTest(t, &sf, []int{1}, false) 36 37 sfCloneIntf := sf.Clone() 38 require.IsType(&unarySnowflake{}, sfCloneIntf) 39 sfClone := sfCloneIntf.(*unarySnowflake) 40 41 UnarySnowflakeStateTest(t, sfClone, []int{1}, false) 42 43 binarySnowflake := sfClone.Extend(0) 44 45 binarySnowflake.RecordUnsuccessfulPoll() 46 47 binarySnowflake.RecordPoll(alphaConfidence, 1) 48 49 require.False(binarySnowflake.Finalized()) 50 51 binarySnowflake.RecordPoll(alphaConfidence, 1) 52 53 require.Equal(1, binarySnowflake.Preference()) 54 require.True(binarySnowflake.Finalized()) 55 56 sf.RecordPoll(alphaConfidence) 57 UnarySnowflakeStateTest(t, &sf, []int{2}, true) 58 59 sf.RecordUnsuccessfulPoll() 60 UnarySnowflakeStateTest(t, &sf, []int{0}, true) 61 62 sf.RecordPoll(alphaConfidence) 63 UnarySnowflakeStateTest(t, &sf, []int{1}, true) 64 } 65 66 type unarySnowflakeTest struct { 67 require *require.Assertions 68 69 unarySnowflake 70 } 71 72 func newUnarySnowflakeTest(t *testing.T, alphaPreference int, terminationConditions []terminationCondition) snowflakeTest[struct{}] { 73 require := require.New(t) 74 75 return &unarySnowflakeTest{ 76 require: require, 77 unarySnowflake: newUnarySnowflake(alphaPreference, terminationConditions), 78 } 79 } 80 81 func (sf *unarySnowflakeTest) RecordPoll(count int, _ struct{}) { 82 sf.unarySnowflake.RecordPoll(count) 83 } 84 85 func (sf *unarySnowflakeTest) AssertEqual(expectedConfidences []int, expectedFinalized bool, _ struct{}) { 86 sf.require.Equal(expectedConfidences, sf.unarySnowflake.confidence) 87 sf.require.Equal(expectedFinalized, sf.Finalized()) 88 } 89 90 func TestUnarySnowflakeErrorDriven(t *testing.T) { 91 for _, test := range getErrorDrivenSnowflakeSingleChoiceSuite[struct{}]() { 92 t.Run(test.name, func(t *testing.T) { 93 test.f(t, newUnarySnowflakeTest, struct{}{}) 94 }) 95 } 96 }