From 178ea47b56138ac122961b6a06d7c69ca4c1fe26 Mon Sep 17 00:00:00 2001 From: Callum Waters Date: Thu, 29 Sep 2022 13:49:21 +0200 Subject: [PATCH] fix mempool tests --- mempool/v0/clist_mempool_test.go | 2 +- mempool/v1/mempool_test.go | 106 +++++++++++++++---------------- 2 files changed, 54 insertions(+), 54 deletions(-) diff --git a/mempool/v0/clist_mempool_test.go b/mempool/v0/clist_mempool_test.go index fbe28d4da..9a20353b0 100644 --- a/mempool/v0/clist_mempool_test.go +++ b/mempool/v0/clist_mempool_test.go @@ -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: } } diff --git a/mempool/v1/mempool_test.go b/mempool/v1/mempool_test.go index 73d03996a..5461859dc 100644 --- a/mempool/v1/mempool_test.go +++ b/mempool/v1/mempool_test.go @@ -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())