github.com/MetalBlockchain/metalgo@v1.11.9/snow/consensus/snowball/binary_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 TestBinarySnowball(t *testing.T) { 13 require := require.New(t) 14 15 red := 0 16 blue := 1 17 18 alphaPreference, alphaConfidence := 2, 3 19 beta := 2 20 terminationConditions := newSingleTerminationCondition(alphaConfidence, beta) 21 22 sb := newBinarySnowball(alphaPreference, terminationConditions, red) 23 require.Equal(red, sb.Preference()) 24 require.False(sb.Finalized()) 25 26 sb.RecordPoll(alphaConfidence, blue) 27 require.Equal(blue, sb.Preference()) 28 require.False(sb.Finalized()) 29 30 sb.RecordPoll(alphaConfidence, red) 31 require.Equal(blue, sb.Preference()) 32 require.False(sb.Finalized()) 33 34 sb.RecordPoll(alphaConfidence, blue) 35 require.Equal(blue, sb.Preference()) 36 require.False(sb.Finalized()) 37 38 sb.RecordPoll(alphaConfidence, blue) 39 require.Equal(blue, sb.Preference()) 40 require.True(sb.Finalized()) 41 } 42 43 func TestBinarySnowballRecordPollPreference(t *testing.T) { 44 require := require.New(t) 45 46 red := 0 47 blue := 1 48 49 alphaPreference, alphaConfidence := 1, 2 50 beta := 2 51 terminationConditions := newSingleTerminationCondition(alphaConfidence, beta) 52 53 sb := newBinarySnowball(alphaPreference, terminationConditions, red) 54 require.Equal(red, sb.Preference()) 55 require.False(sb.Finalized()) 56 57 sb.RecordPoll(alphaConfidence, blue) 58 require.Equal(blue, sb.Preference()) 59 require.False(sb.Finalized()) 60 61 sb.RecordPoll(alphaConfidence, red) 62 require.Equal(blue, sb.Preference()) 63 require.False(sb.Finalized()) 64 65 sb.RecordPoll(alphaPreference, red) 66 require.Equal(red, sb.Preference()) 67 require.False(sb.Finalized()) 68 69 sb.RecordPoll(alphaConfidence, red) 70 require.Equal(red, sb.Preference()) 71 require.False(sb.Finalized()) 72 73 sb.RecordPoll(alphaConfidence, red) 74 require.Equal(red, sb.Preference()) 75 require.True(sb.Finalized()) 76 77 expected := "SB(Preference = 0, PreferenceStrength[0] = 4, PreferenceStrength[1] = 1, SF(Confidence = [2], Finalized = true, SL(Preference = 0)))" 78 require.Equal(expected, sb.String()) 79 } 80 81 func TestBinarySnowballRecordUnsuccessfulPoll(t *testing.T) { 82 require := require.New(t) 83 84 red := 0 85 blue := 1 86 87 alphaPreference, alphaConfidence := 1, 2 88 beta := 2 89 terminationConditions := newSingleTerminationCondition(alphaConfidence, beta) 90 91 sb := newBinarySnowball(alphaPreference, terminationConditions, red) 92 require.Equal(red, sb.Preference()) 93 require.False(sb.Finalized()) 94 95 sb.RecordPoll(alphaConfidence, blue) 96 require.Equal(blue, sb.Preference()) 97 require.False(sb.Finalized()) 98 99 sb.RecordUnsuccessfulPoll() 100 101 sb.RecordPoll(alphaConfidence, blue) 102 require.Equal(blue, sb.Preference()) 103 require.False(sb.Finalized()) 104 105 sb.RecordPoll(alphaConfidence, blue) 106 require.Equal(blue, sb.Preference()) 107 require.True(sb.Finalized()) 108 109 expected := "SB(Preference = 1, PreferenceStrength[0] = 0, PreferenceStrength[1] = 3, SF(Confidence = [2], Finalized = true, SL(Preference = 1)))" 110 require.Equal(expected, sb.String()) 111 } 112 113 func TestBinarySnowballAcceptWeirdColor(t *testing.T) { 114 require := require.New(t) 115 116 blue := 0 117 red := 1 118 119 alphaPreference, alphaConfidence := 1, 2 120 beta := 2 121 terminationConditions := newSingleTerminationCondition(alphaConfidence, beta) 122 123 sb := newBinarySnowball(alphaPreference, terminationConditions, red) 124 125 require.Equal(red, sb.Preference()) 126 require.False(sb.Finalized()) 127 128 sb.RecordPoll(alphaConfidence, red) 129 sb.RecordUnsuccessfulPoll() 130 131 require.Equal(red, sb.Preference()) 132 require.False(sb.Finalized()) 133 134 sb.RecordPoll(alphaConfidence, red) 135 136 sb.RecordUnsuccessfulPoll() 137 138 require.Equal(red, sb.Preference()) 139 require.False(sb.Finalized()) 140 141 sb.RecordPoll(alphaConfidence, blue) 142 143 require.Equal(red, sb.Preference()) 144 require.False(sb.Finalized()) 145 146 sb.RecordPoll(alphaConfidence, blue) 147 148 require.Equal(blue, sb.Preference()) 149 require.True(sb.Finalized()) 150 151 expected := "SB(Preference = 1, PreferenceStrength[0] = 2, PreferenceStrength[1] = 2, SF(Confidence = [2], Finalized = true, SL(Preference = 0)))" 152 require.Equal(expected, sb.String()) 153 } 154 155 func TestBinarySnowballLockColor(t *testing.T) { 156 require := require.New(t) 157 158 red := 0 159 blue := 1 160 161 alphaPreference, alphaConfidence := 1, 2 162 beta := 1 163 terminationConditions := newSingleTerminationCondition(alphaConfidence, beta) 164 165 sb := newBinarySnowball(alphaPreference, terminationConditions, red) 166 167 sb.RecordPoll(alphaConfidence, red) 168 169 require.Equal(red, sb.Preference()) 170 require.True(sb.Finalized()) 171 172 sb.RecordPoll(alphaConfidence, blue) 173 174 require.Equal(red, sb.Preference()) 175 require.True(sb.Finalized()) 176 177 sb.RecordPoll(alphaPreference, blue) 178 sb.RecordPoll(alphaConfidence, blue) 179 180 require.Equal(red, sb.Preference()) 181 require.True(sb.Finalized()) 182 183 expected := "SB(Preference = 1, PreferenceStrength[0] = 1, PreferenceStrength[1] = 3, SF(Confidence = [1], Finalized = true, SL(Preference = 0)))" 184 require.Equal(expected, sb.String()) 185 }