123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- package retry_test
- import (
- "testing"
- "time"
- "github.com/xtls/xray-core/common"
- "github.com/xtls/xray-core/common/errors"
- . "github.com/xtls/xray-core/common/retry"
- )
- var errorTestOnly = errors.New("this is a fake error")
- func TestNoRetry(t *testing.T) {
- startTime := time.Now().Unix()
- err := Timed(10, 100000).On(func() error {
- return nil
- })
- endTime := time.Now().Unix()
- common.Must(err)
- if endTime < startTime {
- t.Error("endTime < startTime: ", startTime, " -> ", endTime)
- }
- }
- func TestRetryOnce(t *testing.T) {
- startTime := time.Now()
- called := 0
- err := Timed(10, 1000).On(func() error {
- if called == 0 {
- called++
- return errorTestOnly
- }
- return nil
- })
- duration := time.Since(startTime)
- common.Must(err)
- if v := int64(duration / time.Millisecond); v < 900 {
- t.Error("duration: ", v)
- }
- }
- func TestRetryMultiple(t *testing.T) {
- startTime := time.Now()
- called := 0
- err := Timed(10, 1000).On(func() error {
- if called < 5 {
- called++
- return errorTestOnly
- }
- return nil
- })
- duration := time.Since(startTime)
- common.Must(err)
- if v := int64(duration / time.Millisecond); v < 4900 {
- t.Error("duration: ", v)
- }
- }
- func TestRetryExhausted(t *testing.T) {
- startTime := time.Now()
- called := 0
- err := Timed(2, 1000).On(func() error {
- called++
- return errorTestOnly
- })
- duration := time.Since(startTime)
- if errors.Cause(err) != ErrRetryFailed {
- t.Error("cause: ", err)
- }
- if v := int64(duration / time.Millisecond); v < 1900 {
- t.Error("duration: ", v)
- }
- }
- func TestExponentialBackoff(t *testing.T) {
- startTime := time.Now()
- called := 0
- err := ExponentialBackoff(10, 100).On(func() error {
- called++
- return errorTestOnly
- })
- duration := time.Since(startTime)
- if errors.Cause(err) != ErrRetryFailed {
- t.Error("cause: ", err)
- }
- if v := int64(duration / time.Millisecond); v < 4000 {
- t.Error("duration: ", v)
- }
- }
|