github.com/MetalBlockchain/metalgo@v1.11.9/snow/consensus/snowball/consensus_reversibility_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  	"gonum.org/v1/gonum/mathext/prng"
    11  )
    12  
    13  func TestSnowballGovernance(t *testing.T) {
    14  	require := require.New(t)
    15  
    16  	var (
    17  		numColors           = 2
    18  		numNodes            = 100
    19  		numByzantine        = 10
    20  		numRed              = 55
    21  		params              = DefaultParameters
    22  		seed         uint64 = 0
    23  		source              = prng.NewMT19937()
    24  	)
    25  
    26  	nBitwise := NewNetwork(SnowballFactory, params, numColors, source)
    27  
    28  	source.Seed(seed)
    29  	for i := 0; i < numRed; i++ {
    30  		nBitwise.AddNodeSpecificColor(NewTree, 0, []int{1})
    31  	}
    32  
    33  	for _, node := range nBitwise.nodes {
    34  		require.Equal(nBitwise.colors[0], node.Preference())
    35  	}
    36  
    37  	for i := 0; i < numNodes-numByzantine-numRed; i++ {
    38  		nBitwise.AddNodeSpecificColor(NewTree, 1, []int{0})
    39  	}
    40  
    41  	for i := 0; i < numByzantine; i++ {
    42  		nBitwise.AddNodeSpecificColor(NewByzantine, 1, []int{0})
    43  	}
    44  
    45  	for !nBitwise.Finalized() {
    46  		nBitwise.Round()
    47  	}
    48  
    49  	for _, node := range nBitwise.nodes {
    50  		if _, ok := node.(*Byzantine); ok {
    51  			continue
    52  		}
    53  		require.Equal(nBitwise.colors[0], node.Preference())
    54  	}
    55  }