github.com/MetalBlockchain/metalgo@v1.11.9/snow/consensus/snowball/unary_snowball_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 UnarySnowballStateTest(t *testing.T, sb *unarySnowball, expectedPreferenceStrength int, expectedConfidence []int, expectedFinalized bool) { 13 require := require.New(t) 14 15 require.Equal(expectedPreferenceStrength, sb.preferenceStrength) 16 require.Equal(expectedConfidence, sb.confidence) 17 require.Equal(expectedFinalized, sb.Finalized()) 18 } 19 20 func TestUnarySnowball(t *testing.T) { 21 require := require.New(t) 22 23 alphaPreference, alphaConfidence := 1, 2 24 beta := 2 25 terminationConditions := newSingleTerminationCondition(alphaConfidence, beta) 26 27 sb := newUnarySnowball(alphaPreference, terminationConditions) 28 29 sb.RecordPoll(alphaConfidence) 30 UnarySnowballStateTest(t, &sb, 1, []int{1}, false) 31 32 sb.RecordPoll(alphaPreference) 33 UnarySnowballStateTest(t, &sb, 2, []int{0}, false) 34 35 sb.RecordPoll(alphaConfidence) 36 UnarySnowballStateTest(t, &sb, 3, []int{1}, false) 37 38 sb.RecordUnsuccessfulPoll() 39 UnarySnowballStateTest(t, &sb, 3, []int{0}, false) 40 41 sb.RecordPoll(alphaConfidence) 42 UnarySnowballStateTest(t, &sb, 4, []int{1}, false) 43 44 sbCloneIntf := sb.Clone() 45 require.IsType(&unarySnowball{}, sbCloneIntf) 46 sbClone := sbCloneIntf.(*unarySnowball) 47 48 UnarySnowballStateTest(t, sbClone, 4, []int{1}, false) 49 50 binarySnowball := sbClone.Extend(0) 51 52 expected := "SB(Preference = 0, PreferenceStrength[0] = 4, PreferenceStrength[1] = 0, SF(Confidence = [1], Finalized = false, SL(Preference = 0)))" 53 require.Equal(expected, binarySnowball.String()) 54 55 binarySnowball.RecordUnsuccessfulPoll() 56 for i := 0; i < 5; i++ { 57 require.Zero(binarySnowball.Preference()) 58 require.False(binarySnowball.Finalized()) 59 binarySnowball.RecordPoll(alphaConfidence, 1) 60 binarySnowball.RecordUnsuccessfulPoll() 61 } 62 63 require.Equal(1, binarySnowball.Preference()) 64 require.False(binarySnowball.Finalized()) 65 66 binarySnowball.RecordPoll(alphaConfidence, 1) 67 require.Equal(1, binarySnowball.Preference()) 68 require.False(binarySnowball.Finalized()) 69 70 binarySnowball.RecordPoll(alphaConfidence, 1) 71 require.Equal(1, binarySnowball.Preference()) 72 require.True(binarySnowball.Finalized()) 73 74 expected = "SB(PreferenceStrength = 4, SF(Confidence = [1], Finalized = false))" 75 require.Equal(expected, sb.String()) 76 }