From 6f0f9e5600a052294cdf1f69d5313d0ab2c272e0 Mon Sep 17 00:00:00 2001 From: Chris Crone Date: Mon, 7 Sep 2020 13:43:16 +0200 Subject: [PATCH 1/2] e2e.framework: Add helper to retry HTTP requests Signed-off-by: Chris Crone --- tests/framework/e2e.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/framework/e2e.go b/tests/framework/e2e.go index 8dc685e1..d089461e 100644 --- a/tests/framework/e2e.go +++ b/tests/framework/e2e.go @@ -22,12 +22,14 @@ import ( "errors" "fmt" "io/ioutil" + "net/http" "os" "os/exec" "path/filepath" "runtime" "strings" "testing" + "time" "gotest.tools/v3/assert" is "gotest.tools/v3/assert/cmp" @@ -192,3 +194,21 @@ func ParseContainerInspect(stdout string) (*containers.Container, error) { } return &res, nil } + +// HTTPGetWithRetry performs an HTTP GET on an `endpoint`. +// In the case of an error it retries the same request after a 5 second sleep, +// returning the error if count of `tries` is reached +func HTTPGetWithRetry(endpoint string, tries int) (*http.Response, error) { + var ( + r *http.Response + err error + ) + for t := 0; t < tries; t++ { + r, err = http.Get(endpoint) + if err == nil || t == tries-1 { + break + } + time.Sleep(5 * time.Second) + } + return r, err +} From e4e77bd1981ba5592538c336200a5e0947960459 Mon Sep 17 00:00:00 2001 From: Chris Crone Date: Mon, 7 Sep 2020 13:43:34 +0200 Subject: [PATCH 2/2] e2e.aci: Retry flaky HTTP GET requests Signed-off-by: Chris Crone --- tests/aci-e2e/e2e-aci_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/aci-e2e/e2e-aci_test.go b/tests/aci-e2e/e2e-aci_test.go index c16afeb7..5a5243fa 100644 --- a/tests/aci-e2e/e2e-aci_test.go +++ b/tests/aci-e2e/e2e-aci_test.go @@ -198,7 +198,7 @@ func TestContainerRunVolume(t *testing.T) { }) t.Run("http get", func(t *testing.T) { - r, err := http.Get(endpoint) + r, err := HTTPGetWithRetry(endpoint, 3) assert.NilError(t, err) assert.Equal(t, r.StatusCode, http.StatusOK) b, err := ioutil.ReadAll(r.Body) @@ -434,7 +434,7 @@ func TestComposeUpUpdate(t *testing.T) { assert.Assert(t, is.Len(containerInspect.Ports, 1)) endpoint := fmt.Sprintf("http://%s:%d", containerInspect.Ports[0].HostIP, containerInspect.Ports[0].HostPort) - r, err := http.Get(endpoint + "/words/noun") + r, err := HTTPGetWithRetry(endpoint+"/words/noun", 3) assert.NilError(t, err) assert.Equal(t, r.StatusCode, http.StatusOK) b, err := ioutil.ReadAll(r.Body)