@@ -208,4 +208,89 @@ func TestRemoteAPI_Write_WithHandler(t *testing.T) {
208208 t .Fatalf ("expected error to contain 'storage error', got %v" , err )
209209 }
210210 })
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+ })
211296}
0 commit comments