From 62e5cd5d0394d0d8d65eb27aef6191777e2d9588 Mon Sep 17 00:00:00 2001 From: mihir Date: Wed, 13 Mar 2024 19:02:10 +0530 Subject: [PATCH 1/4] chore: export un-started httpserver and enable conn with host for transformer container --- .../resource/transformer/transformer.go | 8 ++++ testhelper/httptest/httptest.go | 4 +- testhelper/httptest/httptest_test.go | 38 +++++++++++++++++++ 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/testhelper/docker/resource/transformer/transformer.go b/testhelper/docker/resource/transformer/transformer.go index 278938b4..f73bcd91 100644 --- a/testhelper/docker/resource/transformer/transformer.go +++ b/testhelper/docker/resource/transformer/transformer.go @@ -66,6 +66,14 @@ func WithUserTransformations(transformations map[string]string, cleaner resource } } +// WithConnectionToHostEnabled lets transformer container connect with the host machine +// i.e. transformer container will be able to access localhost of the host machine +func WithConnectionToHostEnabled() func(*config) { + return func(conf *config) { + conf.extraHosts = append(conf.extraHosts, "host.docker.internal:host-gateway") + } +} + // WithConfigBackendURL lets transformer use custom backend config server for transformations // WithConfigBackendURL should not be used with WithUserTransformations option func WithConfigBackendURL(url string) func(*config) { diff --git a/testhelper/httptest/httptest.go b/testhelper/httptest/httptest.go index 2366a9a1..93b71ee3 100644 --- a/testhelper/httptest/httptest.go +++ b/testhelper/httptest/httptest.go @@ -10,7 +10,7 @@ import ( // NewServer starts a new httptest server that listens on all interfaces, contrary to the standard net/httptest.Server that listens only on localhost. // This is useful when you want to access the test http server from within a docker container. func NewServer(handler http.Handler) *Server { - ts := newUnStartedServer(handler) + ts := NewUnStartedServer(handler) ts.start() return ts } @@ -29,7 +29,7 @@ func (s *Server) start() { s.URL = fmt.Sprintf("http://%s:%s", "localhost", port) } -func newUnStartedServer(handler http.Handler) *Server { +func NewUnStartedServer(handler http.Handler) *Server { return &Server{&nethttptest.Server{ Listener: newListener(), Config: &http.Server{Handler: handler}, diff --git a/testhelper/httptest/httptest_test.go b/testhelper/httptest/httptest_test.go index bd3208c7..cf068787 100644 --- a/testhelper/httptest/httptest_test.go +++ b/testhelper/httptest/httptest_test.go @@ -43,3 +43,41 @@ func TestServer(t *testing.T) { require.Equal(t, http.StatusOK, statusCode) require.Equal(t, "Hello, world!", string(body)) } + +func TestUnStartedServer(t *testing.T) { + // create a server which is not started + httpUnStartedServer := kithttptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + _, _ = w.Write([]byte("Hello, world!")) + })) + + var ( + body []byte + statusCode int + ) + require.Never(t, func() bool { + resp, err := http.Get(httpUnStartedServer.URL) + defer func() { httputil.CloseResponse(resp) }() + if err == nil { + statusCode = resp.StatusCode + body, err = io.ReadAll(resp.Body) + } + return err == nil + }, 5*time.Second, time.Second, "connected to an un-started server") + + // start the server now + httpUnStartedServer.Start() + defer httpUnStartedServer.Close() + + require.Eventually(t, func() bool { + resp, err := http.Get(httpUnStartedServer.URL) + defer func() { httputil.CloseResponse(resp) }() + if err == nil { + statusCode = resp.StatusCode + body, err = io.ReadAll(resp.Body) + } + return err == nil + }, 5*time.Second, time.Second, "failed to connect to server") + + require.Equal(t, http.StatusOK, statusCode) + require.Equal(t, "Hello, world!", string(body)) +} From e376af47b60f6507fb3e1f2bbcf812ed4f11cacb Mon Sep 17 00:00:00 2001 From: mihir Date: Wed, 13 Mar 2024 19:50:46 +0530 Subject: [PATCH 2/4] export config BE http request handler for transformer --- testhelper/docker/resource/transformer/transformer.go | 4 ++-- .../resource/transformer/transformer_backend_config.go | 9 +++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/testhelper/docker/resource/transformer/transformer.go b/testhelper/docker/resource/transformer/transformer.go index f73bcd91..28030ab8 100644 --- a/testhelper/docker/resource/transformer/transformer.go +++ b/testhelper/docker/resource/transformer/transformer.go @@ -56,7 +56,7 @@ func (c *config) setBackendConfigURL(url string) { // }) func WithUserTransformations(transformations map[string]string, cleaner resource.Cleaner) func(*config) { return func(conf *config) { - backendConfigSvc := NewTestBackendConfigServer(transformations) + backendConfigSvc := newTestBackendConfigServer(transformations) conf.setBackendConfigURL(dockerTestHelper.ToInternalDockerHost(backendConfigSvc.URL)) conf.extraHosts = append(conf.extraHosts, "host.docker.internal:host-gateway") @@ -78,7 +78,7 @@ func WithConnectionToHostEnabled() func(*config) { // WithConfigBackendURL should not be used with WithUserTransformations option func WithConfigBackendURL(url string) func(*config) { return func(conf *config) { - conf.setBackendConfigURL(url) + conf.setBackendConfigURL(dockerTestHelper.ToInternalDockerHost(url)) } } diff --git a/testhelper/docker/resource/transformer/transformer_backend_config.go b/testhelper/docker/resource/transformer/transformer_backend_config.go index dcfc7520..12c0edbc 100644 --- a/testhelper/docker/resource/transformer/transformer_backend_config.go +++ b/testhelper/docker/resource/transformer/transformer_backend_config.go @@ -14,10 +14,15 @@ const ( versionIDKey = "versionId" ) -func NewTestBackendConfigServer(transformations map[string]string) *kithttptest.Server { +func newTestBackendConfigServer(transformations map[string]string) *kithttptest.Server { + return kithttptest.NewServer(NewTransformerBackendConfigHandler(transformations)) +} + +// NewTransformerBackendConfigHandler returns http request handler to handle all backend config requests by transformer +func NewTransformerBackendConfigHandler(transformations map[string]string) http.Handler { mux := http.NewServeMux() mux.HandleFunc(getByVersionIdEndPoint, getByVersionIdHandler(transformations)) - return kithttptest.NewServer(mux) + return mux } func getByVersionIdHandler(transformations map[string]string) func(http.ResponseWriter, *http.Request) { From 72410e531a55d14fff834251101ff10dcea41d85 Mon Sep 17 00:00:00 2001 From: mihir Date: Wed, 13 Mar 2024 21:24:21 +0530 Subject: [PATCH 3/4] fix unit test --- testhelper/httptest/httptest_test.go | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/testhelper/httptest/httptest_test.go b/testhelper/httptest/httptest_test.go index cf068787..ebabcc72 100644 --- a/testhelper/httptest/httptest_test.go +++ b/testhelper/httptest/httptest_test.go @@ -46,7 +46,7 @@ func TestServer(t *testing.T) { func TestUnStartedServer(t *testing.T) { // create a server which is not started - httpUnStartedServer := kithttptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + httpUnStartedServer := kithttptest.NewUnStartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { _, _ = w.Write([]byte("Hello, world!")) })) @@ -55,12 +55,8 @@ func TestUnStartedServer(t *testing.T) { statusCode int ) require.Never(t, func() bool { - resp, err := http.Get(httpUnStartedServer.URL) + resp, err := http.Get("http://" + httpUnStartedServer.Listener.Addr().String()) defer func() { httputil.CloseResponse(resp) }() - if err == nil { - statusCode = resp.StatusCode - body, err = io.ReadAll(resp.Body) - } return err == nil }, 5*time.Second, time.Second, "connected to an un-started server") From f3749c6a80f1c97c0759f11b5b3036e743a04d59 Mon Sep 17 00:00:00 2001 From: mihir Date: Thu, 14 Mar 2024 12:07:33 +0530 Subject: [PATCH 4/4] addressed comments --- testhelper/docker/resource/transformer/transformer.go | 6 +++--- testhelper/httptest/httptest_test.go | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/testhelper/docker/resource/transformer/transformer.go b/testhelper/docker/resource/transformer/transformer.go index 28030ab8..66f1dd84 100644 --- a/testhelper/docker/resource/transformer/transformer.go +++ b/testhelper/docker/resource/transformer/transformer.go @@ -8,7 +8,7 @@ import ( "github.com/samber/lo" - dockerTestHelper "github.com/rudderlabs/rudder-go-kit/testhelper/docker" + dockertesthelper "github.com/rudderlabs/rudder-go-kit/testhelper/docker" "github.com/ory/dockertest/v3" "github.com/ory/dockertest/v3/docker" @@ -58,7 +58,7 @@ func WithUserTransformations(transformations map[string]string, cleaner resource return func(conf *config) { backendConfigSvc := newTestBackendConfigServer(transformations) - conf.setBackendConfigURL(dockerTestHelper.ToInternalDockerHost(backendConfigSvc.URL)) + conf.setBackendConfigURL(dockertesthelper.ToInternalDockerHost(backendConfigSvc.URL)) conf.extraHosts = append(conf.extraHosts, "host.docker.internal:host-gateway") cleaner.Cleanup(func() { backendConfigSvc.Close() @@ -78,7 +78,7 @@ func WithConnectionToHostEnabled() func(*config) { // WithConfigBackendURL should not be used with WithUserTransformations option func WithConfigBackendURL(url string) func(*config) { return func(conf *config) { - conf.setBackendConfigURL(dockerTestHelper.ToInternalDockerHost(url)) + conf.setBackendConfigURL(dockertesthelper.ToInternalDockerHost(url)) } } diff --git a/testhelper/httptest/httptest_test.go b/testhelper/httptest/httptest_test.go index ebabcc72..f763833f 100644 --- a/testhelper/httptest/httptest_test.go +++ b/testhelper/httptest/httptest_test.go @@ -58,7 +58,7 @@ func TestUnStartedServer(t *testing.T) { resp, err := http.Get("http://" + httpUnStartedServer.Listener.Addr().String()) defer func() { httputil.CloseResponse(resp) }() return err == nil - }, 5*time.Second, time.Second, "connected to an un-started server") + }, 5*time.Second, 10*time.Millisecond, "connected to an un-started server") // start the server now httpUnStartedServer.Start() @@ -72,7 +72,7 @@ func TestUnStartedServer(t *testing.T) { body, err = io.ReadAll(resp.Body) } return err == nil - }, 5*time.Second, time.Second, "failed to connect to server") + }, 2*time.Second, 100*time.Millisecond, "failed to connect to server") require.Equal(t, http.StatusOK, statusCode) require.Equal(t, "Hello, world!", string(body))