@@ -16,25 +16,35 @@ import (
16
16
)
17
17
18
18
func Test_updateStatusController (t * testing.T ) {
19
+ var now = time .Now ()
20
+ var minus90sec = now .Add (- 90 * time .Second )
21
+ var minus30sec = now .Add (- 30 * time .Second )
22
+ var plus30sec = now .Add (30 * time .Second )
23
+ var plus60sec = now .Add (1 * time .Minute )
24
+
19
25
testCases := []struct {
20
- name string
26
+ name string
27
+
21
28
controllerConfigMap * corev1.ConfigMap
29
+ unknownExpirations map [string ]insightExpirations
22
30
23
31
informerMsg []informerMsg
24
- expected * corev1.ConfigMap
32
+
33
+ expectedControllerConfigMap * corev1.ConfigMap
34
+ expectedUnknownExpirations map [string ]insightExpirations
25
35
}{
26
36
{
27
- name : "no messages, no state -> no state" ,
28
- controllerConfigMap : nil ,
29
- informerMsg : []informerMsg {},
30
- expected : nil ,
37
+ name : "no messages, no state -> no state" ,
38
+ controllerConfigMap : nil ,
39
+ informerMsg : []informerMsg {},
40
+ expectedControllerConfigMap : nil ,
31
41
},
32
42
{
33
43
name : "no messages, empty state -> empty state" ,
34
44
controllerConfigMap : & corev1.ConfigMap {
35
45
Data : map [string ]string {},
36
46
},
37
- expected : & corev1.ConfigMap {
47
+ expectedControllerConfigMap : & corev1.ConfigMap {
38
48
Data : map [string ]string {},
39
49
},
40
50
},
@@ -45,7 +55,7 @@ func Test_updateStatusController(t *testing.T) {
45
55
"usc.cpi.cv-version" : "value" ,
46
56
},
47
57
},
48
- expected : & corev1.ConfigMap {
58
+ expectedControllerConfigMap : & corev1.ConfigMap {
49
59
Data : map [string ]string {
50
60
"usc.cpi.cv-version" : "value" ,
51
61
},
@@ -61,7 +71,7 @@ func Test_updateStatusController(t *testing.T) {
61
71
insight : []byte ("value" ),
62
72
},
63
73
},
64
- expected : & corev1.ConfigMap {
74
+ expectedControllerConfigMap : & corev1.ConfigMap {
65
75
Data : map [string ]string {
66
76
"usc.cpi.cv-version" : "value" ,
67
77
},
@@ -101,7 +111,7 @@ func Test_updateStatusController(t *testing.T) {
101
111
knownInsights : []string {"kept" , "new-item" , "another" },
102
112
},
103
113
},
104
- expected : & corev1.ConfigMap {
114
+ expectedControllerConfigMap : & corev1.ConfigMap {
105
115
Data : map [string ]string {
106
116
"usc.cpi.kept" : "kept" ,
107
117
"usc.cpi.new-item" : "msg1" ,
@@ -124,7 +134,7 @@ func Test_updateStatusController(t *testing.T) {
124
134
insight : []byte ("msg from informer two" ),
125
135
},
126
136
},
127
- expected : & corev1.ConfigMap {
137
+ expectedControllerConfigMap : & corev1.ConfigMap {
128
138
Data : map [string ]string {
129
139
"usc.one.item" : "msg from informer one" ,
130
140
"usc.two.item" : "msg from informer two" ,
@@ -141,7 +151,7 @@ func Test_updateStatusController(t *testing.T) {
141
151
insight : []byte ("msg from informer one" ),
142
152
},
143
153
},
144
- expected : nil ,
154
+ expectedControllerConfigMap : nil ,
145
155
},
146
156
{
147
157
name : "empty uid -> message gets dropped" ,
@@ -153,7 +163,7 @@ func Test_updateStatusController(t *testing.T) {
153
163
insight : []byte ("msg from informer one" ),
154
164
},
155
165
},
156
- expected : nil ,
166
+ expectedControllerConfigMap : nil ,
157
167
},
158
168
{
159
169
name : "empty insight payload -> message gets dropped" ,
@@ -165,7 +175,7 @@ func Test_updateStatusController(t *testing.T) {
165
175
insight : []byte {},
166
176
},
167
177
},
168
- expected : nil ,
178
+ expectedControllerConfigMap : nil ,
169
179
},
170
180
{
171
181
name : "nil insight payload -> message gets dropped" ,
@@ -177,10 +187,10 @@ func Test_updateStatusController(t *testing.T) {
177
187
insight : nil ,
178
188
},
179
189
},
180
- expected : nil ,
190
+ expectedControllerConfigMap : nil ,
181
191
},
182
192
{
183
- name : "unknown message gets removed from state" ,
193
+ name : "unknown insight -> not removed from state immediately but set for expiration " ,
184
194
controllerConfigMap : & corev1.ConfigMap {
185
195
Data : map [string ]string {
186
196
"usc.one.old" : "payload" ,
@@ -192,11 +202,88 @@ func Test_updateStatusController(t *testing.T) {
192
202
insight : []byte ("new payload" ),
193
203
knownInsights : nil ,
194
204
}},
195
- expected : & corev1.ConfigMap {
205
+ expectedControllerConfigMap : & corev1.ConfigMap {
196
206
Data : map [string ]string {
207
+ "usc.one.old" : "payload" ,
197
208
"usc.one.new" : "new payload" ,
198
209
},
199
210
},
211
+ expectedUnknownExpirations : map [string ]insightExpirations {
212
+ "one" : {"old" : plus60sec },
213
+ },
214
+ },
215
+ {
216
+ name : "unknown insight already set for expiration -> not removed from state while not expired yet" ,
217
+ controllerConfigMap : & corev1.ConfigMap {
218
+ Data : map [string ]string {
219
+ "usc.one.old" : "payload" ,
220
+ },
221
+ },
222
+ unknownExpirations : map [string ]insightExpirations {
223
+ "one" : {"old" : plus30sec },
224
+ },
225
+ informerMsg : []informerMsg {{
226
+ informer : "one" ,
227
+ uid : "new" ,
228
+ insight : []byte ("new payload" ),
229
+ knownInsights : nil ,
230
+ }},
231
+ expectedControllerConfigMap : & corev1.ConfigMap {
232
+ Data : map [string ]string {
233
+ "usc.one.old" : "payload" ,
234
+ "usc.one.new" : "new payload" ,
235
+ },
236
+ },
237
+ expectedUnknownExpirations : map [string ]insightExpirations {
238
+ "one" : {"old" : plus30sec },
239
+ },
240
+ },
241
+ {
242
+ name : "previously unknown insight set for expiration is known again -> kept in state and expire dropped" ,
243
+ controllerConfigMap : & corev1.ConfigMap {
244
+ Data : map [string ]string {
245
+ "usc.one.old" : "payload" ,
246
+ },
247
+ },
248
+ unknownExpirations : map [string ]insightExpirations {
249
+ "one" : {"old" : minus30sec },
250
+ },
251
+ informerMsg : []informerMsg {{
252
+ informer : "one" ,
253
+ uid : "new" ,
254
+ insight : []byte ("new payload" ),
255
+ knownInsights : []string {"old" },
256
+ }},
257
+ expectedControllerConfigMap : & corev1.ConfigMap {
258
+ Data : map [string ]string {
259
+ "usc.one.old" : "payload" ,
260
+ "usc.one.new" : "new payload" ,
261
+ },
262
+ },
263
+ expectedUnknownExpirations : nil ,
264
+ },
265
+ {
266
+ name : "previously unknown insight expired and never became known again -> dropped from state and expire dropped" ,
267
+ controllerConfigMap : & corev1.ConfigMap {
268
+ Data : map [string ]string {
269
+ "usc.one.old" : "payload" ,
270
+ },
271
+ },
272
+ unknownExpirations : map [string ]insightExpirations {
273
+ "one" : {"old" : minus90sec },
274
+ },
275
+ informerMsg : []informerMsg {{
276
+ informer : "one" ,
277
+ uid : "new" ,
278
+ insight : []byte ("new payload" ),
279
+ knownInsights : nil ,
280
+ }},
281
+ expectedControllerConfigMap : & corev1.ConfigMap {
282
+ Data : map [string ]string {
283
+ "usc.one.new" : "new payload" ,
284
+ },
285
+ },
286
+ expectedUnknownExpirations : nil ,
200
287
},
201
288
}
202
289
@@ -208,9 +295,16 @@ func Test_updateStatusController(t *testing.T) {
208
295
209
296
controller := updateStatusController {
210
297
configMaps : kubeClient .CoreV1 ().ConfigMaps (uscNamespace ),
298
+ now : func () time.Time { return now },
211
299
}
212
300
controller .statusApi .Lock ()
213
301
controller .statusApi .cm = tc .controllerConfigMap
302
+ for informer , expirations := range tc .unknownExpirations {
303
+ if controller .statusApi .unknownInsightExpirations == nil {
304
+ controller .statusApi .unknownInsightExpirations = make (map [string ]insightExpirations )
305
+ }
306
+ controller .statusApi .unknownInsightExpirations [informer ] = expirations
307
+ }
214
308
controller .statusApi .Unlock ()
215
309
216
310
startInsightReceiver , sendInsight := controller .setupInsightReceiver ()
@@ -227,19 +321,24 @@ func Test_updateStatusController(t *testing.T) {
227
321
228
322
expectedProcessed := len (tc .informerMsg )
229
323
var sawProcessed int
230
- var diff string
324
+ var diffConfigMap string
325
+ var diffExpirations string
231
326
backoff := wait.Backoff {Duration : 5 * time .Millisecond , Factor : 2 , Steps : 10 }
232
327
if err := wait .ExponentialBackoff (backoff , func () (bool , error ) {
233
328
controller .statusApi .Lock ()
234
329
defer controller .statusApi .Unlock ()
235
330
236
331
sawProcessed = controller .statusApi .processed
237
- diff = cmp .Diff (tc .expected , controller .statusApi .cm )
332
+ diffConfigMap = cmp .Diff (tc .expectedControllerConfigMap , controller .statusApi .cm )
333
+ diffExpirations = cmp .Diff (tc .expectedUnknownExpirations , controller .statusApi .unknownInsightExpirations )
238
334
239
- return diff == "" && sawProcessed == expectedProcessed , nil
335
+ return diffConfigMap == "" && diffExpirations == "" && sawProcessed == expectedProcessed , nil
240
336
}); err != nil {
241
- if diff != "" {
242
- t .Errorf ("controller config map differs from expected:\n %s" , diff )
337
+ if diffConfigMap != "" {
338
+ t .Errorf ("controller config map differs from expected:\n %s" , diffConfigMap )
339
+ }
340
+ if diffExpirations != "" {
341
+ t .Errorf ("expirations differ from expected:\n %s" , diffExpirations )
243
342
}
244
343
if controller .statusApi .processed != len (tc .informerMsg ) {
245
344
t .Errorf ("controller processed %d messages, expected %d" , controller .statusApi .processed , len (tc .informerMsg ))
0 commit comments