@@ -208,4 +208,89 @@ func TestRemoteAPI_Write_WithHandler(t *testing.T) {
208
208
t .Fatalf ("expected error to contain 'storage error', got %v" , err )
209
209
}
210
210
})
211
+
212
+ t .Run ("retry callback invoked on retries" , func (t * testing.T ) {
213
+ tLogger := slog .Default ()
214
+ mockCode := http .StatusInternalServerError
215
+ mStore := & mockStorage {
216
+ mockErr : errors .New ("storage error" ),
217
+ mockCode : & mockCode ,
218
+ }
219
+ srv := httptest .NewServer (NewWriteHandler (mStore , MessageTypes {WriteV2MessageType }, WithWriteHandlerLogger (tLogger )))
220
+ t .Cleanup (srv .Close )
221
+
222
+ var retryCount int
223
+ var retryErrors []error
224
+
225
+ client , err := NewAPI (srv .URL ,
226
+ WithAPIHTTPClient (srv .Client ()),
227
+ WithAPILogger (tLogger ),
228
+ WithAPIPath ("api/v1/write" ),
229
+ WithAPIBackoff (backoff.Config {
230
+ Min : 1 * time .Millisecond ,
231
+ Max : 1 * time .Millisecond ,
232
+ MaxRetries : 3 ,
233
+ }),
234
+ WithAPIRetryCallback (func (err error ) {
235
+ retryCount ++
236
+ retryErrors = append (retryErrors , err )
237
+ }),
238
+ )
239
+ if err != nil {
240
+ t .Fatal (err )
241
+ }
242
+
243
+ req := testV2 ()
244
+ _ , err = client .Write (context .Background (), WriteV2MessageType , req )
245
+ if err == nil {
246
+ t .Fatal ("expected error, got nil" )
247
+ }
248
+
249
+ // Verify callback was invoked for each retry.
250
+ expectedRetries := 3
251
+ if retryCount != expectedRetries {
252
+ t .Fatalf ("expected %d retry callback invocations, got %d" , expectedRetries , retryCount )
253
+ }
254
+
255
+ // Verify errors were passed correctly.
256
+ for i , retryErr := range retryErrors {
257
+ if retryErr == nil {
258
+ t .Fatalf ("expected non-nil error for retry %d" , i )
259
+ }
260
+ if ! strings .Contains (retryErr .Error (), "storage error" ) {
261
+ t .Fatalf ("expected error to contain 'storage error', got %v" , retryErr )
262
+ }
263
+ }
264
+ })
265
+
266
+ t .Run ("retry callback not invoked on success" , func (t * testing.T ) {
267
+ tLogger := slog .Default ()
268
+ mStore := & mockStorage {}
269
+ srv := httptest .NewServer (NewWriteHandler (mStore , MessageTypes {WriteV2MessageType }, WithWriteHandlerLogger (tLogger )))
270
+ t .Cleanup (srv .Close )
271
+
272
+ callbackInvoked := false
273
+ client , err := NewAPI (srv .URL ,
274
+ WithAPIHTTPClient (srv .Client ()),
275
+ WithAPILogger (tLogger ),
276
+ WithAPIPath ("api/v1/write" ),
277
+ WithAPIRetryCallback (func (err error ) {
278
+ callbackInvoked = true
279
+ }),
280
+ )
281
+ if err != nil {
282
+ t .Fatal (err )
283
+ }
284
+
285
+ req := testV2 ()
286
+ _ , err = client .Write (context .Background (), WriteV2MessageType , req )
287
+ if err != nil {
288
+ t .Fatal (err )
289
+ }
290
+
291
+ // Verify callback was not invoked for successful request.
292
+ if callbackInvoked {
293
+ t .Fatal ("retry callback should not be invoked on successful request" )
294
+ }
295
+ })
211
296
}
0 commit comments