cloudflare/cloudflared

Public

mirrored from https://github.com/cloudflare/cloudflaredAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
2018.10.2

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

origin/backoffhandler_test.go

148lines · modeblame

d06fc520Areg Harutyunyan8 years ago1package origin
2
3import (
4"testing"
5"time"
6
7"golang.org/x/net/context"
8)
9
10func immediateTimeAfter(time.Duration) <-chan time.Time {
11c := make(chan time.Time, 1)
12c <- time.Now()
13return c
14}
15
16func TestBackoffRetries(t *testing.T) {
17// make backoff return immediately
18timeAfter = immediateTimeAfter
19ctx := context.Background()
20backoff := BackoffHandler{MaxRetries: 3}
21if !backoff.Backoff(ctx) {
22t.Fatalf("backoff failed immediately")
23}
24if !backoff.Backoff(ctx) {
25t.Fatalf("backoff failed after 1 retry")
26}
27if !backoff.Backoff(ctx) {
28t.Fatalf("backoff failed after 2 retry")
29}
30if backoff.Backoff(ctx) {
31t.Fatalf("backoff allowed after 3 (max) retries")
32}
33}
34
35func TestBackoffCancel(t *testing.T) {
36// prevent backoff from returning normally
37timeAfter = func(time.Duration) <-chan time.Time { return make(chan time.Time) }
38ctx, cancelFunc := context.WithCancel(context.Background())
39backoff := BackoffHandler{MaxRetries: 3}
40cancelFunc()
41if backoff.Backoff(ctx) {
42t.Fatalf("backoff allowed after cancel")
43}
44if _, ok := backoff.GetBackoffDuration(ctx); ok {
45t.Fatalf("backoff allowed after cancel")
46}
47}
48
49func TestBackoffGracePeriod(t *testing.T) {
50currentTime := time.Now()
51// make timeNow return whatever we like
52timeNow = func() time.Time { return currentTime }
53// make backoff return immediately
54timeAfter = immediateTimeAfter
55ctx := context.Background()
56backoff := BackoffHandler{MaxRetries: 1}
57if !backoff.Backoff(ctx) {
58t.Fatalf("backoff failed immediately")
59}
60// the next call to Backoff would fail unless it's after the grace period
61backoff.SetGracePeriod()
62// advance time to after the grace period (~4 seconds) and see what happens
63currentTime = currentTime.Add(time.Second * 5)
64if !backoff.Backoff(ctx) {
65t.Fatalf("backoff failed after the grace period expired")
66}
67// confirm we ignore grace period after backoff
68if backoff.Backoff(ctx) {
69t.Fatalf("backoff allowed after 1 (max) retry")
70}
71}
72
73func TestGetBackoffDurationRetries(t *testing.T) {
74// make backoff return immediately
75timeAfter = immediateTimeAfter
76ctx := context.Background()
77backoff := BackoffHandler{MaxRetries: 3}
78if _, ok := backoff.GetBackoffDuration(ctx); !ok {
79t.Fatalf("backoff failed immediately")
80}
81backoff.Backoff(ctx) // noop
82if _, ok := backoff.GetBackoffDuration(ctx); !ok {
83t.Fatalf("backoff failed after 1 retry")
84}
85backoff.Backoff(ctx) // noop
86if _, ok := backoff.GetBackoffDuration(ctx); !ok {
87t.Fatalf("backoff failed after 2 retry")
88}
89backoff.Backoff(ctx) // noop
90if _, ok := backoff.GetBackoffDuration(ctx); ok {
91t.Fatalf("backoff allowed after 3 (max) retries")
92}
93if backoff.Backoff(ctx) {
94t.Fatalf("backoff allowed after 3 (max) retries")
95}
96}
97
98func TestGetBackoffDuration(t *testing.T) {
99// make backoff return immediately
100timeAfter = immediateTimeAfter
101ctx := context.Background()
102backoff := BackoffHandler{MaxRetries: 3}
103if duration, ok := backoff.GetBackoffDuration(ctx); !ok || duration != time.Second {
104t.Fatalf("backoff didn't return 1 second on first retry")
105}
106backoff.Backoff(ctx) // noop
107if duration, ok := backoff.GetBackoffDuration(ctx); !ok || duration != time.Second*2 {
108t.Fatalf("backoff didn't return 2 seconds on second retry")
109}
110backoff.Backoff(ctx) // noop
111if duration, ok := backoff.GetBackoffDuration(ctx); !ok || duration != time.Second*4 {
112t.Fatalf("backoff didn't return 4 seconds on third retry")
113}
114backoff.Backoff(ctx) // noop
115if duration, ok := backoff.GetBackoffDuration(ctx); ok || duration != 0 {
116t.Fatalf("backoff didn't return 0 seconds on fourth retry (exceeding limit)")
117}
118}
119
120func TestBackoffRetryForever(t *testing.T) {
121// make backoff return immediately
122timeAfter = immediateTimeAfter
123ctx := context.Background()
124backoff := BackoffHandler{MaxRetries: 3, RetryForever: true}
125if duration, ok := backoff.GetBackoffDuration(ctx); !ok || duration != time.Second {
126t.Fatalf("backoff didn't return 1 second on first retry")
127}
128backoff.Backoff(ctx) // noop
129if duration, ok := backoff.GetBackoffDuration(ctx); !ok || duration != time.Second*2 {
130t.Fatalf("backoff didn't return 2 seconds on second retry")
131}
132backoff.Backoff(ctx) // noop
133if duration, ok := backoff.GetBackoffDuration(ctx); !ok || duration != time.Second*4 {
134t.Fatalf("backoff didn't return 4 seconds on third retry")
135}
136if !backoff.Backoff(ctx) {
137t.Fatalf("backoff refused on fourth retry despire RetryForever")
138}
139if duration, ok := backoff.GetBackoffDuration(ctx); !ok || duration != time.Second*8 {
140t.Fatalf("backoff returned %v instead of 8 seconds on fourth retry", duration)
141}
142if !backoff.Backoff(ctx) {
143t.Fatalf("backoff refused on fifth retry despire RetryForever")
144}
145if duration, ok := backoff.GetBackoffDuration(ctx); !ok || duration != time.Second*8 {
146t.Fatalf("backoff returned %v instead of 8 seconds on fifth retry", duration)
147}
148}