diff --git a/database/sqlserver/sqlserver_test.go b/database/sqlserver/sqlserver_test.go index ad0dc79ed..a53d7226a 100644 --- a/database/sqlserver/sqlserver_test.go +++ b/database/sqlserver/sqlserver_test.go @@ -6,11 +6,14 @@ import ( sqldriver "database/sql/driver" "fmt" "log" + "runtime" + "strconv" "strings" "testing" "time" "github.com/dhui/dktest" + "github.com/docker/go-connections/nat" "github.com/golang-migrate/migrate/v4" dt "github.com/golang-migrate/migrate/v4/database/testing" @@ -23,14 +26,27 @@ const defaultPort = 1433 const saPassword = "Root1234" var ( - opts = dktest.Options{ + sqlEdgeOpts = dktest.Options{ + Env: map[string]string{"ACCEPT_EULA": "Y", "MSSQL_SA_PASSWORD": saPassword}, + PortBindings: map[nat.Port][]nat.PortBinding{ + nat.Port(fmt.Sprintf("%d/tcp", defaultPort)): { + nat.PortBinding{ + HostIP: "0.0.0.0", + HostPort: fmt.Sprintf("%d/tcp", defaultPort), + }, + }, + }, + PortRequired: true, ReadyFunc: isReady, PullTimeout: 2 * time.Minute, + } + sqlServerOpts = dktest.Options{ Env: map[string]string{"ACCEPT_EULA": "Y", "SA_PASSWORD": saPassword, "MSSQL_PID": "Express"}, PortRequired: true, ReadyFunc: isReady, PullTimeout: 2 * time.Minute, } // Container versions: https://mcr.microsoft.com/v2/mssql/server/tags/list specs = []dktesting.ContainerSpec{ - {ImageName: "mcr.microsoft.com/mssql/server:2017-latest", Options: opts}, - {ImageName: "mcr.microsoft.com/mssql/server:2019-latest", Options: opts}, + {ImageName: "mcr.microsoft.com/azure-sql-edge:latest", Options: sqlEdgeOpts}, + {ImageName: "mcr.microsoft.com/mssql/server:2017-latest", Options: sqlServerOpts}, + {ImageName: "mcr.microsoft.com/mssql/server:2019-latest", Options: sqlServerOpts}, } ) @@ -47,10 +63,11 @@ func msConnectionStringMsi(host, port string, useMsi bool) string { } func isReady(ctx context.Context, c dktest.ContainerInfo) bool { - ip, port, err := c.Port(defaultPort) + ip, _, err := c.Port(defaultPort) if err != nil { return false } + port := strconv.Itoa(defaultPort) uri := msConnectionString(ip, port) db, err := sql.Open("sqlserver", uri) if err != nil { @@ -74,13 +91,22 @@ func isReady(ctx context.Context, c dktest.ContainerInfo) bool { return true } +func SkipIfUnsupportedArch(t *testing.T, c dktest.ContainerInfo) { + if strings.Contains(c.ImageName, "mssql") && !strings.HasPrefix(runtime.GOARCH, "amd") { + t.Skip(fmt.Sprintf("Image %s is not supported on arch %s", c.ImageName, runtime.GOARCH)) + } +} + func Test(t *testing.T) { dktesting.ParallelTest(t, specs, func(t *testing.T, c dktest.ContainerInfo) { - ip, port, err := c.Port(defaultPort) + SkipIfUnsupportedArch(t, c) + ip, _, err := c.Port(defaultPort) if err != nil { t.Fatal(err) } + port := strconv.Itoa(defaultPort) + addr := msConnectionString(ip, port) p := &SQLServer{} d, err := p.Open(addr) @@ -100,11 +126,14 @@ func Test(t *testing.T) { func TestMigrate(t *testing.T) { dktesting.ParallelTest(t, specs, func(t *testing.T, c dktest.ContainerInfo) { - ip, port, err := c.Port(defaultPort) + SkipIfUnsupportedArch(t, c) + ip, _, err := c.Port(defaultPort) if err != nil { t.Fatal(err) } + port := strconv.Itoa(defaultPort) + addr := msConnectionString(ip, port) p := &SQLServer{} d, err := p.Open(addr) @@ -128,11 +157,14 @@ func TestMigrate(t *testing.T) { func TestMultiStatement(t *testing.T) { dktesting.ParallelTest(t, specs, func(t *testing.T, c dktest.ContainerInfo) { - ip, port, err := c.FirstPort() + SkipIfUnsupportedArch(t, c) + ip, _, err := c.FirstPort() if err != nil { t.Fatal(err) } + port := strconv.Itoa(defaultPort) + addr := msConnectionString(ip, port) ms := &SQLServer{} d, err := ms.Open(addr) @@ -161,12 +193,16 @@ func TestMultiStatement(t *testing.T) { func TestErrorParsing(t *testing.T) { dktesting.ParallelTest(t, specs, func(t *testing.T, c dktest.ContainerInfo) { - ip, port, err := c.FirstPort() + SkipIfUnsupportedArch(t, c) + ip, _, err := c.FirstPort() if err != nil { t.Fatal(err) } + port := strconv.Itoa(defaultPort) + addr := msConnectionString(ip, port) + p := &SQLServer{} d, err := p.Open(addr) if err != nil { @@ -191,11 +227,14 @@ func TestErrorParsing(t *testing.T) { func TestLockWorks(t *testing.T) { dktesting.ParallelTest(t, specs, func(t *testing.T, c dktest.ContainerInfo) { - ip, port, err := c.Port(defaultPort) + SkipIfUnsupportedArch(t, c) + ip, _, err := c.Port(defaultPort) if err != nil { t.Fatal(err) } + port := strconv.Itoa(defaultPort) + addr := fmt.Sprintf("sqlserver://sa:%v@%v:%v?master", saPassword, ip, port) p := &SQLServer{} d, err := p.Open(addr) @@ -229,6 +268,7 @@ func TestLockWorks(t *testing.T) { func TestMsiTrue(t *testing.T) { dktesting.ParallelTest(t, specs, func(t *testing.T, c dktest.ContainerInfo) { + SkipIfUnsupportedArch(t, c) ip, port, err := c.Port(defaultPort) if err != nil { t.Fatal(err) @@ -245,6 +285,7 @@ func TestMsiTrue(t *testing.T) { func TestOpenWithPasswordAndMSI(t *testing.T) { dktesting.ParallelTest(t, specs, func(t *testing.T, c dktest.ContainerInfo) { + SkipIfUnsupportedArch(t, c) ip, port, err := c.Port(defaultPort) if err != nil { t.Fatal(err) @@ -276,6 +317,7 @@ func TestOpenWithPasswordAndMSI(t *testing.T) { func TestMsiFalse(t *testing.T) { dktesting.ParallelTest(t, specs, func(t *testing.T, c dktest.ContainerInfo) { + SkipIfUnsupportedArch(t, c) ip, port, err := c.Port(defaultPort) if err != nil { t.Fatal(err) diff --git a/go.mod b/go.mod index 63e053b38..a9d395ab4 100644 --- a/go.mod +++ b/go.mod @@ -18,6 +18,7 @@ require ( github.com/denisenkom/go-mssqldb v0.10.0 github.com/dhui/dktest v0.3.9 github.com/docker/docker v20.10.12+incompatible + github.com/docker/go-connections v0.4.0 // indirect github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712 // indirect github.com/envoyproxy/go-control-plane v0.10.1 // indirect github.com/envoyproxy/protoc-gen-validate v0.6.2 // indirect