@@ -30,10 +30,12 @@ import (
30
30
resourceapi "k8s.io/api/resource/v1alpha3"
31
31
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
32
32
"k8s.io/apimachinery/pkg/runtime"
33
+ "k8s.io/apimachinery/pkg/util/wait"
33
34
"k8s.io/client-go/informers"
34
35
"k8s.io/client-go/kubernetes"
35
36
"k8s.io/client-go/kubernetes/fake"
36
37
"k8s.io/client-go/tools/cache"
38
+ "k8s.io/client-go/tools/record"
37
39
"k8s.io/klog/v2/ktesting"
38
40
_ "k8s.io/klog/v2/ktesting/init"
39
41
)
@@ -127,6 +129,11 @@ func TestController(t *testing.T) {
127
129
schedulingCtx , expectedSchedulingCtx * resourceapi.PodSchedulingContext
128
130
claim , expectedClaim * resourceapi.ResourceClaim
129
131
expectedWorkQueueState Mock [string ]
132
+ expectedError string
133
+ // expectedEvent is a slice of strings representing expected events.
134
+ // Each string in the slice should follow the format: "EventType Reason Message".
135
+ // - "Warning Failed processing failed"
136
+ expectedEvent []string
130
137
}{
131
138
"invalid-key" : {
132
139
key : "claim:x/y/z" ,
@@ -164,6 +171,7 @@ func TestController(t *testing.T) {
164
171
claimKey : 1 ,
165
172
},
166
173
},
174
+ expectedEvent : []string {"Warning Failed deallocate: fake error" },
167
175
},
168
176
169
177
// deletion time stamp set, our finalizer set, not allocated -> remove finalizer
@@ -184,6 +192,7 @@ func TestController(t *testing.T) {
184
192
claimKey : 1 ,
185
193
},
186
194
},
195
+ expectedEvent : []string {"Warning Failed stop allocation: fake error" },
187
196
},
188
197
// deletion time stamp set, other finalizer set, not allocated -> do nothing
189
198
"deleted-finalizer-no-removal" : {
@@ -209,6 +218,7 @@ func TestController(t *testing.T) {
209
218
claimKey : 1 ,
210
219
},
211
220
},
221
+ expectedEvent : []string {"Warning Failed deallocate: fake error" },
212
222
},
213
223
// deletion time stamp set, finalizer not set -> do nothing
214
224
"deleted-no-finalizer" : {
@@ -401,6 +411,9 @@ func TestController(t *testing.T) {
401
411
}
402
412
var workQueueState Mock [string ]
403
413
c := ctrl .(* controller )
414
+ // We need to mock the event recorder to test the controller's event.
415
+ fakeRecorder := record .NewFakeRecorder (100 )
416
+ c .eventRecorder = fakeRecorder
404
417
workQueueState .SyncOne (test .key , c .sync )
405
418
assert .Equal (t , test .expectedWorkQueueState , workQueueState )
406
419
@@ -419,10 +432,8 @@ func TestController(t *testing.T) {
419
432
expectedPodSchedulings = append (expectedPodSchedulings , * test .expectedSchedulingCtx )
420
433
}
421
434
assert .Equal (t , expectedPodSchedulings , podSchedulings .Items )
422
-
423
- // TODO: add testing of events.
424
- // Right now, client-go/tools/record/event.go:267 fails during unit testing with
425
- // request namespace does not match object namespace, request: "" object: "default",
435
+ // Assert that the events are correct.
436
+ assertEqualEvents (t , test .expectedEvent , fakeRecorder .Events )
426
437
})
427
438
}
428
439
}
@@ -582,3 +593,25 @@ func fakeK8s(objs []runtime.Object) (kubernetes.Interface, informers.SharedInfor
582
593
informerFactory := informers .NewSharedInformerFactory (client , 0 )
583
594
return client , informerFactory
584
595
}
596
+
597
+ func assertEqualEvents (t * testing.T , expected []string , actual <- chan string ) {
598
+ t .Logf ("Assert for events: %v" , expected )
599
+ c := time .After (wait .ForeverTestTimeout )
600
+ for _ , e := range expected {
601
+ select {
602
+ case a := <- actual :
603
+ assert .Equal (t , a , e )
604
+ case <- c :
605
+ t .Errorf ("Expected event %q, got nothing" , e )
606
+ // continue iterating to print all expected events
607
+ }
608
+ }
609
+ for {
610
+ select {
611
+ case a := <- actual :
612
+ t .Errorf ("Unexpected event: %q" , a )
613
+ default :
614
+ return // No more events, as expected.
615
+ }
616
+ }
617
+ }
0 commit comments