@@ -21,11 +21,13 @@ import (
21
21
"sync"
22
22
"testing"
23
23
"time"
24
+
25
+ testingclock "k8s.io/utils/clock/testing"
24
26
)
25
27
26
28
func Test_newReady (t * testing.T ) {
27
29
errCh := make (chan error , 10 )
28
- ready := newReady ()
30
+ ready := newReady (testingclock . NewFakeClock ( time . Now ()) )
29
31
ready .set (false )
30
32
// create 10 goroutines waiting for ready
31
33
for i := 0 ; i < 10 ; i ++ {
@@ -48,20 +50,20 @@ func Test_newReady(t *testing.T) {
48
50
49
51
func Test_newReadySetIdempotent (t * testing.T ) {
50
52
errCh := make (chan error , 10 )
51
- ready := newReady ()
53
+ ready := newReady (testingclock . NewFakeClock ( time . Now ()) )
52
54
ready .set (false )
53
55
ready .set (false )
54
56
ready .set (false )
55
- if generation , ok := ready .checkAndReadGeneration (); generation != 0 || ok {
57
+ if generation , _ , ok := ready .checkAndReadGeneration (); generation != 0 || ok {
56
58
t .Errorf ("unexpected state: generation=%v ready=%v" , generation , ok )
57
59
}
58
60
ready .set (true )
59
- if generation , ok := ready .checkAndReadGeneration (); generation != 1 || ! ok {
61
+ if generation , _ , ok := ready .checkAndReadGeneration (); generation != 1 || ! ok {
60
62
t .Errorf ("unexpected state: generation=%v ready=%v" , generation , ok )
61
63
}
62
64
ready .set (true )
63
65
ready .set (true )
64
- if generation , ok := ready .checkAndReadGeneration (); generation != 1 || ! ok {
66
+ if generation , _ , ok := ready .checkAndReadGeneration (); generation != 1 || ! ok {
65
67
t .Errorf ("unexpected state: generation=%v ready=%v" , generation , ok )
66
68
}
67
69
ready .set (false )
@@ -77,7 +79,7 @@ func Test_newReadySetIdempotent(t *testing.T) {
77
79
t .Errorf ("ready should be blocking" )
78
80
}
79
81
ready .set (true )
80
- if generation , ok := ready .checkAndReadGeneration (); generation != 2 || ! ok {
82
+ if generation , _ , ok := ready .checkAndReadGeneration (); generation != 2 || ! ok {
81
83
t .Errorf ("unexpected state: generation=%v ready=%v" , generation , ok )
82
84
}
83
85
for i := 0 ; i < 10 ; i ++ {
@@ -92,7 +94,7 @@ func Test_newReadySetIdempotent(t *testing.T) {
92
94
func Test_newReadyRacy (t * testing.T ) {
93
95
concurrency := 1000
94
96
errCh := make (chan error , concurrency )
95
- ready := newReady ()
97
+ ready := newReady (testingclock . NewFakeClock ( time . Now ()) )
96
98
ready .set (false )
97
99
98
100
wg := sync.WaitGroup {}
@@ -123,7 +125,7 @@ func Test_newReadyRacy(t *testing.T) {
123
125
124
126
func Test_newReadyStop (t * testing.T ) {
125
127
errCh := make (chan error , 10 )
126
- ready := newReady ()
128
+ ready := newReady (testingclock . NewFakeClock ( time . Now ()) )
127
129
ready .set (false )
128
130
// create 10 goroutines waiting for ready and stop
129
131
for i := 0 ; i < 10 ; i ++ {
@@ -145,24 +147,24 @@ func Test_newReadyStop(t *testing.T) {
145
147
}
146
148
147
149
func Test_newReadyCheck (t * testing.T ) {
148
- ready := newReady ()
150
+ ready := newReady (testingclock . NewFakeClock ( time . Now ()) )
149
151
// it starts as false
150
- if ready .check () {
151
- t .Errorf ("unexpected ready state %v" , ready . check () )
152
+ if _ , ok := ready .check (); ok {
153
+ t .Errorf ("unexpected ready state %v" , ok )
152
154
}
153
155
ready .set (true )
154
- if ! ready .check () {
155
- t .Errorf ("unexpected ready state %v" , ready . check () )
156
+ if _ , ok := ready .check (); ! ok {
157
+ t .Errorf ("unexpected ready state %v" , ok )
156
158
}
157
159
// stop sets ready to false
158
160
ready .stop ()
159
- if ready .check () {
160
- t .Errorf ("unexpected ready state %v" , ready . check () )
161
+ if _ , ok := ready .check (); ok {
162
+ t .Errorf ("unexpected ready state %v" , ok )
161
163
}
162
164
// can not set to true if is stopped
163
165
ready .set (true )
164
- if ready .check () {
165
- t .Errorf ("unexpected ready state %v" , ready . check () )
166
+ if _ , ok := ready .check (); ok {
167
+ t .Errorf ("unexpected ready state %v" , ok )
166
168
}
167
169
err := ready .wait (context .Background ())
168
170
if err == nil {
@@ -172,7 +174,7 @@ func Test_newReadyCheck(t *testing.T) {
172
174
173
175
func Test_newReadyCancelPending (t * testing.T ) {
174
176
errCh := make (chan error , 10 )
175
- ready := newReady ()
177
+ ready := newReady (testingclock . NewFakeClock ( time . Now ()) )
176
178
ready .set (false )
177
179
ctx , cancel := context .WithCancel (context .Background ())
178
180
// create 10 goroutines stuck on pending
@@ -193,3 +195,40 @@ func Test_newReadyCancelPending(t *testing.T) {
193
195
}
194
196
}
195
197
}
198
+
199
+ func Test_newReadyStateChangeTimestamp (t * testing.T ) {
200
+ fakeClock := testingclock .NewFakeClock (time .Now ())
201
+ fakeClock .SetTime (time .Now ())
202
+
203
+ ready := newReady (fakeClock )
204
+ fakeClock .Step (time .Minute )
205
+ checkReadyTransitionTime (t , ready , time .Minute )
206
+
207
+ ready .set (true )
208
+ fakeClock .Step (time .Minute )
209
+ checkReadyTransitionTime (t , ready , time .Minute )
210
+ fakeClock .Step (time .Minute )
211
+ checkReadyTransitionTime (t , ready , 2 * time .Minute )
212
+
213
+ ready .set (false )
214
+ fakeClock .Step (time .Minute )
215
+ checkReadyTransitionTime (t , ready , time .Minute )
216
+ fakeClock .Step (time .Minute )
217
+ checkReadyTransitionTime (t , ready , 2 * time .Minute )
218
+
219
+ ready .set (true )
220
+ fakeClock .Step (time .Minute )
221
+ checkReadyTransitionTime (t , ready , time .Minute )
222
+
223
+ ready .stop ()
224
+ fakeClock .Step (time .Minute )
225
+ checkReadyTransitionTime (t , ready , time .Minute )
226
+ fakeClock .Step (time .Minute )
227
+ checkReadyTransitionTime (t , ready , 2 * time .Minute )
228
+ }
229
+
230
+ func checkReadyTransitionTime (t * testing.T , r * ready , expectedLastStateChangeDuration time.Duration ) {
231
+ if lastStateChangeDuration , _ := r .check (); lastStateChangeDuration != expectedLastStateChangeDuration {
232
+ t .Errorf ("unexpected last state change duration: %v, expected: %v" , lastStateChangeDuration , expectedLastStateChangeDuration )
233
+ }
234
+ }
0 commit comments