cloudflare/cloudflared

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
2019.7.0

Branches

Tags

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

Clone

HTTPS

Download ZIP

origin/backoffhandler_test.go

147lines · modeblame

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