Skip to content

Commit

Permalink
Fix tests
Browse files Browse the repository at this point in the history
  • Loading branch information
theseanything committed Nov 4, 2024
1 parent 7a11d55 commit ab40254
Show file tree
Hide file tree
Showing 9 changed files with 121 additions and 144 deletions.
66 changes: 49 additions & 17 deletions integration_tests/backend_helpers.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package integration

import (
"net"
"net/http"
"net/http/httptest"
"strconv"
Expand All @@ -12,14 +13,39 @@ import (
"github.com/onsi/gomega/ghttp"
)

func startSimpleBackend(identifier string) *httptest.Server {
return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
var backends = map[string]string{
"backend-1": "127.0.0.1:6789",
"backend-2": "127.0.0.1:6790",
"outer": "127.0.0.1:6792",
"inner": "127.0.0.1:6793",
"innerer": "127.0.0.1:6794",
"root": "127.0.0.1:6795",
"other": "127.0.0.1:6796",
"fallthrough": "127.0.0.1:6797",
"down": "127.0.0.1:6798",
"slow-1": "127.0.0.1:6799",
"slow-2": "127.0.0.1:6800",
"backend": "127.0.0.1:6801",
"be": "127.0.0.1:6802",
"not-running": "127.0.0.1:6803",
"with-path": "127.0.0.1:6804",
}

func startSimpleBackend(identifier, host string) *httptest.Server {
l, err := net.Listen("tcp", host)
Expect(err).NotTo(HaveOccurred())

ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
_, err := w.Write([]byte(identifier))
Expect(err).NotTo(HaveOccurred())
}))
ts.Listener.Close()
ts.Listener = l
ts.Start()
return ts
}

