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)
|
|
}
|