Skip to content

Commit 082d6c2

Browse files
committed
add retry tests with custom wrapped error
1 parent 230edc6 commit 082d6c2

File tree

2 files changed

+181
-0
lines changed

2 files changed

+181
-0
lines changed

internal/table/retry_test.go

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,3 +347,104 @@ func TestRetryContextDeadline(t *testing.T) {
347347
}
348348
}
349349
}
350+
351+
type CustomError struct {
352+
Err error
353+
}
354+
355+
func (e *CustomError) Error() string {
356+
return fmt.Sprintf("custom error: %v", e.Err)
357+
}
358+
359+
func (e *CustomError) Unwrap() error {
360+
return e.Err
361+
}
362+
363+
func TestRetryWithCustomErrors(t *testing.T) {
364+
var (
365+
limit = 10
366+
ctx = context.Background()
367+
p = SessionProviderFunc{
368+
OnGet: func(ctx context.Context) (Session, error) {
369+
return simpleSession(t), nil
370+
},
371+
}
372+
)
373+
for _, test := range []struct {
374+
error error
375+
retriable bool
376+
deleteSession bool
377+
}{
378+
{
379+
error: &CustomError{
380+
Err: errors.NewOpError(
381+
errors.WithOEReason(
382+
errors.StatusBadSession,
383+
),
384+
),
385+
},
386+
retriable: true,
387+
deleteSession: true,
388+
},
389+
{
390+
error: &CustomError{
391+
Err: fmt.Errorf(
392+
"wrapped error: %w",
393+
errors.NewOpError(
394+
errors.WithOEReason(
395+
errors.StatusBadSession,
396+
),
397+
),
398+
),
399+
},
400+
retriable: true,
401+
deleteSession: true,
402+
},
403+
{
404+
error: &CustomError{
405+
Err: fmt.Errorf(
406+
"wrapped error: %w",
407+
errors.NewOpError(
408+
errors.WithOEReason(
409+
errors.StatusUnauthorized,
410+
),
411+
),
412+
),
413+
},
414+
retriable: false,
415+
deleteSession: false,
416+
},
417+
} {
418+
t.Run(test.error.Error(), func(t *testing.T) {
419+
var (
420+
i = 0
421+
sessions = make(map[table.Session]int)
422+
)
423+
err := do(ctx, p, func(ctx context.Context, s table.Session) (err error) {
424+
if test.deleteSession {
425+
if _, has := sessions[s]; has {
426+
t.Fatalf("session already used: %s", s.ID())
427+
}
428+
}
429+
sessions[s]++
430+
i++
431+
if i < limit {
432+
return test.error
433+
}
434+
return nil
435+
})
436+
if test.retriable {
437+
if i != limit {
438+
t.Fatalf("unexpected i: %d, err: %v", i, err)
439+
}
440+
} else {
441+
if i != 1 {
442+
t.Fatalf("unexpected i: %d, err: %v", i, err)
443+
}
444+
if len(sessions) != 1 {
445+
t.Fatalf("unexpected len(sessions): %d, err: %v", len(sessions), err)
446+
}
447+
}
448+
})
449+
}
450+
}

retry/retry_test.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -598,3 +598,83 @@ func TestRetryModes(t *testing.T) {
598598
})
599599
}
600600
}
601+
602+
type CustomError struct {
603+
Err error
604+
}
605+
606+
func (e *CustomError) Error() string {
607+
return fmt.Sprintf("custom error: %v", e.Err)
608+
}
609+
610+
func (e *CustomError) Unwrap() error {
611+
return e.Err
612+
}
613+
614+
func TestRetryWithCustomErrors(t *testing.T) {
615+
var (
616+
limit = 10
617+
ctx = context.Background()
618+
)
619+
for _, test := range []struct {
620+
error error
621+
retriable bool
622+
}{
623+
{
624+
error: &CustomError{
625+
Err: errors.NewOpError(
626+
errors.WithOEReason(
627+
errors.StatusBadSession,
628+
),
629+
),
630+
},
631+
retriable: true,
632+
},
633+
{
634+
error: &CustomError{
635+
Err: fmt.Errorf(
636+
"wrapped error: %w",
637+
errors.NewOpError(
638+
errors.WithOEReason(
639+
errors.StatusBadSession,
640+
),
641+
),
642+
),
643+
},
644+
retriable: true,
645+
},
646+
{
647+
error: &CustomError{
648+
Err: fmt.Errorf(
649+
"wrapped error: %w",
650+
errors.NewOpError(
651+
errors.WithOEReason(
652+
errors.StatusUnauthorized,
653+
),
654+
),
655+
),
656+
},
657+
retriable: false,
658+
},
659+
} {
660+
t.Run(test.error.Error(), func(t *testing.T) {
661+
i := 0
662+
err := Retry(ctx, func(ctx context.Context) (err error) {
663+
i++
664+
if i < limit {
665+
return test.error
666+
}
667+
return nil
668+
})
669+
if test.retriable {
670+
if i != limit {
671+
t.Fatalf("unexpected i: %d, err: %v", i, err)
672+
}
673+
} else {
674+
if i != 1 {
675+
t.Fatalf("unexpected i: %d, err: %v", i, err)
676+
}
677+
}
678+
})
679+
}
680+
}

0 commit comments

Comments
 (0)