diff --git a/.gitignore b/.gitignore index c066fab99c..3c2bdb4771 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .idea assets/params* assets/seed +coverage.txt \ No newline at end of file diff --git a/Jenkinsfile b/Jenkinsfile index 674e966952..afb0afbf10 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -57,16 +57,10 @@ pipeline { sh "docker container prune -f" catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') { sh ''' - go test -v -race -coverprofile=coverage.txt -covermode=atomic -p 1 scroll-tech/database - go test -v -race -coverprofile=coverage.txt -covermode=atomic -p 1 scroll-tech/database/migrate - go test -v -race -coverprofile=coverage.txt -covermode=atomic -p 1 scroll-tech/database/docker - go test -v -race -coverprofile=coverage.txt -covermode=atomic -p 1 scroll-tech/bridge/abi - go test -v -race -coverprofile=coverage.txt -covermode=atomic -p 1 scroll-tech/bridge/l1 - go test -v -race -coverprofile=coverage.txt -covermode=atomic -p 1 scroll-tech/bridge/l2 - go test -v -race -coverprofile=coverage.txt -covermode=atomic -p 1 scroll-tech/bridge/sender - go test -v -race -coverprofile=coverage.txt -covermode=atomic -p 1 scroll-tech/common/docker - go test -v -race -coverprofile=coverage.txt -covermode=atomic -p 1 scroll-tech/coordinator - go test -v -race -coverprofile=coverage.txt -covermode=atomic -p 1 scroll-tech/coordinator/verifier + go test -v -race -coverprofile=coverage.txt -covermode=atomic -p 1 scroll-tech/database/... + go test -v -race -coverprofile=coverage.txt -covermode=atomic -p 1 scroll-tech/bridge/... + go test -v -race -coverprofile=coverage.txt -covermode=atomic -p 1 scroll-tech/common/... + go test -v -race -coverprofile=coverage.txt -covermode=atomic -p 1 scroll-tech/coordinator/... cd .. ''' script { diff --git a/bridge/cmd/main.go b/bridge/cmd/main.go index c7f4c5dad4..3425087a7e 100644 --- a/bridge/cmd/main.go +++ b/bridge/cmd/main.go @@ -9,9 +9,10 @@ import ( "github.com/scroll-tech/go-ethereum/rpc" "github.com/urfave/cli/v2" + "scroll-tech/database" + "scroll-tech/common/utils" "scroll-tech/common/version" - "scroll-tech/database" "scroll-tech/bridge/config" "scroll-tech/bridge/l1" diff --git a/bridge/config.json b/bridge/config.json index 4ad2f1d2da..faf96be4d7 100644 --- a/bridge/config.json +++ b/bridge/config.json @@ -17,7 +17,7 @@ "max_gas_price": 10000000000, "tx_type": "AccessListTx" }, - "private_key": "abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc1" + "private_key": "1212121212121212121212121212121212121212121212121212121212121212" } }, "l2_config": { diff --git a/bridge/go.mod b/bridge/go.mod index ae17eb2bd7..925f0874aa 100644 --- a/bridge/go.mod +++ b/bridge/go.mod @@ -3,8 +3,6 @@ module scroll-tech/bridge go 1.18 require ( - github.com/ethereum/go-ethereum v1.10.13 - github.com/gorilla/websocket v1.4.2 github.com/jmoiron/sqlx v1.3.5 github.com/orcaman/concurrent-map v1.0.0 github.com/scroll-tech/go-ethereum v1.10.14-0.20221012120556-b3a7c9b6917d @@ -18,9 +16,11 @@ require ( github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea // indirect + github.com/ethereum/go-ethereum v1.10.13 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.0 // indirect github.com/google/uuid v1.3.0 // indirect + github.com/gorilla/websocket v1.4.2 // indirect github.com/holiman/uint256 v1.2.0 // indirect github.com/iden3/go-iden3-crypto v0.0.12 // indirect github.com/lib/pq v1.10.6 // indirect diff --git a/bridge/l1/relayer_test.go b/bridge/l1/relayer_test.go index 0b31e023a4..1de9011a18 100644 --- a/bridge/l1/relayer_test.go +++ b/bridge/l1/relayer_test.go @@ -7,52 +7,41 @@ import ( "github.com/scroll-tech/go-ethereum/ethclient" "github.com/stretchr/testify/assert" - "scroll-tech/database" - - "scroll-tech/bridge/mock" + "scroll-tech/database/migrate" "scroll-tech/bridge/config" "scroll-tech/bridge/l1" - "scroll-tech/common/utils" -) + "scroll-tech/database" -var TEST_CONFIG = &mock.TestConfig{ - L1GethTestConfig: mock.L1GethTestConfig{ - HPort: 0, - WPort: 8570, - }, - DbTestconfig: mock.DbTestconfig{ - DbName: "testl1relayer_db", - DbPort: 5440, - DB_CONFIG: &database.DBConfig{ - DriverName: utils.GetEnvWithDefault("TEST_DB_DRIVER", "postgres"), - DSN: utils.GetEnvWithDefault("TEST_DB_DSN", "postgres://postgres:123456@localhost:5440/testl1relayer_db?sslmode=disable"), - }, - }, -} + "scroll-tech/common/docker" +) // TestCreateNewRelayer test create new relayer instance and stop func TestCreateNewL1Relayer(t *testing.T) { cfg, err := config.NewConfig("../config.json") assert.NoError(t, err) - l1docker := mock.NewTestL1Docker(t, TEST_CONFIG) + l1docker := docker.NewTestL1Docker(t) defer l1docker.Stop() + cfg.L2Config.RelayerConfig.SenderConfig.Endpoint = l1docker.Endpoint() + cfg.L1Config.Endpoint = l1docker.Endpoint() client, err := ethclient.Dial(l1docker.Endpoint()) assert.NoError(t, err) - dbImg := mock.GetDbDocker(t, TEST_CONFIG) - dbImg.Start() + dbImg := docker.NewTestDBDocker(t, cfg.DBConfig.DriverName) defer dbImg.Stop() - db, err := database.NewOrmFactory(TEST_CONFIG.DB_CONFIG) + cfg.DBConfig.DSN = dbImg.Endpoint() + + // Create db handler and reset db. + db, err := database.NewOrmFactory(cfg.DBConfig) assert.NoError(t, err) + assert.NoError(t, migrate.ResetDB(db.GetDB().DB)) + defer db.Close() relayer, err := l1.NewLayer1Relayer(context.Background(), client, 1, db, cfg.L2Config.RelayerConfig) assert.NoError(t, err) - - relayer.Start() - defer relayer.Stop() + relayer.Start() } diff --git a/bridge/l2/l2_test.go b/bridge/l2/l2_test.go new file mode 100644 index 0000000000..7d3b068392 --- /dev/null +++ b/bridge/l2/l2_test.go @@ -0,0 +1,85 @@ +package l2_test + +import ( + "testing" + + "github.com/scroll-tech/go-ethereum/ethclient" + "github.com/stretchr/testify/assert" + + "scroll-tech/common/docker" + + "scroll-tech/bridge/config" +) + +var ( + // config + cfg *config.Config + + // docker consider handler. + l1gethImg docker.ImgInstance + l2gethImg docker.ImgInstance + dbImg docker.ImgInstance + + // l2geth client + l2Cli *ethclient.Client +) + +func setupEnv(t *testing.T) (err error) { + // Load config. + cfg, err = config.NewConfig("../config.json") + assert.NoError(t, err) + + // Create l1geth container. + l1gethImg = docker.NewTestL1Docker(t) + cfg.L2Config.RelayerConfig.SenderConfig.Endpoint = l1gethImg.Endpoint() + cfg.L1Config.Endpoint = l1gethImg.Endpoint() + + // Create l2geth container. + l2gethImg = docker.NewTestL2Docker(t) + cfg.L1Config.RelayerConfig.SenderConfig.Endpoint = l2gethImg.Endpoint() + cfg.L2Config.Endpoint = l2gethImg.Endpoint() + + // Create db container. + dbImg = docker.NewTestDBDocker(t, cfg.DBConfig.DriverName) + cfg.DBConfig.DSN = dbImg.Endpoint() + + // Create l2geth client. + l2Cli, err = ethclient.Dial(cfg.L2Config.Endpoint) + assert.NoError(t, err) + + return err +} + +func free(t *testing.T) { + if dbImg != nil { + assert.NoError(t, dbImg.Stop()) + } + if l1gethImg != nil { + assert.NoError(t, l1gethImg.Stop()) + } + if l2gethImg != nil { + assert.NoError(t, l2gethImg.Stop()) + } +} + +func TestFunction(t *testing.T) { + if err := setupEnv(t); err != nil { + t.Fatal(err) + } + + // Run l2 watcher test cases. + t.Run("TestCreateNewWatcherAndStop", testCreateNewWatcherAndStop) + t.Run("TestMonitorBridgeContract", testMonitorBridgeContract) + t.Run("TestFetchMultipleSentMessageInOneBlock", testFetchMultipleSentMessageInOneBlock) + t.Run("TestTraceHasUnsupportedOpcodes", testTraceHasUnsupportedOpcodes) + + // Run l2 relayer test cases. + t.Run("TestCreateNewRelayer", testCreateNewRelayer) + t.Run("TestL2RelayerProcessSaveEvents", testL2RelayerProcessSaveEvents) + t.Run("TestL2RelayerProcessPendingBlocks", testL2RelayerProcessPendingBlocks) + t.Run("TestL2RelayerProcessCommittedBlocks", testL2RelayerProcessCommittedBlocks) + + t.Cleanup(func() { + free(t) + }) +} diff --git a/bridge/l2/relayer_test.go b/bridge/l2/relayer_test.go index 2114ab93b6..6bdbff2fe0 100644 --- a/bridge/l2/relayer_test.go +++ b/bridge/l2/relayer_test.go @@ -8,18 +8,13 @@ import ( "time" "github.com/scroll-tech/go-ethereum/core/types" - "github.com/scroll-tech/go-ethereum/ethclient" "github.com/stretchr/testify/assert" - "scroll-tech/common/docker" + "scroll-tech/bridge/l2" "scroll-tech/database" + "scroll-tech/database/migrate" "scroll-tech/database/orm" - - "scroll-tech/bridge/config" - - "scroll-tech/bridge/l2" - "scroll-tech/bridge/mock" ) var ( @@ -37,198 +32,162 @@ var ( Layer2Hash: "hash0", }, } - l1Docker docker.ImgInstance - l2Docker docker.ImgInstance - dbDocker docker.ImgInstance ) -func setupEnv(t *testing.T) { - l1Docker = mock.NewTestL1Docker(t, TEST_CONFIG) - l2Docker = mock.NewTestL2Docker(t, TEST_CONFIG) - dbDocker = mock.GetDbDocker(t, TEST_CONFIG) +func testCreateNewRelayer(t *testing.T) { + // Create db handler and reset db. + db, err := database.NewOrmFactory(cfg.DBConfig) + assert.NoError(t, err) + assert.NoError(t, migrate.ResetDB(db.GetDB().DB)) + defer db.Close() + + skippedOpcodes := make(map[string]struct{}, len(cfg.L2Config.SkippedOpcodes)) + for _, op := range cfg.L2Config.SkippedOpcodes { + skippedOpcodes[op] = struct{}{} + } + + relayer, err := l2.NewLayer2Relayer(context.Background(), l2Cli, cfg.L2Config.ProofGenerationFreq, skippedOpcodes, int64(cfg.L2Config.Confirmations), db, cfg.L2Config.RelayerConfig) + assert.NoError(t, err) + defer relayer.Stop() + + relayer.Start() +} + +func testL2RelayerProcessSaveEvents(t *testing.T) { + // Create db handler and reset db. + db, err := database.NewOrmFactory(cfg.DBConfig) + assert.NoError(t, err) + assert.NoError(t, migrate.ResetDB(db.GetDB().DB)) + defer db.Close() + + skippedOpcodes := make(map[string]struct{}, len(cfg.L2Config.SkippedOpcodes)) + for _, op := range cfg.L2Config.SkippedOpcodes { + skippedOpcodes[op] = struct{}{} + } + relayer, err := l2.NewLayer2Relayer(context.Background(), l2Cli, cfg.L2Config.ProofGenerationFreq, skippedOpcodes, int64(cfg.L2Config.Confirmations), db, cfg.L2Config.RelayerConfig) + assert.NoError(t, err) + defer relayer.Stop() + + err = db.SaveLayer2Messages(context.Background(), templateLayer2Message) + assert.NoError(t, err) + blocks := []*orm.RollupResult{ + { + Number: 3, + Status: orm.RollupFinalized, + RollupTxHash: "Rollup Test Hash", + FinalizeTxHash: "Finalized Hash", + }, + } + err = db.InsertPendingBlocks(context.Background(), []uint64{uint64(blocks[0].Number)}) + assert.NoError(t, err) + err = db.UpdateRollupStatus(context.Background(), uint64(blocks[0].Number), orm.RollupFinalized) + assert.NoError(t, err) + relayer.ProcessSavedEvents() + + msg, err := db.GetLayer2MessageByNonce(templateLayer2Message[0].Nonce) + assert.NoError(t, err) + assert.Equal(t, orm.MsgSubmitted, msg.Status) +} + +func testL2RelayerProcessPendingBlocks(t *testing.T) { + // Create db handler and reset db. + db, err := database.NewOrmFactory(cfg.DBConfig) + assert.NoError(t, err) + assert.NoError(t, migrate.ResetDB(db.GetDB().DB)) + defer db.Close() + + skippedOpcodes := make(map[string]struct{}, len(cfg.L2Config.SkippedOpcodes)) + for _, op := range cfg.L2Config.SkippedOpcodes { + skippedOpcodes[op] = struct{}{} + } + relayer, err := l2.NewLayer2Relayer(context.Background(), l2Cli, cfg.L2Config.ProofGenerationFreq, skippedOpcodes, int64(cfg.L2Config.Confirmations), db, cfg.L2Config.RelayerConfig) + assert.NoError(t, err) + defer relayer.Stop() + + // this blockresult has number of 0x4, need to change it to match the testcase + // In this testcase scenario, db will store two blocks with height 0x4 and 0x3 + var results []*types.BlockResult + + templateBlockResult, err := os.ReadFile("../../common/testdata/blockResult_relayer_parent.json") + assert.NoError(t, err) + blockResult := &types.BlockResult{} + err = json.Unmarshal(templateBlockResult, blockResult) + assert.NoError(t, err) + results = append(results, blockResult) + templateBlockResult, err = os.ReadFile("../../common/testdata/blockResult_relayer.json") + assert.NoError(t, err) + blockResult = &types.BlockResult{} + err = json.Unmarshal(templateBlockResult, blockResult) + assert.NoError(t, err) + results = append(results, blockResult) + + err = db.InsertBlockResultsWithStatus(context.Background(), results, orm.BlockUnassigned) + assert.NoError(t, err) + + blocks := []*orm.RollupResult{ + { + Number: 4, + Status: 1, + RollupTxHash: "Rollup Test Hash", + FinalizeTxHash: "Finalized Hash", + }, + } + err = db.InsertPendingBlocks(context.Background(), []uint64{uint64(blocks[0].Number)}) + assert.NoError(t, err) + err = db.UpdateRollupStatus(context.Background(), uint64(blocks[0].Number), orm.RollupPending) + assert.NoError(t, err) + + relayer.ProcessPendingBlocks() + + // Check if Rollup Result is changed successfully + status, err := db.GetRollupStatus(uint64(blocks[0].Number)) + assert.NoError(t, err) + assert.Equal(t, orm.RollupCommitting, status) } -func TestRelayerFunction(t *testing.T) { - // Setup - setupEnv(t) - - t.Run("TestCreateNewRelayer", func(t *testing.T) { - cfg, err := config.NewConfig("../config.json") - assert.NoError(t, err) - cfg.L2Config.RelayerConfig.SenderConfig.Endpoint = l1Docker.Endpoint() - - client, err := ethclient.Dial(l2Docker.Endpoint()) - assert.NoError(t, err) - - db, err := database.NewOrmFactory(TEST_CONFIG.DB_CONFIG) - assert.NoError(t, err) - - skippedOpcodes := make(map[string]struct{}, len(cfg.L2Config.SkippedOpcodes)) - for _, op := range cfg.L2Config.SkippedOpcodes { - skippedOpcodes[op] = struct{}{} - } - - relayer, err := l2.NewLayer2Relayer(context.Background(), client, cfg.L2Config.ProofGenerationFreq, skippedOpcodes, int64(cfg.L2Config.Confirmations), db, cfg.L2Config.RelayerConfig) - assert.NoError(t, err) - - relayer.Start() - - defer relayer.Stop() - }) - - t.Run("TestL2RelayerProcessSaveEvents", func(t *testing.T) { - cfg, err := config.NewConfig("../config.json") - assert.NoError(t, err) - cfg.L2Config.RelayerConfig.SenderConfig.Endpoint = l1Docker.Endpoint() - - client, err := ethclient.Dial(l2Docker.Endpoint()) - assert.NoError(t, err) - - mock.ClearDB(t, TEST_CONFIG.DB_CONFIG) - db := mock.PrepareDB(t, TEST_CONFIG.DB_CONFIG) - - skippedOpcodes := make(map[string]struct{}, len(cfg.L2Config.SkippedOpcodes)) - for _, op := range cfg.L2Config.SkippedOpcodes { - skippedOpcodes[op] = struct{}{} - } - relayer, err := l2.NewLayer2Relayer(context.Background(), client, cfg.L2Config.ProofGenerationFreq, skippedOpcodes, int64(cfg.L2Config.Confirmations), db, cfg.L2Config.RelayerConfig) - assert.NoError(t, err) - - err = db.SaveLayer2Messages(context.Background(), templateLayer2Message) - assert.NoError(t, err) - blocks := []*orm.RollupResult{ - { - Number: 3, - Status: orm.RollupFinalized, - RollupTxHash: "Rollup Test Hash", - FinalizeTxHash: "Finalized Hash", - }, - } - err = db.InsertPendingBlocks(context.Background(), []uint64{uint64(blocks[0].Number)}) - assert.NoError(t, err) - err = db.UpdateRollupStatus(context.Background(), uint64(blocks[0].Number), orm.RollupFinalized) - assert.NoError(t, err) - relayer.ProcessSavedEvents() - - msg, err := db.GetLayer2MessageByNonce(templateLayer2Message[0].Nonce) - assert.NoError(t, err) - assert.Equal(t, orm.MsgSubmitted, msg.Status) - - }) - - t.Run("TestL2RelayerProcessPendingBlocks", func(t *testing.T) { - cfg, err := config.NewConfig("../config.json") - assert.NoError(t, err) - cfg.L2Config.RelayerConfig.SenderConfig.Endpoint = l1Docker.Endpoint() - - client, err := ethclient.Dial(l2Docker.Endpoint()) - assert.NoError(t, err) - - mock.ClearDB(t, TEST_CONFIG.DB_CONFIG) - db := mock.PrepareDB(t, TEST_CONFIG.DB_CONFIG) - - skippedOpcodes := make(map[string]struct{}, len(cfg.L2Config.SkippedOpcodes)) - for _, op := range cfg.L2Config.SkippedOpcodes { - skippedOpcodes[op] = struct{}{} - } - relayer, err := l2.NewLayer2Relayer(context.Background(), client, cfg.L2Config.ProofGenerationFreq, skippedOpcodes, int64(cfg.L2Config.Confirmations), db, cfg.L2Config.RelayerConfig) - assert.NoError(t, err) - - // this blockresult has number of 0x4, need to change it to match the testcase - // In this testcase scenario, db will store two blocks with height 0x4 and 0x3 - var results []*types.BlockResult - - templateBlockResult, err := os.ReadFile("../../common/testdata/blockResult_relayer_parent.json") - assert.NoError(t, err) - blockResult := &types.BlockResult{} - err = json.Unmarshal(templateBlockResult, blockResult) - assert.NoError(t, err) - results = append(results, blockResult) - templateBlockResult, err = os.ReadFile("../../common/testdata/blockResult_relayer.json") - assert.NoError(t, err) - blockResult = &types.BlockResult{} - err = json.Unmarshal(templateBlockResult, blockResult) - assert.NoError(t, err) - results = append(results, blockResult) - - err = db.InsertBlockResultsWithStatus(context.Background(), results, orm.BlockUnassigned) - assert.NoError(t, err) - - blocks := []*orm.RollupResult{ - { - Number: 4, - Status: 1, - RollupTxHash: "Rollup Test Hash", - FinalizeTxHash: "Finalized Hash", - }, - } - err = db.InsertPendingBlocks(context.Background(), []uint64{uint64(blocks[0].Number)}) - assert.NoError(t, err) - err = db.UpdateRollupStatus(context.Background(), uint64(blocks[0].Number), orm.RollupPending) - assert.NoError(t, err) - - relayer.ProcessPendingBlocks() - - // Check if Rollup Result is changed successfully - status, err := db.GetRollupStatus(uint64(blocks[0].Number)) - assert.NoError(t, err) - assert.Equal(t, orm.RollupCommitting, status) - }) - - t.Run("TestL2RelayerProcessCommittedBlocks", func(t *testing.T) { - cfg, err := config.NewConfig("../config.json") - assert.NoError(t, err) - cfg.L2Config.RelayerConfig.SenderConfig.Endpoint = l1Docker.Endpoint() - - client, err := ethclient.Dial(l2Docker.Endpoint()) - assert.NoError(t, err) - - mock.ClearDB(t, TEST_CONFIG.DB_CONFIG) - db := mock.PrepareDB(t, TEST_CONFIG.DB_CONFIG) - - skippedOpcodes := make(map[string]struct{}, len(cfg.L2Config.SkippedOpcodes)) - for _, op := range cfg.L2Config.SkippedOpcodes { - skippedOpcodes[op] = struct{}{} - } - relayer, err := l2.NewLayer2Relayer(context.Background(), client, cfg.L2Config.ProofGenerationFreq, skippedOpcodes, int64(cfg.L2Config.Confirmations), db, cfg.L2Config.RelayerConfig) - assert.NoError(t, err) - - templateBlockResult, err := os.ReadFile("../../common/testdata/blockResult_relayer.json") - assert.NoError(t, err) - blockResult := &types.BlockResult{} - err = json.Unmarshal(templateBlockResult, blockResult) - assert.NoError(t, err) - err = db.InsertBlockResultsWithStatus(context.Background(), []*types.BlockResult{blockResult}, orm.BlockVerified) - assert.NoError(t, err) - - blocks := []*orm.RollupResult{ - { - Number: 4, - Status: 1, - RollupTxHash: "Rollup Test Hash", - FinalizeTxHash: "Finalized Hash", - }, - } - err = db.InsertPendingBlocks(context.Background(), []uint64{uint64(blocks[0].Number)}) - assert.NoError(t, err) - err = db.UpdateRollupStatus(context.Background(), uint64(blocks[0].Number), orm.RollupCommitted) - assert.NoError(t, err) - tProof := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31} - tStateProof := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31} - - err = db.UpdateProofByNumber(context.Background(), uint64(blocks[0].Number), tProof, tStateProof, 100) - assert.NoError(t, err) - relayer.ProcessCommittedBlocks() - - status, err := db.GetRollupStatus(uint64(blocks[0].Number)) - assert.NoError(t, err) - assert.Equal(t, orm.RollupFinalizing, status) - }) - - // Teardown - t.Cleanup(func() { - assert.NoError(t, l1Docker.Stop()) - assert.NoError(t, l2Docker.Stop()) - assert.NoError(t, dbDocker.Stop()) - }) +func testL2RelayerProcessCommittedBlocks(t *testing.T) { + // Create db handler and reset db. + db, err := database.NewOrmFactory(cfg.DBConfig) + assert.NoError(t, err) + assert.NoError(t, migrate.ResetDB(db.GetDB().DB)) + defer db.Close() + + skippedOpcodes := make(map[string]struct{}, len(cfg.L2Config.SkippedOpcodes)) + for _, op := range cfg.L2Config.SkippedOpcodes { + skippedOpcodes[op] = struct{}{} + } + relayer, err := l2.NewLayer2Relayer(context.Background(), l2Cli, cfg.L2Config.ProofGenerationFreq, skippedOpcodes, int64(cfg.L2Config.Confirmations), db, cfg.L2Config.RelayerConfig) + assert.NoError(t, err) + defer relayer.Stop() + + templateBlockResult, err := os.ReadFile("../../common/testdata/blockResult_relayer.json") + assert.NoError(t, err) + blockResult := &types.BlockResult{} + err = json.Unmarshal(templateBlockResult, blockResult) + assert.NoError(t, err) + err = db.InsertBlockResultsWithStatus(context.Background(), []*types.BlockResult{blockResult}, orm.BlockVerified) + assert.NoError(t, err) + + blocks := []*orm.RollupResult{ + { + Number: 4, + Status: 1, + RollupTxHash: "Rollup Test Hash", + FinalizeTxHash: "Finalized Hash", + }, + } + err = db.InsertPendingBlocks(context.Background(), []uint64{uint64(blocks[0].Number)}) + assert.NoError(t, err) + err = db.UpdateRollupStatus(context.Background(), uint64(blocks[0].Number), orm.RollupCommitted) + assert.NoError(t, err) + tProof := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31} + tStateProof := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31} + + err = db.UpdateProofByNumber(context.Background(), uint64(blocks[0].Number), tProof, tStateProof, 100) + assert.NoError(t, err) + relayer.ProcessCommittedBlocks() + + status, err := db.GetRollupStatus(uint64(blocks[0].Number)) + assert.NoError(t, err) + assert.Equal(t, orm.RollupFinalizing, status) } diff --git a/bridge/l2/watcher_test.go b/bridge/l2/watcher_test.go index 91a1087693..e3d0f23763 100644 --- a/bridge/l2/watcher_test.go +++ b/bridge/l2/watcher_test.go @@ -6,282 +6,207 @@ import ( "encoding/json" "math/big" "os" + "strconv" "testing" "time" - "github.com/stretchr/testify/assert" - "github.com/scroll-tech/go-ethereum/accounts/abi/bind" "github.com/scroll-tech/go-ethereum/common" "github.com/scroll-tech/go-ethereum/core/types" "github.com/scroll-tech/go-ethereum/crypto" "github.com/scroll-tech/go-ethereum/ethclient" + "github.com/stretchr/testify/assert" bridge_abi "scroll-tech/bridge/abi" "scroll-tech/bridge/l2" - - "scroll-tech/common/docker" - "scroll-tech/common/utils" + "scroll-tech/bridge/mock_bridge" + "scroll-tech/bridge/sender" "scroll-tech/database" - - db_config "scroll-tech/database" - - "scroll-tech/bridge/config" - "scroll-tech/bridge/mock" - "scroll-tech/bridge/mock_bridge" + "scroll-tech/database/migrate" ) -const TEST_BUFFER = 500 - -var TEST_CONFIG = &mock.TestConfig{ - L1GethTestConfig: mock.L1GethTestConfig{ - HPort: 0, - WPort: 8571, - }, - L2GethTestConfig: mock.L2GethTestConfig{ - HPort: 0, - WPort: 8567, - }, - DbTestconfig: mock.DbTestconfig{ - DbName: "testwatcher_db", - DbPort: 5438, - DB_CONFIG: &db_config.DBConfig{ - DriverName: utils.GetEnvWithDefault("TEST_DB_DRIVER", "postgres"), - DSN: utils.GetEnvWithDefault("TEST_DB_DSN", "postgres://postgres:123456@localhost:5438/testwatcher_db?sslmode=disable"), - }, - }, -} - -var ( - // previousHeight store previous chain height - previousHeight uint64 - l1gethImg docker.ImgInstance - l2gethImg docker.ImgInstance - dbImg docker.ImgInstance - l2Backend *l2.Backend -) +func testCreateNewWatcherAndStop(t *testing.T) { + // Create db handler and reset db. + l2db, err := database.NewOrmFactory(cfg.DBConfig) + assert.NoError(t, err) + assert.NoError(t, migrate.ResetDB(l2db.GetDB().DB)) + defer l2db.Close() -func setenv(t *testing.T) { - cfg, err := config.NewConfig("../config.json") + messengerABI, err := bridge_abi.L2MessengerMetaData.GetAbi() assert.NoError(t, err) - l1gethImg = mock.NewTestL1Docker(t, TEST_CONFIG) - cfg.L2Config.RelayerConfig.SenderConfig.Endpoint = l1gethImg.Endpoint() - l2Backend, l2gethImg, dbImg = mock.L2gethDocker(t, cfg, TEST_CONFIG) -} -func TestWatcherFunction(t *testing.T) { - setenv(t) - t.Run("TestL2Backend", func(t *testing.T) { - err := l2Backend.Start() - assert.NoError(t, err) - l2Backend.Stop() - }) - t.Run("TestCreateNewWatcherAndStop", func(t *testing.T) { - cfg, err := config.NewConfig("../config.json") - assert.NoError(t, err) + skippedOpcodes := make(map[string]struct{}, len(cfg.L2Config.SkippedOpcodes)) + for _, op := range cfg.L2Config.SkippedOpcodes { + skippedOpcodes[op] = struct{}{} + } + proofGenerationFreq := cfg.L2Config.ProofGenerationFreq + if proofGenerationFreq == 0 { + proofGenerationFreq = 1 + } + rc := l2.NewL2WatcherClient(context.Background(), l2Cli, cfg.L2Config.Confirmations, proofGenerationFreq, skippedOpcodes, cfg.L2Config.L2MessengerAddress, messengerABI, l2db) + rc.Start() + defer rc.Stop() - cfg.L2Config.Endpoint = l2gethImg.Endpoint() - client, err := ethclient.Dial(cfg.L2Config.Endpoint) - assert.NoError(t, err) - mock.ClearDB(t, TEST_CONFIG.DB_CONFIG) + privkey, err := crypto.ToECDSA(common.FromHex(cfg.L1Config.RelayerConfig.PrivateKey)) + assert.NoError(t, err) - messengerABI, err := bridge_abi.L2MessengerMetaData.GetAbi() - assert.NoError(t, err) + cfg.L1Config.RelayerConfig.SenderConfig.Confirmations = 0 + newSender, err := sender.NewSender(context.Background(), cfg.L1Config.RelayerConfig.SenderConfig, privkey) + assert.NoError(t, err) - l2db := mock.PrepareDB(t, TEST_CONFIG.DB_CONFIG) - - skippedOpcodes := make(map[string]struct{}, len(cfg.L2Config.SkippedOpcodes)) - for _, op := range cfg.L2Config.SkippedOpcodes { - skippedOpcodes[op] = struct{}{} - } - proofGenerationFreq := cfg.L2Config.ProofGenerationFreq - if proofGenerationFreq == 0 { - proofGenerationFreq = 1 - } - rc := l2.NewL2WatcherClient(context.Background(), client, cfg.L2Config.Confirmations, proofGenerationFreq, skippedOpcodes, cfg.L2Config.L2MessengerAddress, messengerABI, l2db) - rc.Start() - - // Create several transactions and commit to block - numTransactions := 3 - - for i := 0; i < numTransactions; i++ { - tx := mock.SendTxToL2Client(t, client, cfg.L2Config.RelayerConfig.PrivateKey) - // wait for mining - _, err = bind.WaitMined(context.Background(), client, tx) - assert.NoError(t, err) - } - - <-time.After(10 * time.Second) - blockNum, err := client.BlockNumber(context.Background()) + // Create several transactions and commit to block + numTransactions := 3 + toAddress := common.HexToAddress("0x4592d8f8d7b001e72cb26a73e4fa1806a51ac79d") + for i := 0; i < numTransactions; i++ { + _, err = newSender.SendTransaction(strconv.Itoa(1000+i), &toAddress, big.NewInt(1000000000), nil) assert.NoError(t, err) - assert.GreaterOrEqual(t, blockNum, uint64(numTransactions)) - - rc.Stop() - l2db.Close() - }) + <-newSender.ConfirmChan() + } - t.Run("TestMonitorBridgeContract", func(t *testing.T) { - cfg, err := config.NewConfig("../config.json") - assert.NoError(t, err) - t.Log("confirmations:", cfg.L2Config.Confirmations) + //<-time.After(10 * time.Second) + blockNum, err := l2Cli.BlockNumber(context.Background()) + assert.NoError(t, err) + assert.GreaterOrEqual(t, blockNum, uint64(numTransactions)) +} - cfg.L2Config.Endpoint = l2gethImg.Endpoint() - client, err := ethclient.Dial(cfg.L2Config.Endpoint) - assert.NoError(t, err) +func testMonitorBridgeContract(t *testing.T) { + // Create db handler and reset db. + db, err := database.NewOrmFactory(cfg.DBConfig) + assert.NoError(t, err) + assert.NoError(t, migrate.ResetDB(db.GetDB().DB)) + defer db.Close() - mock.ClearDB(t, TEST_CONFIG.DB_CONFIG) - previousHeight, err = client.BlockNumber(context.Background()) - assert.NoError(t, err) + previousHeight, err := l2Cli.BlockNumber(context.Background()) + assert.NoError(t, err) - auth := prepareAuth(t, client, cfg.L2Config.RelayerConfig.PrivateKey) + auth := prepareAuth(t, l2Cli, cfg.L2Config.RelayerConfig.PrivateKey) - // deploy mock bridge - _, tx, instance, err := mock_bridge.DeployMockBridge(auth, client) - assert.NoError(t, err) - address, err := bind.WaitDeployed(context.Background(), client, tx) - assert.NoError(t, err) + // deploy mock bridge + _, tx, instance, err := mock_bridge.DeployMockBridge(auth, l2Cli) + assert.NoError(t, err) + address, err := bind.WaitDeployed(context.Background(), l2Cli, tx) + assert.NoError(t, err) - db := mock.PrepareDB(t, TEST_CONFIG.DB_CONFIG) - rc := prepareRelayerClient(client, db, address) - rc.Start() + rc := prepareRelayerClient(l2Cli, db, address) + rc.Start() + defer rc.Stop() - // Call mock_bridge instance sendMessage to trigger emit events - addr := common.HexToAddress("0x1c5a77d9fa7ef466951b2f01f724bca3a5820b63") - nonce, err := client.PendingNonceAt(context.Background(), addr) - assert.NoError(t, err) - auth.Nonce = big.NewInt(int64(nonce)) - toAddress := common.HexToAddress("0x4592d8f8d7b001e72cb26a73e4fa1806a51ac79d") - message := []byte("testbridgecontract") - tx, err = instance.SendMessage(auth, toAddress, message, auth.GasPrice) - assert.NoError(t, err) - receipt, err := bind.WaitMined(context.Background(), client, tx) - if receipt.Status != types.ReceiptStatusSuccessful || err != nil { - t.Fatalf("Call failed") - } - - //extra block mined - addr = common.HexToAddress("0x1c5a77d9fa7ef466951b2f01f724bca3a5820b63") - nonce, nounceErr := client.PendingNonceAt(context.Background(), addr) - assert.NoError(t, nounceErr) - auth.Nonce = big.NewInt(int64(nonce)) - toAddress = common.HexToAddress("0x4592d8f8d7b001e72cb26a73e4fa1806a51ac79d") - message = []byte("testbridgecontract") - tx, err = instance.SendMessage(auth, toAddress, message, auth.GasPrice) - assert.NoError(t, err) - receipt, err = bind.WaitMined(context.Background(), client, tx) - if receipt.Status != types.ReceiptStatusSuccessful || err != nil { - t.Fatalf("Call failed") - } + // Call mock_bridge instance sendMessage to trigger emit events + addr := common.HexToAddress("0x1c5a77d9fa7ef466951b2f01f724bca3a5820b63") + nonce, err := l2Cli.PendingNonceAt(context.Background(), addr) + assert.NoError(t, err) + auth.Nonce = big.NewInt(int64(nonce)) + toAddress := common.HexToAddress("0x4592d8f8d7b001e72cb26a73e4fa1806a51ac79d") + message := []byte("testbridgecontract") + tx, err = instance.SendMessage(auth, toAddress, message, auth.GasPrice) + assert.NoError(t, err) + receipt, err := bind.WaitMined(context.Background(), l2Cli, tx) + if receipt.Status != types.ReceiptStatusSuccessful || err != nil { + t.Fatalf("Call failed") + } - // wait for dealing time - <-time.After(6 * time.Second) + //extra block mined + addr = common.HexToAddress("0x1c5a77d9fa7ef466951b2f01f724bca3a5820b63") + nonce, nounceErr := l2Cli.PendingNonceAt(context.Background(), addr) + assert.NoError(t, nounceErr) + auth.Nonce = big.NewInt(int64(nonce)) + toAddress = common.HexToAddress("0x4592d8f8d7b001e72cb26a73e4fa1806a51ac79d") + message = []byte("testbridgecontract") + tx, err = instance.SendMessage(auth, toAddress, message, auth.GasPrice) + assert.NoError(t, err) + receipt, err = bind.WaitMined(context.Background(), l2Cli, tx) + if receipt.Status != types.ReceiptStatusSuccessful || err != nil { + t.Fatalf("Call failed") + } - var latestHeight uint64 - latestHeight, err = client.BlockNumber(context.Background()) - assert.NoError(t, err) - t.Log("Latest height is", latestHeight) + // wait for dealing time + <-time.After(6 * time.Second) - // check if we successfully stored events - height, err := db.GetLayer2LatestWatchedHeight() - assert.NoError(t, err) - t.Log("Height in DB is", height) - assert.Greater(t, height, int64(previousHeight)) - msgs, err := db.GetL2UnprocessedMessages() - assert.NoError(t, err) - assert.Equal(t, 2, len(msgs)) + var latestHeight uint64 + latestHeight, err = l2Cli.BlockNumber(context.Background()) + assert.NoError(t, err) + t.Log("Latest height is", latestHeight) - rc.Stop() - db.Close() - }) + // check if we successfully stored events + height, err := db.GetLayer2LatestWatchedHeight() + assert.NoError(t, err) + t.Log("Height in DB is", height) + assert.Greater(t, height, int64(previousHeight)) + msgs, err := db.GetL2UnprocessedMessages() + assert.NoError(t, err) + assert.Equal(t, 2, len(msgs)) +} - t.Run("TestFetchMultipleSentMessageInOneBlock", func(t *testing.T) { - cfg, err := config.NewConfig("../config.json") - assert.NoError(t, err) +func testFetchMultipleSentMessageInOneBlock(t *testing.T) { + // Create db handler and reset db. + db, err := database.NewOrmFactory(cfg.DBConfig) + assert.NoError(t, err) + assert.NoError(t, migrate.ResetDB(db.GetDB().DB)) + defer db.Close() - cfg.L2Config.Endpoint = l2gethImg.Endpoint() - client, err := ethclient.Dial(cfg.L2Config.Endpoint) - assert.NoError(t, err) + previousHeight, err := l2Cli.BlockNumber(context.Background()) // shallow the global previousHeight + assert.NoError(t, err) - mock.ClearDB(t, TEST_CONFIG.DB_CONFIG) + auth := prepareAuth(t, l2Cli, cfg.L2Config.RelayerConfig.PrivateKey) - previousHeight, err := client.BlockNumber(context.Background()) // shallow the global previousHeight - assert.NoError(t, err) + _, trx, instance, err := mock_bridge.DeployMockBridge(auth, l2Cli) + assert.NoError(t, err) + address, err := bind.WaitDeployed(context.Background(), l2Cli, trx) + assert.NoError(t, err) - auth := prepareAuth(t, client, cfg.L2Config.RelayerConfig.PrivateKey) + rc := prepareRelayerClient(l2Cli, db, address) + rc.Start() + defer rc.Stop() - _, trx, instance, err := mock_bridge.DeployMockBridge(auth, client) - assert.NoError(t, err) - address, err := bind.WaitDeployed(context.Background(), client, trx) - assert.NoError(t, err) + // Call mock_bridge instance sendMessage to trigger emit events multiple times + numTransactions := 4 + var tx *types.Transaction - db := mock.PrepareDB(t, TEST_CONFIG.DB_CONFIG) - rc := prepareRelayerClient(client, db, address) - rc.Start() - - // Call mock_bridge instance sendMessage to trigger emit events multiple times - numTransactions := 4 - var tx *types.Transaction - - for i := 0; i < numTransactions; i++ { - addr := common.HexToAddress("0x1c5a77d9fa7ef466951b2f01f724bca3a5820b63") - nonce, nounceErr := client.PendingNonceAt(context.Background(), addr) - assert.NoError(t, nounceErr) - auth.Nonce = big.NewInt(int64(nonce)) - toAddress := common.HexToAddress("0x4592d8f8d7b001e72cb26a73e4fa1806a51ac79d") - message := []byte("testbridgecontract") - tx, err = instance.SendMessage(auth, toAddress, message, auth.GasPrice) - assert.NoError(t, err) - } - - receipt, err := bind.WaitMined(context.Background(), client, tx) - if receipt.Status != types.ReceiptStatusSuccessful || err != nil { - t.Fatalf("Call failed") - } - - // extra block mined + for i := 0; i < numTransactions; i++ { addr := common.HexToAddress("0x1c5a77d9fa7ef466951b2f01f724bca3a5820b63") - nonce, nounceErr := client.PendingNonceAt(context.Background(), addr) + nonce, nounceErr := l2Cli.PendingNonceAt(context.Background(), addr) assert.NoError(t, nounceErr) auth.Nonce = big.NewInt(int64(nonce)) toAddress := common.HexToAddress("0x4592d8f8d7b001e72cb26a73e4fa1806a51ac79d") message := []byte("testbridgecontract") tx, err = instance.SendMessage(auth, toAddress, message, auth.GasPrice) assert.NoError(t, err) - receipt, err = bind.WaitMined(context.Background(), client, tx) - if receipt.Status != types.ReceiptStatusSuccessful || err != nil { - t.Fatalf("Call failed") - } - - // wait for dealing time - <-time.After(6 * time.Second) - - // check if we successfully stored events - height, err := db.GetLayer2LatestWatchedHeight() - assert.NoError(t, err) - t.Log("LatestHeight is", height) - assert.Greater(t, height, int64(previousHeight)) // height must be greater than previousHeight because confirmations is 0 - msgs, err := db.GetL2UnprocessedMessages() - assert.NoError(t, err) - assert.Equal(t, 5, len(msgs)) + } - rc.Stop() - db.Close() - }) + receipt, err := bind.WaitMined(context.Background(), l2Cli, tx) + if receipt.Status != types.ReceiptStatusSuccessful || err != nil { + t.Fatalf("Call failed") + } - // Teardown - t.Cleanup(func() { - assert.NoError(t, l1gethImg.Stop()) - assert.NoError(t, l2gethImg.Stop()) - assert.NoError(t, dbImg.Stop()) - }) + // extra block mined + addr := common.HexToAddress("0x1c5a77d9fa7ef466951b2f01f724bca3a5820b63") + nonce, nounceErr := l2Cli.PendingNonceAt(context.Background(), addr) + assert.NoError(t, nounceErr) + auth.Nonce = big.NewInt(int64(nonce)) + toAddress := common.HexToAddress("0x4592d8f8d7b001e72cb26a73e4fa1806a51ac79d") + message := []byte("testbridgecontract") + tx, err = instance.SendMessage(auth, toAddress, message, auth.GasPrice) + assert.NoError(t, err) + receipt, err = bind.WaitMined(context.Background(), l2Cli, tx) + if receipt.Status != types.ReceiptStatusSuccessful || err != nil { + t.Fatalf("Call failed") + } -} + // wait for dealing time + <-time.After(6 * time.Second) -func TestTraceHasUnsupportedOpcodes(t *testing.T) { - cfg, err := config.NewConfig("../config.json") + // check if we successfully stored events + height, err := db.GetLayer2LatestWatchedHeight() assert.NoError(t, err) + t.Log("LatestHeight is", height) + assert.Greater(t, height, int64(previousHeight)) // height must be greater than previousHeight because confirmations is 0 + msgs, err := db.GetL2UnprocessedMessages() + assert.NoError(t, err) + assert.Equal(t, 5, len(msgs)) +} +func testTraceHasUnsupportedOpcodes(t *testing.T) { delegateTrace, err := os.ReadFile("../../common/testdata/blockResult_delegate.json") assert.NoError(t, err) @@ -294,26 +219,26 @@ func TestTraceHasUnsupportedOpcodes(t *testing.T) { } } -func prepareRelayerClient(client *ethclient.Client, db database.OrmFactory, contractAddr common.Address) *l2.WatcherClient { +func prepareRelayerClient(l2Cli *ethclient.Client, db database.OrmFactory, contractAddr common.Address) *l2.WatcherClient { messengerABI, _ := bridge_abi.L1MessengerMetaData.GetAbi() - return l2.NewL2WatcherClient(context.Background(), client, 0, 1, map[string]struct{}{}, contractAddr, messengerABI, db) + return l2.NewL2WatcherClient(context.Background(), l2Cli, 0, 1, map[string]struct{}{}, contractAddr, messengerABI, db) } -func prepareAuth(t *testing.T, client *ethclient.Client, private string) *bind.TransactOpts { +func prepareAuth(t *testing.T, l2Cli *ethclient.Client, private string) *bind.TransactOpts { privateKey, err := crypto.HexToECDSA(private) assert.NoError(t, err) publicKey := privateKey.Public() publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey) assert.True(t, ok) fromAddress := crypto.PubkeyToAddress(*publicKeyECDSA) - nonce, err := client.PendingNonceAt(context.Background(), fromAddress) + nonce, err := l2Cli.PendingNonceAt(context.Background(), fromAddress) assert.NoError(t, err) auth, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(53077)) assert.NoError(t, err) auth.Nonce = big.NewInt(int64(nonce)) auth.Value = big.NewInt(0) // in wei auth.GasLimit = uint64(30000000) // in units - auth.GasPrice, err = client.SuggestGasPrice(context.Background()) + auth.GasPrice, err = l2Cli.SuggestGasPrice(context.Background()) assert.NoError(t, err) return auth } diff --git a/bridge/mock/mock.go b/bridge/mock/mock.go deleted file mode 100644 index a56aebdfef..0000000000 --- a/bridge/mock/mock.go +++ /dev/null @@ -1,251 +0,0 @@ -package mock - -import ( - "context" - "crypto/ecdsa" - "crypto/elliptic" - "crypto/rand" - "encoding/binary" - "encoding/json" - "io" - "math/big" - "net" - "os" - "testing" - "time" - - "github.com/ethereum/go-ethereum/crypto/secp256k1" - "github.com/gorilla/websocket" - "github.com/scroll-tech/go-ethereum/common" - "github.com/scroll-tech/go-ethereum/core/types" - "github.com/scroll-tech/go-ethereum/crypto" - "github.com/scroll-tech/go-ethereum/ethclient" - "github.com/stretchr/testify/assert" - - "scroll-tech/database" - "scroll-tech/database/migrate" - - "scroll-tech/common/message" - "scroll-tech/coordinator" - coordinator_config "scroll-tech/coordinator/config" - - bridge_config "scroll-tech/bridge/config" - "scroll-tech/bridge/l2" - - "scroll-tech/common/docker" - - docker_db "scroll-tech/database/docker" -) - -// PerformHandshake sets up a websocket client to connect to the roller manager. -func PerformHandshake(t *testing.T, c *websocket.Conn) { - // Try to perform handshake - pk, sk := generateKeyPair() - authMsg := &message.AuthMessage{ - Identity: message.Identity{ - Name: "testRoller", - Timestamp: time.Now().UnixNano(), - PublicKey: common.Bytes2Hex(pk), - }, - Signature: "", - } - - hash, err := authMsg.Identity.Hash() - assert.NoError(t, err) - sig, err := secp256k1.Sign(hash, sk) - assert.NoError(t, err) - - authMsg.Signature = common.Bytes2Hex(sig) - - b, err := json.Marshal(authMsg) - assert.NoError(t, err) - - msg := &message.Msg{ - Type: message.Register, - Payload: b, - } - - b, err = json.Marshal(msg) - assert.NoError(t, err) - - assert.NoError(t, c.WriteMessage(websocket.BinaryMessage, b)) -} - -func generateKeyPair() (pubkey, privkey []byte) { - key, err := ecdsa.GenerateKey(secp256k1.S256(), rand.Reader) - if err != nil { - panic(err) - } - pubkey = elliptic.Marshal(secp256k1.S256(), key.X, key.Y) - - privkey = make([]byte, 32) - blob := key.D.Bytes() - copy(privkey[32-len(blob):], blob) - - return pubkey, privkey -} - -// SetupMockVerifier sets up a mocked verifier for a test case. -func SetupMockVerifier(t *testing.T, verifierEndpoint string) { - err := os.RemoveAll(verifierEndpoint) - assert.NoError(t, err) - - l, err := net.Listen("unix", verifierEndpoint) - assert.NoError(t, err) - - go func() { - conn, err := l.Accept() - assert.NoError(t, err) - - // Simply read all incoming messages and send a true boolean straight back. - for { - // Read length - buf := make([]byte, 4) - _, err = io.ReadFull(conn, buf) - assert.NoError(t, err) - - // Read message - msgLength := binary.LittleEndian.Uint64(buf) - buf = make([]byte, msgLength) - _, err = io.ReadFull(conn, buf) - assert.NoError(t, err) - - // Return boolean - buf = []byte{1} - _, err = conn.Write(buf) - assert.NoError(t, err) - } - }() - -} - -// L1GethTestConfig is the http and web socket port of l1geth docker -type L1GethTestConfig struct { - HPort int - WPort int -} - -// L2GethTestConfig is the http and web socket port of l2geth docker -type L2GethTestConfig struct { - HPort int - WPort int -} - -// DbTestconfig is the test config of database docker -type DbTestconfig struct { - DbName string - DbPort int - DB_CONFIG *database.DBConfig -} - -// TestConfig is the config for test -type TestConfig struct { - L1GethTestConfig - L2GethTestConfig - DbTestconfig -} - -// NewTestL1Docker starts and returns l1geth docker -func NewTestL1Docker(t *testing.T, tcfg *TestConfig) docker.ImgInstance { - img_geth := docker.NewImgGeth(t, "scroll_l1geth", "", "", tcfg.L1GethTestConfig.HPort, tcfg.L1GethTestConfig.WPort) - assert.NoError(t, img_geth.Start()) - return img_geth -} - -// NewTestL2Docker starts and returns l2geth docker -func NewTestL2Docker(t *testing.T, tcfg *TestConfig) docker.ImgInstance { - img_geth := docker.NewImgGeth(t, "scroll_l2geth", "", "", tcfg.L2GethTestConfig.HPort, tcfg.L2GethTestConfig.WPort) - assert.NoError(t, img_geth.Start()) - return img_geth -} - -// GetDbDocker starts and returns database docker -func GetDbDocker(t *testing.T, tcfg *TestConfig) docker.ImgInstance { - img_db := docker_db.NewImgDB(t, "postgres", "123456", tcfg.DbName, tcfg.DbPort) - assert.NoError(t, img_db.Start()) - return img_db -} - -// L2gethDocker return mock l2geth client created with docker for test -func L2gethDocker(t *testing.T, cfg *bridge_config.Config, tcfg *TestConfig) (*l2.Backend, docker.ImgInstance, docker.ImgInstance) { - // initialize l2geth docker image - img_geth := NewTestL2Docker(t, tcfg) - - cfg.L2Config.Endpoint = img_geth.Endpoint() - - // initialize db docker image - img_db := GetDbDocker(t, tcfg) - - db, err := database.NewOrmFactory(&database.DBConfig{ - DriverName: "postgres", - DSN: img_db.Endpoint(), - }) - assert.NoError(t, err) - - client, err := l2.New(context.Background(), cfg.L2Config, db) - assert.NoError(t, err) - - return client, img_geth, img_db -} - -// SetupRollerManager return coordinator.Manager for testcase -func SetupRollerManager(t *testing.T, cfg *coordinator_config.Config, orm database.OrmFactory) *coordinator.Manager { - // Load config file. - ctx := context.Background() - - SetupMockVerifier(t, cfg.RollerManagerConfig.VerifierEndpoint) - rollerManager, err := coordinator.New(ctx, cfg.RollerManagerConfig, orm) - assert.NoError(t, err) - - // Start rollermanager modules. - err = rollerManager.Start() - assert.NoError(t, err) - return rollerManager -} - -// ClearDB clears db -func ClearDB(t *testing.T, db_cfg *database.DBConfig) { - factory, err := database.NewOrmFactory(db_cfg) - assert.NoError(t, err) - db := factory.GetDB() - version0 := int64(0) - err = migrate.Rollback(db.DB, &version0) - assert.NoError(t, err) - err = migrate.Migrate(db.DB) - assert.NoError(t, err) - err = db.DB.Close() - assert.NoError(t, err) -} - -// PrepareDB will return DB for testcase -func PrepareDB(t *testing.T, db_cfg *database.DBConfig) database.OrmFactory { - db, err := database.NewOrmFactory(db_cfg) - assert.NoError(t, err) - return db -} - -// SendTxToL2Client will send a default Tx by calling l2geth client -func SendTxToL2Client(t *testing.T, client *ethclient.Client, private string) *types.Transaction { - privateKey, err := crypto.HexToECDSA(private) - assert.NoError(t, err) - publicKey := privateKey.Public() - publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey) - assert.True(t, ok) - fromAddress := crypto.PubkeyToAddress(*publicKeyECDSA) - nonce, err := client.PendingNonceAt(context.Background(), fromAddress) - assert.NoError(t, err) - value := big.NewInt(1000000000) // in wei - gasLimit := uint64(30000000) // in units - gasPrice, err := client.SuggestGasPrice(context.Background()) - assert.NoError(t, err) - toAddress := common.HexToAddress("0x4592d8f8d7b001e72cb26a73e4fa1806a51ac79d") - tx := types.NewTransaction(nonce, toAddress, value, gasLimit, gasPrice, nil) - chainID, err := client.ChainID(context.Background()) - assert.NoError(t, err) - - signedTx, err := types.SignTx(tx, types.NewEIP155Signer(chainID), privateKey) - assert.NoError(t, err) - - assert.NoError(t, client.SendTransaction(context.Background(), signedTx)) - return signedTx -} diff --git a/bridge/sender/sender_test.go b/bridge/sender/sender_test.go index bfc6b8ffbc..0fd169180b 100644 --- a/bridge/sender/sender_test.go +++ b/bridge/sender/sender_test.go @@ -8,30 +8,21 @@ import ( "testing" "time" - "golang.org/x/sync/errgroup" - cmap "github.com/orcaman/concurrent-map" "github.com/scroll-tech/go-ethereum/common" "github.com/scroll-tech/go-ethereum/crypto" "github.com/stretchr/testify/assert" - - "scroll-tech/common/docker" + "golang.org/x/sync/errgroup" "scroll-tech/bridge/config" - "scroll-tech/bridge/mock" "scroll-tech/bridge/sender" + + "scroll-tech/common/docker" ) const TX_BATCH = 100 var ( - TestConfig = &mock.TestConfig{ - L1GethTestConfig: mock.L1GethTestConfig{ - HPort: 0, - WPort: 8576, - }, - } - l1gethImg docker.ImgInstance private *ecdsa.PrivateKey ) @@ -42,17 +33,18 @@ func setupEnv(t *testing.T) { prv, err := crypto.HexToECDSA(cfg.L2Config.RelayerConfig.PrivateKey) assert.NoError(t, err) private = prv - l1gethImg = mock.NewTestL1Docker(t, TestConfig) + l1gethImg = docker.NewTestL1Docker(t) } func TestFunction(t *testing.T) { // Setup setupEnv(t) - t.Run("test Run sender", func(t *testing.T) { + t.Run("TestRunSender", func(t *testing.T) { // set config cfg, err := config.NewConfig("../config.json") assert.NoError(t, err) cfg.L2Config.RelayerConfig.SenderConfig.Endpoint = l1gethImg.Endpoint() + cfg.L1Config.Endpoint = l1gethImg.Endpoint() // create newSender newSender, err := sender.NewSender(context.Background(), cfg.L2Config.RelayerConfig.SenderConfig, private) diff --git a/database/docker/docker_db.go b/common/docker/docker_db.go similarity index 83% rename from database/docker/docker_db.go rename to common/docker/docker_db.go index 2bc5dc5e12..4238b53d41 100644 --- a/database/docker/docker_db.go +++ b/common/docker/docker_db.go @@ -8,24 +8,8 @@ import ( "time" "github.com/docker/docker/api/types" - "github.com/docker/docker/client" - - "scroll-tech/common/docker" -) - -var ( - cli *client.Client ) -func init() { - var err error - cli, err = client.NewClientWithOpts(client.FromEnv) - if err != nil { - panic(err) - } - cli.NegotiateAPIVersion(context.Background()) -} - // ImgDB the postgres image manager. type ImgDB struct { image string @@ -37,24 +21,24 @@ type ImgDB struct { password string running bool - *docker.Cmd + *Cmd } // NewImgDB return postgres db img instance. -func NewImgDB(t *testing.T, image, password, dbName string, port int) docker.ImgInstance { +func NewImgDB(t *testing.T, image, password, dbName string, port int) ImgInstance { return &ImgDB{ image: image, name: fmt.Sprintf("%s-%s_%d", image, dbName, port), password: password, dbName: dbName, port: port, - Cmd: docker.NewCmd(t), + Cmd: NewCmd(t), } } // Start postgres db container. func (i *ImgDB) Start() error { - id := docker.GetContainerID(i.name) + id := GetContainerID(i.name) if id != "" { return fmt.Errorf("container already exist, name: %s", i.name) } @@ -76,7 +60,7 @@ func (i *ImgDB) Stop() error { ctx := context.Background() // check if container is running, stop the running container. - id := docker.GetContainerID(i.name) + id := GetContainerID(i.name) if id != "" { timeout := time.Second * 3 if err := cli.ContainerStop(ctx, id, &timeout); err != nil { @@ -124,7 +108,7 @@ func (i *ImgDB) isOk() bool { select { case <-okCh: time.Sleep(time.Millisecond * 1500) - i.id = docker.GetContainerID(i.name) + i.id = GetContainerID(i.name) return i.id != "" case <-time.NewTimer(time.Second * 10).C: return false diff --git a/common/docker/docker_geth.go b/common/docker/docker_geth.go index 46018813b1..7135135b8d 100644 --- a/common/docker/docker_geth.go +++ b/common/docker/docker_geth.go @@ -9,22 +9,8 @@ import ( "time" "github.com/docker/docker/api/types" - "github.com/docker/docker/client" ) -var ( - cli *client.Client -) - -func init() { - var err error - cli, err = client.NewClientWithOpts(client.FromEnv) - if err != nil { - panic(err) - } - cli.NegotiateAPIVersion(context.Background()) -} - // ImgGeth the geth image manager include l1geth and l2geth. type ImgGeth struct { image string @@ -44,7 +30,7 @@ type ImgGeth struct { func NewImgGeth(t *testing.T, image, volume, ipc string, hPort, wPort int) ImgInstance { return &ImgGeth{ image: image, - name: fmt.Sprintf("%s-%d", image, time.Now().Unix()), + name: fmt.Sprintf("%s-%d", image, time.Now().Nanosecond()), volume: volume, ipcPath: ipc, httpPort: hPort, diff --git a/common/docker/docker_test.go b/common/docker/docker_test.go index cbe68002fb..9acafc7950 100644 --- a/common/docker/docker_test.go +++ b/common/docker/docker_test.go @@ -4,6 +4,8 @@ import ( "context" "testing" + "github.com/jmoiron/sqlx" + _ "github.com/lib/pq" //nolint:golint "github.com/scroll-tech/go-ethereum/ethclient" "github.com/stretchr/testify/assert" ) @@ -39,3 +41,13 @@ func TestL2Geth(t *testing.T) { assert.NoError(t, err) t.Logf("chainId: %s", chainID.String()) } + +func TestDB(t *testing.T) { + driverName := "postgres" + dbImg := NewTestDBDocker(t, driverName) + defer dbImg.Stop() + + db, err := sqlx.Open(driverName, dbImg.Endpoint()) + assert.NoError(t, err) + assert.NoError(t, db.Ping()) +} diff --git a/common/docker/interface.go b/common/docker/interface.go index 552bf82b2e..a6e4f7d792 100644 --- a/common/docker/interface.go +++ b/common/docker/interface.go @@ -5,8 +5,22 @@ import ( "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" + "github.com/docker/docker/client" ) +var ( + cli *client.Client +) + +func init() { + var err error + cli, err = client.NewClientWithOpts(client.FromEnv) + if err != nil { + panic(err) + } + cli.NegotiateAPIVersion(context.Background()) +} + // ImgInstance is an img instance. type ImgInstance interface { Start() error diff --git a/common/docker/mock.go b/common/docker/mock.go new file mode 100644 index 0000000000..27f4482ebc --- /dev/null +++ b/common/docker/mock.go @@ -0,0 +1,39 @@ +package docker + +import ( + "crypto/rand" + "math/big" + "testing" + + "github.com/stretchr/testify/assert" +) + +var ( + l1StartPort = 10000 + l2StartPort = 20000 + dbStartPort = 30000 +) + +// NewTestL1Docker starts and returns l1geth docker +func NewTestL1Docker(t *testing.T) ImgInstance { + id, _ := rand.Int(rand.Reader, big.NewInt(2000)) + imgL1geth := NewImgGeth(t, "scroll_l1geth", "", "", 0, l1StartPort+int(id.Int64())) + assert.NoError(t, imgL1geth.Start()) + return imgL1geth +} + +// NewTestL2Docker starts and returns l2geth docker +func NewTestL2Docker(t *testing.T) ImgInstance { + id, _ := rand.Int(rand.Reader, big.NewInt(2000)) + imgL2geth := NewImgGeth(t, "scroll_l2geth", "", "", 0, l2StartPort+int(id.Int64())) + assert.NoError(t, imgL2geth.Start()) + return imgL2geth +} + +// NewTestDBDocker starts and returns database docker +func NewTestDBDocker(t *testing.T, driverName string) ImgInstance { + id, _ := rand.Int(rand.Reader, big.NewInt(2000)) + imgDB := NewImgDB(t, driverName, "123456", "test_db", dbStartPort+int(id.Int64())) + assert.NoError(t, imgDB.Start()) + return imgDB +} diff --git a/common/go.mod b/common/go.mod index 5e72440a3d..edf9677ef2 100644 --- a/common/go.mod +++ b/common/go.mod @@ -4,6 +4,8 @@ go 1.18 require ( github.com/docker/docker v20.10.17+incompatible + github.com/jmoiron/sqlx v1.3.5 + github.com/lib/pq v1.10.6 github.com/mattn/go-colorable v0.1.8 github.com/mattn/go-isatty v0.0.14 github.com/scroll-tech/go-ethereum v1.10.14-0.20221012120556-b3a7c9b6917d @@ -45,6 +47,7 @@ require ( github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 // indirect github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458 // indirect github.com/mattn/go-runewidth v0.0.9 // indirect + github.com/mattn/go-sqlite3 v1.14.14 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/pointerstructure v1.2.0 // indirect github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae // indirect diff --git a/common/go.sum b/common/go.sum index cb6ba7fea6..7e61571f4f 100644 --- a/common/go.sum +++ b/common/go.sum @@ -152,6 +152,8 @@ github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34 github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= @@ -249,6 +251,8 @@ github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1C github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= +github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= @@ -284,6 +288,9 @@ github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.10.6 h1:jbk+ZieJ0D7EVGJYpL9QTz7/YW6UHbmdnZWYyK5cdBs= +github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= @@ -304,6 +311,9 @@ github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzp github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.14 h1:qZgc/Rwetq+MtyE18WhzjokPD93dNqLGNT3QJuLvBGw= +github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= diff --git a/coordinator/cmd/main.go b/coordinator/cmd/main.go index d81c880f52..ecad0fabd5 100644 --- a/coordinator/cmd/main.go +++ b/coordinator/cmd/main.go @@ -11,6 +11,7 @@ import ( "scroll-tech/common/utils" "scroll-tech/common/version" + "scroll-tech/database" rollers "scroll-tech/coordinator" diff --git a/coordinator/config/config.go b/coordinator/config/config.go index 43229753e0..bd4264c4de 100644 --- a/coordinator/config/config.go +++ b/coordinator/config/config.go @@ -8,6 +8,7 @@ import ( "strings" "scroll-tech/common/utils" + db_config "scroll-tech/database" ) diff --git a/coordinator/go.mod b/coordinator/go.mod index c771eddc6c..0f3f16a556 100644 --- a/coordinator/go.mod +++ b/coordinator/go.mod @@ -3,6 +3,7 @@ module scroll-tech/coordinator go 1.18 require ( + github.com/ethereum/go-ethereum v1.10.13 github.com/gorilla/websocket v1.4.2 github.com/orcaman/concurrent-map v1.0.0 github.com/scroll-tech/go-ethereum v1.10.14-0.20221012120556-b3a7c9b6917d @@ -15,7 +16,6 @@ require ( github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea // indirect - github.com/ethereum/go-ethereum v1.10.13 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.0 // indirect github.com/iden3/go-iden3-crypto v0.0.12 // indirect diff --git a/coordinator/manager.go b/coordinator/manager.go index a4c9315e45..d0f282375f 100644 --- a/coordinator/manager.go +++ b/coordinator/manager.go @@ -16,6 +16,7 @@ import ( "github.com/scroll-tech/go-ethereum/rpc" "scroll-tech/common/message" + "scroll-tech/database/orm" "scroll-tech/coordinator/config" diff --git a/coordinator/manager_test.go b/coordinator/manager_test.go index d15e9fbd2a..bcaf5d0506 100644 --- a/coordinator/manager_test.go +++ b/coordinator/manager_test.go @@ -2,48 +2,43 @@ package coordinator_test import ( "context" + "crypto/ecdsa" + "crypto/elliptic" + "crypto/rand" + "encoding/binary" "encoding/json" + "io" mathrand "math/rand" + "net" "net/url" "os" "strconv" "testing" "time" + "github.com/ethereum/go-ethereum/crypto/secp256k1" "github.com/gorilla/websocket" + "github.com/scroll-tech/go-ethereum/common" "github.com/scroll-tech/go-ethereum/core/types" "github.com/stretchr/testify/assert" + "scroll-tech/coordinator" + "scroll-tech/coordinator/config" + "scroll-tech/common/docker" "scroll-tech/common/message" - "scroll-tech/common/utils" - db_config "scroll-tech/database" - "scroll-tech/database/orm" - "scroll-tech/bridge/mock" - - "scroll-tech/coordinator" - "scroll-tech/coordinator/config" + "scroll-tech/database" + "scroll-tech/database/migrate" + "scroll-tech/database/orm" ) const managerAddr = "localhost:8132" const managerPort = ":8132" var ( - DB_CONFIG = &db_config.DBConfig{ - DriverName: utils.GetEnvWithDefault("TEST_DB_DRIVER", "postgres"), - DSN: utils.GetEnvWithDefault("TEST_DB_DSN", "postgres://postgres:123456@localhost:5436/testmanager_db?sslmode=disable"), - } - - TEST_CONFIG = &mock.TestConfig{ - L2GethTestConfig: mock.L2GethTestConfig{ - HPort: 8536, - WPort: 0, - }, - DbTestconfig: mock.DbTestconfig{ - DbName: "testmanager_db", - DbPort: 5436, - }, + dbConfig = &database.DBConfig{ + DriverName: "postgres", } l2gethImg docker.ImgInstance dbImg docker.ImgInstance @@ -51,9 +46,10 @@ var ( func setupEnv(t *testing.T) { // initialize l2geth docker image - l2gethImg = mock.NewTestL2Docker(t, TEST_CONFIG) + l2gethImg = docker.NewTestL2Docker(t) // initialize db docker image - dbImg = mock.GetDbDocker(t, TEST_CONFIG) + dbImg = docker.NewTestDBDocker(t, "postgres") + dbConfig.DSN = dbImg.Endpoint() } func TestFunction(t *testing.T) { @@ -72,7 +68,7 @@ func TestFunction(t *testing.T) { assert.NoError(t, err) defer c.Close() - mock.PerformHandshake(t, c) + performHandshake(t, c) // Roller manager should send a Websocket over the GetRollerChan select { @@ -99,7 +95,7 @@ func TestFunction(t *testing.T) { // Wait for the handshake timeout to pass <-time.After(coordinator.HandshakeTimeout + 1*time.Second) - mock.PerformHandshake(t, c) + performHandshake(t, c) // No websocket should be received select { @@ -123,7 +119,7 @@ func TestFunction(t *testing.T) { assert.NoError(t, err) defer c.Close() - mock.PerformHandshake(t, c) + performHandshake(t, c) // Roller manager should send a Websocket over the GetRollerChan select { @@ -136,28 +132,31 @@ func TestFunction(t *testing.T) { }) t.Run("TestTriggerProofGenerationSession", func(t *testing.T) { - // prepare DB - mock.ClearDB(t, DB_CONFIG) - db := mock.PrepareDB(t, DB_CONFIG) + // Create db handler and reset db. + db, err := database.NewOrmFactory(dbConfig) + assert.NoError(t, err) + assert.NoError(t, migrate.ResetDB(db.GetDB().DB)) // Test with two clients to make sure traces messages aren't duplicated // to rollers. numClients := uint8(2) verifierEndpoint := setupMockVerifier(t) rollerManager := setupRollerManager(t, verifierEndpoint, db) + defer rollerManager.Stop() // Set up and register `numClients` clients conns := make([]*websocket.Conn, numClients) for i := 0; i < int(numClients); i++ { u := url.URL{Scheme: "ws", Host: managerAddr, Path: "/"} - c, _, err := websocket.DefaultDialer.Dial(u.String(), nil) + var conn *websocket.Conn + conn, _, err = websocket.DefaultDialer.Dial(u.String(), nil) assert.NoError(t, err) - defer c.Close() + defer conn.Close() - mock.PerformHandshake(t, c) + performHandshake(t, conn) - conns[i] = c + conns[i] = conn } var results []*types.BlockResult @@ -197,19 +196,19 @@ func TestFunction(t *testing.T) { assert.NoError(t, json.Unmarshal(payload, traces)) } - - rollerManager.Stop() }) t.Run("TestIdleRollerSelection", func(t *testing.T) { + // Create db handler and reset db. + db, err := database.NewOrmFactory(dbConfig) + assert.NoError(t, err) + assert.NoError(t, migrate.ResetDB(db.GetDB().DB)) + // Test with two clients to make sure traces messages aren't duplicated // to rollers. numClients := uint8(2) verifierEndpoint := setupMockVerifier(t) - mock.ClearDB(t, DB_CONFIG) - db := mock.PrepareDB(t, DB_CONFIG) - // Ensure only one roller is picked per session. rollerManager := setupRollerManager(t, verifierEndpoint, db) defer rollerManager.Stop() @@ -219,13 +218,14 @@ func TestFunction(t *testing.T) { for i := 0; i < int(numClients); i++ { u := url.URL{Scheme: "ws", Host: managerAddr, Path: "/"} - c, _, err := websocket.DefaultDialer.Dial(u.String(), nil) + var conn *websocket.Conn + conn, _, err = websocket.DefaultDialer.Dial(u.String(), nil) assert.NoError(t, err) - c.SetReadDeadline(time.Now().Add(100 * time.Second)) + conn.SetReadDeadline(time.Now().Add(100 * time.Second)) - mock.PerformHandshake(t, c) + performHandshake(t, conn) time.Sleep(1 * time.Second) - conns[i] = c + conns[i] = conn } defer func() { for _, conn := range conns { @@ -272,7 +272,6 @@ func TestFunction(t *testing.T) { assert.NoError(t, l2gethImg.Stop()) assert.NoError(t, dbImg.Stop()) }) - } func setupRollerManager(t *testing.T, verifierEndpoint string, orm orm.BlockResultOrm) *coordinator.Manager { @@ -289,13 +288,89 @@ func setupRollerManager(t *testing.T, verifierEndpoint string, orm orm.BlockResu return rollerManager } +// performHandshake sets up a websocket client to connect to the roller manager. +func performHandshake(t *testing.T, c *websocket.Conn) { + // Try to perform handshake + pk, sk := generateKeyPair() + authMsg := &message.AuthMessage{ + Identity: message.Identity{ + Name: "testRoller", + Timestamp: time.Now().UnixNano(), + PublicKey: common.Bytes2Hex(pk), + }, + Signature: "", + } + + hash, err := authMsg.Identity.Hash() + assert.NoError(t, err) + sig, err := secp256k1.Sign(hash, sk) + assert.NoError(t, err) + + authMsg.Signature = common.Bytes2Hex(sig) + + b, err := json.Marshal(authMsg) + assert.NoError(t, err) + + msg := &message.Msg{ + Type: message.Register, + Payload: b, + } + + b, err = json.Marshal(msg) + assert.NoError(t, err) + + assert.NoError(t, c.WriteMessage(websocket.BinaryMessage, b)) +} + +func generateKeyPair() (pubkey, privkey []byte) { + key, err := ecdsa.GenerateKey(secp256k1.S256(), rand.Reader) + if err != nil { + panic(err) + } + pubkey = elliptic.Marshal(secp256k1.S256(), key.X, key.Y) + + privkey = make([]byte, 32) + blob := key.D.Bytes() + copy(privkey[32-len(blob):], blob) + + return pubkey, privkey +} + +// setupMockVerifier sets up a mocked verifier for a test case. func setupMockVerifier(t *testing.T) string { id := strconv.Itoa(mathrand.Int()) verifierEndpoint := "/tmp/" + id + ".sock" err := os.RemoveAll(verifierEndpoint) assert.NoError(t, err) - mock.SetupMockVerifier(t, verifierEndpoint) + err = os.RemoveAll(verifierEndpoint) + assert.NoError(t, err) + + l, err := net.Listen("unix", verifierEndpoint) + assert.NoError(t, err) + + go func() { + conn, err := l.Accept() + assert.NoError(t, err) + // Simply read all incoming messages and send a true boolean straight back. + for { + // Read length + buf := make([]byte, 4) + _, err = io.ReadFull(conn, buf) + assert.NoError(t, err) + + // Read message + msgLength := binary.LittleEndian.Uint64(buf) + buf = make([]byte, msgLength) + _, err = io.ReadFull(conn, buf) + assert.NoError(t, err) + + // Return boolean + buf = []byte{1} + _, err = conn.Write(buf) + assert.NoError(t, err) + } + }() return verifierEndpoint } diff --git a/database/docker/docker_test.go b/database/docker/docker_test.go deleted file mode 100644 index b00cda22be..0000000000 --- a/database/docker/docker_test.go +++ /dev/null @@ -1,33 +0,0 @@ -package docker - -import ( - "testing" - - "github.com/stretchr/testify/assert" - - "scroll-tech/database" - "scroll-tech/database/migrate" -) - -func TestDB(t *testing.T) { - img := NewImgDB(t, "postgres", "123456", "test", 5433) - assert.NoError(t, img.Start()) - defer img.Stop() - - factory, err := database.NewOrmFactory(&database.DBConfig{ - DriverName: "postgres", - DSN: img.Endpoint(), - }) - assert.NoError(t, err) - db := factory.GetDB() - - version := int64(0) - assert.NoError(t, migrate.Rollback(db.DB, &version)) - - assert.NoError(t, migrate.Migrate(db.DB)) - - vs, err := migrate.Current(db.DB) - assert.NoError(t, err) - - t.Logf("current version:%d", vs) -} diff --git a/database/go.mod b/database/go.mod index 419979722d..132fd1cd94 100644 --- a/database/go.mod +++ b/database/go.mod @@ -3,7 +3,6 @@ module scroll-tech/database go 1.18 require ( - github.com/docker/docker v20.10.17+incompatible github.com/jmoiron/sqlx v1.3.5 github.com/lib/pq v1.10.6 github.com/mattn/go-sqlite3 v1.14.14 @@ -13,30 +12,15 @@ require ( ) require ( - github.com/Microsoft/go-winio v0.6.0 // indirect github.com/btcsuite/btcd v0.20.1-beta // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/docker/distribution v2.8.1+incompatible // indirect - github.com/docker/go-connections v0.4.0 // indirect - github.com/docker/go-units v0.5.0 // indirect github.com/ethereum/go-ethereum v1.10.13 // indirect github.com/go-stack/stack v1.8.0 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/google/go-cmp v0.5.8 // indirect github.com/iden3/go-iden3-crypto v0.0.12 // indirect - github.com/morikuni/aec v1.0.0 // indirect - github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.0.2 // indirect - github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect - github.com/sirupsen/logrus v1.9.0 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa // indirect - golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect - golang.org/x/net v0.0.0-20220812174116-3211cb980234 // indirect golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab // indirect - golang.org/x/tools v0.1.12 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - gotest.tools/v3 v3.4.0 // indirect ) diff --git a/database/go.sum b/database/go.sum index 74c09311cc..d375e5d627 100644 --- a/database/go.sum +++ b/database/go.sum @@ -21,7 +21,6 @@ dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7 github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= @@ -35,8 +34,6 @@ github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbt github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= -github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o= @@ -100,15 +97,7 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= -github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= -github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.17+incompatible h1:JYCuMrWaVNophQTOrMMoSwudOVEfcegoZZrleKc1xwE= -github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= -github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dop251/goja v0.0.0-20211011172007-d99e4b8cbf48/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= @@ -148,8 +137,6 @@ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/me github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -182,9 +169,6 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -243,7 +227,6 @@ github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F github.com/karalabe/usb v0.0.0-20211005121534-4c5740d64559/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= @@ -293,11 +276,8 @@ github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4f github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= -github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae h1:O4SWKdcHVCvYqyDV+9CJA1fcDN2L11Bule0iFy3YlAI= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= @@ -313,10 +293,6 @@ github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9k github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= -github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -362,8 +338,6 @@ github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKl github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -399,7 +373,6 @@ github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPU github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= @@ -449,11 +422,9 @@ golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCc golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -469,7 +440,6 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -480,8 +450,6 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220812174116-3211cb980234 h1:RDqmgfe7SvlMWoqC3xwQ2blLO3fcWcxMa3eBLRdRW7E= -golang.org/x/net v0.0.0-20220812174116-3211cb980234/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -539,7 +507,6 @@ golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab h1:2QkjZIsXupsJbJIdSjjUOgWK3aEtzyuh2mPt3l/CkeU= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -557,7 +524,6 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -585,11 +551,8 @@ golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -659,8 +622,6 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= -gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/database/migrate/migrate.go b/database/migrate/migrate.go index d7e2f6afb9..a7ee894300 100644 --- a/database/migrate/migrate.go +++ b/database/migrate/migrate.go @@ -38,6 +38,14 @@ func Rollback(db *sql.DB, version *int64) error { return goose.Down(db, MigrationsDir) } +// ResetDB clean and migrate db. +func ResetDB(db *sql.DB) error { + if err := Rollback(db, new(int64)); err != nil { + return err + } + return Migrate(db) +} + // Current get current version func Current(db *sql.DB) (int64, error) { return goose.GetDBVersion(db) diff --git a/database/migrate/migrate_test.go b/database/migrate/migrate_test.go index 918564bec7..33ddca2058 100644 --- a/database/migrate/migrate_test.go +++ b/database/migrate/migrate_test.go @@ -8,35 +8,41 @@ import ( "github.com/pressly/goose/v3" "github.com/stretchr/testify/assert" - "scroll-tech/common/utils" - "scroll-tech/common/docker" "scroll-tech/database" - docker_db "scroll-tech/database/docker" ) var ( - pgDB *sqlx.DB - img docker.ImgInstance + pgDB *sqlx.DB + dbImg docker.ImgInstance ) -func initEnv(t *testing.T) { - img = docker_db.NewImgDB(t, "postgres", "123456", "test_1", 5434) - assert.NoError(t, img.Start()) +func initEnv(t *testing.T) error { + // Start db container. + dbImg = docker.NewTestDBDocker(t, "postgres") - var err error + // Create db orm handler. factory, err := database.NewOrmFactory(&database.DBConfig{ - DriverName: utils.GetEnvWithDefault("TEST_DB_DRIVER", "postgres"), - DSN: img.Endpoint(), + DriverName: "postgres", + DSN: dbImg.Endpoint(), }) - assert.NoError(t, err) + if err != nil { + return err + } pgDB = factory.GetDB() + return nil } -func TestMegration(t *testing.T) { - initEnv(t) - defer img.Stop() +func TestMigration(t *testing.T) { + defer func() { + if dbImg != nil { + assert.NoError(t, dbImg.Stop()) + } + }() + if err := initEnv(t); err != nil { + t.Fatal(err) + } err := Migrate(pgDB.DB) assert.NoError(t, err) diff --git a/database/orm_test.go b/database/orm_test.go index 3431c4505e..518edad228 100644 --- a/database/orm_test.go +++ b/database/orm_test.go @@ -7,17 +7,13 @@ import ( "testing" "time" - "github.com/jmoiron/sqlx" _ "github.com/lib/pq" _ "github.com/mattn/go-sqlite3" "github.com/scroll-tech/go-ethereum/core/types" - "github.com/scroll-tech/go-ethereum/log" "github.com/stretchr/testify/assert" "scroll-tech/common/docker" - docker_db "scroll-tech/database/docker" - "scroll-tech/database" "scroll-tech/database/migrate" "scroll-tech/database/orm" @@ -64,7 +60,6 @@ var ( Layer1Hash: "hash1", }, } - templateLayer2Message = []*orm.Layer2Message{ { Nonce: 1, @@ -91,62 +86,68 @@ var ( Layer2Hash: "hash1", }, } - sqlxdb *sqlx.DB - ormTrace orm.BlockResultOrm blockResult *types.BlockResult - ormLayer1 orm.Layer1MessageOrm - ormLayer2 orm.Layer2MessageOrm - img docker.ImgInstance - ormRollup orm.RollupResultOrm + + dbConfig *database.DBConfig + dbImg docker.ImgInstance + ormTrace orm.BlockResultOrm + ormLayer1 orm.Layer1MessageOrm + ormLayer2 orm.Layer2MessageOrm + ormRollup orm.RollupResultOrm ) -func initEnv(t *testing.T) error { - img = docker_db.NewImgDB(t, "postgres", "123456", "test", 5444) - assert.NoError(t, img.Start()) - factory, err := database.NewOrmFactory(&database.DBConfig{ - DriverName: "postgres", - DSN: img.Endpoint(), - }) - if err != nil { - return err - } +func setupEnv(t *testing.T) error { + // Init db config and start db container. + dbConfig = &database.DBConfig{DriverName: "postgres"} + dbImg = docker.NewTestDBDocker(t, dbConfig.DriverName) + dbConfig.DSN = dbImg.Endpoint() + + // Create db handler and reset db. + factory, err := database.NewOrmFactory(dbConfig) + assert.NoError(t, err) db := factory.GetDB() - sqlxdb = db + assert.NoError(t, migrate.ResetDB(db.DB)) + + // Init several orm handles. ormTrace = orm.NewBlockResultOrm(db) ormLayer1 = orm.NewLayer1MessageOrm(db) ormLayer2 = orm.NewLayer2MessageOrm(db) ormRollup = orm.NewRollupResultOrm(db) - // init db - version := int64(0) - err = migrate.Rollback(db.DB, &version) + templateBlockResult, err := os.ReadFile("../common/testdata/blockResult_orm.json") if err != nil { - log.Error("failed to rollback in test db", "err", err) return err } + // unmarshal blockResult + blockResult = &types.BlockResult{} + return json.Unmarshal(templateBlockResult, blockResult) +} - err = migrate.Migrate(db.DB) - if err != nil { - log.Error("migrate failed in test db", "err", err) - return err +// TestOrmFactory run several test cases. +func TestOrmFactory(t *testing.T) { + defer func() { + if dbImg != nil { + assert.NoError(t, dbImg.Stop()) + } + }() + if err := setupEnv(t); err != nil { + t.Fatal(err) } - templateBlockResult, err := os.ReadFile("../common/testdata/blockResult_orm.json") - if err != nil { - return err - } + t.Run("testOrm_BlockResults", testOrmBlockResults) - // unmarshal blockResult - if blockResult == nil { - blockResult = &types.BlockResult{} - return json.Unmarshal(templateBlockResult, blockResult) - } - return nil + t.Run("testOrmLayer1Message", testOrmLayer1Message) + + t.Run("testOrmLayer2Message", testOrmLayer2Message) + + t.Run("testOrmRollupResult", testOrmRollupResult) } -func TestOrm_BlockResults(t *testing.T) { - assert.NoError(t, initEnv(t)) - defer img.Stop() +func testOrmBlockResults(t *testing.T) { + // Create db handler and reset db. + factory, err := database.NewOrmFactory(dbConfig) + assert.NoError(t, err) + assert.NoError(t, migrate.ResetDB(factory.GetDB().DB)) res, err := ormTrace.GetBlockResults(map[string]interface{}{}) assert.NoError(t, err) @@ -185,18 +186,18 @@ func TestOrm_BlockResults(t *testing.T) { }) assert.NoError(t, err) assert.Equal(t, true, len(res) == 1 && res[0].BlockTrace.Hash.String() == blockResult.BlockTrace.Hash.String()) - - defer sqlxdb.Close() } -func TestOrm_Layer1Message(t *testing.T) { - assert.NoError(t, initEnv(t)) - defer img.Stop() +func testOrmLayer1Message(t *testing.T) { + // Create db handler and reset db. + factory, err := database.NewOrmFactory(dbConfig) + assert.NoError(t, err) + assert.NoError(t, migrate.ResetDB(factory.GetDB().DB)) expected := "expect hash" // Insert into db - err := ormLayer1.SaveLayer1Messages(context.Background(), templateLayer1Message) + err = ormLayer1.SaveLayer1Messages(context.Background(), templateLayer1Message) assert.NoError(t, err) err = ormLayer1.UpdateLayer1Status(context.Background(), "hash0", orm.MsgConfirmed) @@ -219,19 +220,18 @@ func TestOrm_Layer1Message(t *testing.T) { msg, err := ormLayer1.GetLayer1MessageByLayer1Hash("hash1") assert.NoError(t, err) assert.Equal(t, orm.MsgSubmitted, msg.Status) - - // todo : we should have a method to verify layer2hash in layer1message - defer sqlxdb.Close() } -func TestOrm_Layer2Message(t *testing.T) { - assert.NoError(t, initEnv(t)) - defer img.Stop() +func testOrmLayer2Message(t *testing.T) { + // Create db handler and reset db. + factory, err := database.NewOrmFactory(dbConfig) + assert.NoError(t, err) + assert.NoError(t, migrate.ResetDB(factory.GetDB().DB)) expected := "expect hash" // Insert into db - err := ormLayer2.SaveLayer2Messages(context.Background(), templateLayer2Message) + err = ormLayer2.SaveLayer2Messages(context.Background(), templateLayer2Message) assert.NoError(t, err) err = ormLayer2.UpdateLayer2Status(context.Background(), "hash0", orm.MsgConfirmed) @@ -254,18 +254,17 @@ func TestOrm_Layer2Message(t *testing.T) { msg, err := ormLayer2.GetLayer2MessageByLayer2Hash("hash1") assert.NoError(t, err) assert.Equal(t, orm.MsgSubmitted, msg.Status) - - // todo : we should have a method to verify layer1hash in layer1message - defer sqlxdb.Close() } -// TestOrm_RollupResult test rollup result table functions -func TestOrm_RollupResult(t *testing.T) { - assert.NoError(t, initEnv(t)) - defer img.Stop() +// testOrmRollupResult test rollup result table functions +func testOrmRollupResult(t *testing.T) { + // Create db handler and reset db. + factory, err := database.NewOrmFactory(dbConfig) + assert.NoError(t, err) + assert.NoError(t, migrate.ResetDB(factory.GetDB().DB)) blocks := []uint64{uint64(templateRollup[0].Number), uint64(templateRollup[1].Number)} - err := ormRollup.InsertPendingBlocks(context.Background(), blocks) + err = ormRollup.InsertPendingBlocks(context.Background(), blocks) assert.NoError(t, err) err = ormRollup.UpdateFinalizeTxHash(context.Background(), uint64(templateRollup[0].Number), templateRollup[0].FinalizeTxHash) diff --git a/roller/store/stack_test.go b/roller/store/stack_test.go index c914e387ec..9f6f09812e 100644 --- a/roller/store/stack_test.go +++ b/roller/store/stack_test.go @@ -4,9 +4,10 @@ import ( "io/ioutil" "os" "path/filepath" - "scroll-tech/common/message" "testing" + "scroll-tech/common/message" + "github.com/stretchr/testify/assert" )