Skip to content

Commit 1777e24

Browse files
authored
test(client/v1): add more healthz client tests (#673)
Cherry-picked from #627. Signed-off-by: Gyuho Lee <[email protected]>
1 parent 8d1d3b5 commit 1777e24

File tree

1 file changed

+69
-0
lines changed

1 file changed

+69
-0
lines changed

client/v1/healthz_test.go

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,3 +167,72 @@ func TestCheckHealthzContextCancellation(t *testing.T) {
167167
t.Error("CheckHealthz() with canceled context should return error")
168168
}
169169
}
170+
171+
func TestBlockUntilServerReady(t *testing.T) {
172+
t.Run("server becomes ready immediately", func(t *testing.T) {
173+
expectedHealthz, err := server.DefaultHealthz.JSON()
174+
require.NoError(t, err)
175+
176+
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
177+
assert.Equal(t, "/healthz", r.URL.Path)
178+
assert.Equal(t, http.MethodGet, r.Method)
179+
w.WriteHeader(http.StatusOK)
180+
_, err := w.Write(expectedHealthz)
181+
require.NoError(t, err)
182+
}))
183+
defer srv.Close()
184+
185+
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
186+
defer cancel()
187+
188+
err = BlockUntilServerReady(ctx, srv.URL)
189+
require.NoError(t, err)
190+
})
191+
192+
t.Run("server becomes ready after delay", func(t *testing.T) {
193+
expectedHealthz, err := server.DefaultHealthz.JSON()
194+
require.NoError(t, err)
195+
196+
// Track number of requests to simulate the server becoming ready after a few attempts
197+
requestCount := 0
198+
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
199+
assert.Equal(t, "/healthz", r.URL.Path)
200+
assert.Equal(t, http.MethodGet, r.Method)
201+
202+
requestCount++
203+
if requestCount <= 2 {
204+
// First two requests fail
205+
w.WriteHeader(http.StatusServiceUnavailable)
206+
return
207+
}
208+
209+
// Later requests succeed
210+
w.WriteHeader(http.StatusOK)
211+
_, err := w.Write(expectedHealthz)
212+
require.NoError(t, err)
213+
}))
214+
defer srv.Close()
215+
216+
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
217+
defer cancel()
218+
219+
err = BlockUntilServerReady(ctx, srv.URL)
220+
require.NoError(t, err)
221+
assert.GreaterOrEqual(t, requestCount, 3, "Expected at least 3 requests")
222+
})
223+
224+
t.Run("context canceled", func(t *testing.T) {
225+
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
226+
assert.Equal(t, "/healthz", r.URL.Path)
227+
w.WriteHeader(http.StatusServiceUnavailable)
228+
}))
229+
defer srv.Close()
230+
231+
ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond)
232+
defer cancel()
233+
234+
err := BlockUntilServerReady(ctx, srv.URL)
235+
require.Error(t, err)
236+
assert.Contains(t, err.Error(), "context")
237+
})
238+
}

0 commit comments

Comments
 (0)