github.com/ava-labs/avalanchego@v1.11.11/vms/platformvm/network/gossip_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 network 5 6 import ( 7 "errors" 8 "testing" 9 10 "github.com/prometheus/client_golang/prometheus" 11 "github.com/stretchr/testify/require" 12 "go.uber.org/mock/gomock" 13 14 "github.com/ava-labs/avalanchego/ids" 15 "github.com/ava-labs/avalanchego/utils/logging" 16 "github.com/ava-labs/avalanchego/vms/platformvm/txs" 17 "github.com/ava-labs/avalanchego/vms/platformvm/txs/mempool/mempoolmock" 18 "github.com/ava-labs/avalanchego/vms/txs/mempool" 19 ) 20 21 var errFoo = errors.New("foo") 22 23 // Add should error if verification errors 24 func TestGossipMempoolAddVerificationError(t *testing.T) { 25 require := require.New(t) 26 ctrl := gomock.NewController(t) 27 28 txID := ids.GenerateTestID() 29 tx := &txs.Tx{ 30 TxID: txID, 31 } 32 33 mempool := mempoolmock.NewMempool(ctrl) 34 txVerifier := testTxVerifier{err: errFoo} 35 36 mempool.EXPECT().Get(txID).Return(nil, false) 37 mempool.EXPECT().GetDropReason(txID).Return(nil) 38 mempool.EXPECT().MarkDropped(txID, errFoo) 39 40 gossipMempool, err := newGossipMempool( 41 mempool, 42 prometheus.NewRegistry(), 43 logging.NoLog{}, 44 txVerifier, 45 testConfig.ExpectedBloomFilterElements, 46 testConfig.ExpectedBloomFilterFalsePositiveProbability, 47 testConfig.MaxBloomFilterFalsePositiveProbability, 48 ) 49 require.NoError(err) 50 51 err = gossipMempool.Add(tx) 52 require.ErrorIs(err, errFoo) 53 require.False(gossipMempool.bloom.Has(tx)) 54 } 55 56 // Add should error if adding to the mempool errors 57 func TestGossipMempoolAddError(t *testing.T) { 58 require := require.New(t) 59 ctrl := gomock.NewController(t) 60 61 txID := ids.GenerateTestID() 62 tx := &txs.Tx{ 63 TxID: txID, 64 } 65 66 txVerifier := testTxVerifier{} 67 mempool := mempoolmock.NewMempool(ctrl) 68 69 mempool.EXPECT().Get(txID).Return(nil, false) 70 mempool.EXPECT().GetDropReason(txID).Return(nil) 71 mempool.EXPECT().Add(tx).Return(errFoo) 72 mempool.EXPECT().MarkDropped(txID, errFoo).AnyTimes() 73 74 gossipMempool, err := newGossipMempool( 75 mempool, 76 prometheus.NewRegistry(), 77 logging.NoLog{}, 78 txVerifier, 79 testConfig.ExpectedBloomFilterElements, 80 testConfig.ExpectedBloomFilterFalsePositiveProbability, 81 testConfig.MaxBloomFilterFalsePositiveProbability, 82 ) 83 require.NoError(err) 84 85 err = gossipMempool.Add(tx) 86 require.ErrorIs(err, errFoo) 87 require.False(gossipMempool.bloom.Has(tx)) 88 } 89 90 // Adding a duplicate to the mempool should return an error 91 func TestMempoolDuplicate(t *testing.T) { 92 require := require.New(t) 93 ctrl := gomock.NewController(t) 94 95 testMempool := mempoolmock.NewMempool(ctrl) 96 txVerifier := testTxVerifier{} 97 98 txID := ids.GenerateTestID() 99 tx := &txs.Tx{ 100 TxID: txID, 101 } 102 103 testMempool.EXPECT().Get(txID).Return(tx, true) 104 105 gossipMempool, err := newGossipMempool( 106 testMempool, 107 prometheus.NewRegistry(), 108 logging.NoLog{}, 109 txVerifier, 110 testConfig.ExpectedBloomFilterElements, 111 testConfig.ExpectedBloomFilterFalsePositiveProbability, 112 testConfig.MaxBloomFilterFalsePositiveProbability, 113 ) 114 require.NoError(err) 115 116 err = gossipMempool.Add(tx) 117 require.ErrorIs(err, mempool.ErrDuplicateTx) 118 require.False(gossipMempool.bloom.Has(tx)) 119 } 120 121 // Adding a tx to the mempool should add it to the bloom filter 122 func TestGossipAddBloomFilter(t *testing.T) { 123 require := require.New(t) 124 ctrl := gomock.NewController(t) 125 126 txID := ids.GenerateTestID() 127 tx := &txs.Tx{ 128 TxID: txID, 129 } 130 131 txVerifier := testTxVerifier{} 132 mempool := mempoolmock.NewMempool(ctrl) 133 134 mempool.EXPECT().Get(txID).Return(nil, false) 135 mempool.EXPECT().GetDropReason(txID).Return(nil) 136 mempool.EXPECT().Add(tx).Return(nil) 137 mempool.EXPECT().Len().Return(0) 138 mempool.EXPECT().RequestBuildBlock(false) 139 140 gossipMempool, err := newGossipMempool( 141 mempool, 142 prometheus.NewRegistry(), 143 logging.NoLog{}, 144 txVerifier, 145 testConfig.ExpectedBloomFilterElements, 146 testConfig.ExpectedBloomFilterFalsePositiveProbability, 147 testConfig.MaxBloomFilterFalsePositiveProbability, 148 ) 149 require.NoError(err) 150 151 require.NoError(gossipMempool.Add(tx)) 152 require.True(gossipMempool.bloom.Has(tx)) 153 }