From 1438b9381b0d7e5b57e8bb8f9b88ec7d939f668d Mon Sep 17 00:00:00 2001 From: Manav Aggarwal Date: Wed, 4 Oct 2023 12:24:34 -0400 Subject: [PATCH 1/3] Refactor full node test --- node/full_node_test.go | 88 +++++++++++++++++++++++++++--------------- 1 file changed, 56 insertions(+), 32 deletions(-) diff --git a/node/full_node_test.go b/node/full_node_test.go index 3ca1b1a7dd..b09734b9d7 100644 --- a/node/full_node_test.go +++ b/node/full_node_test.go @@ -25,15 +25,13 @@ import ( "github.com/rollkit/rollkit/test/mocks" ) -// simply check that node is starting and stopping without panicking +// TestStartup checks if the node starts and stops without any errors func TestStartup(t *testing.T) { assert := assert.New(t) require := require.New(t) - app := &mocks.Application{} - app.On(InitChain, mock.Anything).Return(abci.ResponseInitChain{}) - key, _, _ := crypto.GenerateEd25519Key(rand.Reader) - signingKey, _, _ := crypto.GenerateEd25519Key(rand.Reader) + app := setupMockApplication() + key, signingKey := generateKeys() ctx, cancel := context.WithCancel(context.Background()) defer cancel() node, err := newFullNode(ctx, config.NodeConfig{DALayer: "mock"}, key, signingKey, proxy.NewLocalClientCreator(app), &types.GenesisDoc{ChainID: "test"}, log.TestingLogger()) @@ -54,16 +52,14 @@ func TestMempoolDirectly(t *testing.T) { assert := assert.New(t) require := require.New(t) - app := &mocks.Application{} - app.On(InitChain, mock.Anything).Return(abci.ResponseInitChain{}) - app.On(CheckTx, mock.Anything).Return(abci.ResponseCheckTx{}) - key, _, _ := crypto.GenerateEd25519Key(rand.Reader) - signingKey, _, _ := crypto.GenerateEd25519Key(rand.Reader) - anotherKey, _, _ := crypto.GenerateEd25519Key(rand.Reader) + app := setupMockApplication() + key, signingKey := generateKeys() + anotherKey := generateSingleKey() ctx, cancel := context.WithCancel(context.Background()) defer cancel() - node, err := newFullNode(ctx, config.NodeConfig{DALayer: "mock"}, key, signingKey, proxy.NewLocalClientCreator(app), &types.GenesisDoc{ChainID: "test"}, log.TestingLogger()) + + node, err := setupNode(ctx, key, signingKey, app) require.NoError(err) require.NotNil(node) @@ -73,30 +69,58 @@ func TestMempoolDirectly(t *testing.T) { assert.NoError(node.Stop()) }() - pid, err := peer.IDFromPrivateKey(anotherKey) - require.NoError(err) - err = node.Mempool.CheckTx([]byte("tx1"), func(r *abci.Response) {}, mempool.TxInfo{ - SenderID: node.mempoolIDs.GetForPeer(pid), - }) - require.NoError(err) - err = node.Mempool.CheckTx([]byte("tx2"), func(r *abci.Response) {}, mempool.TxInfo{ - SenderID: node.mempoolIDs.GetForPeer(pid), - }) - require.NoError(err) - time.Sleep(100 * time.Millisecond) - err = node.Mempool.CheckTx([]byte("tx3"), func(r *abci.Response) {}, mempool.TxInfo{ - SenderID: node.mempoolIDs.GetForPeer(pid), - }) - require.NoError(err) - err = node.Mempool.CheckTx([]byte("tx4"), func(r *abci.Response) {}, mempool.TxInfo{ - SenderID: node.mempoolIDs.GetForPeer(pid), - }) + pid := getPeerID(anotherKey, require) + + checkTransactions(node, pid, require) + + checkMempoolSize(node, require) +} + +func setupMockApplication() *mocks.Application { + app := &mocks.Application{} + app.On(InitChain, mock.Anything).Return(abci.ResponseInitChain{}) + app.On(CheckTx, mock.Anything).Return(abci.ResponseCheckTx{}) + return app +} + +func generateKeys() (crypto.PrivKey, crypto.PrivKey) { + key, _, _ := crypto.GenerateEd25519Key(rand.Reader) + signingKey, _, _ := crypto.GenerateEd25519Key(rand.Reader) + return key, signingKey +} + +func generateSingleKey() crypto.PrivKey { + key, _, _ := crypto.GenerateEd25519Key(rand.Reader) + return key +} + +func setupNode(ctx context.Context, key crypto.PrivKey, signingKey crypto.PrivKey, app *mocks.Application) (*FullNode, error) { + return newFullNode(ctx, config.NodeConfig{DALayer: "mock"}, key, signingKey, proxy.NewLocalClientCreator(app), &types.GenesisDoc{ChainID: "test"}, log.TestingLogger()) +} + +func getPeerID(key crypto.PrivKey, require *require.Assertions) peer.ID { + pid, err := peer.IDFromPrivateKey(key) require.NoError(err) + return pid +} + +func checkTransactions(node *FullNode, pid peer.ID, require *require.Assertions) { + transactions := []string{"tx1", "tx2", "tx3", "tx4"} + for _, tx := range transactions { + err := node.Mempool.CheckTx([]byte(tx), func(r *abci.Response) {}, mempool.TxInfo{ + SenderID: node.mempoolIDs.GetForPeer(pid), + }) + require.NoError(err) + } +} +func checkMempoolSize(node *FullNode, require *require.Assertions) { require.NoError(testutils.Retry(300, 100*time.Millisecond, func() error { - if int64(4*len("tx*")) == node.Mempool.SizeBytes() { + expectedSize := int64(4 * len("tx*")) + actualSize := node.Mempool.SizeBytes() + if expectedSize == actualSize { return nil } - return fmt.Errorf("expected size %v, got size %v", int64(4*len("tx*")), node.Mempool.SizeBytes()) + return fmt.Errorf("expected size %v, got size %v", expectedSize, actualSize) })) } From 2e3d6bae5655e0b92ab6c79918f96a906eee64fc Mon Sep 17 00:00:00 2001 From: Manav Aggarwal Date: Wed, 4 Oct 2023 22:02:46 -0400 Subject: [PATCH 2/3] Clean up full node test further --- node/full_node_test.go | 100 ++++++++++++++++++++--------------------- 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/node/full_node_test.go b/node/full_node_test.go index b09734b9d7..ad31ea0f7e 100644 --- a/node/full_node_test.go +++ b/node/full_node_test.go @@ -30,21 +30,9 @@ func TestStartup(t *testing.T) { assert := assert.New(t) require := require.New(t) - app := setupMockApplication() - key, signingKey := generateKeys() - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - node, err := newFullNode(ctx, config.NodeConfig{DALayer: "mock"}, key, signingKey, proxy.NewLocalClientCreator(app), &types.GenesisDoc{ChainID: "test"}, log.TestingLogger()) - require.NoError(err) - require.NotNil(node) - - assert.False(node.IsRunning()) - - err = node.Start() - assert.NoError(err) - defer func() { - assert.NoError(node.Stop()) - }() + ctx := context.Background() + node := initializeAndStartNode(ctx, require, assert) + defer cleanUpNode(node, assert) assert.True(node.IsRunning()) } @@ -52,30 +40,23 @@ func TestMempoolDirectly(t *testing.T) { assert := assert.New(t) require := require.New(t) - app := setupMockApplication() - key, signingKey := generateKeys() - anotherKey := generateSingleKey() - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - node, err := setupNode(ctx, key, signingKey, app) - require.NoError(err) - require.NotNil(node) - - err = node.Start() - require.NoError(err) - defer func() { - assert.NoError(node.Stop()) - }() - - pid := getPeerID(anotherKey, require) + ctx := context.Background() + node := initializeAndStartNode(ctx, require, assert) + defer cleanUpNode(node, assert) - checkTransactions(node, pid, require) + peerID := getPeerID(assert) + verifyTransactions(node, peerID, assert) + verifyMempoolSize(node, assert) +} - checkMempoolSize(node, require) +// cleanUpNode stops the node and checks if it is running +func cleanUpNode(node *FullNode, assert *assert.Assertions) { + defer node.cancel() + assert.NoError(node.Stop()) + assert.False(node.IsRunning()) } +// setupMockApplication initializes a mock application func setupMockApplication() *mocks.Application { app := &mocks.Application{} app.On(InitChain, mock.Anything).Return(abci.ResponseInitChain{}) @@ -83,39 +64,58 @@ func setupMockApplication() *mocks.Application { return app } -func generateKeys() (crypto.PrivKey, crypto.PrivKey) { - key, _, _ := crypto.GenerateEd25519Key(rand.Reader) - signingKey, _, _ := crypto.GenerateEd25519Key(rand.Reader) - return key, signingKey -} - +// generateSingleKey generates a single private key func generateSingleKey() crypto.PrivKey { key, _, _ := crypto.GenerateEd25519Key(rand.Reader) return key } -func setupNode(ctx context.Context, key crypto.PrivKey, signingKey crypto.PrivKey, app *mocks.Application) (*FullNode, error) { +// newTestNode creates a new test node +func newTestNode(ctx context.Context, key crypto.PrivKey, signingKey crypto.PrivKey, app *mocks.Application) (*FullNode, error) { return newFullNode(ctx, config.NodeConfig{DALayer: "mock"}, key, signingKey, proxy.NewLocalClientCreator(app), &types.GenesisDoc{ChainID: "test"}, log.TestingLogger()) } -func getPeerID(key crypto.PrivKey, require *require.Assertions) peer.ID { - pid, err := peer.IDFromPrivateKey(key) +// setupTestNode sets up a test node +func setupTestNode(ctx context.Context, require *require.Assertions) *FullNode { + app := setupMockApplication() + key, signingKey := generateSingleKey(), generateSingleKey() + node, err := newTestNode(ctx, key, signingKey, app) require.NoError(err) - return pid + require.NotNil(node) + return node +} + +// initializeAndStartNode initializes and starts a test node +func initializeAndStartNode(ctx context.Context, require *require.Assertions, assert *assert.Assertions) *FullNode { + node := setupTestNode(ctx, require) + assert.False(node.IsRunning()) + err := node.Start() + assert.NoError(err) + return node +} + +// getPeerID generates a peer ID +func getPeerID(assert *assert.Assertions) peer.ID { + key := generateSingleKey() + peerID, err := peer.IDFromPrivateKey(key) + assert.NoError(err) + return peerID } -func checkTransactions(node *FullNode, pid peer.ID, require *require.Assertions) { +// verifyTransactions checks if transactions are valid +func verifyTransactions(node *FullNode, peerID peer.ID, assert *assert.Assertions) { transactions := []string{"tx1", "tx2", "tx3", "tx4"} for _, tx := range transactions { err := node.Mempool.CheckTx([]byte(tx), func(r *abci.Response) {}, mempool.TxInfo{ - SenderID: node.mempoolIDs.GetForPeer(pid), + SenderID: node.mempoolIDs.GetForPeer(peerID), }) - require.NoError(err) + assert.NoError(err) } } -func checkMempoolSize(node *FullNode, require *require.Assertions) { - require.NoError(testutils.Retry(300, 100*time.Millisecond, func() error { +// verifyMempoolSize checks if the mempool size is as expected +func verifyMempoolSize(node *FullNode, assert *assert.Assertions) { + assert.NoError(testutils.Retry(300, 100*time.Millisecond, func() error { expectedSize := int64(4 * len("tx*")) actualSize := node.Mempool.SizeBytes() if expectedSize == actualSize { From fc7fc6397dff969211ae54d4d7b07bf44f1ea888 Mon Sep 17 00:00:00 2001 From: Manav Aggarwal Date: Thu, 5 Oct 2023 10:24:22 -0400 Subject: [PATCH 3/3] Move assert statement in helper function --- node/full_node_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/full_node_test.go b/node/full_node_test.go index ad31ea0f7e..3ca131d12e 100644 --- a/node/full_node_test.go +++ b/node/full_node_test.go @@ -33,7 +33,6 @@ func TestStartup(t *testing.T) { ctx := context.Background() node := initializeAndStartNode(ctx, require, assert) defer cleanUpNode(node, assert) - assert.True(node.IsRunning()) } func TestMempoolDirectly(t *testing.T) { @@ -91,6 +90,7 @@ func initializeAndStartNode(ctx context.Context, require *require.Assertions, as assert.False(node.IsRunning()) err := node.Start() assert.NoError(err) + assert.True(node.IsRunning()) return node }