Make datastore tests pass with remote Docker containers (#587)

* Make datastore tests pass with remote Docker containers
* Make tests consume DOCKER_HOST IP address as bind host while constucting database URI.

 This fix makes datastore tests pass against
 remote Docker (with host IP different from 127.0.0.1)

Fixes: #586

* Make datastore tests pass on Go1.7.1
This commit is contained in:
Denis Makogon
2017-03-14 15:32:50 +02:00
committed by Seif Lotfy سيف لطفي
parent c38aae4bfe
commit 23360d45f3
3 changed files with 35 additions and 9 deletions

View File

@@ -12,6 +12,9 @@ import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"reflect" "reflect"
"net/http" "net/http"
"os"
"net/url"
"strings"
) )
func setLogBuffer() *bytes.Buffer { func setLogBuffer() *bytes.Buffer {
@@ -24,6 +27,28 @@ func setLogBuffer() *bytes.Buffer {
return &buf return &buf
} }
// workaround for parts.Hostname() that doesn't work on Go1.7.1
// TODO(denismakogon): remove this after switching to Go 1.8
func stripPort(hostport string) string {
colon := strings.IndexByte(hostport, ':')
if colon == -1 {
return hostport
}
if i := strings.IndexByte(hostport, ']'); i != -1 {
return strings.TrimPrefix(hostport[:i], "[")
}
return hostport[:colon]
}
func GetContainerHostIP() string {
dockerHost := os.Getenv("DOCKER_HOST")
if dockerHost == "" {
return "127.0.0.1"
}
parts, _ := url.Parse(dockerHost)
return stripPort(parts.Host)
}
func Test(t *testing.T, ds models.Datastore) { func Test(t *testing.T, ds models.Datastore) {
buf := setLogBuffer() buf := setLogBuffer()

View File

@@ -12,7 +12,7 @@ import (
"github.com/iron-io/functions/api/datastore/internal/datastoretest" "github.com/iron-io/functions/api/datastore/internal/datastoretest"
) )
const tmpPostgres = "postgres://postgres@127.0.0.1:15432/funcs?sslmode=disable" const tmpPostgres = "postgres://postgres@%v:15432/funcs?sslmode=disable"
func preparePostgresTest(logf, fatalf func(string, ...interface{})) (func(), func()) { func preparePostgresTest(logf, fatalf func(string, ...interface{})) (func(), func()) {
fmt.Println("initializing postgres for test") fmt.Println("initializing postgres for test")
@@ -21,7 +21,8 @@ func preparePostgresTest(logf, fatalf func(string, ...interface{})) (func(), fun
wait := 1 * time.Second wait := 1 * time.Second
for { for {
db, err := sql.Open("postgres", "postgres://postgres@127.0.0.1:15432?sslmode=disable") db, err := sql.Open("postgres", fmt.Sprintf("postgres://postgres@%v:15432?sslmode=disable",
datastoretest.GetContainerHostIP()))
if err != nil { if err != nil {
fmt.Println("failed to connect to postgres:", err) fmt.Println("failed to connect to postgres:", err)
fmt.Println("retrying in:", wait) fmt.Println("retrying in:", wait)
@@ -49,7 +50,7 @@ func preparePostgresTest(logf, fatalf func(string, ...interface{})) (func(), fun
} }
fmt.Println("postgres for test ready") fmt.Println("postgres for test ready")
return func() { return func() {
db, err := sql.Open("postgres", tmpPostgres) db, err := sql.Open("postgres", fmt.Sprintf(tmpPostgres, datastoretest.GetContainerHostIP()))
if err != nil { if err != nil {
fatalf("failed to connect for truncation: %s\n", err) fatalf("failed to connect for truncation: %s\n", err)
} }
@@ -69,13 +70,13 @@ func TestDatastore(t *testing.T) {
_, close := preparePostgresTest(t.Logf, t.Fatalf) _, close := preparePostgresTest(t.Logf, t.Fatalf)
defer close() defer close()
u, err := url.Parse(tmpPostgres) u, err := url.Parse(fmt.Sprintf(tmpPostgres, datastoretest.GetContainerHostIP()))
if err != nil { if err != nil {
t.Fatalf("failed to parse url:", err) t.Fatalf("failed to parse url: %v", err)
} }
ds, err := New(u) ds, err := New(u)
if err != nil { if err != nil {
t.Fatalf("failed to create postgres datastore:", err) t.Fatalf("failed to create postgres datastore: %v", err)
} }
datastoretest.Test(t, ds) datastoretest.Test(t, ds)

View File

@@ -13,7 +13,7 @@ import (
"github.com/iron-io/functions/api/datastore/internal/datastoretest" "github.com/iron-io/functions/api/datastore/internal/datastoretest"
) )
const tmpRedis = "redis://127.0.0.1:6301/" const tmpRedis = "redis://%v:6301/"
func prepareRedisTest(logf, fatalf func(string, ...interface{})) (func(), func()) { func prepareRedisTest(logf, fatalf func(string, ...interface{})) (func(), func()) {
fmt.Println("initializing redis for test") fmt.Println("initializing redis for test")
@@ -22,7 +22,7 @@ func prepareRedisTest(logf, fatalf func(string, ...interface{})) (func(), func()
timeout := time.After(20 * time.Second) timeout := time.After(20 * time.Second)
for { for {
c, err := redis.DialURL(tmpRedis) c, err := redis.DialURL(fmt.Sprintf(tmpRedis, datastoretest.GetContainerHostIP()))
if err == nil { if err == nil {
_, err = c.Do("PING") _, err = c.Do("PING")
c.Close() c.Close()
@@ -49,7 +49,7 @@ func TestDatastore(t *testing.T) {
_, close := prepareRedisTest(t.Logf, t.Fatalf) _, close := prepareRedisTest(t.Logf, t.Fatalf)
defer close() defer close()
u, err := url.Parse(tmpRedis) u, err := url.Parse(fmt.Sprintf(tmpRedis, datastoretest.GetContainerHostIP()))
if err != nil { if err != nil {
t.Fatal("failed to parse url: ", err) t.Fatal("failed to parse url: ", err)
} }