1
1
package queueinformer
2
2
3
3
import (
4
+ "math"
4
5
"math/rand"
5
6
"reflect"
6
7
"testing"
@@ -10,60 +11,134 @@ import (
10
11
"github.com/stretchr/testify/require"
11
12
)
12
13
14
+ type fakeFloat64er float64
15
+
16
+ func (f fakeFloat64er ) Float64 () float64 {
17
+ return float64 (f )
18
+ }
19
+
13
20
func TestResyncWithJitter (t * testing.T ) {
14
21
type args struct {
15
22
resyncPeriod time.Duration
16
23
factor float64
24
+ r float64
17
25
}
18
26
tests := []struct {
19
- name string
20
- args args
21
- wantMin time.Duration
22
- wantMax time.Duration
27
+ name string
28
+ args args
29
+ want time.Duration
23
30
}{
24
31
{
25
- name : "TypicalInput/Minutes" ,
32
+ name : "TypicalInput/15Minutes/Min" ,
33
+ args : args {
34
+ resyncPeriod : 15 * time .Minute ,
35
+ factor : 0.2 ,
36
+ r : 0 ,
37
+ },
38
+ want : 12 * time .Minute ,
39
+ },
40
+ {
41
+ name : "TypicalInput/15Minutes/Mid" ,
42
+ args : args {
43
+ resyncPeriod : 15 * time .Minute ,
44
+ factor : 0.2 ,
45
+ r : 0.5 ,
46
+ },
47
+ want : 15 * time .Minute ,
48
+ },
49
+ {
50
+ name : "TypicalInput/15Minutes/Max" ,
26
51
args : args {
27
52
resyncPeriod : 15 * time .Minute ,
28
53
factor : 0.2 ,
54
+ r : 1 ,
29
55
},
30
- wantMin : 12 * time .Minute ,
31
- wantMax : 18 * time .Minute ,
56
+ want : 18 * time .Minute ,
32
57
},
33
58
{
34
- name : "TypicalInput/Hours " ,
59
+ name : "TypicalInput/10Hours/Min " ,
35
60
args : args {
36
61
resyncPeriod : 10 * time .Hour ,
37
62
factor : 0.1 ,
63
+ r : 0 ,
38
64
},
39
- wantMin : 9 * time .Hour ,
40
- wantMax : 11 * time .Hour ,
65
+ want : 9 * time .Hour ,
66
+ },
67
+ {
68
+ name : "TypicalInput/10Hours/Mid" ,
69
+ args : args {
70
+ resyncPeriod : 10 * time .Hour ,
71
+ factor : 0.1 ,
72
+ r : 0.5 ,
73
+ },
74
+ want : 10 * time .Hour ,
75
+ },
76
+ {
77
+ name : "TypicalInput/10Hours/Max" ,
78
+ args : args {
79
+ resyncPeriod : 10 * time .Hour ,
80
+ factor : 0.1 ,
81
+ r : 1 ,
82
+ },
83
+ want : 11 * time .Hour ,
41
84
},
42
85
{
43
86
name : "BadInput/BadFactor" ,
44
87
args : args {
45
88
resyncPeriod : 10 * time .Hour ,
46
89
factor : - 0.1 ,
47
90
},
48
- wantMin : 10 * time .Hour ,
49
- wantMax : 10 * time .Hour ,
91
+ want : 10 * time .Hour ,
50
92
},
51
93
{
52
94
name : "BadInput/BadResync" ,
53
95
args : args {
54
96
resyncPeriod : - 10 * time .Hour ,
55
97
factor : 0.1 ,
56
98
},
57
- wantMin : DefaultResyncPeriod ,
58
- wantMax : DefaultResyncPeriod ,
99
+ want : DefaultResyncPeriod ,
100
+ },
101
+ {
102
+ name : "BadInput/Big" ,
103
+ args : args {
104
+ resyncPeriod : time .Duration (math .MaxInt64 ),
105
+ factor : 1 ,
106
+ r : 1 ,
107
+ },
108
+ want : time .Duration (math .MaxInt64 ),
109
+ },
110
+ {
111
+ name : "SmallInput/Min" ,
112
+ args : args {
113
+ resyncPeriod : 10 * time .Second ,
114
+ factor : 0.5 ,
115
+ r : 0 ,
116
+ },
117
+ want : 5 * time .Second ,
118
+ },
119
+ {
120
+ name : "SmallInput/Mid" ,
121
+ args : args {
122
+ resyncPeriod : 10 * time .Second ,
123
+ factor : 0.5 ,
124
+ r : 0.5 ,
125
+ },
126
+ want : 10 * time .Second ,
127
+ },
128
+ {
129
+ name : "SmallInput/Max" ,
130
+ args : args {
131
+ resyncPeriod : 10 * time .Second ,
132
+ factor : 0.5 ,
133
+ r : 1 ,
134
+ },
135
+ want : 15 * time .Second ,
59
136
},
60
137
}
61
138
for _ , tt := range tests {
62
139
t .Run (tt .name , func (t * testing.T ) {
63
- got := ResyncWithJitter (tt .args .resyncPeriod , tt .args .factor )
64
- require .True (t , got () >= tt .wantMin )
65
- require .True (t , got () <= tt .wantMax )
66
- require .True (t , got () != got () || tt .wantMax == tt .wantMin )
140
+ got := resyncWithJitter (tt .args .resyncPeriod , tt .args .factor , fakeFloat64er (tt .args .r ))()
141
+ require .Equal (t , tt .want , got )
67
142
})
68
143
}
69
144
}
0 commit comments