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 }