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  }