RequireEventuallyResponseOK makes HTTP GET requests to the given endpoint until it returns 200 OK with a valid JSON response that can be decoded into target, or until the context times out. This is useful for waiting for HTTP servers to become ready during tests, especially for metadata endpoints th
(ctx context.Context, t testing.TB, endpoint string, target interface{})
| 14 | // times out. This is useful for waiting for HTTP servers to become ready during tests, |
| 15 | // especially for metadata endpoints that may not be immediately available. |
| 16 | func RequireEventuallyResponseOK(ctx context.Context, t testing.TB, endpoint string, target interface{}) { |
| 17 | t.Helper() |
| 18 | |
| 19 | ok := Eventually(ctx, t, func(ctx context.Context) (done bool) { |
| 20 | req, err := http.NewRequestWithContext(ctx, http.MethodGet, endpoint, nil) |
| 21 | if err != nil { |
| 22 | return false |
| 23 | } |
| 24 | resp, err := http.DefaultClient.Do(req) |
| 25 | if err != nil { |
| 26 | return false |
| 27 | } |
| 28 | defer resp.Body.Close() |
| 29 | if resp.StatusCode != http.StatusOK { |
| 30 | return false |
| 31 | } |
| 32 | if err := json.NewDecoder(resp.Body).Decode(target); err != nil { |
| 33 | return false |
| 34 | } |
| 35 | return true |
| 36 | }, IntervalFast) |
| 37 | |
| 38 | require.True(t, ok, "endpoint %s not ready in time", endpoint) |
| 39 | } |