fix mempool tests

This commit is contained in:
Callum Waters
2022-09-29 13:49:21 +02:00
parent e9ce605aa3
commit 178ea47b56
2 changed files with 54 additions and 54 deletions
+1 -1
View File
@@ -81,7 +81,7 @@ func ensureNoFire(t *testing.T, ch <-chan struct{}, timeoutMS int) {
timer := time.NewTimer(time.Duration(timeoutMS) * time.Millisecond)
select {
case <-ch:
panic("Expected not to fire")
t.Fatal("Expected not to fire")
case <-timer.C:
}
}
+53 -53
View File
@@ -44,8 +44,8 @@ func (app *application) CheckTx(_ context.Context, req *abci.RequestCheckTx) (*a
// infer the priority from the raw transaction value (sender=key=value)
parts := bytes.Split(req.Tx, []byte("="))
if len(parts) == 3 {
v, err := strconv.ParseInt(string(parts[2]), 10, 64)
if len(parts) == 2 {
v, err := strconv.ParseInt(string(parts[1]), 10, 64)
if err != nil {
return &abci.ResponseCheckTx{
Priority: priority,
@@ -55,6 +55,8 @@ func (app *application) CheckTx(_ context.Context, req *abci.RequestCheckTx) (*a
}
priority = v
parts = bytes.Split(parts[0], []byte("/"))
sender = string(parts[0])
} else {
return &abci.ResponseCheckTx{
@@ -112,17 +114,15 @@ func checkTxs(t *testing.T, txmp *TxMempool, numTxs int, peerID uint16) []testTx
rng := rand.New(rand.NewSource(time.Now().UnixNano()))
for i := 0; i < numTxs; i++ {
prefix := make([]byte, 20)
_, err := rng.Read(prefix)
require.NoError(t, err)
priority := int64(rng.Intn(9999-1000) + 1000)
txs[i] = testTx{
tx: []byte(fmt.Sprintf("sender-%d-%d=%X=%d", i, peerID, prefix, priority)),
tx: []byte(fmt.Sprintf("sender-%d-%d=%d", i, peerID, priority)),
priority: priority,
}
require.NoError(t, txmp.CheckTx(txs[i].tx, nil, txInfo))
require.NoError(t, txmp.CheckTx(txs[i].tx, func (resp *abci.ResponseCheckTx) {
require.False(t, resp.IsErr(), txs[i].tx)
}, txInfo))
}
return txs
@@ -186,7 +186,7 @@ func TestTxMempool_Size(t *testing.T) {
txmp := setup(t, 0)
txs := checkTxs(t, txmp, 100, 0)
require.Equal(t, len(txs), txmp.Size())
require.Equal(t, int64(5690), txmp.SizeBytes())
require.Equal(t, int64(1590), txmp.SizeBytes())
rawTxs := make([]types.Tx, len(txs))
for i, tx := range txs {
@@ -203,7 +203,7 @@ func TestTxMempool_Size(t *testing.T) {
txmp.Unlock()
require.Equal(t, len(rawTxs)/2, txmp.Size())
require.Equal(t, int64(2850), txmp.SizeBytes())
require.Equal(t, int64(800), txmp.SizeBytes())
}
func TestTxMempool_Eviction(t *testing.T) {
@@ -220,12 +220,12 @@ func TestTxMempool_Eviction(t *testing.T) {
// A transaction bigger than the mempool should be rejected even when there
// are slots available.
mustCheckTx(t, txmp, "big=0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef=1")
mustCheckTx(t, txmp, "big0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef=1")
require.Equal(t, 0, txmp.Size())
// Nearly-fill the mempool with a low-priority transaction, to show that it
// is evicted even when slots are available for a higher-priority tx.
const bigTx = "big=0123456789abcdef0123456789abcdef0123456789abcdef01234=2"
const bigTx = "big0123456789abcdef0123456789abcdef0123456789abcdef01234=2"
mustCheckTx(t, txmp, bigTx)
require.Equal(t, 1, txmp.Size()) // bigTx is the only element
require.True(t, txExists(bigTx))
@@ -233,55 +233,55 @@ func TestTxMempool_Eviction(t *testing.T) {
// The next transaction should evict bigTx, because it is higher priority
// but does not fit on size.
mustCheckTx(t, txmp, "key1=0000=25")
require.True(t, txExists("key1=0000=25"))
mustCheckTx(t, txmp, "key1=25")
require.True(t, txExists("key1=25"))
require.False(t, txExists(bigTx))
require.False(t, txmp.cache.Has([]byte(bigTx)))
require.Equal(t, int64(len("key1=0000=25")), txmp.SizeBytes())
require.Equal(t, int64(len("key1=25")), txmp.SizeBytes())
// Now fill up the rest of the slots with other transactions.
mustCheckTx(t, txmp, "key2=0001=5")
mustCheckTx(t, txmp, "key3=0002=10")
mustCheckTx(t, txmp, "key4=0003=3")
mustCheckTx(t, txmp, "key5=0004=3")
mustCheckTx(t, txmp, "key2=5")
mustCheckTx(t, txmp, "key3=10")
mustCheckTx(t, txmp, "key4=3")
mustCheckTx(t, txmp, "key5=3")
// A new transaction with low priority should be discarded.
mustCheckTx(t, txmp, "key6=0005=1")
require.False(t, txExists("key6=0005=1"))
mustCheckTx(t, txmp, "key6=1")
require.False(t, txExists("key6=1"))
// A new transaction with higher priority should evict key5, which is the
// newest of the two transactions with lowest priority.
mustCheckTx(t, txmp, "key7=0006=7")
require.True(t, txExists("key7=0006=7")) // new transaction added
require.False(t, txExists("key5=0004=3")) // newest low-priority tx evicted
require.True(t, txExists("key4=0003=3")) // older low-priority tx retained
mustCheckTx(t, txmp, "key7=7")
require.True(t, txExists("key7=7")) // new transaction added
require.False(t, txExists("key5=3")) // newest low-priority tx evicted
require.True(t, txExists("key4=3")) // older low-priority tx retained
// Another new transaction evicts the other low-priority element.
mustCheckTx(t, txmp, "key8=0007=20")
require.True(t, txExists("key8=0007=20"))
require.False(t, txExists("key4=0003=3"))
mustCheckTx(t, txmp, "key8=20")
require.True(t, txExists("key8=20"))
require.False(t, txExists("key4=3"))
// Now the lowest-priority tx is 5, so that should be the next to go.
mustCheckTx(t, txmp, "key9=0008=9")
require.True(t, txExists("key9=0008=9"))
require.False(t, txExists("k3y2=0001=5"))
mustCheckTx(t, txmp, "key9=9")
require.True(t, txExists("key9=9"))
require.False(t, txExists("k3y2=5"))
// Add a transaction that requires eviction of multiple lower-priority
// entries, in order to fit the size of the element.
mustCheckTx(t, txmp, "key10=0123456789abcdef=11") // evict 10, 9, 7; keep 25, 20, 11
require.True(t, txExists("key1=0000=25"))
require.True(t, txExists("key8=0007=20"))
require.True(t, txExists("key10=0123456789abcdef=11"))
require.False(t, txExists("key3=0002=10"))
require.False(t, txExists("key9=0008=9"))
require.False(t, txExists("key7=0006=7"))
mustCheckTx(t, txmp, "key0123456789=11") // evict 10, 9, 7; keep 25, 20, 11
require.True(t, txExists("key1=25"))
require.True(t, txExists("key8=20"))
require.True(t, txExists("key0123456789=11"))
require.False(t, txExists("key3=10"))
require.False(t, txExists("key9=9"))
require.False(t, txExists("key7=7"))
}
func TestTxMempool_Flush(t *testing.T) {
txmp := setup(t, 0)
txs := checkTxs(t, txmp, 100, 0)
require.Equal(t, len(txs), txmp.Size())
require.Equal(t, int64(5690), txmp.SizeBytes())
require.Equal(t, int64(1590), txmp.SizeBytes())
rawTxs := make([]types.Tx, len(txs))
for i, tx := range txs {
@@ -306,7 +306,7 @@ func TestTxMempool_ReapMaxBytesMaxGas(t *testing.T) {
txmp := setup(t, 0)
tTxs := checkTxs(t, txmp, 100, 0) // all txs request 1 gas unit
require.Equal(t, len(tTxs), txmp.Size())
require.Equal(t, int64(5690), txmp.SizeBytes())
require.Equal(t, int64(1590), txmp.SizeBytes())
txMap := make(map[types.TxKey]testTx)
priorities := make([]int64, len(tTxs))
@@ -333,22 +333,22 @@ func TestTxMempool_ReapMaxBytesMaxGas(t *testing.T) {
reapedTxs := txmp.ReapMaxBytesMaxGas(-1, 50)
ensurePrioritized(reapedTxs)
require.Equal(t, len(tTxs), txmp.Size())
require.Equal(t, int64(5690), txmp.SizeBytes())
require.Equal(t, int64(1590), txmp.SizeBytes())
require.Len(t, reapedTxs, 50)
// reap by transaction bytes only
reapedTxs = txmp.ReapMaxBytesMaxGas(1000, -1)
ensurePrioritized(reapedTxs)
require.Equal(t, len(tTxs), txmp.Size())
require.Equal(t, int64(5690), txmp.SizeBytes())
require.Equal(t, int64(1590), txmp.SizeBytes())
require.GreaterOrEqual(t, len(reapedTxs), 16)
// Reap by both transaction bytes and gas, where the size yields 31 reaped
// transactions and the gas limit reaps 25 transactions.
reapedTxs = txmp.ReapMaxBytesMaxGas(1500, 30)
reapedTxs = txmp.ReapMaxBytesMaxGas(1500, 25)
ensurePrioritized(reapedTxs)
require.Equal(t, len(tTxs), txmp.Size())
require.Equal(t, int64(5690), txmp.SizeBytes())
require.Equal(t, int64(1590), txmp.SizeBytes())
require.Len(t, reapedTxs, 25)
}
@@ -356,7 +356,7 @@ func TestTxMempool_ReapMaxTxs(t *testing.T) {
txmp := setup(t, 0)
tTxs := checkTxs(t, txmp, 100, 0)
require.Equal(t, len(tTxs), txmp.Size())
require.Equal(t, int64(5690), txmp.SizeBytes())
require.Equal(t, int64(1590), txmp.SizeBytes())
txMap := make(map[types.TxKey]testTx)
priorities := make([]int64, len(tTxs))
@@ -383,21 +383,21 @@ func TestTxMempool_ReapMaxTxs(t *testing.T) {
reapedTxs := txmp.ReapMaxTxs(-1)
ensurePrioritized(reapedTxs)
require.Equal(t, len(tTxs), txmp.Size())
require.Equal(t, int64(5690), txmp.SizeBytes())
require.Equal(t, int64(1590), txmp.SizeBytes())
require.Len(t, reapedTxs, len(tTxs))
// reap a single transaction
reapedTxs = txmp.ReapMaxTxs(1)
ensurePrioritized(reapedTxs)
require.Equal(t, len(tTxs), txmp.Size())
require.Equal(t, int64(5690), txmp.SizeBytes())
require.Equal(t, int64(1590), txmp.SizeBytes())
require.Len(t, reapedTxs, 1)
// reap half of the transactions
reapedTxs = txmp.ReapMaxTxs(len(tTxs) / 2)
ensurePrioritized(reapedTxs)
require.Equal(t, len(tTxs), txmp.Size())
require.Equal(t, int64(5690), txmp.SizeBytes())
require.Equal(t, int64(1590), txmp.SizeBytes())
require.Len(t, reapedTxs, len(tTxs)/2)
}
@@ -405,13 +405,13 @@ func TestTxMempool_CheckTxExceedsMaxSize(t *testing.T) {
txmp := setup(t, 0)
rng := rand.New(rand.NewSource(time.Now().UnixNano()))
tx := make([]byte, txmp.config.MaxTxBytes+1)
tx := kvstore.NewRandomTx(txmp.config.MaxTxBytes+1)
_, err := rng.Read(tx)
require.NoError(t, err)
require.Error(t, txmp.CheckTx(tx, nil, mempool.TxInfo{SenderID: 0}))
tx = make([]byte, txmp.config.MaxTxBytes-1)
tx = kvstore.NewRandomTx(txmp.config.MaxTxBytes-1)
_, err = rng.Read(tx)
require.NoError(t, err)
@@ -427,7 +427,7 @@ func TestTxMempool_CheckTxSamePeer(t *testing.T) {
_, err := rng.Read(prefix)
require.NoError(t, err)
tx := []byte(fmt.Sprintf("sender-0=%X=%d", prefix, 50))
tx := []byte(fmt.Sprintf("sender/%X=%d", prefix, 50))
require.NoError(t, txmp.CheckTx(tx, nil, mempool.TxInfo{SenderID: peerID}))
require.Error(t, txmp.CheckTx(tx, nil, mempool.TxInfo{SenderID: peerID}))
@@ -446,8 +446,8 @@ func TestTxMempool_CheckTxSameSender(t *testing.T) {
_, err = rng.Read(prefix2)
require.NoError(t, err)
tx1 := []byte(fmt.Sprintf("sender-0=%X=%d", prefix1, 50))
tx2 := []byte(fmt.Sprintf("sender-0=%X=%d", prefix2, 50))
tx1 := []byte(fmt.Sprintf("sender/%X=%d", prefix1, 50))
tx2 := []byte(fmt.Sprintf("sender/%X=%d", prefix2, 50))
require.NoError(t, txmp.CheckTx(tx1, nil, mempool.TxInfo{SenderID: peerID}))
require.Equal(t, 1, txmp.Size())