|
@ -72,30 +72,18 @@ func (app *application) CheckTx(req abci.RequestCheckTx) abci.ResponseCheckTx { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
func setup(ctx context.Context, t testing.TB, cacheSize int, options ...TxMempoolOption) *TxMempool { |
|
|
|
|
|
|
|
|
func setup(ctx context.Context, t testing.TB, app abciclient.Client, cacheSize int, options ...TxMempoolOption) *TxMempool { |
|
|
t.Helper() |
|
|
t.Helper() |
|
|
|
|
|
|
|
|
var cancel context.CancelFunc |
|
|
|
|
|
ctx, cancel = context.WithCancel(ctx) |
|
|
|
|
|
|
|
|
|
|
|
logger := log.TestingLogger() |
|
|
logger := log.TestingLogger() |
|
|
|
|
|
|
|
|
conn := abciclient.NewLocalClient(logger, &application{ |
|
|
|
|
|
kvstore.NewApplication(), |
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
cfg, err := config.ResetTestRoot(t.TempDir(), strings.ReplaceAll(t.Name(), "/", "|")) |
|
|
cfg, err := config.ResetTestRoot(t.TempDir(), strings.ReplaceAll(t.Name(), "/", "|")) |
|
|
require.NoError(t, err) |
|
|
require.NoError(t, err) |
|
|
cfg.Mempool.CacheSize = cacheSize |
|
|
cfg.Mempool.CacheSize = cacheSize |
|
|
require.NoError(t, conn.Start(ctx)) |
|
|
|
|
|
|
|
|
|
|
|
t.Cleanup(func() { |
|
|
|
|
|
os.RemoveAll(cfg.RootDir) |
|
|
|
|
|
cancel() |
|
|
|
|
|
conn.Wait() |
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
t.Cleanup(func() { os.RemoveAll(cfg.RootDir) }) |
|
|
|
|
|
|
|
|
return NewTxMempool(logger.With("test", t.Name()), cfg.Mempool, conn, options...) |
|
|
|
|
|
|
|
|
return NewTxMempool(logger.With("test", t.Name()), cfg.Mempool, app, options...) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
func checkTxs(ctx context.Context, t *testing.T, txmp *TxMempool, numTxs int, peerID uint16) []testTx { |
|
|
func checkTxs(ctx context.Context, t *testing.T, txmp *TxMempool, numTxs int, peerID uint16) []testTx { |
|
@ -137,7 +125,13 @@ func TestTxMempool_TxsAvailable(t *testing.T) { |
|
|
ctx, cancel := context.WithCancel(context.Background()) |
|
|
ctx, cancel := context.WithCancel(context.Background()) |
|
|
defer cancel() |
|
|
defer cancel() |
|
|
|
|
|
|
|
|
txmp := setup(ctx, t, 0) |
|
|
|
|
|
|
|
|
client := abciclient.NewLocalClient(log.NewNopLogger(), &application{Application: kvstore.NewApplication()}) |
|
|
|
|
|
if err := client.Start(ctx); err != nil { |
|
|
|
|
|
t.Fatal(err) |
|
|
|
|
|
} |
|
|
|
|
|
t.Cleanup(client.Wait) |
|
|
|
|
|
|
|
|
|
|
|
txmp := setup(ctx, t, client, 0) |
|
|
txmp.EnableTxsAvailable() |
|
|
txmp.EnableTxsAvailable() |
|
|
|
|
|
|
|
|
ensureNoTxFire := func() { |
|
|
ensureNoTxFire := func() { |
|
@ -194,7 +188,13 @@ func TestTxMempool_Size(t *testing.T) { |
|
|
ctx, cancel := context.WithCancel(context.Background()) |
|
|
ctx, cancel := context.WithCancel(context.Background()) |
|
|
defer cancel() |
|
|
defer cancel() |
|
|
|
|
|
|
|
|
txmp := setup(ctx, t, 0) |
|
|
|
|
|
|
|
|
client := abciclient.NewLocalClient(log.NewNopLogger(), &application{Application: kvstore.NewApplication()}) |
|
|
|
|
|
if err := client.Start(ctx); err != nil { |
|
|
|
|
|
t.Fatal(err) |
|
|
|
|
|
} |
|
|
|
|
|
t.Cleanup(client.Wait) |
|
|
|
|
|
|
|
|
|
|
|
txmp := setup(ctx, t, client, 0) |
|
|
txs := checkTxs(ctx, t, txmp, 100, 0) |
|
|
txs := checkTxs(ctx, t, txmp, 100, 0) |
|
|
require.Equal(t, len(txs), txmp.Size()) |
|
|
require.Equal(t, len(txs), txmp.Size()) |
|
|
require.Equal(t, int64(5690), txmp.SizeBytes()) |
|
|
require.Equal(t, int64(5690), txmp.SizeBytes()) |
|
@ -221,7 +221,13 @@ func TestTxMempool_Flush(t *testing.T) { |
|
|
ctx, cancel := context.WithCancel(context.Background()) |
|
|
ctx, cancel := context.WithCancel(context.Background()) |
|
|
defer cancel() |
|
|
defer cancel() |
|
|
|
|
|
|
|
|
txmp := setup(ctx, t, 0) |
|
|
|
|
|
|
|
|
client := abciclient.NewLocalClient(log.NewNopLogger(), &application{Application: kvstore.NewApplication()}) |
|
|
|
|
|
if err := client.Start(ctx); err != nil { |
|
|
|
|
|
t.Fatal(err) |
|
|
|
|
|
} |
|
|
|
|
|
t.Cleanup(client.Wait) |
|
|
|
|
|
|
|
|
|
|
|
txmp := setup(ctx, t, client, 0) |
|
|
txs := checkTxs(ctx, t, txmp, 100, 0) |
|
|
txs := checkTxs(ctx, t, txmp, 100, 0) |
|
|
require.Equal(t, len(txs), txmp.Size()) |
|
|
require.Equal(t, len(txs), txmp.Size()) |
|
|
require.Equal(t, int64(5690), txmp.SizeBytes()) |
|
|
require.Equal(t, int64(5690), txmp.SizeBytes()) |
|
@ -249,7 +255,13 @@ func TestTxMempool_ReapMaxBytesMaxGas(t *testing.T) { |
|
|
ctx, cancel := context.WithCancel(context.Background()) |
|
|
ctx, cancel := context.WithCancel(context.Background()) |
|
|
defer cancel() |
|
|
defer cancel() |
|
|
|
|
|
|
|
|
txmp := setup(ctx, t, 0) |
|
|
|
|
|
|
|
|
client := abciclient.NewLocalClient(log.NewNopLogger(), &application{Application: kvstore.NewApplication()}) |
|
|
|
|
|
if err := client.Start(ctx); err != nil { |
|
|
|
|
|
t.Fatal(err) |
|
|
|
|
|
} |
|
|
|
|
|
t.Cleanup(client.Wait) |
|
|
|
|
|
|
|
|
|
|
|
txmp := setup(ctx, t, client, 0) |
|
|
tTxs := checkTxs(ctx, t, txmp, 100, 0) // all txs request 1 gas unit
|
|
|
tTxs := checkTxs(ctx, t, txmp, 100, 0) // all txs request 1 gas unit
|
|
|
require.Equal(t, len(tTxs), txmp.Size()) |
|
|
require.Equal(t, len(tTxs), txmp.Size()) |
|
|
require.Equal(t, int64(5690), txmp.SizeBytes()) |
|
|
require.Equal(t, int64(5690), txmp.SizeBytes()) |
|
@ -302,7 +314,13 @@ func TestTxMempool_ReapMaxTxs(t *testing.T) { |
|
|
ctx, cancel := context.WithCancel(context.Background()) |
|
|
ctx, cancel := context.WithCancel(context.Background()) |
|
|
defer cancel() |
|
|
defer cancel() |
|
|
|
|
|
|
|
|
txmp := setup(ctx, t, 0) |
|
|
|
|
|
|
|
|
client := abciclient.NewLocalClient(log.NewNopLogger(), &application{Application: kvstore.NewApplication()}) |
|
|
|
|
|
if err := client.Start(ctx); err != nil { |
|
|
|
|
|
t.Fatal(err) |
|
|
|
|
|
} |
|
|
|
|
|
t.Cleanup(client.Wait) |
|
|
|
|
|
|
|
|
|
|
|
txmp := setup(ctx, t, client, 0) |
|
|
tTxs := checkTxs(ctx, t, txmp, 100, 0) |
|
|
tTxs := checkTxs(ctx, t, txmp, 100, 0) |
|
|
require.Equal(t, len(tTxs), txmp.Size()) |
|
|
require.Equal(t, len(tTxs), txmp.Size()) |
|
|
require.Equal(t, int64(5690), txmp.SizeBytes()) |
|
|
require.Equal(t, int64(5690), txmp.SizeBytes()) |
|
@ -354,7 +372,12 @@ func TestTxMempool_CheckTxExceedsMaxSize(t *testing.T) { |
|
|
ctx, cancel := context.WithCancel(context.Background()) |
|
|
ctx, cancel := context.WithCancel(context.Background()) |
|
|
defer cancel() |
|
|
defer cancel() |
|
|
|
|
|
|
|
|
txmp := setup(ctx, t, 0) |
|
|
|
|
|
|
|
|
client := abciclient.NewLocalClient(log.NewNopLogger(), &application{Application: kvstore.NewApplication()}) |
|
|
|
|
|
if err := client.Start(ctx); err != nil { |
|
|
|
|
|
t.Fatal(err) |
|
|
|
|
|
} |
|
|
|
|
|
t.Cleanup(client.Wait) |
|
|
|
|
|
txmp := setup(ctx, t, client, 0) |
|
|
|
|
|
|
|
|
rng := rand.New(rand.NewSource(time.Now().UnixNano())) |
|
|
rng := rand.New(rand.NewSource(time.Now().UnixNano())) |
|
|
tx := make([]byte, txmp.config.MaxTxBytes+1) |
|
|
tx := make([]byte, txmp.config.MaxTxBytes+1) |
|
@ -374,7 +397,13 @@ func TestTxMempool_CheckTxSamePeer(t *testing.T) { |
|
|
ctx, cancel := context.WithCancel(context.Background()) |
|
|
ctx, cancel := context.WithCancel(context.Background()) |
|
|
defer cancel() |
|
|
defer cancel() |
|
|
|
|
|
|
|
|
txmp := setup(ctx, t, 100) |
|
|
|
|
|
|
|
|
client := abciclient.NewLocalClient(log.NewNopLogger(), &application{Application: kvstore.NewApplication()}) |
|
|
|
|
|
if err := client.Start(ctx); err != nil { |
|
|
|
|
|
t.Fatal(err) |
|
|
|
|
|
} |
|
|
|
|
|
t.Cleanup(client.Wait) |
|
|
|
|
|
|
|
|
|
|
|
txmp := setup(ctx, t, client, 100) |
|
|
peerID := uint16(1) |
|
|
peerID := uint16(1) |
|
|
rng := rand.New(rand.NewSource(time.Now().UnixNano())) |
|
|
rng := rand.New(rand.NewSource(time.Now().UnixNano())) |
|
|
|
|
|
|
|
@ -392,7 +421,13 @@ func TestTxMempool_CheckTxSameSender(t *testing.T) { |
|
|
ctx, cancel := context.WithCancel(context.Background()) |
|
|
ctx, cancel := context.WithCancel(context.Background()) |
|
|
defer cancel() |
|
|
defer cancel() |
|
|
|
|
|
|
|
|
txmp := setup(ctx, t, 100) |
|
|
|
|
|
|
|
|
client := abciclient.NewLocalClient(log.NewNopLogger(), &application{Application: kvstore.NewApplication()}) |
|
|
|
|
|
if err := client.Start(ctx); err != nil { |
|
|
|
|
|
t.Fatal(err) |
|
|
|
|
|
} |
|
|
|
|
|
t.Cleanup(client.Wait) |
|
|
|
|
|
|
|
|
|
|
|
txmp := setup(ctx, t, client, 100) |
|
|
peerID := uint16(1) |
|
|
peerID := uint16(1) |
|
|
rng := rand.New(rand.NewSource(time.Now().UnixNano())) |
|
|
rng := rand.New(rand.NewSource(time.Now().UnixNano())) |
|
|
|
|
|
|
|
@ -417,7 +452,13 @@ func TestTxMempool_ConcurrentTxs(t *testing.T) { |
|
|
ctx, cancel := context.WithCancel(context.Background()) |
|
|
ctx, cancel := context.WithCancel(context.Background()) |
|
|
defer cancel() |
|
|
defer cancel() |
|
|
|
|
|
|
|
|
txmp := setup(ctx, t, 100) |
|
|
|
|
|
|
|
|
client := abciclient.NewLocalClient(log.NewNopLogger(), &application{Application: kvstore.NewApplication()}) |
|
|
|
|
|
if err := client.Start(ctx); err != nil { |
|
|
|
|
|
t.Fatal(err) |
|
|
|
|
|
} |
|
|
|
|
|
t.Cleanup(client.Wait) |
|
|
|
|
|
|
|
|
|
|
|
txmp := setup(ctx, t, client, 100) |
|
|
rng := rand.New(rand.NewSource(time.Now().UnixNano())) |
|
|
rng := rand.New(rand.NewSource(time.Now().UnixNano())) |
|
|
checkTxDone := make(chan struct{}) |
|
|
checkTxDone := make(chan struct{}) |
|
|
|
|
|
|
|
@ -484,7 +525,13 @@ func TestTxMempool_ExpiredTxs_NumBlocks(t *testing.T) { |
|
|
ctx, cancel := context.WithCancel(context.Background()) |
|
|
ctx, cancel := context.WithCancel(context.Background()) |
|
|
defer cancel() |
|
|
defer cancel() |
|
|
|
|
|
|
|
|
txmp := setup(ctx, t, 500) |
|
|
|
|
|
|
|
|
client := abciclient.NewLocalClient(log.NewNopLogger(), &application{Application: kvstore.NewApplication()}) |
|
|
|
|
|
if err := client.Start(ctx); err != nil { |
|
|
|
|
|
t.Fatal(err) |
|
|
|
|
|
} |
|
|
|
|
|
t.Cleanup(client.Wait) |
|
|
|
|
|
|
|
|
|
|
|
txmp := setup(ctx, t, client, 500) |
|
|
txmp.height = 100 |
|
|
txmp.height = 100 |
|
|
txmp.config.TTLNumBlocks = 10 |
|
|
txmp.config.TTLNumBlocks = 10 |
|
|
|
|
|
|
|
@ -556,10 +603,16 @@ func TestTxMempool_CheckTxPostCheckError(t *testing.T) { |
|
|
ctx, cancel := context.WithCancel(ctx) |
|
|
ctx, cancel := context.WithCancel(ctx) |
|
|
defer cancel() |
|
|
defer cancel() |
|
|
|
|
|
|
|
|
|
|
|
client := abciclient.NewLocalClient(log.NewNopLogger(), &application{Application: kvstore.NewApplication()}) |
|
|
|
|
|
if err := client.Start(ctx); err != nil { |
|
|
|
|
|
t.Fatal(err) |
|
|
|
|
|
} |
|
|
|
|
|
t.Cleanup(client.Wait) |
|
|
|
|
|
|
|
|
postCheckFn := func(_ types.Tx, _ *abci.ResponseCheckTx) error { |
|
|
postCheckFn := func(_ types.Tx, _ *abci.ResponseCheckTx) error { |
|
|
return testCase.err |
|
|
return testCase.err |
|
|
} |
|
|
} |
|
|
txmp := setup(ctx, t, 0, WithPostCheck(postCheckFn)) |
|
|
|
|
|
|
|
|
txmp := setup(ctx, t, client, 0, WithPostCheck(postCheckFn)) |
|
|
rng := rand.New(rand.NewSource(time.Now().UnixNano())) |
|
|
rng := rand.New(rand.NewSource(time.Now().UnixNano())) |
|
|
tx := make([]byte, txmp.config.MaxTxBytes-1) |
|
|
tx := make([]byte, txmp.config.MaxTxBytes-1) |
|
|
_, err := rng.Read(tx) |
|
|
_, err := rng.Read(tx) |
|
|