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  }