mirror of
https://github.com/fnproject/fn.git
synced 2022-10-28 21:29:17 +03:00
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:
committed by
Seif Lotfy سيف لطفي
parent
c38aae4bfe
commit
23360d45f3
@@ -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()
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user