2017-06-24 07:34:16 +00:00
package cockroachdb
// error codes https://github.com/lib/pq/blob/master/error.go
import (
2019-01-09 06:37:15 +00:00
"context"
2017-06-24 07:34:16 +00:00
"database/sql"
"fmt"
2019-02-26 23:56:57 +00:00
"github.com/golang-migrate/migrate/v4"
2019-04-26 22:47:16 +00:00
"log"
2018-11-06 06:46:46 +00:00
"strings"
2017-06-24 07:34:16 +00:00
"testing"
2018-11-06 06:46:46 +00:00
)
2017-06-24 07:34:16 +00:00
2019-01-08 10:20:34 +00:00
import (
"github.com/dhui/dktest"
_ "github.com/lib/pq"
)
2018-11-06 06:46:46 +00:00
import (
2018-10-10 22:11:48 +00:00
dt "github.com/golang-migrate/migrate/v4/database/testing"
2019-01-08 10:20:34 +00:00
"github.com/golang-migrate/migrate/v4/dktesting"
2019-02-26 23:56:57 +00:00
_ "github.com/golang-migrate/migrate/v4/source/file"
2017-06-24 07:34:16 +00:00
)
2019-01-08 10:20:34 +00:00
const defaultPort = 26257
var (
2019-01-12 23:54:17 +00:00
opts = dktest . Options { Cmd : [ ] string { "start" , "--insecure" } , PortRequired : true , ReadyFunc : isReady }
// Released versions: https://www.cockroachlabs.com/docs/releases/
specs = [ ] dktesting . ContainerSpec {
{ ImageName : "cockroachdb/cockroach:v1.0.7" , Options : opts } ,
{ ImageName : "cockroachdb/cockroach:v1.1.9" , Options : opts } ,
{ ImageName : "cockroachdb/cockroach:v2.0.7" , Options : opts } ,
{ ImageName : "cockroachdb/cockroach:v2.1.3" , Options : opts } ,
}
2019-01-08 10:20:34 +00:00
)
2017-06-24 07:34:16 +00:00
2019-01-09 06:37:15 +00:00
func isReady ( ctx context . Context , c dktest . ContainerInfo ) bool {
2019-01-08 10:20:34 +00:00
ip , port , err := c . Port ( defaultPort )
2017-06-24 07:34:16 +00:00
if err != nil {
2019-04-26 22:47:16 +00:00
log . Println ( "port error:" , err )
2017-06-24 07:34:16 +00:00
return false
}
2019-01-08 10:20:34 +00:00
db , err := sql . Open ( "postgres" , fmt . Sprintf ( "postgres://root@%v:%v?sslmode=disable" , ip , port ) )
if err != nil {
2019-04-26 22:47:16 +00:00
log . Println ( "open error:" , err )
2019-01-08 10:20:34 +00:00
return false
}
2019-01-09 06:37:15 +00:00
if err := db . PingContext ( ctx ) ; err != nil {
2019-04-26 22:47:16 +00:00
log . Println ( "ping error:" , err )
2019-01-08 10:20:34 +00:00
return false
2017-06-24 07:34:16 +00:00
}
2019-04-26 22:47:16 +00:00
if err := db . Close ( ) ; err != nil {
log . Println ( "close error:" , err )
}
2019-01-08 10:20:34 +00:00
return true
}
2017-06-24 07:34:16 +00:00
2019-01-08 10:20:34 +00:00
func createDB ( t * testing . T , c dktest . ContainerInfo ) {
ip , port , err := c . Port ( defaultPort )
if err != nil {
t . Fatal ( err )
}
2017-06-24 07:34:16 +00:00
2019-01-08 10:20:34 +00:00
db , err := sql . Open ( "postgres" , fmt . Sprintf ( "postgres://root@%v:%v?sslmode=disable" , ip , port ) )
if err != nil {
t . Fatal ( err )
}
if err = db . Ping ( ) ; err != nil {
t . Fatal ( err )
}
2019-04-26 22:47:16 +00:00
defer func ( ) {
if err := db . Close ( ) ; err != nil {
t . Error ( err )
}
} ( )
2019-01-08 10:20:34 +00:00
if _ , err = db . Exec ( "CREATE DATABASE migrate" ) ; err != nil {
t . Fatal ( err )
}
2017-06-24 07:34:16 +00:00
}
func Test ( t * testing . T ) {
2019-01-08 10:20:34 +00:00
dktesting . ParallelTest ( t , specs , func ( t * testing . T , ci dktest . ContainerInfo ) {
createDB ( t , ci )
ip , port , err := ci . Port ( 26257 )
if err != nil {
t . Fatal ( err )
}
addr := fmt . Sprintf ( "cockroach://root@%v:%v/migrate?sslmode=disable" , ip , port )
c := & CockroachDb { }
d , err := c . Open ( addr )
if err != nil {
2019-04-26 22:47:16 +00:00
t . Fatal ( err )
2019-01-08 10:20:34 +00:00
}
dt . Test ( t , d , [ ] byte ( "SELECT 1" ) )
} )
2017-06-24 07:34:16 +00:00
}
2019-02-26 23:56:57 +00:00
func TestMigrate ( t * testing . T ) {
dktesting . ParallelTest ( t , specs , func ( t * testing . T , ci dktest . ContainerInfo ) {
createDB ( t , ci )
ip , port , err := ci . Port ( 26257 )
if err != nil {
t . Fatal ( err )
}
addr := fmt . Sprintf ( "cockroach://root@%v:%v/migrate?sslmode=disable" , ip , port )
c := & CockroachDb { }
d , err := c . Open ( addr )
if err != nil {
2019-04-26 22:47:16 +00:00
t . Fatal ( err )
2019-02-26 23:56:57 +00:00
}
m , err := migrate . NewWithDatabaseInstance ( "file://./examples/migrations" , "migrate" , d )
if err != nil {
2019-04-26 22:47:16 +00:00
t . Fatal ( err )
2019-02-26 23:56:57 +00:00
}
dt . TestMigrate ( t , m , [ ] byte ( "SELECT 1" ) )
} )
}
2017-06-24 07:34:16 +00:00
func TestMultiStatement ( t * testing . T ) {
2019-01-08 10:20:34 +00:00
dktesting . ParallelTest ( t , specs , func ( t * testing . T , ci dktest . ContainerInfo ) {
createDB ( t , ci )
ip , port , err := ci . Port ( 26257 )
if err != nil {
t . Fatal ( err )
}
addr := fmt . Sprintf ( "cockroach://root@%v:%v/migrate?sslmode=disable" , ip , port )
c := & CockroachDb { }
d , err := c . Open ( addr )
if err != nil {
2019-04-26 22:47:16 +00:00
t . Fatal ( err )
2019-01-08 10:20:34 +00:00
}
if err := d . Run ( strings . NewReader ( "CREATE TABLE foo (foo text); CREATE TABLE bar (bar text);" ) ) ; err != nil {
t . Fatalf ( "expected err to be nil, got %v" , err )
}
// make sure second table exists
var exists bool
if err := d . ( * CockroachDb ) . db . QueryRow ( "SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'bar' AND table_schema = (SELECT current_schema()))" ) . Scan ( & exists ) ; err != nil {
t . Fatal ( err )
}
if ! exists {
t . Fatalf ( "expected table bar to exist" )
}
} )
2017-06-24 07:34:16 +00:00
}
func TestFilterCustomQuery ( t * testing . T ) {
2019-01-08 10:20:34 +00:00
dktesting . ParallelTest ( t , specs , func ( t * testing . T , ci dktest . ContainerInfo ) {
createDB ( t , ci )
ip , port , err := ci . Port ( 26257 )
if err != nil {
t . Fatal ( err )
}
addr := fmt . Sprintf ( "cockroach://root@%v:%v/migrate?sslmode=disable&x-custom=foobar" , ip , port )
c := & CockroachDb { }
_ , err = c . Open ( addr )
if err != nil {
2019-04-26 22:47:16 +00:00
t . Fatal ( err )
2019-01-08 10:20:34 +00:00
}
} )
2017-06-24 07:34:16 +00:00
}