mirror of https://github.com/VinGarcia/ksql.git
Add docker test support for mysql
parent
45edd4b1dd
commit
fe464a217c
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
)
|
||||
|
||||
|
|
69
main_test.go
69
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 {
|
||||
|
|
Loading…
Reference in New Issue