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  }