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