diff --git a/common/docker/docker_app.go b/common/docker/docker_app.go deleted file mode 100644 index 568921001..000000000 --- a/common/docker/docker_app.go +++ /dev/null @@ -1,196 +0,0 @@ -package docker - -import ( - "crypto/rand" - "database/sql" - "encoding/json" - "fmt" - "math/big" - "os" - "testing" - "time" - - "github.com/jmoiron/sqlx" - "github.com/scroll-tech/go-ethereum/ethclient" - "github.com/stretchr/testify/assert" - - "scroll-tech/database" - - "scroll-tech/common/utils" -) - -var ( - l1StartPort = 10000 - l2StartPort = 20000 - dbStartPort = 30000 -) - -// AppAPI app interface. -type AppAPI interface { - IsRunning() bool - WaitResult(t *testing.T, timeout time.Duration, keyword string) bool - RunApp(waitResult func() bool) - WaitExit() - ExpectWithTimeout(t *testing.T, parallel bool, timeout time.Duration, keyword string) -} - -// App is collection struct of runtime docker images -type App struct { - L1gethImg GethImgInstance - L2gethImg GethImgInstance - DBImg ImgInstance - - dbClient *sql.DB - DBConfig *database.DBConfig - DBConfigFile string - - // common time stamp. - Timestamp int -} - -// NewDockerApp returns new instance of dockerApp struct -func NewDockerApp() *App { - timestamp := time.Now().Nanosecond() - app := &App{ - Timestamp: timestamp, - L1gethImg: newTestL1Docker(), - L2gethImg: newTestL2Docker(), - DBImg: newTestDBDocker("postgres"), - DBConfigFile: fmt.Sprintf("/tmp/%d_db-config.json", timestamp), - } - if err := app.mockDBConfig(); err != nil { - panic(err) - } - return app -} - -// RunImages runs all images togather -func (b *App) RunImages(t *testing.T) { - b.RunDBImage(t) - b.RunL1Geth(t) - b.RunL2Geth(t) -} - -// RunDBImage starts postgres docker container. -func (b *App) RunDBImage(t *testing.T) { - if b.DBImg.IsRunning() { - return - } - assert.NoError(t, b.DBImg.Start()) - - // try 5 times until the db is ready. - ok := utils.TryTimes(10, func() bool { - db, err := sqlx.Open("postgres", b.DBImg.Endpoint()) - return err == nil && db != nil && db.Ping() == nil - }) - assert.True(t, ok) -} - -// Free clear all running images, double check and recycle docker container. -func (b *App) Free() { - if b.L1gethImg.IsRunning() { - _ = b.L1gethImg.Stop() - } - if b.L2gethImg.IsRunning() { - _ = b.L2gethImg.Stop() - } - if b.DBImg.IsRunning() { - _ = b.DBImg.Stop() - _ = os.Remove(b.DBConfigFile) - if !utils.IsNil(b.dbClient) { - _ = b.dbClient.Close() - b.dbClient = nil - } - } -} - -// RunL1Geth starts l1geth docker container. -func (b *App) RunL1Geth(t *testing.T) { - if b.L1gethImg.IsRunning() { - return - } - assert.NoError(t, b.L1gethImg.Start()) -} - -// L1Client returns a ethclient by dialing running l1geth -func (b *App) L1Client() (*ethclient.Client, error) { - if utils.IsNil(b.L1gethImg) { - return nil, fmt.Errorf("l1 geth is not running") - } - client, err := ethclient.Dial(b.L1gethImg.Endpoint()) - if err != nil { - return nil, err - } - return client, nil -} - -// RunL2Geth starts l2geth docker container. -func (b *App) RunL2Geth(t *testing.T) { - if b.L2gethImg.IsRunning() { - return - } - assert.NoError(t, b.L2gethImg.Start()) -} - -// L2Client returns a ethclient by dialing running l2geth -func (b *App) L2Client() (*ethclient.Client, error) { - if utils.IsNil(b.L2gethImg) { - return nil, fmt.Errorf("l2 geth is not running") - } - client, err := ethclient.Dial(b.L2gethImg.Endpoint()) - if err != nil { - return nil, err - } - return client, nil -} - -// DBClient create and return *sql.DB instance. -func (b *App) DBClient(t *testing.T) *sql.DB { - if !utils.IsNil(b.dbClient) { - return b.dbClient - } - var ( - cfg = b.DBConfig - err error - ) - b.dbClient, err = sql.Open(cfg.DriverName, cfg.DSN) - assert.NoError(t, err) - b.dbClient.SetMaxOpenConns(cfg.MaxOpenNum) - b.dbClient.SetMaxIdleConns(cfg.MaxIdleNum) - assert.NoError(t, b.dbClient.Ping()) - return b.dbClient -} - -func (b *App) mockDBConfig() error { - b.DBConfig = &database.DBConfig{ - DSN: "", - DriverName: "postgres", - MaxOpenNum: 200, - MaxIdleNum: 20, - } - - if b.DBImg != nil { - b.DBConfig.DSN = b.DBImg.Endpoint() - } - data, err := json.Marshal(b.DBConfig) - if err != nil { - return err - } - - return os.WriteFile(b.DBConfigFile, data, 0644) //nolint:gosec -} - -func newTestL1Docker() GethImgInstance { - id, _ := rand.Int(rand.Reader, big.NewInt(2000)) - return NewImgGeth("scroll_l1geth", "", "", 0, l1StartPort+int(id.Int64())) -} - -func newTestL2Docker() GethImgInstance { - id, _ := rand.Int(rand.Reader, big.NewInt(2000)) - return NewImgGeth("scroll_l2geth", "", "", 0, l2StartPort+int(id.Int64())) -} - -func newTestDBDocker(driverName string) ImgInstance { - id, _ := rand.Int(rand.Reader, big.NewInt(2000)) - return NewImgDB(driverName, "123456", "test_db", dbStartPort+int(id.Int64())) -} diff --git a/common/docker/docker_db.go b/common/docker/docker_db.go deleted file mode 100644 index 8d82764bb..000000000 --- a/common/docker/docker_db.go +++ /dev/null @@ -1,131 +0,0 @@ -package docker - -import ( - "context" - "fmt" - "strings" - "time" - - "github.com/docker/docker/api/types/container" - - "scroll-tech/common/cmd" - "scroll-tech/common/utils" -) - -// ImgDB the postgres image manager. -type ImgDB struct { - image string - name string - id string - - dbName string - port int - password string - - running bool - cmd *cmd.Cmd -} - -// NewImgDB return postgres db img instance. -func NewImgDB(image, password, dbName string, port int) ImgInstance { - img := &ImgDB{ - image: image, - name: fmt.Sprintf("%s-%s_%d", image, dbName, port), - password: password, - dbName: dbName, - port: port, - } - img.cmd = cmd.NewCmd("docker", img.prepare()...) - return img -} - -// Start postgres db container. -func (i *ImgDB) Start() error { - id := GetContainerID(i.name) - if id != "" { - return fmt.Errorf("container already exist, name: %s", i.name) - } - i.running = i.isOk() - if !i.running { - _ = i.Stop() - return fmt.Errorf("failed to start image: %s", i.image) - } - return nil -} - -// Stop the container. -func (i *ImgDB) Stop() error { - if !i.running { - return nil - } - i.running = false - - ctx := context.Background() - // stop the running container. - if i.id == "" { - i.id = GetContainerID(i.name) - } - - timeoutSec := 3 - timeout := container.StopOptions{ - Timeout: &timeoutSec, - } - if err := cli.ContainerStop(ctx, i.id, timeout); err != nil { - return err - } - // remove the stopped container. - return cli.ContainerRemove(ctx, i.id, container.RemoveOptions{}) -} - -// Endpoint return the dsn. -func (i *ImgDB) Endpoint() string { - return fmt.Sprintf("postgres://postgres:%s@localhost:%d/%s?sslmode=disable", i.password, i.port, i.dbName) -} - -// IsRunning returns docker container's running status. -func (i *ImgDB) IsRunning() bool { - return i.running -} - -func (i *ImgDB) prepare() []string { - cmd := []string{"run", "--rm", "--name", i.name, "-p", fmt.Sprintf("%d:5432", i.port)} - envs := []string{ - "-e", "POSTGRES_PASSWORD=" + i.password, - "-e", fmt.Sprintf("POSTGRES_DB=%s", i.dbName), - } - - cmd = append(cmd, envs...) - return append(cmd, i.image) -} - -func (i *ImgDB) isOk() bool { - keyword := "database system is ready to accept connections" - okCh := make(chan struct{}, 1) - i.cmd.RegistFunc(keyword, func(buf string) { - if strings.Contains(buf, keyword) { - select { - case okCh <- struct{}{}: - default: - return - } - } - }) - defer i.cmd.UnRegistFunc(keyword) - // Start cmd in parallel. - i.cmd.RunCmd(true) - - select { - case <-okCh: - utils.TryTimes(20, func() bool { - i.id = GetContainerID(i.name) - return i.id != "" - }) - case err := <-i.cmd.ErrChan: - if err != nil { - fmt.Printf("failed to start %s, err: %v\n", i.name, err) - } - case <-time.After(time.Second * 20): - return false - } - return i.id != "" -} diff --git a/common/docker/docker_geth.go b/common/docker/docker_geth.go deleted file mode 100644 index 69f3e747a..000000000 --- a/common/docker/docker_geth.go +++ /dev/null @@ -1,174 +0,0 @@ -package docker - -import ( - "context" - "fmt" - "math/big" - "strconv" - "strings" - "time" - - "github.com/docker/docker/api/types/container" - "github.com/scroll-tech/go-ethereum/ethclient" - - "scroll-tech/common/cmd" - "scroll-tech/common/utils" -) - -// ImgGeth the geth image manager include l1geth and l2geth. -type ImgGeth struct { - image string - name string - id string - - volume string - ipcPath string - httpPort int - wsPort int - chainID *big.Int - - running bool - cmd *cmd.Cmd -} - -// NewImgGeth return geth img instance. -func NewImgGeth(image, volume, ipc string, hPort, wPort int) GethImgInstance { - img := &ImgGeth{ - image: image, - name: fmt.Sprintf("%s-%d", image, time.Now().Nanosecond()), - volume: volume, - ipcPath: ipc, - httpPort: hPort, - wsPort: wPort, - } - img.cmd = cmd.NewCmd("docker", img.params()...) - return img -} - -// Start run image and check if it is running healthily. -func (i *ImgGeth) Start() error { - id := GetContainerID(i.name) - if id != "" { - return fmt.Errorf("container already exist, name: %s", i.name) - } - i.running = i.isOk() - if !i.running { - _ = i.Stop() - return fmt.Errorf("failed to start image: %s", i.image) - } - - // try 10 times to get chainID until is ok. - utils.TryTimes(10, func() bool { - client, err := ethclient.Dial(i.Endpoint()) - if err == nil && client != nil { - i.chainID, err = client.ChainID(context.Background()) - return err == nil && i.chainID != nil - } - return false - }) - - return nil -} - -// IsRunning returns docker container's running status. -func (i *ImgGeth) IsRunning() bool { - return i.running -} - -// Endpoint return the connection endpoint. -func (i *ImgGeth) Endpoint() string { - switch true { - case i.httpPort != 0: - return fmt.Sprintf("http://127.0.0.1:%d", i.httpPort) - case i.wsPort != 0: - return fmt.Sprintf("ws://127.0.0.1:%d", i.wsPort) - default: - return i.ipcPath - } -} - -// ChainID return chainID. -func (i *ImgGeth) ChainID() *big.Int { - return i.chainID -} - -func (i *ImgGeth) isOk() bool { - keyword := "WebSocket enabled" - okCh := make(chan struct{}, 1) - i.cmd.RegistFunc(keyword, func(buf string) { - if strings.Contains(buf, keyword) { - select { - case okCh <- struct{}{}: - default: - return - } - } - }) - defer i.cmd.UnRegistFunc(keyword) - // Start cmd in parallel. - i.cmd.RunCmd(true) - - select { - case <-okCh: - utils.TryTimes(20, func() bool { - i.id = GetContainerID(i.name) - return i.id != "" - }) - case err := <-i.cmd.ErrChan: - if err != nil { - fmt.Printf("failed to start %s, err: %v\n", i.name, err) - } - case <-time.After(time.Second * 10): - return false - } - return i.id != "" -} - -// Stop the docker container. -func (i *ImgGeth) Stop() error { - if !i.running { - return nil - } - i.running = false - - ctx := context.Background() - // check if container is running, stop the running container. - id := GetContainerID(i.name) - if id != "" { - timeoutSec := 3 - timeout := container.StopOptions{ - Timeout: &timeoutSec, - } - if err := cli.ContainerStop(ctx, id, timeout); err != nil { - return err - } - i.id = id - } - // remove the stopped container. - return cli.ContainerRemove(ctx, i.id, container.RemoveOptions{}) -} - -func (i *ImgGeth) params() []string { - cmds := []string{"run", "--rm", "--name", i.name} - var ports []string - if i.httpPort != 0 { - ports = append(ports, []string{"-p", strconv.Itoa(i.httpPort) + ":8545"}...) - } - if i.wsPort != 0 { - ports = append(ports, []string{"-p", strconv.Itoa(i.wsPort) + ":8546"}...) - } - - var envs []string - if i.ipcPath != "" { - envs = append(envs, []string{"-e", fmt.Sprintf("IPC_PATH=%s", i.ipcPath)}...) - } - - if i.volume != "" { - cmds = append(cmds, []string{"-v", fmt.Sprintf("%s:%s", i.volume, i.volume)}...) - } - - cmds = append(cmds, ports...) - cmds = append(cmds, envs...) - - return append(cmds, i.image) -} diff --git a/common/docker/docker_test.go b/common/docker/docker_test.go deleted file mode 100644 index 71412fb48..000000000 --- a/common/docker/docker_test.go +++ /dev/null @@ -1,53 +0,0 @@ -package docker_test - -import ( - "context" - "testing" - - "github.com/jmoiron/sqlx" - "github.com/stretchr/testify/assert" - - "scroll-tech/common/docker" -) - -var ( - base *docker.App -) - -func TestMain(m *testing.M) { - base = docker.NewDockerApp() - - m.Run() - - base.Free() -} - -func TestDB(t *testing.T) { - base.RunDBImage(t) - - db, err := sqlx.Open("postgres", base.DBImg.Endpoint()) - assert.NoError(t, err) - assert.NoError(t, db.Ping()) -} - -func TestL1Geth(t *testing.T) { - base.RunL1Geth(t) - - client, err := base.L1Client() - assert.NoError(t, err) - - chainID, err := client.ChainID(context.Background()) - assert.NoError(t, err) - t.Logf("chainId: %s", chainID.String()) -} - -func TestL2Geth(t *testing.T) { - base.RunL2Geth(t) - - client, err := base.L2Client() - assert.NoError(t, err) - - chainID, err := client.ChainID(context.Background()) - assert.NoError(t, err) - t.Logf("chainId: %s", chainID.String()) -} diff --git a/common/go.mod b/common/go.mod index 8a3e74e99..dc0985f7e 100644 --- a/common/go.mod +++ b/common/go.mod @@ -9,7 +9,6 @@ require ( github.com/docker/docker v25.0.3+incompatible github.com/gin-contrib/pprof v1.4.0 github.com/gin-gonic/gin v1.9.1 - github.com/jmoiron/sqlx v1.3.5 github.com/mattn/go-colorable v0.1.13 github.com/mattn/go-isatty v0.0.20 github.com/modern-go/reflect2 v1.0.2 @@ -144,7 +143,6 @@ require ( github.com/mailru/easyjson v0.7.6 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect github.com/mattn/go-shellwords v1.0.12 // indirect - github.com/mattn/go-sqlite3 v1.14.16 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect github.com/miekg/pkcs11 v1.1.1 // indirect diff --git a/common/go.sum b/common/go.sum index c0cde110c..adb41db47 100644 --- a/common/go.sum +++ b/common/go.sum @@ -268,7 +268,6 @@ github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXS github.com/go-playground/validator/v10 v10.15.5 h1:LEBecTWb/1j5TNY1YYG2RcOUN3R7NLylN+x8TTueE24= github.com/go-playground/validator/v10 v10.15.5/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= github.com/go-sql-driver/mysql v1.3.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -400,8 +399,6 @@ github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= 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/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= @@ -443,7 +440,6 @@ github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ic github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= github.com/lib/pq v0.0.0-20150723085316-0dad96c0b94f/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.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= @@ -469,9 +465,6 @@ github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/mattn/go-sqlite3 v1.6.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.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= -github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= diff --git a/coordinator/cmd/api/app/mock_app.go b/coordinator/cmd/api/app/mock_app.go index b690592f3..e7ad3c900 100644 --- a/coordinator/cmd/api/app/mock_app.go +++ b/coordinator/cmd/api/app/mock_app.go @@ -13,7 +13,6 @@ import ( "github.com/scroll-tech/go-ethereum/params" "scroll-tech/common/cmd" - "scroll-tech/common/docker" "scroll-tech/common/testcontainers" "scroll-tech/common/utils" @@ -38,7 +37,7 @@ type CoordinatorApp struct { HTTPPort int64 args []string - docker.AppAPI + *cmd.Cmd } // NewCoordinatorApp return a new coordinatorApp manager. @@ -64,14 +63,14 @@ func NewCoordinatorApp(testApps *testcontainers.TestcontainerApps, configFile st // RunApp run coordinator-test child process by multi parameters. func (c *CoordinatorApp) RunApp(t *testing.T, args ...string) { - c.AppAPI = cmd.NewCmd(string(utils.CoordinatorAPIApp), append(c.args, args...)...) - c.AppAPI.RunApp(func() bool { return c.AppAPI.WaitResult(t, time.Second*20, "Start coordinator api successfully") }) + c.Cmd = cmd.NewCmd(string(utils.CoordinatorAPIApp), append(c.args, args...)...) + c.Cmd.RunApp(func() bool { return c.Cmd.WaitResult(t, time.Second*20, "Start coordinator api successfully") }) } // Free stop and release coordinator-test. func (c *CoordinatorApp) Free() { - if !utils.IsNil(c.AppAPI) { - c.AppAPI.WaitExit() + if !utils.IsNil(c.Cmd) { + c.Cmd.WaitExit() } _ = os.Remove(c.coordinatorFile) } diff --git a/coordinator/test/api_test.go b/coordinator/test/api_test.go index 8eee8918c..e1006fc56 100644 --- a/coordinator/test/api_test.go +++ b/coordinator/test/api_test.go @@ -22,7 +22,6 @@ import ( "scroll-tech/database/migrate" "scroll-tech/common/testcontainers" - tc "scroll-tech/common/testcontainers" "scroll-tech/common/types" "scroll-tech/common/types/encoding" "scroll-tech/common/types/message" @@ -156,7 +155,7 @@ func setEnv(t *testing.T) { glogger.Verbosity(log.LvlInfo) log.Root().SetHandler(glogger) - testApps = tc.NewTestcontainerApps() + testApps = testcontainers.NewTestcontainerApps() assert.NoError(t, testApps.StartPostgresContainer()) db, err = testApps.GetGormDBClient() diff --git a/database/migrate/migrate_test.go b/database/migrate/migrate_test.go index c6c25db03..b44be6fa3 100644 --- a/database/migrate/migrate_test.go +++ b/database/migrate/migrate_test.go @@ -1,93 +1,89 @@ package migrate import ( + "database/sql" "testing" - "github.com/jmoiron/sqlx" _ "github.com/lib/pq" "github.com/stretchr/testify/assert" - "scroll-tech/common/docker" - - "scroll-tech/database" + "scroll-tech/common/testcontainers" ) var ( - base *docker.App - pgDB *sqlx.DB + testApps *testcontainers.TestcontainerApps + pgDB *sql.DB ) -func initEnv(t *testing.T) error { +func setupEnv(t *testing.T) { // Start db container. - base.RunDBImage(t) + testApps = testcontainers.NewTestcontainerApps() + assert.NoError(t, testApps.StartPostgresContainer()) + gormClient, err := testApps.GetGormDBClient() + assert.NoError(t, err) + pgDB, err = gormClient.DB() + assert.NoError(t, err) +} - // Create db orm handler. - factory, err := database.NewOrmFactory(base.DBConfig) - if err != nil { - return err - } - pgDB = factory.GetDB() - return nil +func TestMain(m *testing.M) { + defer func() { + if testApps != nil { + testApps.Free() + } + }() + m.Run() } func TestMigrate(t *testing.T) { - base = docker.NewDockerApp() - if err := initEnv(t); err != nil { - t.Fatal(err) - } - + setupEnv(t) t.Run("testCurrent", testCurrent) t.Run("testStatus", testStatus) t.Run("testResetDB", testResetDB) t.Run("testMigrate", testMigrate) t.Run("testRollback", testRollback) - - t.Cleanup(func() { - base.Free() - }) } func testCurrent(t *testing.T) { - cur, err := Current(pgDB.DB) + cur, err := Current(pgDB) assert.NoError(t, err) assert.Equal(t, int64(0), cur) } func testStatus(t *testing.T) { - status := Status(pgDB.DB) + status := Status(pgDB) assert.NoError(t, status) } func testResetDB(t *testing.T) { - assert.NoError(t, ResetDB(pgDB.DB)) - cur, err := Current(pgDB.DB) + assert.NoError(t, ResetDB(pgDB)) + cur, err := Current(pgDB) assert.NoError(t, err) // total number of tables. assert.Equal(t, int64(16), cur) } func testMigrate(t *testing.T) { - assert.NoError(t, Migrate(pgDB.DB)) - cur, err := Current(pgDB.DB) + assert.NoError(t, Migrate(pgDB)) + cur, err := Current(pgDB) assert.NoError(t, err) assert.Equal(t, int64(16), cur) } func testRollback(t *testing.T) { - version, err := Current(pgDB.DB) + version, err := Current(pgDB) assert.NoError(t, err) assert.Equal(t, int64(16), version) - assert.NoError(t, Rollback(pgDB.DB, nil)) + assert.NoError(t, Rollback(pgDB, nil)) - cur, err := Current(pgDB.DB) + cur, err := Current(pgDB) assert.NoError(t, err) assert.Equal(t, version, cur+1) targetVersion := int64(0) - assert.NoError(t, Rollback(pgDB.DB, &targetVersion)) + assert.NoError(t, Rollback(pgDB, &targetVersion)) - cur, err = Current(pgDB.DB) + cur, err = Current(pgDB) assert.NoError(t, err) assert.Equal(t, int64(0), cur) } diff --git a/prover/cmd/app/mock_app.go b/prover/cmd/app/mock_app.go index a8ed111c7..8d4681545 100644 --- a/prover/cmd/app/mock_app.go +++ b/prover/cmd/app/mock_app.go @@ -12,7 +12,6 @@ import ( "scroll-tech/prover/config" "scroll-tech/common/cmd" - "scroll-tech/common/docker" "scroll-tech/common/testcontainers" "scroll-tech/common/types/message" "scroll-tech/common/utils" @@ -40,7 +39,7 @@ type ProverApp struct { index int name string args []string - docker.AppAPI + *cmd.Cmd } // NewProverApp return a new proverApp manager. @@ -65,7 +64,7 @@ func NewProverApp(testApps *testcontainers.TestcontainerApps, mockName utils.Moc name: name, args: []string{"--log.debug", "--config", proverFile}, } - proverApp.AppAPI = cmd.NewCmd(proverApp.name, proverApp.args...) + proverApp.Cmd = cmd.NewCmd(proverApp.name, proverApp.args...) if err := proverApp.MockConfig(true, httpURL, proofType); err != nil { panic(err) } @@ -74,13 +73,13 @@ func NewProverApp(testApps *testcontainers.TestcontainerApps, mockName utils.Moc // RunApp run prover-test child process by multi parameters. func (r *ProverApp) RunApp(t *testing.T) { - r.AppAPI.RunApp(func() bool { return r.AppAPI.WaitResult(t, time.Second*40, "prover start successfully") }) + r.Cmd.RunApp(func() bool { return r.Cmd.WaitResult(t, time.Second*40, "prover start successfully") }) } // Free stop and release prover-test. func (r *ProverApp) Free() { - if !utils.IsNil(r.AppAPI) { - r.AppAPI.WaitExit() + if !utils.IsNil(r.Cmd) { + r.Cmd.WaitExit() } _ = os.Remove(r.proverFile) _ = os.Remove(r.Config.KeystorePath) diff --git a/rollup/cmd/mock_app.go b/rollup/cmd/mock_app.go index 472c91c2f..b57f5def8 100644 --- a/rollup/cmd/mock_app.go +++ b/rollup/cmd/mock_app.go @@ -7,12 +7,11 @@ import ( "testing" "time" + "scroll-tech/rollup/internal/config" + "scroll-tech/common/cmd" - "scroll-tech/common/docker" "scroll-tech/common/testcontainers" "scroll-tech/common/utils" - - "scroll-tech/rollup/internal/config" ) // MockApp mockApp-test client manager. @@ -20,7 +19,7 @@ type MockApp struct { Config *config.Config testApps *testcontainers.TestcontainerApps - mockApps map[utils.MockAppName]docker.AppAPI + mockApps map[utils.MockAppName]*cmd.Cmd originFile string rollupFile string @@ -33,7 +32,7 @@ func NewRollupApp(testApps *testcontainers.TestcontainerApps, file string) *Mock rollupFile := fmt.Sprintf("/tmp/%d_rollup-config.json", testApps.Timestamp) rollupApp := &MockApp{ testApps: testApps, - mockApps: make(map[utils.MockAppName]docker.AppAPI), + mockApps: make(map[utils.MockAppName]*cmd.Cmd), originFile: file, rollupFile: rollupFile, args: []string{"--log.debug", "--config", rollupFile}, @@ -69,7 +68,7 @@ func (b *MockApp) WaitExit() { for _, app := range b.mockApps { app.WaitExit() } - b.mockApps = make(map[utils.MockAppName]docker.AppAPI) + b.mockApps = make(map[utils.MockAppName]*cmd.Cmd) } // Free stop and release rollup mocked apps. diff --git a/rollup/internal/controller/relayer/relayer_test.go b/rollup/internal/controller/relayer/relayer_test.go index 9cada496a..c3ee3e9f7 100644 --- a/rollup/internal/controller/relayer/relayer_test.go +++ b/rollup/internal/controller/relayer/relayer_test.go @@ -14,8 +14,8 @@ import ( "github.com/stretchr/testify/assert" "scroll-tech/common/database" - "scroll-tech/common/docker" dockercompose "scroll-tech/common/docker-compose/l1" + "scroll-tech/common/testcontainers" "scroll-tech/common/types/encoding" "scroll-tech/common/types/encoding/codecv0" @@ -26,7 +26,7 @@ var ( // config cfg *config.Config - base *docker.App + testApps *testcontainers.TestcontainerApps posL1TestEnv *dockercompose.PoSL1TestEnv // l2geth client @@ -53,16 +53,25 @@ func setupEnv(t *testing.T) { cfg, err = config.NewConfig("../../../conf/config.json") assert.NoError(t, err) - base.RunL2Geth(t) - base.RunDBImage(t) + posL1TestEnv, err = dockercompose.NewPoSL1TestEnv() + assert.NoError(t, err, "failed to create PoS L1 test environment") + assert.NoError(t, posL1TestEnv.Start(), "failed to start PoS L1 test environment") + + testApps = testcontainers.NewTestcontainerApps() + assert.NoError(t, testApps.StartPostgresContainer()) + assert.NoError(t, testApps.StartL2GethContainer()) cfg.L2Config.RelayerConfig.SenderConfig.Endpoint = posL1TestEnv.Endpoint() - cfg.L1Config.RelayerConfig.SenderConfig.Endpoint = base.L2gethImg.Endpoint() + cfg.L1Config.RelayerConfig.SenderConfig.Endpoint, err = testApps.GetL2GethEndPoint() + assert.NoError(t, err) + + dsn, err := testApps.GetDBEndPoint() + assert.NoError(t, err) cfg.DBConfig = &database.Config{ - DSN: base.DBConfig.DSN, - DriverName: base.DBConfig.DriverName, - MaxOpenNum: base.DBConfig.MaxOpenNum, - MaxIdleNum: base.DBConfig.MaxIdleNum, + DSN: dsn, + DriverName: "postgres", + MaxOpenNum: 200, + MaxIdleNum: 20, } port, err := rand.Int(rand.Reader, big.NewInt(10000)) assert.NoError(t, err) @@ -70,7 +79,7 @@ func setupEnv(t *testing.T) { cfg.L2Config.RelayerConfig.ChainMonitor.BaseURL = "http://localhost:" + svrPort // Create l2geth client. - l2Cli, err = base.L2Client() + l2Cli, err = testApps.GetL2GethClient() assert.NoError(t, err) templateBlockTrace1, err := os.ReadFile("../../../testdata/blockTrace_02.json") @@ -97,19 +106,14 @@ func setupEnv(t *testing.T) { } func TestMain(m *testing.M) { - base = docker.NewDockerApp() - base.Free() - - var err error - posL1TestEnv, err = dockercompose.NewPoSL1TestEnv() - if err != nil { - log.Crit("failed to create PoS L1 test environment", "err", err) - } - if err := posL1TestEnv.Start(); err != nil { - log.Crit("failed to start PoS L1 test environment", "err", err) - } - defer posL1TestEnv.Stop() - + defer func() { + if testApps != nil { + testApps.Free() + } + if posL1TestEnv != nil { + posL1TestEnv.Stop() + } + }() m.Run() } diff --git a/rollup/internal/controller/sender/sender_test.go b/rollup/internal/controller/sender/sender_test.go index dbdb69b3b..579becf46 100644 --- a/rollup/internal/controller/sender/sender_test.go +++ b/rollup/internal/controller/sender/sender_test.go @@ -26,12 +26,10 @@ import ( "github.com/stretchr/testify/assert" "gorm.io/gorm" - "scroll-tech/database/migrate" - - "scroll-tech/common/database" - "scroll-tech/common/docker" dockercompose "scroll-tech/common/docker-compose/l1" + "scroll-tech/common/testcontainers" "scroll-tech/common/types" + "scroll-tech/database/migrate" bridgeAbi "scroll-tech/rollup/abi" "scroll-tech/rollup/internal/config" @@ -39,12 +37,10 @@ import ( "scroll-tech/rollup/mock_bridge" ) -const TXBatch = 50 - var ( privateKey *ecdsa.PrivateKey cfg *config.Config - base *docker.App + testApps *testcontainers.TestcontainerApps posL1TestEnv *dockercompose.PoSL1TestEnv txTypes = []string{"LegacyTx", "DynamicFeeTx", "DynamicFeeTx"} txBlob = []*kzg4844.Blob{nil, nil, randBlob()} @@ -54,19 +50,14 @@ var ( ) func TestMain(m *testing.M) { - base = docker.NewDockerApp() - defer base.Free() - - var err error - posL1TestEnv, err = dockercompose.NewPoSL1TestEnv() - if err != nil { - log.Crit("failed to create PoS L1 test environment", "err", err) - } - if err := posL1TestEnv.Start(); err != nil { - log.Crit("failed to start PoS L1 test environment", "err", err) - } - defer posL1TestEnv.Stop() - + defer func() { + if testApps != nil { + testApps.Free() + } + if posL1TestEnv != nil { + posL1TestEnv.Stop() + } + }() m.Run() } @@ -82,17 +73,18 @@ func setupEnv(t *testing.T) { assert.NoError(t, err) privateKey = priv + posL1TestEnv, err = dockercompose.NewPoSL1TestEnv() + assert.NoError(t, err, "failed to create PoS L1 test environment") + assert.NoError(t, posL1TestEnv.Start(), "failed to start PoS L1 test environment") + + testApps = testcontainers.NewTestcontainerApps() + assert.NoError(t, testApps.StartPostgresContainer()) + assert.NoError(t, testApps.StartL1GethContainer()) + assert.NoError(t, testApps.StartL2GethContainer()) + cfg.L2Config.RelayerConfig.SenderConfig.Endpoint = posL1TestEnv.Endpoint() - base.RunDBImage(t) - db, err = database.InitDB( - &database.Config{ - DSN: base.DBConfig.DSN, - DriverName: base.DBConfig.DriverName, - MaxOpenNum: base.DBConfig.MaxOpenNum, - MaxIdleNum: base.DBConfig.MaxIdleNum, - }, - ) + db, err = testApps.GetGormDBClient() assert.NoError(t, err) sqlDB, err := db.DB() assert.NoError(t, err) diff --git a/rollup/internal/controller/watcher/l1_watcher_test.go b/rollup/internal/controller/watcher/l1_watcher_test.go index ffeb18faa..1ba338bdc 100644 --- a/rollup/internal/controller/watcher/l1_watcher_test.go +++ b/rollup/internal/controller/watcher/l1_watcher_test.go @@ -27,7 +27,7 @@ import ( func setupL1Watcher(t *testing.T) (*L1WatcherClient, *gorm.DB) { db := setupDB(t) - client, err := ethclient.Dial(base.L1gethImg.Endpoint()) + client, err := testApps.GetL1GethClient() assert.NoError(t, err) l1Cfg := cfg.L1Config watcher := NewL1WatcherClient(context.Background(), client, l1Cfg.StartHeight, l1Cfg.Confirmations, l1Cfg.L1MessageQueueAddress, l1Cfg.RelayerConfig.RollupContractAddress, db, nil) diff --git a/rollup/internal/controller/watcher/watcher_test.go b/rollup/internal/controller/watcher/watcher_test.go index df53c9e79..78bf754db 100644 --- a/rollup/internal/controller/watcher/watcher_test.go +++ b/rollup/internal/controller/watcher/watcher_test.go @@ -11,9 +11,8 @@ import ( "gorm.io/gorm" "scroll-tech/common/database" - "scroll-tech/common/docker" + "scroll-tech/common/testcontainers" "scroll-tech/common/types/encoding" - "scroll-tech/database/migrate" "scroll-tech/rollup/internal/config" @@ -23,7 +22,7 @@ var ( // config cfg *config.Config - base *docker.App + testApps *testcontainers.TestcontainerApps // l2geth client l2Cli *ethclient.Client @@ -42,19 +41,27 @@ func setupEnv(t *testing.T) (err error) { cfg, err = config.NewConfig("../../../conf/config.json") assert.NoError(t, err) - base.RunImages(t) + testApps = testcontainers.NewTestcontainerApps() + assert.NoError(t, testApps.StartPostgresContainer()) + assert.NoError(t, testApps.StartL1GethContainer()) + assert.NoError(t, testApps.StartL2GethContainer()) - cfg.L2Config.RelayerConfig.SenderConfig.Endpoint = base.L1gethImg.Endpoint() - cfg.L1Config.RelayerConfig.SenderConfig.Endpoint = base.L2gethImg.Endpoint() + cfg.L2Config.RelayerConfig.SenderConfig.Endpoint, err = testApps.GetL1GethEndPoint() + assert.NoError(t, err) + cfg.L1Config.RelayerConfig.SenderConfig.Endpoint, err = testApps.GetL2GethEndPoint() + assert.NoError(t, err) + + dsn, err := testApps.GetDBEndPoint() + assert.NoError(t, err) cfg.DBConfig = &database.Config{ - DSN: base.DBConfig.DSN, - DriverName: base.DBConfig.DriverName, - MaxOpenNum: base.DBConfig.MaxOpenNum, - MaxIdleNum: base.DBConfig.MaxIdleNum, + DSN: dsn, + DriverName: "postgres", + MaxOpenNum: 200, + MaxIdleNum: 20, } // Create l2geth client. - l2Cli, err = base.L2Client() + l2Cli, err = testApps.GetL2GethClient() assert.NoError(t, err) block1 = readBlockFromJSON(t, "../../../testdata/blockTrace_02.json") @@ -73,11 +80,12 @@ func setupDB(t *testing.T) *gorm.DB { } func TestMain(m *testing.M) { - base = docker.NewDockerApp() - + defer func() { + if testApps != nil { + testApps.Free() + } + }() m.Run() - - base.Free() } func TestFunction(t *testing.T) { diff --git a/rollup/internal/orm/orm_test.go b/rollup/internal/orm/orm_test.go index 87af173b8..39a850a30 100644 --- a/rollup/internal/orm/orm_test.go +++ b/rollup/internal/orm/orm_test.go @@ -14,8 +14,7 @@ import ( "scroll-tech/database/migrate" - "scroll-tech/common/database" - "scroll-tech/common/docker" + "scroll-tech/common/testcontainers" "scroll-tech/common/types" "scroll-tech/common/types/encoding" "scroll-tech/common/types/encoding/codecv0" @@ -23,7 +22,7 @@ import ( ) var ( - base *docker.App + testApps *testcontainers.TestcontainerApps db *gorm.DB l2BlockOrm *L2Block @@ -37,23 +36,23 @@ var ( func TestMain(m *testing.M) { t := &testing.T{} + defer func() { + if testApps != nil { + testApps.Free() + } + tearDownEnv(t) + }() setupEnv(t) - defer tearDownEnv(t) m.Run() } func setupEnv(t *testing.T) { - base = docker.NewDockerApp() - base.RunDBImage(t) var err error - db, err = database.InitDB( - &database.Config{ - DSN: base.DBConfig.DSN, - DriverName: base.DBConfig.DriverName, - MaxOpenNum: base.DBConfig.MaxOpenNum, - MaxIdleNum: base.DBConfig.MaxIdleNum, - }, - ) + + testApps = testcontainers.NewTestcontainerApps() + assert.NoError(t, testApps.StartPostgresContainer()) + + db, err = testApps.GetGormDBClient() assert.NoError(t, err) sqlDB, err := db.DB() assert.NoError(t, err) @@ -81,7 +80,6 @@ func tearDownEnv(t *testing.T) { sqlDB, err := db.DB() assert.NoError(t, err) sqlDB.Close() - base.Free() } func TestL1BlockOrm(t *testing.T) {