diff --git a/snow/consensus/snowball/flat_test.go b/snow/consensus/snowball/flat_test.go index c5d292d1ec4..0291c03be1a 100644 --- a/snow/consensus/snowball/flat_test.go +++ b/snow/consensus/snowball/flat_test.go @@ -8,7 +8,6 @@ import ( "github.com/stretchr/testify/require" - "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/avalanchego/utils/bag" ) @@ -26,14 +25,12 @@ func TestFlat(t *testing.T) { require.Equal(Red, f.Preference()) require.False(f.Finalized()) - twoBlue := bag.Bag[ids.ID]{} - twoBlue.Add(Blue, Blue) + twoBlue := bag.Of(Blue, Blue) require.True(f.RecordPoll(twoBlue)) require.Equal(Blue, f.Preference()) require.False(f.Finalized()) - oneRedOneBlue := bag.Bag[ids.ID]{} - oneRedOneBlue.Add(Red, Blue) + oneRedOneBlue := bag.Of(Red, Blue) require.False(f.RecordPoll(oneRedOneBlue)) require.Equal(Blue, f.Preference()) require.False(f.Finalized()) diff --git a/snow/consensus/snowball/tree_test.go b/snow/consensus/snowball/tree_test.go index b11b3286d90..26406e42802 100644 --- a/snow/consensus/snowball/tree_test.go +++ b/snow/consensus/snowball/tree_test.go @@ -29,8 +29,7 @@ func TestSnowballSingleton(t *testing.T) { require.False(tree.Finalized()) - oneRed := bag.Bag[ids.ID]{} - oneRed.Add(Red) + oneRed := bag.Of(Red) require.True(tree.RecordPoll(oneRed)) require.False(tree.Finalized()) @@ -51,8 +50,7 @@ func TestSnowballSingleton(t *testing.T) { // Because the tree is already finalized, RecordPoll can return either true // or false. - oneBlue := bag.Bag[ids.ID]{} - oneBlue.Add(Blue) + oneBlue := bag.Of(Blue) tree.RecordPoll(oneBlue) require.Equal(Red, tree.Preference()) require.True(tree.Finalized()) @@ -69,8 +67,7 @@ func TestSnowballRecordUnsuccessfulPoll(t *testing.T) { require.False(tree.Finalized()) - oneRed := bag.Bag[ids.ID]{} - oneRed.Add(Red) + oneRed := bag.Of(Red) require.True(tree.RecordPoll(oneRed)) tree.RecordUnsuccessfulPoll() @@ -99,14 +96,12 @@ func TestSnowballBinary(t *testing.T) { require.Equal(Red, tree.Preference()) require.False(tree.Finalized()) - oneBlue := bag.Bag[ids.ID]{} - oneBlue.Add(Blue) + oneBlue := bag.Of(Blue) require.True(tree.RecordPoll(oneBlue)) require.Equal(Blue, tree.Preference()) require.False(tree.Finalized()) - oneRed := bag.Bag[ids.ID]{} - oneRed.Add(Red) + oneRed := bag.Of(Red) require.True(tree.RecordPoll(oneRed)) require.Equal(Blue, tree.Preference()) require.False(tree.Finalized()) @@ -147,8 +142,7 @@ func TestSnowballLastBinary(t *testing.T) { require.Equal(zero, tree.Preference()) require.False(tree.Finalized()) - oneBag := bag.Bag[ids.ID]{} - oneBag.Add(one) + oneBag := bag.Of(one) require.True(tree.RecordPoll(oneBag)) require.Equal(one, tree.Preference()) require.False(tree.Finalized()) @@ -193,8 +187,7 @@ func TestSnowballAddPreviouslyRejected(t *testing.T) { require.False(tree.Finalized()) } - zeroBag := bag.Bag[ids.ID]{} - zeroBag.Add(zero) + zeroBag := bag.Of(zero) require.True(tree.RecordPoll(zeroBag)) { @@ -244,8 +237,7 @@ func TestSnowballNewUnary(t *testing.T) { require.False(tree.Finalized()) } - oneBag := bag.Bag[ids.ID]{} - oneBag.Add(one) + oneBag := bag.Of(one) require.True(tree.RecordPoll(oneBag)) { @@ -297,8 +289,7 @@ func TestSnowballTransitiveReset(t *testing.T) { require.False(tree.Finalized()) } - zeroBag := bag.Bag[ids.ID]{} - zeroBag.Add(zero) + zeroBag := bag.Of(zero) require.True(tree.RecordPoll(zeroBag)) { @@ -375,22 +366,19 @@ func TestSnowballTrinary(t *testing.T) { require.Equal(Green, tree.Preference()) require.False(tree.Finalized()) - redBag := bag.Bag[ids.ID]{} - redBag.Add(Red) + redBag := bag.Of(Red) require.True(tree.RecordPoll(redBag)) require.Equal(Red, tree.Preference()) require.False(tree.Finalized()) - blueBag := bag.Bag[ids.ID]{} - blueBag.Add(Blue) + blueBag := bag.Of(Blue) require.True(tree.RecordPoll(blueBag)) require.Equal(Red, tree.Preference()) require.False(tree.Finalized()) // Here is a case where voting for a color makes a different color become // the preferred color. This is intended behavior. - greenBag := bag.Bag[ids.ID]{} - greenBag.Add(Green) + greenBag := bag.Of(Green) require.True(tree.RecordPoll(greenBag)) require.Equal(Blue, tree.Preference()) require.False(tree.Finalized()) @@ -429,21 +417,18 @@ func TestSnowballCloseTrinary(t *testing.T) { require.Equal(yellow, tree.Preference()) require.False(tree.Finalized()) - yellowBag := bag.Bag[ids.ID]{} - yellowBag.Add(yellow) + yellowBag := bag.Of(yellow) require.True(tree.RecordPoll(yellowBag)) require.Equal(yellow, tree.Preference()) require.False(tree.Finalized()) - magentaBag := bag.Bag[ids.ID]{} - magentaBag.Add(magenta) + magentaBag := bag.Of(magenta) require.True(tree.RecordPoll(magentaBag)) require.Equal(yellow, tree.Preference()) require.False(tree.Finalized()) // Cyan has already been rejected here, so these are not successful polls. - cyanBag := bag.Bag[ids.ID]{} - cyanBag.Add(cyan) + cyanBag := bag.Of(cyan) require.False(tree.RecordPoll(cyanBag)) require.Equal(yellow, tree.Preference()) require.False(tree.Finalized()) @@ -472,8 +457,7 @@ func TestSnowballAddRejected(t *testing.T) { require.Equal(c0000, tree.Preference()) require.False(tree.Finalized()) - c0010Bag := bag.Bag[ids.ID]{} - c0010Bag.Add(c0010) + c0010Bag := bag.Of(c0010) require.True(tree.RecordPoll(c0010Bag)) { @@ -519,8 +503,7 @@ func TestSnowballResetChild(t *testing.T) { require.Equal(c0000, tree.Preference()) require.False(tree.Finalized()) - c0000Bag := bag.Bag[ids.ID]{} - c0000Bag.Add(c0000) + c0000Bag := bag.Of(c0000) require.True(tree.RecordPoll(c0000Bag)) { @@ -580,8 +563,7 @@ func TestSnowballResetSibling(t *testing.T) { require.Equal(c0000, tree.Preference()) require.False(tree.Finalized()) - c0100Bag := bag.Bag[ids.ID]{} - c0100Bag.Add(c0100) + c0100Bag := bag.Of(c0100) require.True(tree.RecordPoll(c0100Bag)) { @@ -595,8 +577,7 @@ func TestSnowballResetSibling(t *testing.T) { require.False(tree.Finalized()) } - c1000Bag := bag.Bag[ids.ID]{} - c1000Bag.Add(c1000) + c1000Bag := bag.Of(c1000) require.True(tree.RecordPoll(c1000Bag)) { @@ -716,8 +697,7 @@ func TestSnowballFineGrained(t *testing.T) { require.False(tree.Finalized()) } - c0000Bag := bag.Bag[ids.ID]{} - c0000Bag.Add(c0000) + c0000Bag := bag.Of(c0000) require.True(tree.RecordPoll(c0000Bag)) { @@ -733,8 +713,7 @@ func TestSnowballFineGrained(t *testing.T) { require.False(tree.Finalized()) } - c0010Bag := bag.Bag[ids.ID]{} - c0010Bag.Add(c0010) + c0010Bag := bag.Of(c0010) require.True(tree.RecordPoll(c0010Bag)) { @@ -840,8 +819,7 @@ func TestSnowballFilterBinaryChildren(t *testing.T) { require.False(tree.Finalized()) } - c0000Bag := bag.Bag[ids.ID]{} - c0000Bag.Add(c0000) + c0000Bag := bag.Of(c0000) require.True(tree.RecordPoll(c0000Bag)) { @@ -868,8 +846,7 @@ func TestSnowballFilterBinaryChildren(t *testing.T) { require.False(tree.Finalized()) } - c0100Bag := bag.Bag[ids.ID]{} - c0100Bag.Add(c0100) + c0100Bag := bag.Of(c0100) require.True(tree.RecordPoll(c0100Bag)) { diff --git a/snow/consensus/snowman/consensus_test.go b/snow/consensus/snowman/consensus_test.go index 3a3815a54f4..b1bbbd71fe5 100644 --- a/snow/consensus/snowman/consensus_test.go +++ b/snow/consensus/snowman/consensus_test.go @@ -144,8 +144,7 @@ func NumProcessingTest(t *testing.T, factory Factory) { require.Equal(1, sm.NumProcessing()) - votes := bag.Bag[ids.ID]{} - votes.Add(block.ID()) + votes := bag.Of(block.ID()) require.NoError(sm.RecordPoll(context.Background(), votes)) require.Zero(sm.NumProcessing()) @@ -425,8 +424,7 @@ func RecordPollAcceptSingleBlockTest(t *testing.T, factory Factory) { require.NoError(sm.Add(context.Background(), block)) - votes := bag.Bag[ids.ID]{} - votes.Add(block.ID()) + votes := bag.Of(block.ID()) require.NoError(sm.RecordPoll(context.Background(), votes)) require.Equal(block.ID(), sm.Preference()) require.False(sm.Finalized()) @@ -476,8 +474,7 @@ func RecordPollAcceptAndRejectTest(t *testing.T, factory Factory) { require.NoError(sm.Add(context.Background(), firstBlock)) require.NoError(sm.Add(context.Background(), secondBlock)) - votes := bag.Bag[ids.ID]{} - votes.Add(firstBlock.ID()) + votes := bag.Of(firstBlock.ID()) require.NoError(sm.RecordPoll(context.Background(), votes)) require.Equal(firstBlock.ID(), sm.Preference()) @@ -532,9 +529,7 @@ func RecordPollSplitVoteNoChangeTest(t *testing.T, factory Factory) { require.NoError(sm.Add(context.Background(), firstBlock)) require.NoError(sm.Add(context.Background(), secondBlock)) - votes := bag.Bag[ids.ID]{} - votes.Add(firstBlock.ID()) - votes.Add(secondBlock.ID()) + votes := bag.Of(firstBlock.ID(), secondBlock.ID()) // The first poll will accept shared bits require.NoError(sm.RecordPoll(context.Background(), votes)) @@ -573,8 +568,7 @@ func RecordPollWhenFinalizedTest(t *testing.T, factory Factory) { } require.NoError(sm.Initialize(ctx, params, GenesisID, GenesisHeight, GenesisTimestamp)) - votes := bag.Bag[ids.ID]{} - votes.Add(GenesisID) + votes := bag.Of(GenesisID) require.NoError(sm.RecordPoll(context.Background(), votes)) require.True(sm.Finalized()) require.Equal(GenesisID, sm.Preference()) @@ -635,8 +629,7 @@ func RecordPollRejectTransitivelyTest(t *testing.T, factory Factory) { // 2 // Tail = 0 - votes := bag.Bag[ids.ID]{} - votes.Add(block0.ID()) + votes := bag.Of(block0.ID()) require.NoError(sm.RecordPoll(context.Background(), votes)) // Current graph structure: @@ -713,8 +706,7 @@ func RecordPollTransitivelyResetConfidenceTest(t *testing.T, factory Factory) { // / \ // 2 3 - votesFor2 := bag.Bag[ids.ID]{} - votesFor2.Add(block2.ID()) + votesFor2 := bag.Of(block2.ID()) require.NoError(sm.RecordPoll(context.Background(), votesFor2)) require.False(sm.Finalized()) require.Equal(block2.ID(), sm.Preference()) @@ -728,8 +720,7 @@ func RecordPollTransitivelyResetConfidenceTest(t *testing.T, factory Factory) { require.False(sm.Finalized()) require.Equal(block2.ID(), sm.Preference()) - votesFor3 := bag.Bag[ids.ID]{} - votesFor3.Add(block3.ID()) + votesFor3 := bag.Of(block3.ID()) require.NoError(sm.RecordPoll(context.Background(), votesFor3)) require.False(sm.Finalized()) require.Equal(block2.ID(), sm.Preference()) @@ -773,12 +764,10 @@ func RecordPollInvalidVoteTest(t *testing.T, factory Factory) { require.NoError(sm.Add(context.Background(), block)) - validVotes := bag.Bag[ids.ID]{} - validVotes.Add(block.ID()) + validVotes := bag.Of(block.ID()) require.NoError(sm.RecordPoll(context.Background(), validVotes)) - invalidVotes := bag.Bag[ids.ID]{} - invalidVotes.Add(unknownBlockID) + invalidVotes := bag.Of(unknownBlockID) require.NoError(sm.RecordPoll(context.Background(), invalidVotes)) require.NoError(sm.RecordPoll(context.Background(), validVotes)) require.False(sm.Finalized()) @@ -860,12 +849,7 @@ func RecordPollTransitiveVotingTest(t *testing.T, factory Factory) { // 2 4 // Tail = 2 - votes0_2_4 := bag.Bag[ids.ID]{} - votes0_2_4.Add( - block0.ID(), - block2.ID(), - block4.ID(), - ) + votes0_2_4 := bag.Of(block0.ID(), block2.ID(), block4.ID()) require.NoError(sm.RecordPoll(context.Background(), votes0_2_4)) // Current graph structure: @@ -884,8 +868,7 @@ func RecordPollTransitiveVotingTest(t *testing.T, factory Factory) { require.Equal(choices.Processing, block3.Status()) require.Equal(choices.Processing, block4.Status()) - dep2_2_2 := bag.Bag[ids.ID]{} - dep2_2_2.AddCount(block2.ID(), 3) + dep2_2_2 := bag.Of(block2.ID(), block2.ID(), block2.ID()) require.NoError(sm.RecordPoll(context.Background(), dep2_2_2)) // Current graph structure: @@ -958,8 +941,7 @@ func RecordPollDivergedVotingTest(t *testing.T, factory Factory) { // The first bit is contested as either 0 or 1. When voting for [block0] and // when the first bit is 1, the following bits have been decided to follow // the 255 remaining bits of [block0]. - votes0 := bag.Bag[ids.ID]{} - votes0.Add(block0.ID()) + votes0 := bag.Of(block0.ID()) require.NoError(sm.RecordPoll(context.Background(), votes0)) // Although we are adding in [block2] here - the underlying snowball @@ -994,8 +976,7 @@ func RecordPollDivergedVotingTest(t *testing.T, factory Factory) { // [block0]. When [block0] is accepted, [block1] and [block2] are rejected // as conflicting. [block2]'s child, [block3], is then rejected // transitively. - votes3 := bag.Bag[ids.ID]{} - votes3.Add(block3.ID()) + votes3 := bag.Of(block3.ID()) require.NoError(sm.RecordPoll(context.Background(), votes3)) require.True(sm.Finalized(), "finalized too late") @@ -1062,8 +1043,7 @@ func RecordPollDivergedVotingWithNoConflictingBitTest(t *testing.T, factory Fact // second bit is contested as either 0 or 1. For when the second bit is 1, // the following bits have been decided to follow the 254 remaining bits of // [block0]. - votes0 := bag.Bag[ids.ID]{} - votes0.Add(block0.ID()) + votes0 := bag.Of(block0.ID()) require.NoError(sm.RecordPoll(context.Background(), votes0)) // Although we are adding in [block2] here - the underlying snowball @@ -1098,8 +1078,7 @@ func RecordPollDivergedVotingWithNoConflictingBitTest(t *testing.T, factory Fact // dropped. Although the votes for [block3] are still applied, [block3] will // only be marked as accepted after [block2] is marked as accepted; which // will never happen. - votes3 := bag.Bag[ids.ID]{} - votes3.Add(block3.ID()) + votes3 := bag.Of(block3.ID()) require.NoError(sm.RecordPoll(context.Background(), votes3)) require.False(sm.Finalized(), "finalized too early") @@ -1172,9 +1151,7 @@ func RecordPollChangePreferredChainTest(t *testing.T, factory Factory) { require.False(sm.IsPreferred(b1Block)) require.False(sm.IsPreferred(b2Block)) - b2Votes := bag.Bag[ids.ID]{} - b2Votes.Add(b2Block.ID()) - + b2Votes := bag.Of(b2Block.ID()) require.NoError(sm.RecordPoll(context.Background(), b2Votes)) require.Equal(b2Block.ID(), sm.Preference()) @@ -1183,9 +1160,7 @@ func RecordPollChangePreferredChainTest(t *testing.T, factory Factory) { require.True(sm.IsPreferred(b1Block)) require.True(sm.IsPreferred(b2Block)) - a1Votes := bag.Bag[ids.ID]{} - a1Votes.Add(a1Block.ID()) - + a1Votes := bag.Of(a1Block.ID()) require.NoError(sm.RecordPoll(context.Background(), a1Votes)) require.NoError(sm.RecordPoll(context.Background(), a1Votes)) @@ -1349,8 +1324,7 @@ func ErrorOnAcceptTest(t *testing.T, factory Factory) { require.NoError(sm.Add(context.Background(), block)) - votes := bag.Bag[ids.ID]{} - votes.Add(block.ID()) + votes := bag.Of(block.ID()) err := sm.RecordPoll(context.Background(), votes) require.ErrorIs(err, errTest) } @@ -1395,8 +1369,7 @@ func ErrorOnRejectSiblingTest(t *testing.T, factory Factory) { require.NoError(sm.Add(context.Background(), block0)) require.NoError(sm.Add(context.Background(), block1)) - votes := bag.Bag[ids.ID]{} - votes.Add(block0.ID()) + votes := bag.Of(block0.ID()) err := sm.RecordPoll(context.Background(), votes) require.ErrorIs(err, errTest) } @@ -1450,8 +1423,7 @@ func ErrorOnTransitiveRejectionTest(t *testing.T, factory Factory) { require.NoError(sm.Add(context.Background(), block1)) require.NoError(sm.Add(context.Background(), block2)) - votes := bag.Bag[ids.ID]{} - votes.Add(block0.ID()) + votes := bag.Of(block0.ID()) err := sm.RecordPoll(context.Background(), votes) require.ErrorIs(err, errTest) } diff --git a/snow/consensus/snowman/poll/early_term_no_traversal_test.go b/snow/consensus/snowman/poll/early_term_no_traversal_test.go index 627c97b3398..5b8cb3d3595 100644 --- a/snow/consensus/snowman/poll/early_term_no_traversal_test.go +++ b/snow/consensus/snowman/poll/early_term_no_traversal_test.go @@ -21,8 +21,7 @@ func TestEarlyTermNoTraversalResults(t *testing.T) { vdr1 := ids.NodeID{1} // k = 1 - vdrs := bag.Bag[ids.NodeID]{} - vdrs.Add(vdr1) + vdrs := bag.Of(vdr1) factory := NewEarlyTermNoTraversalFactory(alpha) poll := factory.New(vdrs) @@ -45,11 +44,7 @@ func TestEarlyTermNoTraversalString(t *testing.T) { vdr1 := ids.NodeID{1} vdr2 := ids.NodeID{2} // k = 2 - vdrs := bag.Bag[ids.NodeID]{} - vdrs.Add( - vdr1, - vdr2, - ) + vdrs := bag.Of(vdr1, vdr2) factory := NewEarlyTermNoTraversalFactory(alpha) poll := factory.New(vdrs) @@ -73,11 +68,7 @@ func TestEarlyTermNoTraversalDropsDuplicatedVotes(t *testing.T) { vdr1 := ids.NodeID{1} vdr2 := ids.NodeID{2} // k = 2 - vdrs := bag.Bag[ids.NodeID]{} - vdrs.Add( - vdr1, - vdr2, - ) + vdrs := bag.Of(vdr1, vdr2) factory := NewEarlyTermNoTraversalFactory(alpha) poll := factory.New(vdrs) @@ -105,14 +96,7 @@ func TestEarlyTermNoTraversalTerminatesEarly(t *testing.T) { vdr4 := ids.NodeID{4} vdr5 := ids.NodeID{5} // k = 5 - vdrs := bag.Bag[ids.NodeID]{} - vdrs.Add( - vdr1, - vdr2, - vdr3, - vdr4, - vdr5, - ) + vdrs := bag.Of(vdr1, vdr2, vdr3, vdr4, vdr5) factory := NewEarlyTermNoTraversalFactory(alpha) poll := factory.New(vdrs) @@ -147,13 +131,7 @@ func TestEarlyTermNoTraversalForSharedAncestor(t *testing.T) { vdr3 := ids.NodeID{3} vdr4 := ids.NodeID{4} - vdrs := bag.Bag[ids.NodeID]{} - vdrs.Add( - vdr1, - vdr2, - vdr3, - vdr4, - ) + vdrs := bag.Of(vdr1, vdr2, vdr3, vdr4) factory := NewEarlyTermNoTraversalFactory(alpha) poll := factory.New(vdrs) @@ -180,12 +158,7 @@ func TestEarlyTermNoTraversalWithFastDrops(t *testing.T) { vdr2 := ids.NodeID{2} vdr3 := ids.NodeID{3} // k = 3 - vdrs := bag.Bag[ids.NodeID]{} - vdrs.Add( - vdr1, - vdr2, - vdr3, - ) + vdrs := bag.Of(vdr1, vdr2, vdr3) factory := NewEarlyTermNoTraversalFactory(alpha) poll := factory.New(vdrs) @@ -207,12 +180,7 @@ func TestEarlyTermNoTraversalWithWeightedResponses(t *testing.T) { vdr1 := ids.NodeID{2} vdr2 := ids.NodeID{3} - vdrs := bag.Bag[ids.NodeID]{} - vdrs.Add( - vdr1, - vdr2, - vdr2, - ) // k = 3 + vdrs := bag.Of(vdr1, vdr2, vdr2) // k = 3 factory := NewEarlyTermNoTraversalFactory(alpha) poll := factory.New(vdrs) @@ -233,12 +201,7 @@ func TestEarlyTermNoTraversalDropWithWeightedResponses(t *testing.T) { vdr1 := ids.NodeID{1} vdr2 := ids.NodeID{2} - vdrs := bag.Bag[ids.NodeID]{} - vdrs.Add( - vdr1, - vdr2, - vdr2, - ) // k = 3 + vdrs := bag.Of(vdr1, vdr2, vdr2) // k = 3 factory := NewEarlyTermNoTraversalFactory(alpha) poll := factory.New(vdrs) diff --git a/snow/consensus/snowman/poll/no_early_term_test.go b/snow/consensus/snowman/poll/no_early_term_test.go index 415c46b2e25..cd130ca7e27 100644 --- a/snow/consensus/snowman/poll/no_early_term_test.go +++ b/snow/consensus/snowman/poll/no_early_term_test.go @@ -19,8 +19,7 @@ func TestNoEarlyTermResults(t *testing.T) { vdr1 := ids.NodeID{1} // k = 1 - vdrs := bag.Bag[ids.NodeID]{} - vdrs.Add(vdr1) + vdrs := bag.Of(vdr1) factory := NewNoEarlyTermFactory() poll := factory.New(vdrs) @@ -41,11 +40,7 @@ func TestNoEarlyTermString(t *testing.T) { vdr1 := ids.NodeID{1} vdr2 := ids.NodeID{2} // k = 2 - vdrs := bag.Bag[ids.NodeID]{} - vdrs.Add( - vdr1, - vdr2, - ) + vdrs := bag.Of(vdr1, vdr2) factory := NewNoEarlyTermFactory() poll := factory.New(vdrs) @@ -67,11 +62,7 @@ func TestNoEarlyTermDropsDuplicatedVotes(t *testing.T) { vdr1 := ids.NodeID{1} vdr2 := ids.NodeID{2} // k = 2 - vdrs := bag.Bag[ids.NodeID]{} - vdrs.Add( - vdr1, - vdr2, - ) + vdrs := bag.Of(vdr1, vdr2) factory := NewNoEarlyTermFactory() poll := factory.New(vdrs) diff --git a/snow/consensus/snowman/poll/set_test.go b/snow/consensus/snowman/poll/set_test.go index 316f0dcb851..775d6ecd109 100644 --- a/snow/consensus/snowman/poll/set_test.go +++ b/snow/consensus/snowman/poll/set_test.go @@ -50,12 +50,10 @@ func TestCreateAndFinishPollOutOfOrder_NewerFinishesFirst(t *testing.T) { vdrs := []ids.NodeID{vdr1, vdr2, vdr3} // create two polls for the two vtxs - vdrBag := bag.Bag[ids.NodeID]{} - vdrBag.Add(vdrs...) + vdrBag := bag.Of(vdrs...) require.True(s.Add(1, vdrBag)) - vdrBag = bag.Bag[ids.NodeID]{} - vdrBag.Add(vdrs...) + vdrBag = bag.Of(vdrs...) require.True(s.Add(2, vdrBag)) require.Equal(s.Len(), 2) @@ -64,8 +62,6 @@ func TestCreateAndFinishPollOutOfOrder_NewerFinishesFirst(t *testing.T) { vtx1 := ids.ID{1} vtx2 := ids.ID{2} - var results []bag.Bag[ids.ID] - // vote out of order require.Empty(s.Vote(1, vdr1, vtx1)) require.Empty(s.Vote(2, vdr2, vtx2)) @@ -76,7 +72,7 @@ func TestCreateAndFinishPollOutOfOrder_NewerFinishesFirst(t *testing.T) { require.Empty(s.Vote(1, vdr2, vtx1)) - results = s.Vote(1, vdr3, vtx1) // poll 1 finished, poll 2 should be finished as well + results := s.Vote(1, vdr3, vtx1) // poll 1 finished, poll 2 should be finished as well require.Len(results, 2) require.Equal(vtx1, results[0].List()[0]) require.Equal(vtx2, results[1].List()[0]) @@ -99,12 +95,10 @@ func TestCreateAndFinishPollOutOfOrder_OlderFinishesFirst(t *testing.T) { vdrs := []ids.NodeID{vdr1, vdr2, vdr3} // create two polls for the two vtxs - vdrBag := bag.Bag[ids.NodeID]{} - vdrBag.Add(vdrs...) + vdrBag := bag.Of(vdrs...) require.True(s.Add(1, vdrBag)) - vdrBag = bag.Bag[ids.NodeID]{} - vdrBag.Add(vdrs...) + vdrBag = bag.Of(vdrs...) require.True(s.Add(2, vdrBag)) require.Equal(s.Len(), 2) @@ -113,8 +107,6 @@ func TestCreateAndFinishPollOutOfOrder_OlderFinishesFirst(t *testing.T) { vtx1 := ids.ID{1} vtx2 := ids.ID{2} - var results []bag.Bag[ids.ID] - // vote out of order require.Empty(s.Vote(1, vdr1, vtx1)) require.Empty(s.Vote(2, vdr2, vtx2)) @@ -122,8 +114,8 @@ func TestCreateAndFinishPollOutOfOrder_OlderFinishesFirst(t *testing.T) { require.Empty(s.Vote(1, vdr2, vtx1)) - results = s.Vote(1, vdr3, vtx1) // poll 1 finished, poll 2 still remaining - require.Len(results, 1) // because 1 is the oldest + results := s.Vote(1, vdr3, vtx1) // poll 1 finished, poll 2 still remaining + require.Len(results, 1) // because 1 is the oldest require.Equal(vtx1, results[0].List()[0]) results = s.Vote(2, vdr1, vtx2) // poll 2 finished @@ -148,16 +140,13 @@ func TestCreateAndFinishPollOutOfOrder_UnfinishedPollsGaps(t *testing.T) { vdrs := []ids.NodeID{vdr1, vdr2, vdr3} // create three polls for the two vtxs - vdrBag := bag.Bag[ids.NodeID]{} - vdrBag.Add(vdrs...) + vdrBag := bag.Of(vdrs...) require.True(s.Add(1, vdrBag)) - vdrBag = bag.Bag[ids.NodeID]{} - vdrBag.Add(vdrs...) + vdrBag = bag.Of(vdrs...) require.True(s.Add(2, vdrBag)) - vdrBag = bag.Bag[ids.NodeID]{} - vdrBag.Add(vdrs...) + vdrBag = bag.Of(vdrs...) require.True(s.Add(3, vdrBag)) require.Equal(s.Len(), 3) @@ -168,8 +157,6 @@ func TestCreateAndFinishPollOutOfOrder_UnfinishedPollsGaps(t *testing.T) { vtx2 := ids.ID{2} vtx3 := ids.ID{3} - var results []bag.Bag[ids.ID] - // vote out of order // 2 finishes first to create a gap of finished poll between two unfinished polls 1 and 3 require.Empty(s.Vote(2, vdr3, vtx2)) @@ -184,7 +171,7 @@ func TestCreateAndFinishPollOutOfOrder_UnfinishedPollsGaps(t *testing.T) { // 1 finishes now, 2 and 3 have already finished so we expect 3 items in results require.Empty(s.Vote(1, vdr1, vtx1)) require.Empty(s.Vote(1, vdr2, vtx1)) - results = s.Vote(1, vdr3, vtx1) + results := s.Vote(1, vdr3, vtx1) require.Len(results, 3) require.Equal(vtx1, results[0].List()[0]) require.Equal(vtx2, results[1].List()[0]) @@ -205,11 +192,7 @@ func TestCreateAndFinishSuccessfulPoll(t *testing.T) { vdr1 := ids.NodeID{1} vdr2 := ids.NodeID{2} // k = 2 - vdrs := bag.Bag[ids.NodeID]{} - vdrs.Add( - vdr1, - vdr2, - ) + vdrs := bag.Of(vdr1, vdr2) require.Zero(s.Len()) @@ -243,11 +226,7 @@ func TestCreateAndFinishFailedPoll(t *testing.T) { vdr1 := ids.NodeID{1} vdr2 := ids.NodeID{2} // k = 2 - vdrs := bag.Bag[ids.NodeID]{} - vdrs.Add( - vdr1, - vdr2, - ) + vdrs := bag.Of(vdr1, vdr2) require.Zero(s.Len()) @@ -277,8 +256,7 @@ func TestSetString(t *testing.T) { vdr1 := ids.NodeID{1} // k = 1 - vdrs := bag.Bag[ids.NodeID]{} - vdrs.Add(vdr1) + vdrs := bag.Of(vdr1) expected := `current polls: (Size = 1) RequestID 0: diff --git a/snow/engine/snowman/transitive.go b/snow/engine/snowman/transitive.go index 4bde5518273..1450fed0163 100644 --- a/snow/engine/snowman/transitive.go +++ b/snow/engine/snowman/transitive.go @@ -700,8 +700,7 @@ func (t *Transitive) pullQuery(ctx context.Context, blkID ids.ID) { return } - vdrBag := bag.Bag[ids.NodeID]{} - vdrBag.Add(vdrIDs...) + vdrBag := bag.Of(vdrIDs...) t.RequestID++ if t.polls.Add(t.RequestID, vdrBag) { @@ -730,8 +729,7 @@ func (t *Transitive) sendQuery(ctx context.Context, blk snowman.Block, push bool return } - vdrBag := bag.Bag[ids.NodeID]{} - vdrBag.Add(vdrIDs...) + vdrBag := bag.Of(vdrIDs...) t.RequestID++ if t.polls.Add(t.RequestID, vdrBag) { diff --git a/utils/bag/bag.go b/utils/bag/bag.go index 4d9d418add3..496969a01b1 100644 --- a/utils/bag/bag.go +++ b/utils/bag/bag.go @@ -24,6 +24,13 @@ type Bag[T comparable] struct { metThreshold set.Set[T] } +// Of returns a Bag initialized with [elts] +func Of[T comparable](elts ...T) Bag[T] { + var b Bag[T] + b.Add(elts...) + return b +} + func (b *Bag[T]) init() { if b.counts == nil { b.counts = make(map[T]int, minBagSize) diff --git a/utils/bag/bag_test.go b/utils/bag/bag_test.go index ab37c5fd43b..1a42486560a 100644 --- a/utils/bag/bag_test.go +++ b/utils/bag/bag_test.go @@ -9,6 +9,55 @@ import ( "github.com/stretchr/testify/require" ) +func TestBagOf(t *testing.T) { + tests := []struct { + name string + elements []int + expectedCounts map[int]int + }{ + { + name: "nil", + elements: nil, + expectedCounts: map[int]int{}, + }, + { + name: "empty", + elements: []int{}, + expectedCounts: map[int]int{}, + }, + { + name: "unique elements", + elements: []int{1, 2, 3}, + expectedCounts: map[int]int{ + 1: 1, + 2: 1, + 3: 1, + }, + }, + { + name: "duplicate elements", + elements: []int{1, 2, 3, 1, 2, 3}, + expectedCounts: map[int]int{ + 1: 2, + 2: 2, + 3: 2, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + require := require.New(t) + + b := Of(tt.elements...) + + require.Equal(len(tt.elements), b.Len()) + for entry, count := range tt.expectedCounts { + require.Equal(count, b.Count(entry)) + } + }) + } +} + func TestBagAdd(t *testing.T) { require := require.New(t)