@@ -167,3 +167,72 @@ func TestCheckHealthzContextCancellation(t *testing.T) {
167
167
t .Error ("CheckHealthz() with canceled context should return error" )
168
168
}
169
169
}
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