From fe464a217c2e8dcf094a4a04c25668d72d1e3839 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Garcia?= Date: Tue, 14 Dec 2021 23:55:49 -0300 Subject: [PATCH] Add docker test support for mysql --- docker-compose.yml | 1 + ksql_test.go | 4 --- main_test.go | 69 ++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 68 insertions(+), 6 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 715b450..438ef64 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -24,6 +24,7 @@ services: - "127.0.0.1:3306:3306" environment: MYSQL_ROOT_PASSWORD: mysql + MYSQL_DATABASE: ksql sqlserver: image: microsoft/mssql-server-linux:2017-latest diff --git a/ksql_test.go b/ksql_test.go index 755bd97..495b56d 100644 --- a/ksql_test.go +++ b/ksql_test.go @@ -10,12 +10,8 @@ import ( "strings" "testing" - _ "github.com/denisenkom/go-mssqldb" "github.com/ditointernet/go-assert" - _ "github.com/go-sql-driver/mysql" "github.com/jackc/pgx/v4/pgxpool" - _ "github.com/lib/pq" - _ "github.com/mattn/go-sqlite3" "github.com/vingarcia/ksql/nullable" ) diff --git a/main_test.go b/main_test.go index 1fc220f..346ce8c 100644 --- a/main_test.go +++ b/main_test.go @@ -11,6 +11,11 @@ import ( dockertest "github.com/ory/dockertest/v3" "github.com/ory/dockertest/v3/docker" + + _ "github.com/denisenkom/go-mssqldb" + _ "github.com/go-sql-driver/mysql" + _ "github.com/lib/pq" + _ "github.com/mattn/go-sqlite3" ) var connectionString = map[string]string{ @@ -23,12 +28,15 @@ var connectionString = map[string]string{ func TestMain(m *testing.M) { postgresURL, closePostgres := startPostgresDB("ksql") connectionString["postgres"] = postgresURL + mysqlURL, closeMySQL := startMySQLDB("ksql") + connectionString["mysql"] = mysqlURL exitCode := m.Run() // We need to close it without defer because - //of the os.Exit call below: + // of the os.Exit call below: closePostgres() + closeMySQL() os.Exit(exitCode) } @@ -63,7 +71,7 @@ func startPostgresDB(dbName string) (databaseURL string, closer func()) { } hostAndPort := resource.GetHostPort("5432/tcp") - databaseUrl := fmt.Sprintf("postgres://postgres:postgres@%s/"+dbName+"?sslmode=disable", hostAndPort) + databaseUrl := fmt.Sprintf("postgres://postgres:postgres@%s/%s?sslmode=disable", hostAndPort, dbName) fmt.Println("Connecting to postgres on url: ", databaseUrl) @@ -82,6 +90,63 @@ func startPostgresDB(dbName string) (databaseURL string, closer func()) { if err != nil { log.Fatalf("Could not connect to docker: %s", err) } + sqlDB.Close() + + return databaseUrl, func() { + if err := pool.Purge(resource); err != nil { + log.Fatalf("Could not purge resource: %s", err) + } + } +} + +func startMySQLDB(dbName string) (databaseURL string, closer func()) { + // uses a sensible default on windows (tcp/http) and linux/osx (socket) + pool, err := dockertest.NewPool("") + if err != nil { + log.Fatalf("Could not connect to docker: %s", err) + } + + // pulls an image, creates a container based on it and runs it + resource, err := pool.RunWithOptions( + &dockertest.RunOptions{ + Repository: "mysql", + Tag: "8.0.27", + Env: []string{ + "MYSQL_ROOT_PASSWORD=mysql", + "MYSQL_DATABASE=" + dbName, + }, + }, + func(config *docker.HostConfig) { + // set AutoRemove to true so that stopped container goes away by itself + config.AutoRemove = true + config.RestartPolicy = docker.RestartPolicy{Name: "no"} + }, + ) + if err != nil { + log.Fatalf("Could not start resource: %s", err) + } + + hostAndPort := resource.GetHostPort("3306/tcp") + databaseUrl := fmt.Sprintf("root:mysql@(%s)/%s?timeout=30s", hostAndPort, dbName) + + fmt.Println("Connecting to mysql on url: ", databaseUrl) + + resource.Expire(40) // Tell docker to hard kill the container in 20 seconds + + var sqlDB *sql.DB + // exponential backoff-retry, because the application in the container might not be ready to accept connections yet + pool.MaxWait = 10 * time.Second + pool.Retry(func() error { + sqlDB, err = sql.Open("mysql", databaseUrl) + if err != nil { + return err + } + return sqlDB.Ping() + }) + if err != nil { + log.Fatalf("Could not connect to docker: %s", err) + } + sqlDB.Close() return databaseUrl, func() { if err := pool.Purge(resource); err != nil {