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  }