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  }