func startTarpitBackend(delays ...time.Duration) *httptest.Server {
func startTarpitBackend(host string, delays ...time.Duration) *httptest.Server {
responseDelay := 2 * time.Second
if len(delays) > 0 {
responseDelay = delays[0]
Expand All @@ -28,7 +54,11 @@ func startTarpitBackend(delays ...time.Duration) *httptest.Server {
if len(delays) > 1 {
bodyDelay = delays[1]
}
return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

l, err := net.Listen("tcp", host)
Expect(err).NotTo(HaveOccurred())

ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
body := "Tarpit\n"

if responseDelay > 0 {
Expand All @@ -44,24 +74,26 @@ func startTarpitBackend(delays ...time.Duration) *httptest.Server {
_, err := w.Write([]byte(body))
Expect(err).NotTo(HaveOccurred())
}))
ts.Listener.Close()
ts.Listener = l
ts.Start()
return ts
}

func startRecordingBackend() *ghttp.Server {
return startRecordingServer(false)
}

func startRecordingTLSBackend() *ghttp.Server {
return startRecordingServer(true)
}
func startRecordingBackend(tls bool, host string) *ghttp.Server {
l, err := net.Listen("tcp", host)
Expect(err).NotTo(HaveOccurred())

func startRecordingServer(tls bool) (server *ghttp.Server) {
ts := ghttp.NewUnstartedServer()
ts.HTTPTestServer.Listener.Close()
ts.HTTPTestServer.Listener = l
if tls {
server = ghttp.NewTLSServer()
ts.HTTPTestServer.StartTLS()
} else {
server = ghttp.NewServer()
ts.Start()
}

server.AllowUnhandledRequests = true
server.UnhandledRequestStatusCode = http.StatusOK
return server
ts.AllowUnhandledRequests = true
ts.UnhandledRequestStatusCode = http.StatusOK
return ts
}
9 changes: 8 additions & 1 deletion integration_tests/integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,14 @@ var _ = BeforeSuite(func() {
if err != nil {
Fail(err.Error())
}
err = startRouter(routerPort, apiPort, nil)

backendEnvVars := []string{}
for id, host := range backends {
envVar := "BACKEND_URL_" + id + "=http://" + host
backendEnvVars = append(backendEnvVars, envVar)
}

err = startRouter(routerPort, apiPort, backendEnvVars)
if err != nil {
Fail(err.Error())
}
Expand Down
34 changes: 11 additions & 23 deletions integration_tests/performance_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package integration

import (
"net/http/httptest"
"os"
"time"

. "github.com/onsi/ginkgo/v2"
Expand All @@ -21,17 +20,15 @@ var _ = Describe("Performance", func() {
)

BeforeEach(func() {
backend1 = startSimpleBackend("backend 1")
backend2 = startSimpleBackend("backend 2")
os.Setenv("BACKEND_URL_backend-1", backend1.URL)
os.Setenv("BACKEND_URL_backend-2", backend2.URL)
backend1 = startSimpleBackend("backend 1", backends["backend-1"])
backend2 = startSimpleBackend("backend 2", backends["backend-2"])
addRoute("/one", NewBackendRoute("backend-1"))
addRoute("/two", NewBackendRoute("backend-2"))
reloadRoutes(apiPort)
})
AfterEach(func() {
os.Unsetenv("BACKEND_URL_backend-1")
os.Unsetenv("BACKEND_URL_backend-2")
backend1.Close()
backend2.Close()
})

It("Router should not cause errors or much latency", func() {
Expand Down Expand Up @@ -59,11 +56,9 @@ var _ = Describe("Performance", func() {

Describe("with one slow backend hit separately", func() {
It("Router should not cause errors or much latency", func() {
slowBackend := startTarpitBackend(time.Second)
slowBackend := startTarpitBackend(backends["slow-1"], time.Second)
defer slowBackend.Close()
os.Setenv("BACKEND_URL_backend-slow", slowBackend.URL)
defer os.Unsetenv("BACKEND_URL_backend-slow")
addRoute("/slow", NewBackendRoute("backend-slow"))
addRoute("/slow", NewBackendRoute("slow-1"))
reloadRoutes(apiPort)

_, gen := generateLoad([]string{routerURL(routerPort, "/slow")}, 50)
Expand All @@ -75,10 +70,7 @@ var _ = Describe("Performance", func() {

Describe("with one downed backend hit separately", func() {
It("Router should not cause errors or much latency", func() {
os.Setenv("BACKEND_URL_backend-down", "http://127.0.0.1:3162/")
defer os.Unsetenv("BACKEND_URL_backend-down")

addRoute("/down", NewBackendRoute("backend-down"))
addRoute("/down", NewBackendRoute("down"))
reloadRoutes(apiPort)

_, gen := generateLoad([]string{routerURL(routerPort, "/down")}, 50)
Expand All @@ -100,17 +92,13 @@ var _ = Describe("Performance", func() {
var backend2 *httptest.Server

BeforeEach(func() {
backend1 = startTarpitBackend(time.Second)
backend2 = startTarpitBackend(time.Second)
os.Setenv("BACKEND_URL_backend-1", backend1.URL)
os.Setenv("BACKEND_URL_backend-2", backend2.URL)
addRoute("/one", NewBackendRoute("backend-1"))
addRoute("/two", NewBackendRoute("backend-2"))
backend1 = startTarpitBackend(backends["slow-1"], time.Second)
backend2 = startTarpitBackend(backends["slow-2"], time.Second)
addRoute("/one", NewBackendRoute("slow-1"))
addRoute("/two", NewBackendRoute("slow-2"))
reloadRoutes(apiPort)
})
AfterEach(func() {
os.Unsetenv("BACKEND_URL_backend-1")
os.Unsetenv("BACKEND_URL_backend-2")
backend1.Close()
backend2.Close()
})
Expand Down
60 changes: 21 additions & 39 deletions integration_tests/proxy_function_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import (
"net/http/httptest"
"net/textproto"
"net/url"
"os"
"strings"
"time"

Expand All @@ -20,9 +19,6 @@ var _ = Describe("Functioning as a reverse proxy", func() {

Describe("connecting to the backend", func() {
It("should return a 502 if the connection to the backend is refused", func() {
os.Setenv("BACKEND_URL_not-running", "http://127.0.0.1:3164/")
defer os.Unsetenv("BACKEND_URL_not-running")

addRoute("/not-running", NewBackendRoute("not-running"))
reloadRoutes(apiPort)

Expand All @@ -34,23 +30,20 @@ var _ = Describe("Functioning as a reverse proxy", func() {

logDetails := lastRouterErrorLogEntry()
Expect(logDetails.Fields).To(Equal(map[string]interface{}{
"error": "dial tcp 127.0.0.1:3164: connect: connection refused",
"error": "dial tcp 127.0.0.1:6803: connect: connection refused",
"request": "GET /not-running HTTP/1.1",
"request_method": "GET",
"status": float64(502), // All numbers in JSON are floating point
"upstream_addr": "127.0.0.1:3164",
"upstream_addr": "127.0.0.1:6803",
}))
Expect(logDetails.Timestamp).To(BeTemporally("~", time.Now(), time.Second))
})

It("should log and return a 504 if the connection times out in the configured time", func() {
err := startRouter(3167, 3166, []string{"ROUTER_BACKEND_CONNECT_TIMEOUT=0.3s"})
err := startRouter(3167, 3166, []string{"ROUTER_BACKEND_CONNECT_TIMEOUT=0.3s", "BACKEND_URL_black-hole=http://240.0.0.0:1234/"})
Expect(err).NotTo(HaveOccurred())
defer stopRouter(3167)

os.Setenv("BACKEND_URL_black-hole", "http://240.0.0.0:1234/")
defer os.Unsetenv("BACKEND_URL_black-hole")

addRoute("/should-time-out", NewBackendRoute("black-hole"))
reloadRoutes(3166)

Expand Down Expand Up @@ -79,20 +72,16 @@ var _ = Describe("Functioning as a reverse proxy", func() {
var tarpit1, tarpit2 *httptest.Server

BeforeEach(func() {
err := startRouter(3167, 3166, []string{"ROUTER_BACKEND_HEADER_TIMEOUT=0.3s"})
err := startRouter(3167, 3166, []string{"ROUTER_BACKEND_HEADER_TIMEOUT=0.3s", "BACKEND_URL_slow-1=http://127.0.0.1:6256/", "BACKEND_URL_slow-2=http://127.0.0.1:6253/"})
Expect(err).NotTo(HaveOccurred())
tarpit1 = startTarpitBackend(time.Second)
tarpit2 = startTarpitBackend(100*time.Millisecond, 500*time.Millisecond)
os.Setenv("BACKEND_URL_tarpit1", tarpit1.URL)
os.Setenv("BACKEND_URL_tarpit2", tarpit2.URL)
addRoute("/tarpit1", NewBackendRoute("tarpit1"))
addRoute("/tarpit2", NewBackendRoute("tarpit2"))
tarpit1 = startTarpitBackend("127.0.0.1:6256", time.Second)
tarpit2 = startTarpitBackend("127.0.0.1:6253", 100*time.Millisecond, 500*time.Millisecond)
addRoute("/tarpit1", NewBackendRoute("slow-1"))
addRoute("/tarpit2", NewBackendRoute("slow-2"))
reloadRoutes(3166)
})

AfterEach(func() {
os.Unsetenv("BACKEND_URL_tarpit1")
os.Unsetenv("BACKEND_URL_tarpit2")
tarpit1.Close()
tarpit2.Close()
stopRouter(3167)
Expand Down Expand Up @@ -125,14 +114,12 @@ var _ = Describe("Functioning as a reverse proxy", func() {

Describe("header handling", func() {
BeforeEach(func() {
recorder = startRecordingBackend()
os.Setenv("BACKEND_URL_backend", recorder.URL())
recorder = startRecordingBackend(false, backends["backend"])
addRoute("/foo", NewBackendRoute("backend", "prefix"))
reloadRoutes(apiPort)
})

AfterEach(func() {
os.Unsetenv("BACKEND_URL_backend")
recorder.Close()
})

Expand Down Expand Up @@ -250,14 +237,12 @@ var _ = Describe("Functioning as a reverse proxy", func() {

Describe("request verb, path, query and body handling", func() {
BeforeEach(func() {
recorder = startRecordingBackend()
os.Setenv("BACKEND_URL_backend", recorder.URL())
recorder = startRecordingBackend(false, backends["backend"])
addRoute("/foo", NewBackendRoute("backend", "prefix"))
reloadRoutes(apiPort)
})

AfterEach(func() {
os.Unsetenv("BACKEND_URL_backend")
recorder.Close()
})

Expand Down Expand Up @@ -307,19 +292,20 @@ var _ = Describe("Functioning as a reverse proxy", func() {

Describe("handling a backend with a non '/' path", func() {
BeforeEach(func() {
recorder = startRecordingBackend()
os.Setenv("BACKEND_URL_backend", recorder.URL()+"/something")
addRoute("/foo/bar", NewBackendRoute("backend", "prefix"))
reloadRoutes(apiPort)
err := startRouter(3167, 3166, []string{"ROUTER_TLS_SKIP_VERIFY=1", "BACKEND_URL_with-path=http://127.0.0.1:6804/something"})
Expect(err).NotTo(HaveOccurred())
recorder = startRecordingBackend(false, backends["with-path"])
addRoute("/foo/bar", NewBackendRoute("with-path", "prefix"))
reloadRoutes(3166)
})

AfterEach(func() {
os.Unsetenv("BACKEND_URL_backend")
recorder.Close()
stopRouter(3167)
})

It("should merge the 2 paths", func() {
resp := routerRequest(routerPort, "/foo/bar")
resp := routerRequest(3167, "/foo/bar")
Expect(resp.StatusCode).To(Equal(200))

Expect(recorder.ReceivedRequests()).To(HaveLen(1))
Expand All @@ -328,7 +314,7 @@ var _ = Describe("Functioning as a reverse proxy", func() {
})

It("should preserve the request query string", func() {
resp := routerRequest(routerPort, "/foo/bar?baz=qux")
resp := routerRequest(3167, "/foo/bar?baz=qux")
Expect(resp.StatusCode).To(Equal(200))

Expect(recorder.ReceivedRequests()).To(HaveLen(1))
Expand All @@ -339,14 +325,12 @@ var _ = Describe("Functioning as a reverse proxy", func() {

Describe("handling HTTP/1.0 requests", func() {
BeforeEach(func() {
recorder = startRecordingBackend()
os.Setenv("BACKEND_URL_backend", recorder.URL())
recorder = startRecordingBackend(false, backends["backend"])
addRoute("/foo", NewBackendRoute("backend", "prefix"))
reloadRoutes(apiPort)
})

AfterEach(func() {
os.Unsetenv("BACKEND_URL_backend")
recorder.Close()
})

Expand All @@ -373,16 +357,14 @@ var _ = Describe("Functioning as a reverse proxy", func() {

Describe("handling requests to a HTTPS backend", func() {
BeforeEach(func() {
err := startRouter(3167, 3166, []string{"ROUTER_TLS_SKIP_VERIFY=1"})
err := startRouter(3167, 3166, []string{"ROUTER_TLS_SKIP_VERIFY=1", "BACKEND_URL_backend=https://127.0.0.1:2486"})
Expect(err).NotTo(HaveOccurred())
recorder = startRecordingTLSBackend()
os.Setenv("BACKEND_URL_backend", recorder.URL())
recorder = startRecordingBackend(true, "127.0.0.1:2486")
addRoute("/foo", NewBackendRoute("backend", "prefix"))
reloadRoutes(3166)
})

AfterEach(func() {
os.Unsetenv("BACKEND_URL_backend")
recorder.Close()
stopRouter(3167)
})
Expand Down
5 changes: 1 addition & 4 deletions integration_tests/redirect_test.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package integration

import (
"os"
"time"

. "github.com/onsi/ginkgo/v2"
Expand Down Expand Up @@ -223,15 +222,13 @@ var _ = Describe("Redirection", func() {
var recorder *ghttp.Server

BeforeEach(func() {
recorder = startRecordingBackend()
os.Setenv("BACKEND_URL_be", recorder.URL())
recorder = startRecordingBackend(false, backends["be"])
addRoute("/guidance/keeping-a-pet-pig-or-micropig", NewBackendRoute("be", "exact"))
addRoute("/GUIDANCE/keeping-a-pet-pig-or-micropig", NewBackendRoute("be", "exact"))
reloadRoutes(apiPort)
})

AfterEach(func() {
os.Unsetenv("BACKEND_URL_be")
recorder.Close()
})

Expand Down
Loading

0 comments on commit ab40254

Please sign in to comment.