@@ -26,17 +26,15 @@ import (
26
26
v1 "k8s.io/api/core/v1"
27
27
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
28
28
"k8s.io/apimachinery/pkg/runtime"
29
- "k8s.io/apimachinery/pkg/util/wait"
30
- "k8s.io/apimachinery/pkg/watch"
31
29
"k8s.io/utils/ptr"
32
30
)
33
31
34
32
func TestDataConsistencyChecker (t * testing.T ) {
35
33
scenarios := []struct {
36
34
name string
37
35
38
- podList * v1.PodList
39
- storeContent []* v1.Pod
36
+ listResponse * v1.PodList
37
+ retrievedItems []* v1.Pod
40
38
requestOptions metav1.ListOptions
41
39
42
40
expectedRequestOptions []metav1.ListOptions
@@ -45,12 +43,12 @@ func TestDataConsistencyChecker(t *testing.T) {
45
43
}{
46
44
{
47
45
name : "data consistency check won't panic when data is consistent" ,
48
- podList : & v1.PodList {
46
+ listResponse : & v1.PodList {
49
47
ListMeta : metav1.ListMeta {ResourceVersion : "2" },
50
48
Items : []v1.Pod {* makePod ("p1" , "1" ), * makePod ("p2" , "2" )},
51
49
},
52
50
requestOptions : metav1.ListOptions {TimeoutSeconds : ptr .To (int64 (39 ))},
53
- storeContent : []* v1.Pod {makePod ("p1" , "1" ), makePod ("p2" , "2" )},
51
+ retrievedItems : []* v1.Pod {makePod ("p1" , "1" ), makePod ("p2" , "2" )},
54
52
expectedListRequests : 1 ,
55
53
expectedRequestOptions : []metav1.ListOptions {
56
54
{
@@ -63,7 +61,7 @@ func TestDataConsistencyChecker(t *testing.T) {
63
61
64
62
{
65
63
name : "data consistency check won't panic when there is no data" ,
66
- podList : & v1.PodList {
64
+ listResponse : & v1.PodList {
67
65
ListMeta : metav1.ListMeta {ResourceVersion : "2" },
68
66
},
69
67
requestOptions : metav1.ListOptions {TimeoutSeconds : ptr .To (int64 (39 ))},
@@ -79,12 +77,12 @@ func TestDataConsistencyChecker(t *testing.T) {
79
77
80
78
{
81
79
name : "data consistency panics when data is inconsistent" ,
82
- podList : & v1.PodList {
80
+ listResponse : & v1.PodList {
83
81
ListMeta : metav1.ListMeta {ResourceVersion : "2" },
84
82
Items : []v1.Pod {* makePod ("p1" , "1" ), * makePod ("p2" , "2" ), * makePod ("p3" , "3" )},
85
83
},
86
84
requestOptions : metav1.ListOptions {TimeoutSeconds : ptr .To (int64 (39 ))},
87
- storeContent : []* v1.Pod {makePod ("p1" , "1" ), makePod ("p2" , "2" )},
85
+ retrievedItems : []* v1.Pod {makePod ("p1" , "1" ), makePod ("p2" , "2" )},
88
86
expectedListRequests : 1 ,
89
87
expectedRequestOptions : []metav1.ListOptions {
90
88
{
@@ -99,23 +97,22 @@ func TestDataConsistencyChecker(t *testing.T) {
99
97
100
98
for _ , scenario := range scenarios {
101
99
t .Run (scenario .name , func (t * testing.T ) {
102
- listWatcher , store , _ , stopCh := testData ()
103
- ctx := wait . ContextForChannel ( stopCh )
104
- for _ , obj := range scenario . storeContent {
105
- require . NoError ( t , store . Add ( obj ))
100
+ ctx := context . TODO ()
101
+ fakeLister := & listWrapper { response : scenario . listResponse }
102
+ retrievedItemsFunc := func () [] * v1. Pod {
103
+ return scenario . retrievedItems
106
104
}
107
- listWatcher .customListResponse = scenario .podList
108
105
109
106
if scenario .expectPanic {
110
107
require .Panics (t , func () {
111
- checkDataConsistency (ctx , "" , scenario .podList .ResourceVersion , wrapListFuncWithContext ( listWatcher .List ) , scenario .requestOptions , store . List )
108
+ checkDataConsistency (ctx , "" , scenario .listResponse .ResourceVersion , fakeLister .List , scenario .requestOptions , retrievedItemsFunc )
112
109
})
113
110
} else {
114
- checkDataConsistency (ctx , "" , scenario .podList .ResourceVersion , wrapListFuncWithContext ( listWatcher .List ) , scenario .requestOptions , store . List )
111
+ checkDataConsistency (ctx , "" , scenario .listResponse .ResourceVersion , fakeLister .List , scenario .requestOptions , retrievedItemsFunc )
115
112
}
116
113
117
- verifyListCounter (t , listWatcher , scenario .expectedListRequests )
118
- verifyRequestOptions (t , listWatcher , scenario .expectedRequestOptions )
114
+ require . Equal (t , fakeLister . counter , scenario .expectedListRequests )
115
+ require . Equal (t , fakeLister . requestOptions , scenario .expectedRequestOptions )
119
116
})
120
117
}
121
118
}
@@ -126,29 +123,38 @@ func TestDriveWatchLisConsistencyIfRequired(t *testing.T) {
126
123
}
127
124
128
125
func TestDataConsistencyCheckerRetry (t * testing.T ) {
129
- store := NewStore (MetaNamespaceKeyFunc )
130
126
ctx := context .TODO ()
131
-
127
+ retrievedItemsFunc := func () []* v1.Pod {
128
+ return nil
129
+ }
132
130
stopListErrorAfter := 5
133
- errLister := & errorLister {stopErrorAfter : stopListErrorAfter }
131
+ fakeErrLister := & errorLister {stopErrorAfter : stopListErrorAfter }
134
132
135
- checkDataConsistency (ctx , "" , "" , wrapListFuncWithContext ( errLister .List ) , metav1.ListOptions {}, store . List )
136
- require .Equal (t , errLister .listCounter , errLister .stopErrorAfter )
133
+ checkDataConsistency (ctx , "" , "" , fakeErrLister .List , metav1.ListOptions {}, retrievedItemsFunc )
134
+ require .Equal (t , fakeErrLister .listCounter , fakeErrLister .stopErrorAfter )
137
135
}
138
136
139
137
type errorLister struct {
140
138
listCounter int
141
139
stopErrorAfter int
142
140
}
143
141
144
- func (lw * errorLister ) List (_ metav1.ListOptions ) (runtime.Object , error ) {
142
+ func (lw * errorLister ) List (_ context. Context , _ metav1.ListOptions ) (runtime.Object , error ) {
145
143
lw .listCounter ++
146
144
if lw .listCounter == lw .stopErrorAfter {
147
145
return & v1.PodList {}, nil
148
146
}
149
147
return nil , fmt .Errorf ("nasty error" )
150
148
}
151
149
152
- func (lw * errorLister ) Watch (_ metav1.ListOptions ) (watch.Interface , error ) {
153
- panic ("not implemented" )
150
+ type listWrapper struct {
151
+ counter int
152
+ requestOptions []metav1.ListOptions
153
+ response * v1.PodList
154
+ }
155
+
156
+ func (lw * listWrapper ) List (_ context.Context , opts metav1.ListOptions ) (* v1.PodList , error ) {
157
+ lw .counter ++
158
+ lw .requestOptions = append (lw .requestOptions , opts )
159
+ return lw .response , nil
154
160
}
0 commit comments