Skip to content

Commit

Permalink
Factor out savepoint tests into its own package
Browse files Browse the repository at this point in the history
  • Loading branch information
dhui committed Jan 6, 2019
1 parent 76d3fe2 commit ecc6b61
Show file tree
Hide file tree
Showing 5 changed files with 107 additions and 146 deletions.
51 changes: 9 additions & 42 deletions savepointers/mssql/mssql_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (

import (
"github.com/dhui/satomic/savepointers/mssql"
"github.com/dhui/satomic/savepointers/savepointertest"
)

const (
Expand All @@ -28,14 +29,16 @@ var env = map[string]string{
"SA_PASSWORD": password,
}

func readyFunc(c dktest.ContainerInfo) bool {
var msSQLDBGetter savepointertest.DBGetter = func(c dktest.ContainerInfo) (*sql.DB, error) {
connStr := fmt.Sprintf("sqlserver://sa:%s@%s:%s", password, c.IP, c.Port)
db, err := sql.Open("sqlserver", connStr)
if err != nil {
return false
return nil, err
}
defer db.Close() // nolint:errcheck
return db.Ping() == nil
if err := db.Ping(); err != nil {
return nil, err
}
return db, nil
}

func TestSavepointerMSSQL(t *testing.T) {
Expand All @@ -46,42 +49,6 @@ func TestSavepointerMSSQL(t *testing.T) {
"microsoft/mssql-server-linux",
}

for _, v := range versions {
v := v
t.Run(v, func(t *testing.T) {
t.Parallel()
dktest.Run(t, v, dktest.Options{Env: env, PortRequired: true, ReadyFunc: readyFunc, Timeout: timeout},
func(t *testing.T, c dktest.ContainerInfo) {
connStr := fmt.Sprintf("sqlserver://sa:%s@%s:%s", password, c.IP, c.Port)
db, err := sql.Open("sqlserver", connStr)
if err != nil {
t.Fatal(err)
}
defer db.Close() // nolint:errcheck
if err := db.Ping(); err != nil {
t.Fatal(err)
}
tx, err := db.Begin()
if err != nil {
t.Fatal("Error starting transaction:", err)
}

savepointer := mssql.Savepointer{}
savepointName1 := `needs to be quoted1 +/'"]` + "`"
savepointName2 := `needs to be quoted2 +/'"]` + "`"
if _, err := tx.Exec(savepointer.Create(savepointName1)); err != nil {
t.Fatal("Error creating savepoint:", err)
}
if _, err := tx.Exec(savepointer.Rollback(savepointName1)); err != nil {
t.Fatal("Error rolling back savepoint:", err)
}
if _, err := tx.Exec(savepointer.Create(savepointName2)); err != nil {
t.Fatal("Error creating savepoint:", err)
}
if _, err := tx.Exec(savepointer.Release(savepointName2)); err != nil {
t.Fatal("Error releasing savepoint:", err)
}
})
})
}
savepointertest.TestSavepointerWithDocker(t, mssql.Savepointer{}, versions, dktest.Options{Env: env,
PortRequired: true, ReadyFunc: msSQLDBGetter.ReadyFunc(), Timeout: timeout}, msSQLDBGetter)
}
51 changes: 9 additions & 42 deletions savepointers/mysql/mysql_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (

import (
"github.com/dhui/satomic/savepointers/mysql"
"github.com/dhui/satomic/savepointers/savepointertest"
)

const (
Expand All @@ -27,14 +28,16 @@ var env = map[string]string{
"MYSQL_DATABASE": db,
}

func readyFunc(c dktest.ContainerInfo) bool {
var mySQLDBGetter savepointertest.DBGetter = func(c dktest.ContainerInfo) (*sql.DB, error) {
connStr := fmt.Sprintf("root:%s@tcp(%s:%s)/%s", password, c.IP, c.Port, db)
db, err := sql.Open("mysql", connStr)
if err != nil {
return false
return nil, err
}
defer db.Close() // nolint:errcheck
return db.Ping() == nil
if err := db.Ping(); err != nil {
return nil, err
}
return db, nil
}

func TestSavepointerMySQL(t *testing.T) {
Expand All @@ -48,42 +51,6 @@ func TestSavepointerMySQL(t *testing.T) {
"mysql:5.5",
}

for _, v := range versions {
v := v
t.Run(v, func(t *testing.T) {
t.Parallel()
dktest.Run(t, v, dktest.Options{Env: env, PortRequired: true, ReadyFunc: readyFunc, Timeout: timeout},
func(t *testing.T, c dktest.ContainerInfo) {
connStr := fmt.Sprintf("root:%s@tcp(%s:%s)/%s", password, c.IP, c.Port, db)
db, err := sql.Open("mysql", connStr)
if err != nil {
t.Fatal(err)
}
defer db.Close() // nolint:errcheck
if err := db.Ping(); err != nil {
t.Fatal(err)
}
tx, err := db.Begin()
if err != nil {
t.Fatal("Error starting transaction:", err)
}

savepointer := mysql.Savepointer{}
savepointName1 := `needs to be quoted1 +/'"]` + "`"
savepointName2 := `needs to be quoted2 +/'"]` + "`"
if _, err := tx.Exec(savepointer.Create(savepointName1)); err != nil {
t.Fatal("Error creating savepoint:", err)
}
if _, err := tx.Exec(savepointer.Rollback(savepointName1)); err != nil {
t.Fatal("Error rolling back savepoint:", err)
}
if _, err := tx.Exec(savepointer.Create(savepointName2)); err != nil {
t.Fatal("Error creating savepoint:", err)
}
if _, err := tx.Exec(savepointer.Release(savepointName2)); err != nil {
t.Fatal("Error releasing savepoint:", err)
}
})
})
}
savepointertest.TestSavepointerWithDocker(t, mysql.Savepointer{}, versions, dktest.Options{Env: env,
PortRequired: true, ReadyFunc: mySQLDBGetter.ReadyFunc(), Timeout: timeout}, mySQLDBGetter)
}
52 changes: 9 additions & 43 deletions savepointers/postgres/postgres_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,20 +14,23 @@ import (

import (
"github.com/dhui/satomic/savepointers/postgres"
"github.com/dhui/satomic/savepointers/savepointertest"
)

const (
timeout = 3 * time.Minute
)

func readyFunc(c dktest.ContainerInfo) bool {
var postgresDBGetter savepointertest.DBGetter = func(c dktest.ContainerInfo) (*sql.DB, error) {
connStr := fmt.Sprintf("host=%s port=%s user=postgres dbname=postgres sslmode=disable", c.IP, c.Port)
db, err := sql.Open("postgres", connStr)
if err != nil {
return false
return nil, err
}
defer db.Close() // nolint:errcheck
return db.Ping() == nil
if err := db.Ping(); err != nil {
return nil, err
}
return db, nil
}

func TestSavepointerPostgres(t *testing.T) {
Expand All @@ -42,43 +45,6 @@ func TestSavepointerPostgres(t *testing.T) {
"postgres:9.4-alpine",
}

for _, v := range versions {
v := v
t.Run(v, func(t *testing.T) {
t.Parallel()
dktest.Run(t, v, dktest.Options{PortRequired: true, ReadyFunc: readyFunc, Timeout: timeout},
func(t *testing.T, c dktest.ContainerInfo) {
connStr := fmt.Sprintf("host=%s port=%s user=postgres dbname=postgres sslmode=disable",
c.IP, c.Port)
db, err := sql.Open("postgres", connStr)
if err != nil {
t.Fatal(err)
}
defer db.Close() // nolint:errcheck
if err := db.Ping(); err != nil {
t.Fatal(err)
}
tx, err := db.Begin()
if err != nil {
t.Fatal("Error starting transaction:", err)
}

savepointer := postgres.Savepointer{}
savepointName1 := `needs to be quoted1 +/'"]` + "`"
savepointName2 := `needs to be quoted2 +/'"]` + "`"
if _, err := tx.Exec(savepointer.Create(savepointName1)); err != nil {
t.Fatal("Error creating savepoint:", err)
}
if _, err := tx.Exec(savepointer.Rollback(savepointName1)); err != nil {
t.Fatal("Error rolling back savepoint:", err)
}
if _, err := tx.Exec(savepointer.Create(savepointName2)); err != nil {
t.Fatal("Error creating savepoint:", err)
}
if _, err := tx.Exec(savepointer.Release(savepointName2)); err != nil {
t.Fatal("Error releasing savepoint:", err)
}
})
})
}
savepointertest.TestSavepointerWithDocker(t, postgres.Savepointer{}, versions, dktest.Options{
PortRequired: true, ReadyFunc: postgresDBGetter.ReadyFunc(), Timeout: timeout}, postgresDBGetter)
}
77 changes: 77 additions & 0 deletions savepointers/savepointertest/savepointertest.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package savepointertest

import (
"database/sql"
"fmt"
"testing"
)

import (
"github.com/dhui/dktest"
)

import (
"github.com/dhui/satomic/savepointers"
)

// DBGetter is a function that gets a ready-to-use SQL DB using the given ContainerInfo.
// e.g. Ping() should be called by the DBGetter before returning the *sql.DB.
// The caller is responsible for closing the DB.
type DBGetter func(dktest.ContainerInfo) (*sql.DB, error)

// ReadyFunc converts the DBGetter to dktest compatible ReadyFunc
func (g DBGetter) ReadyFunc() func(dktest.ContainerInfo) bool {
return func(c dktest.ContainerInfo) bool {
db, err := g(c)
if err != nil {
return false
}
db.Close() // nolint:errcheck
return true
}
}

// TestSavepointer tests the given Savepointer using the given ready-to-use *sql.DB
// e.g. Ping() should already have been called on the *sql.DB
// The caller is responsible for closing the *sql.DB
func TestSavepointer(t *testing.T, savepointer savepointers.Savepointer, db *sql.DB) {
tx, err := db.Begin()
if err != nil {
t.Fatal("Error starting transaction:", err)
}

savepointName1 := `needs to be quoted1 +/'"]` + "`"
savepointName2 := `needs to be quoted2 +/'"]` + "`"
if _, err := tx.Exec(savepointer.Create(savepointName1)); err != nil {
t.Fatal("Error creating savepoint:", err)
}
if _, err := tx.Exec(savepointer.Rollback(savepointName1)); err != nil {
t.Fatal("Error rolling back savepoint:", err)
}
if _, err := tx.Exec(savepointer.Create(savepointName2)); err != nil {
t.Fatal("Error creating savepoint:", err)
}
if _, err := tx.Exec(savepointer.Release(savepointName2)); err != nil {
t.Fatal("Error releasing savepoint:", err)
}
}

// TestSavepointerWithDocker tests the given Savepointer using the given Docker images and options
func TestSavepointerWithDocker(t *testing.T, savepointer savepointers.Savepointer, imageNames []string,
opts dktest.Options, dbGetter DBGetter) {
for _, imageName := range imageNames {
imageName := imageName
t.Run(fmt.Sprintf("test_savepointer_%T_%s", savepointer, imageName), func(t *testing.T) {
t.Parallel()
dktest.Run(t, imageName, opts,
func(t *testing.T, c dktest.ContainerInfo) {
db, err := dbGetter(c)
if err != nil {
t.Fatal(err)
}
defer db.Close() // nolint:errcheck
TestSavepointer(t, savepointer, db)
})
})
}
}
22 changes: 3 additions & 19 deletions savepointers/sqlite/sqlite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
)

import (
"github.com/dhui/satomic/savepointers/savepointertest"
"github.com/dhui/satomic/savepointers/sqlite"
)

Expand All @@ -18,24 +19,7 @@ func TestSavepointerSQLite(t *testing.T) {
if err != nil {
t.Fatal("Error opening SQLite db:", err)
}
tx, err := db.Begin()
if err != nil {
t.Fatal("Error starting transaction:", err)
}
defer db.Close()

savepointer := sqlite.Savepointer{}
savepointName1 := `needs to be quoted1 +/'"]` + "`"
savepointName2 := `needs to be quoted2 +/'"]` + "`"
if _, err := tx.Exec(savepointer.Create(savepointName1)); err != nil {
t.Fatal("Error creating savepoint:", err)
}
if _, err := tx.Exec(savepointer.Rollback(savepointName1)); err != nil {
t.Fatal("Error rolling back savepoint:", err)
}
if _, err := tx.Exec(savepointer.Create(savepointName2)); err != nil {
t.Fatal("Error creating savepoint:", err)
}
if _, err := tx.Exec(savepointer.Release(savepointName2)); err != nil {
t.Fatal("Error releasing savepoint:", err)
}
savepointertest.TestSavepointer(t, sqlite.Savepointer{}, db)
}

0 comments on commit ecc6b61

Please sign in to comment.