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  }