package mempool import ( "fmt" "math/rand" "sort" "testing" "time" "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/types" ) func TestTxStore_GetTxBySender(t *testing.T) { txs := NewTxStore() wtx := &WrappedTx{ tx: []byte("test_tx"), sender: "foo", priority: 1, timestamp: time.Now(), } res := txs.GetTxBySender(wtx.sender) require.Nil(t, res) txs.SetTx(wtx) res = txs.GetTxBySender(wtx.sender) require.NotNil(t, res) require.Equal(t, wtx, res) } func TestTxStore_GetTxByHash(t *testing.T) { txs := NewTxStore() wtx := &WrappedTx{ tx: []byte("test_tx"), sender: "foo", priority: 1, timestamp: time.Now(), } key := wtx.tx.Key() res := txs.GetTxByHash(key) require.Nil(t, res) txs.SetTx(wtx) res = txs.GetTxByHash(key) require.NotNil(t, res) require.Equal(t, wtx, res) } func TestTxStore_SetTx(t *testing.T) { txs := NewTxStore() wtx := &WrappedTx{ tx: []byte("test_tx"), priority: 1, timestamp: time.Now(), } key := wtx.tx.Key() txs.SetTx(wtx) res := txs.GetTxByHash(key) require.NotNil(t, res) require.Equal(t, wtx, res) wtx.sender = "foo" txs.SetTx(wtx) res = txs.GetTxByHash(key) require.NotNil(t, res) require.Equal(t, wtx, res) } func TestTxStore_GetOrSetPeerByTxHash(t *testing.T) { txs := NewTxStore() wtx := &WrappedTx{ tx: []byte("test_tx"), priority: 1, timestamp: time.Now(), } key := wtx.tx.Key() txs.SetTx(wtx) res, ok := txs.GetOrSetPeerByTxHash(types.Tx([]byte("test_tx_2")).Key(), 15) require.Nil(t, res) require.False(t, ok) res, ok = txs.GetOrSetPeerByTxHash(key, 15) require.NotNil(t, res) require.False(t, ok) res, ok = txs.GetOrSetPeerByTxHash(key, 15) require.NotNil(t, res) require.True(t, ok) require.True(t, txs.TxHasPeer(key, 15)) require.False(t, txs.TxHasPeer(key, 16)) } func TestTxStore_RemoveTx(t *testing.T) { txs := NewTxStore() wtx := &WrappedTx{ tx: []byte("test_tx"), priority: 1, timestamp: time.Now(), } txs.SetTx(wtx) key := wtx.tx.Key() res := txs.GetTxByHash(key) require.NotNil(t, res) txs.RemoveTx(res) res = txs.GetTxByHash(key) require.Nil(t, res) } func TestTxStore_Size(t *testing.T) { txStore := NewTxStore() numTxs := 1000 for i := 0; i < numTxs; i++ { txStore.SetTx(&WrappedTx{ tx: []byte(fmt.Sprintf("test_tx_%d", i)), priority: int64(i), timestamp: time.Now(), }) } require.Equal(t, numTxs, txStore.Size()) } func TestWrappedTxList_Reset(t *testing.T) { list := NewWrappedTxList(func(wtx1, wtx2 *WrappedTx) bool { return wtx1.height >= wtx2.height }) require.Zero(t, list.Size()) for i := 0; i < 100; i++ { list.Insert(&WrappedTx{height: int64(i)}) } require.Equal(t, 100, list.Size()) list.Reset() require.Zero(t, list.Size()) } func TestWrappedTxList_Insert(t *testing.T) { list := NewWrappedTxList(func(wtx1, wtx2 *WrappedTx) bool { return wtx1.height >= wtx2.height }) rng := rand.New(rand.NewSource(time.Now().UnixNano())) var expected []int for i := 0; i < 100; i++ { height := rng.Int63n(10000) expected = append(expected, int(height)) list.Insert(&WrappedTx{height: height}) if i%10 == 0 { list.Insert(&WrappedTx{height: height}) expected = append(expected, int(height)) } } got := make([]int, list.Size()) for i, wtx := range list.txs { got[i] = int(wtx.height) } sort.Ints(expected) require.Equal(t, expected, got) } func TestWrappedTxList_Remove(t *testing.T) { list := NewWrappedTxList(func(wtx1, wtx2 *WrappedTx) bool { return wtx1.height >= wtx2.height }) rng := rand.New(rand.NewSource(time.Now().UnixNano())) var txs []*WrappedTx for i := 0; i < 100; i++ { height := rng.Int63n(10000) tx := &WrappedTx{height: height} txs = append(txs, tx) list.Insert(tx) if i%10 == 0 { tx = &WrappedTx{height: height} list.Insert(tx) txs = append(txs, tx) } } // remove a tx that does not exist list.Remove(&WrappedTx{height: 20000}) // remove a tx that exists (by height) but not referenced list.Remove(&WrappedTx{height: txs[0].height}) // remove a few existing txs for i := 0; i < 25; i++ { j := rng.Intn(len(txs)) list.Remove(txs[j]) txs = append(txs[:j], txs[j+1:]...) } expected := make([]int, len(txs)) for i, tx := range txs { expected[i] = int(tx.height) } got := make([]int, list.Size()) for i, wtx := range list.txs { got[i] = int(wtx.height) } sort.Ints(expected) require.Equal(t, expected, got) }