@@ -13,39 +13,58 @@ import (
13
13
apierrors "k8s.io/apimachinery/pkg/api/errors"
14
14
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
15
15
"k8s.io/apimachinery/pkg/util/wait"
16
+ "sigs.k8s.io/controller-runtime/pkg/client"
16
17
"sigs.k8s.io/controller-runtime/pkg/client/fake"
17
18
)
18
19
20
+ var brokenReaderError = errors .New ("broken" )
21
+
22
+ type brokenReader struct {}
23
+
24
+ func (r * brokenReader ) Get (
25
+ ctx context.Context ,
26
+ key client.ObjectKey ,
27
+ obj client.Object ,
28
+ opts ... client.GetOption ,
29
+ ) error {
30
+ return brokenReaderError
31
+ }
32
+
33
+ func (r * brokenReader ) List (
34
+ ctx context.Context ,
35
+ list client.ObjectList ,
36
+ opts ... client.ListOption ,
37
+ ) error {
38
+ return brokenReaderError
39
+ }
40
+
41
+ var _ client.Reader = & brokenReader {}
42
+
19
43
func TestWait (t * testing.T ) {
20
- // We use the corev1.Namespace concrete type for the test, because we want to
21
- // verify behavior for a concrete type, and because the Wait function is
22
- // generic, and will behave identically for all concrete types.
23
- type args struct {
24
- input ForObjectInput [* corev1.Namespace ]
25
- }
26
44
tests := []struct {
27
- name string
28
- args args
45
+ name string
46
+ // We use the corev1.Namespace concrete type for the test, because we want to
47
+ // verify behavior for a concrete type, and because the Wait function is
48
+ // generic, and will behave identically for all concrete types.
49
+ input ForObjectInput [* corev1.Namespace ]
29
50
errCheck func (error ) bool
30
51
}{
31
52
{
32
- name : "time out while get fails; report get error" ,
33
- args : args {
34
- input : ForObjectInput [* corev1.Namespace ]{
35
- Reader : fake .NewFakeClient (),
36
- Check : func (_ context.Context , _ * corev1.Namespace ) (bool , error ) {
37
- return true , nil
53
+ name : "time out while get does not find object; report get error" ,
54
+ input : ForObjectInput [* corev1.Namespace ]{
55
+ Reader : fake .NewFakeClient (),
56
+ Check : func (_ context.Context , _ * corev1.Namespace ) (bool , error ) {
57
+ return true , nil
58
+ },
59
+ Interval : time .Nanosecond ,
60
+ Timeout : time .Millisecond ,
61
+ Target : & corev1.Namespace {
62
+ TypeMeta : v1.TypeMeta {
63
+ Kind : "Namespace" ,
64
+ APIVersion : "v1" ,
38
65
},
39
- Interval : time .Nanosecond ,
40
- Timeout : time .Millisecond ,
41
- Target : & corev1.Namespace {
42
- TypeMeta : v1.TypeMeta {
43
- Kind : "Namespace" ,
44
- APIVersion : "v1" ,
45
- },
46
- ObjectMeta : v1.ObjectMeta {
47
- Name : "example" ,
48
- },
66
+ ObjectMeta : v1.ObjectMeta {
67
+ Name : "example" ,
49
68
},
50
69
},
51
70
},
@@ -55,26 +74,35 @@ func TestWait(t *testing.T) {
55
74
},
56
75
},
57
76
{
58
- name : "time out while check returns false; no check error to report" ,
59
- args : args {
60
- input : ForObjectInput [* corev1.Namespace ]{
61
- Reader : fake .NewFakeClient (
62
- & corev1.Namespace {
63
- TypeMeta : v1.TypeMeta {
64
- Kind : "Namespace" ,
65
- APIVersion : "v1" ,
66
- },
67
- ObjectMeta : v1.ObjectMeta {
68
- Name : "example" ,
69
- },
70
- },
71
- ),
72
- Check : func (_ context.Context , _ * corev1.Namespace ) (bool , error ) {
73
- return false , nil
77
+ name : "return immediately when get fails; report get error" ,
78
+ input : ForObjectInput [* corev1.Namespace ]{
79
+ Reader : & brokenReader {},
80
+ Check : func (_ context.Context , _ * corev1.Namespace ) (bool , error ) {
81
+ return true , nil
82
+ },
83
+ Interval : time .Nanosecond ,
84
+ Timeout : time .Millisecond ,
85
+ Target : & corev1.Namespace {
86
+ TypeMeta : v1.TypeMeta {
87
+ Kind : "Namespace" ,
88
+ APIVersion : "v1" ,
89
+ },
90
+ ObjectMeta : v1.ObjectMeta {
91
+ Name : "example" ,
74
92
},
75
- Interval : time .Nanosecond ,
76
- Timeout : time .Millisecond ,
77
- Target : & corev1.Namespace {
93
+ },
94
+ },
95
+ errCheck : func (err error ) bool {
96
+ return ! wait .Interrupted (err ) &&
97
+ ! apierrors .IsNotFound (err ) &&
98
+ errors .Is (err , brokenReaderError )
99
+ },
100
+ },
101
+ {
102
+ name : "time out while check returns false; no check error to report" ,
103
+ input : ForObjectInput [* corev1.Namespace ]{
104
+ Reader : fake .NewFakeClient (
105
+ & corev1.Namespace {
78
106
TypeMeta : v1.TypeMeta {
79
107
Kind : "Namespace" ,
80
108
APIVersion : "v1" ,
@@ -83,30 +111,29 @@ func TestWait(t *testing.T) {
83
111
Name : "example" ,
84
112
},
85
113
},
114
+ ),
115
+ Check : func (_ context.Context , _ * corev1.Namespace ) (bool , error ) {
116
+ return false , nil
117
+ },
118
+ Interval : time .Nanosecond ,
119
+ Timeout : time .Millisecond ,
120
+ Target : & corev1.Namespace {
121
+ TypeMeta : v1.TypeMeta {
122
+ Kind : "Namespace" ,
123
+ APIVersion : "v1" ,
124
+ },
125
+ ObjectMeta : v1.ObjectMeta {
126
+ Name : "example" ,
127
+ },
86
128
},
87
129
},
88
130
errCheck : wait .Interrupted ,
89
131
},
90
132
{
91
133
name : "return immediately when check returns an error; report the error" ,
92
- args : args {
93
- input : ForObjectInput [* corev1.Namespace ]{
94
- Reader : fake .NewFakeClient (
95
- & corev1.Namespace {
96
- TypeMeta : v1.TypeMeta {
97
- Kind : "Namespace" ,
98
- APIVersion : "v1" ,
99
- },
100
- ObjectMeta : v1.ObjectMeta {
101
- Name : "example" ,
102
- },
103
- },
104
- ),
105
- Check : func (_ context.Context , _ * corev1.Namespace ) (bool , error ) {
106
- return false , fmt .Errorf ("condition failed" )
107
- },
108
- Interval : time .Nanosecond ,
109
- Timeout : time .Millisecond , Target : & corev1.Namespace {
134
+ input : ForObjectInput [* corev1.Namespace ]{
135
+ Reader : fake .NewFakeClient (
136
+ & corev1.Namespace {
110
137
TypeMeta : v1.TypeMeta {
111
138
Kind : "Namespace" ,
112
139
APIVersion : "v1" ,
@@ -115,6 +142,19 @@ func TestWait(t *testing.T) {
115
142
Name : "example" ,
116
143
},
117
144
},
145
+ ),
146
+ Check : func (_ context.Context , _ * corev1.Namespace ) (bool , error ) {
147
+ return false , fmt .Errorf ("condition failed" )
148
+ },
149
+ Interval : time .Nanosecond ,
150
+ Timeout : time .Millisecond , Target : & corev1.Namespace {
151
+ TypeMeta : v1.TypeMeta {
152
+ Kind : "Namespace" ,
153
+ APIVersion : "v1" ,
154
+ },
155
+ ObjectMeta : v1.ObjectMeta {
156
+ Name : "example" ,
157
+ },
118
158
},
119
159
},
120
160
errCheck : func (err error ) bool {
@@ -127,7 +167,7 @@ func TestWait(t *testing.T) {
127
167
t .Run (tt .name , func (t * testing.T ) {
128
168
err := ForObject (
129
169
context .Background (),
130
- tt .args . input ,
170
+ tt .input ,
131
171
)
132
172
if ! tt .errCheck (err ) {
133
173
t .Errorf ("error did not pass check: %s" , err )
0 commit comments