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