bitbucket.org/number571/tendermint@v0.8.14/internal/mempool/v1/tx_test.go (about)

     1  package v1
     2  
     3  import (
     4  	"fmt"
     5  	"math/rand"
     6  	"sort"
     7  	"testing"
     8  	"time"
     9  
    10  	"bitbucket.org/number571/tendermint/internal/mempool"
    11  	"github.com/stretchr/testify/require"
    12  )
    13  
    14  func TestTxStore_GetTxBySender(t *testing.T) {
    15  	txs := NewTxStore()
    16  	wtx := &WrappedTx{
    17  		tx:        []byte("test_tx"),
    18  		sender:    "foo",
    19  		priority:  1,
    20  		timestamp: time.Now(),
    21  	}
    22  
    23  	res := txs.GetTxBySender(wtx.sender)
    24  	require.Nil(t, res)
    25  
    26  	txs.SetTx(wtx)
    27  
    28  	res = txs.GetTxBySender(wtx.sender)
    29  	require.NotNil(t, res)
    30  	require.Equal(t, wtx, res)
    31  }
    32  
    33  func TestTxStore_GetTxByHash(t *testing.T) {
    34  	txs := NewTxStore()
    35  	wtx := &WrappedTx{
    36  		tx:        []byte("test_tx"),
    37  		sender:    "foo",
    38  		priority:  1,
    39  		timestamp: time.Now(),
    40  	}
    41  
    42  	key := mempool.TxKey(wtx.tx)
    43  	res := txs.GetTxByHash(key)
    44  	require.Nil(t, res)
    45  
    46  	txs.SetTx(wtx)
    47  
    48  	res = txs.GetTxByHash(key)
    49  	require.NotNil(t, res)
    50  	require.Equal(t, wtx, res)
    51  }
    52  
    53  func TestTxStore_SetTx(t *testing.T) {
    54  	txs := NewTxStore()
    55  	wtx := &WrappedTx{
    56  		tx:        []byte("test_tx"),
    57  		priority:  1,
    58  		timestamp: time.Now(),
    59  	}
    60  
    61  	key := mempool.TxKey(wtx.tx)
    62  	txs.SetTx(wtx)
    63  
    64  	res := txs.GetTxByHash(key)
    65  	require.NotNil(t, res)
    66  	require.Equal(t, wtx, res)
    67  
    68  	wtx.sender = "foo"
    69  	txs.SetTx(wtx)
    70  
    71  	res = txs.GetTxByHash(key)
    72  	require.NotNil(t, res)
    73  	require.Equal(t, wtx, res)
    74  }
    75  
    76  func TestTxStore_GetOrSetPeerByTxHash(t *testing.T) {
    77  	txs := NewTxStore()
    78  	wtx := &WrappedTx{
    79  		tx:        []byte("test_tx"),
    80  		priority:  1,
    81  		timestamp: time.Now(),
    82  	}
    83  
    84  	key := mempool.TxKey(wtx.tx)
    85  	txs.SetTx(wtx)
    86  
    87  	res, ok := txs.GetOrSetPeerByTxHash(mempool.TxKey([]byte("test_tx_2")), 15)
    88  	require.Nil(t, res)
    89  	require.False(t, ok)
    90  
    91  	res, ok = txs.GetOrSetPeerByTxHash(key, 15)
    92  	require.NotNil(t, res)
    93  	require.False(t, ok)
    94  
    95  	res, ok = txs.GetOrSetPeerByTxHash(key, 15)
    96  	require.NotNil(t, res)
    97  	require.True(t, ok)
    98  
    99  	require.True(t, txs.TxHasPeer(key, 15))
   100  	require.False(t, txs.TxHasPeer(key, 16))
   101  }
   102  
   103  func TestTxStore_RemoveTx(t *testing.T) {
   104  	txs := NewTxStore()
   105  	wtx := &WrappedTx{
   106  		tx:        []byte("test_tx"),
   107  		priority:  1,
   108  		timestamp: time.Now(),
   109  	}
   110  
   111  	txs.SetTx(wtx)
   112  
   113  	key := mempool.TxKey(wtx.tx)
   114  	res := txs.GetTxByHash(key)
   115  	require.NotNil(t, res)
   116  
   117  	txs.RemoveTx(res)
   118  
   119  	res = txs.GetTxByHash(key)
   120  	require.Nil(t, res)
   121  }
   122  
   123  func TestTxStore_Size(t *testing.T) {
   124  	txStore := NewTxStore()
   125  	numTxs := 1000
   126  
   127  	for i := 0; i < numTxs; i++ {
   128  		txStore.SetTx(&WrappedTx{
   129  			tx:        []byte(fmt.Sprintf("test_tx_%d", i)),
   130  			priority:  int64(i),
   131  			timestamp: time.Now(),
   132  		})
   133  	}
   134  
   135  	require.Equal(t, numTxs, txStore.Size())
   136  }
   137  
   138  func TestWrappedTxList_Reset(t *testing.T) {
   139  	list := NewWrappedTxList(func(wtx1, wtx2 *WrappedTx) bool {
   140  		return wtx1.height >= wtx2.height
   141  	})
   142  
   143  	require.Zero(t, list.Size())
   144  
   145  	for i := 0; i < 100; i++ {
   146  		list.Insert(&WrappedTx{height: int64(i)})
   147  	}
   148  
   149  	require.Equal(t, 100, list.Size())
   150  
   151  	list.Reset()
   152  	require.Zero(t, list.Size())
   153  }
   154  
   155  func TestWrappedTxList_Insert(t *testing.T) {
   156  	list := NewWrappedTxList(func(wtx1, wtx2 *WrappedTx) bool {
   157  		return wtx1.height >= wtx2.height
   158  	})
   159  
   160  	rng := rand.New(rand.NewSource(time.Now().UnixNano()))
   161  
   162  	var expected []int
   163  	for i := 0; i < 100; i++ {
   164  		height := rng.Int63n(10000)
   165  		expected = append(expected, int(height))
   166  		list.Insert(&WrappedTx{height: height})
   167  
   168  		if i%10 == 0 {
   169  			list.Insert(&WrappedTx{height: height})
   170  			expected = append(expected, int(height))
   171  		}
   172  	}
   173  
   174  	got := make([]int, list.Size())
   175  	for i, wtx := range list.txs {
   176  		got[i] = int(wtx.height)
   177  	}
   178  
   179  	sort.Ints(expected)
   180  	require.Equal(t, expected, got)
   181  }
   182  
   183  func TestWrappedTxList_Remove(t *testing.T) {
   184  	list := NewWrappedTxList(func(wtx1, wtx2 *WrappedTx) bool {
   185  		return wtx1.height >= wtx2.height
   186  	})
   187  
   188  	rng := rand.New(rand.NewSource(time.Now().UnixNano()))
   189  
   190  	var txs []*WrappedTx
   191  	for i := 0; i < 100; i++ {
   192  		height := rng.Int63n(10000)
   193  		tx := &WrappedTx{height: height}
   194  
   195  		txs = append(txs, tx)
   196  		list.Insert(tx)
   197  
   198  		if i%10 == 0 {
   199  			tx = &WrappedTx{height: height}
   200  			list.Insert(tx)
   201  			txs = append(txs, tx)
   202  		}
   203  	}
   204  
   205  	// remove a tx that does not exist
   206  	list.Remove(&WrappedTx{height: 20000})
   207  
   208  	// remove a tx that exists (by height) but not referenced
   209  	list.Remove(&WrappedTx{height: txs[0].height})
   210  
   211  	// remove a few existing txs
   212  	for i := 0; i < 25; i++ {
   213  		j := rng.Intn(len(txs))
   214  		list.Remove(txs[j])
   215  		txs = append(txs[:j], txs[j+1:]...)
   216  	}
   217  
   218  	expected := make([]int, len(txs))
   219  	for i, tx := range txs {
   220  		expected[i] = int(tx.height)
   221  	}
   222  
   223  	got := make([]int, list.Size())
   224  	for i, wtx := range list.txs {
   225  		got[i] = int(wtx.height)
   226  	}
   227  
   228  	sort.Ints(expected)
   229  	require.Equal(t, expected, got)
   230  }