github.com/MetalBlockchain/metalgo@v1.11.9/snow/consensus/snowball/nnary_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 TestNnarySnowball(t *testing.T) { 13 require := require.New(t) 14 15 alphaPreference, alphaConfidence := 1, 2 16 beta := 2 17 terminationConditions := newSingleTerminationCondition(alphaConfidence, beta) 18 19 sb := newNnarySnowball(alphaPreference, terminationConditions, Red) 20 sb.Add(Blue) 21 sb.Add(Green) 22 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(alphaPreference, Red) 35 require.Equal(Red, sb.Preference()) 36 require.False(sb.Finalized()) 37 38 sb.RecordPoll(alphaConfidence, Red) 39 require.Equal(Red, sb.Preference()) 40 require.False(sb.Finalized()) 41 42 sb.RecordPoll(alphaPreference, Blue) 43 require.Equal(Red, sb.Preference()) 44 require.False(sb.Finalized()) 45 46 sb.RecordPoll(alphaConfidence, Blue) 47 require.Equal(Red, sb.Preference()) 48 require.False(sb.Finalized()) 49 50 sb.RecordPoll(alphaConfidence, Blue) 51 require.Equal(Blue, sb.Preference()) 52 require.True(sb.Finalized()) 53 } 54 55 func TestVirtuousNnarySnowball(t *testing.T) { 56 require := require.New(t) 57 58 alphaPreference, alphaConfidence := 1, 2 59 beta := 1 60 terminationConditions := newSingleTerminationCondition(alphaConfidence, beta) 61 62 sb := newNnarySnowball(alphaPreference, terminationConditions, Red) 63 64 require.Equal(Red, sb.Preference()) 65 require.False(sb.Finalized()) 66 67 sb.RecordPoll(alphaConfidence, Red) 68 require.Equal(Red, sb.Preference()) 69 require.True(sb.Finalized()) 70 } 71 72 func TestNarySnowballRecordUnsuccessfulPoll(t *testing.T) { 73 require := require.New(t) 74 75 alphaPreference, alphaConfidence := 1, 2 76 beta := 2 77 terminationConditions := newSingleTerminationCondition(alphaConfidence, beta) 78 79 sb := newNnarySnowball(alphaPreference, terminationConditions, Red) 80 sb.Add(Blue) 81 82 require.Equal(Red, sb.Preference()) 83 require.False(sb.Finalized()) 84 85 sb.RecordPoll(alphaConfidence, Blue) 86 require.Equal(Blue, sb.Preference()) 87 require.False(sb.Finalized()) 88 89 sb.RecordUnsuccessfulPoll() 90 91 sb.RecordPoll(alphaConfidence, Blue) 92 93 require.Equal(Blue, sb.Preference()) 94 require.False(sb.Finalized()) 95 96 sb.RecordPoll(alphaConfidence, Blue) 97 98 require.Equal(Blue, sb.Preference()) 99 require.True(sb.Finalized()) 100 101 expected := "SB(Preference = TtF4d2QWbk5vzQGTEPrN48x6vwgAoAmKQ9cbp79inpQmcRKES, PreferenceStrength = 3, SF(Confidence = [2], Finalized = true, SL(Preference = TtF4d2QWbk5vzQGTEPrN48x6vwgAoAmKQ9cbp79inpQmcRKES)))" 102 require.Equal(expected, sb.String()) 103 104 for i := 0; i < 4; i++ { 105 sb.RecordPoll(alphaConfidence, Red) 106 107 require.Equal(Blue, sb.Preference()) 108 require.True(sb.Finalized()) 109 } 110 } 111 112 func TestNarySnowballDifferentSnowflakeColor(t *testing.T) { 113 require := require.New(t) 114 115 alphaPreference, alphaConfidence := 1, 2 116 beta := 2 117 terminationConditions := newSingleTerminationCondition(alphaConfidence, beta) 118 119 sb := newNnarySnowball(alphaPreference, terminationConditions, Red) 120 sb.Add(Blue) 121 122 require.Equal(Red, sb.Preference()) 123 require.False(sb.Finalized()) 124 125 sb.RecordPoll(alphaConfidence, Blue) 126 127 require.Equal(Blue, sb.nnarySnowflake.Preference()) 128 129 sb.RecordPoll(alphaConfidence, Red) 130 131 require.Equal(Blue, sb.Preference()) 132 require.Equal(Red, sb.nnarySnowflake.Preference()) 133 }