@@ -27,6 +27,7 @@ func Test_actualWaitFeatureFlag(t *testing.T) {
27
27
values []* string
28
28
defaultValue bool
29
29
nilClient bool
30
+ clientHanging time.Duration
30
31
}
31
32
tests := []struct {
32
33
name string
@@ -42,6 +43,7 @@ func Test_actualWaitFeatureFlag(t *testing.T) {
42
43
values : []* string {nil , nil , & trueValue },
43
44
defaultValue : false ,
44
45
nilClient : false ,
46
+ clientHanging : time .Second * 0 ,
45
47
},
46
48
wantFlagValue : true ,
47
49
wantOk : true ,
@@ -54,6 +56,20 @@ func Test_actualWaitFeatureFlag(t *testing.T) {
54
56
values : []* string {nil , nil , nil , & falseValue },
55
57
defaultValue : false ,
56
58
nilClient : false ,
59
+ clientHanging : time .Second * 0 ,
60
+ },
61
+ wantFlagValue : false ,
62
+ wantOk : true ,
63
+ fetchTimes : 4 ,
64
+ },
65
+ {
66
+ name : "happy path 3" ,
67
+ args : args {
68
+ timeoutDuration : baseDuration * 1000 ,
69
+ values : []* string {nil , nil , nil , & falseValue },
70
+ defaultValue : false ,
71
+ nilClient : false ,
72
+ clientHanging : baseDuration * 10 ,
57
73
},
58
74
wantFlagValue : false ,
59
75
wantOk : true ,
@@ -66,6 +82,7 @@ func Test_actualWaitFeatureFlag(t *testing.T) {
66
82
values : []* string {nil , nil , nil , & unknownValue , & falseValue },
67
83
defaultValue : false ,
68
84
nilClient : false ,
85
+ clientHanging : time .Second * 0 ,
69
86
},
70
87
wantFlagValue : false ,
71
88
wantOk : true ,
@@ -78,6 +95,7 @@ func Test_actualWaitFeatureFlag(t *testing.T) {
78
95
values : []* string {nil , nil , nil , & unknownValue , & falseValue },
79
96
defaultValue : false ,
80
97
nilClient : true ,
98
+ clientHanging : time .Second * 0 ,
81
99
},
82
100
wantFlagValue : false ,
83
101
wantOk : false ,
@@ -90,58 +108,75 @@ func Test_actualWaitFeatureFlag(t *testing.T) {
90
108
values : []* string {nil , nil , nil , & unknownValue , & falseValue },
91
109
defaultValue : true ,
92
110
nilClient : true ,
111
+ clientHanging : time .Second * 0 ,
93
112
},
94
113
wantFlagValue : true ,
95
114
wantOk : false ,
96
115
fetchTimes : 0 ,
97
116
},
98
117
{
99
- name : "timed out with default value: true" ,
118
+ name : "ctx timed out should get default value: true" ,
100
119
args : args {
101
120
timeoutDuration : baseDuration * 30 ,
102
121
values : []* string {nil , nil , nil , & unknownValue , & falseValue },
103
122
defaultValue : true ,
104
123
nilClient : false ,
124
+ clientHanging : time .Second * 0 ,
105
125
},
106
126
wantFlagValue : true ,
107
127
wantOk : false ,
108
128
fetchTimes : 2 ,
109
129
},
110
130
{
111
- name : "timed out with default value: false" ,
131
+ name : "ctx timed out should get default value: false" ,
112
132
args : args {
113
133
timeoutDuration : baseDuration * 30 ,
114
134
values : []* string {nil , nil , nil , & unknownValue , & falseValue },
115
135
defaultValue : false ,
116
136
nilClient : false ,
137
+ clientHanging : time .Second * 0 ,
117
138
},
118
139
wantFlagValue : false ,
119
140
wantOk : false ,
120
141
fetchTimes : 2 ,
121
142
},
143
+ {
144
+ name : "client hanging should get default value" ,
145
+ args : args {
146
+ timeoutDuration : baseDuration * 30 ,
147
+ values : []* string {nil , nil , nil , & unknownValue , & falseValue },
148
+ defaultValue : true ,
149
+ nilClient : false ,
150
+ clientHanging : baseDuration * 60 ,
151
+ },
152
+ wantFlagValue : true ,
153
+ wantOk : false ,
154
+ fetchTimes : 1 ,
155
+ },
122
156
}
123
157
for _ , tt := range tests {
124
158
t .Run (tt .name , func (t * testing.T ) {
125
159
ctx , cancel := context .WithTimeout (context .Background (), tt .args .timeoutDuration )
126
160
defer cancel ()
127
- client := newMockClient (tt .args .values , tt .args .nilClient )
128
- gotFlagValue , gotOk , gotWaitTimes := cmd .ActualWaitFeatureFlag (ctx , client , tt .args .defaultValue )
161
+ client := newMockClient (tt .args .values , tt .args .nilClient , tt . args . clientHanging )
162
+ gotFlagValue , gotOk , gotFetchTimes := cmd .ActualWaitFeatureFlag (ctx , client , tt .args .defaultValue )
129
163
if gotFlagValue != tt .wantFlagValue {
130
164
t .Errorf ("actualWaitFeatureFlag() gotFlagValue = %v, want %v" , gotFlagValue , tt .wantFlagValue )
131
165
}
132
166
if gotOk != tt .wantOk {
133
167
t .Errorf ("actualWaitFeatureFlag() gotOk = %v, want %v" , gotOk , tt .wantOk )
134
168
}
135
- if gotWaitTimes != tt .fetchTimes {
136
- t .Errorf ("actualWaitFeatureFlag() gotWaitTimes = %v, want %v" , gotWaitTimes , tt .fetchTimes )
169
+ if gotFetchTimes != tt .fetchTimes {
170
+ t .Errorf ("actualWaitFeatureFlag() gotFetchTimes = %v, want %v" , gotFetchTimes , tt .fetchTimes )
137
171
}
138
172
})
139
173
}
140
174
}
141
175
142
176
type mockClient struct {
143
- values []* string
144
- i int
177
+ values []* string
178
+ i int
179
+ hangingDuration time.Duration
145
180
}
146
181
147
182
// GetBoolValue implements experiments.Client.
@@ -159,18 +194,19 @@ func (*mockClient) GetIntValue(ctx context.Context, experimentName string, defau
159
194
panic ("unimplemented" )
160
195
}
161
196
162
- func newMockClient (values []* string , isNil bool ) experiments.Client {
197
+ func newMockClient (values []* string , isNil bool , hangingDuration time. Duration ) experiments.Client {
163
198
if isNil {
164
199
return nil
165
200
}
166
- return & mockClient {values : values , i : 0 }
201
+ return & mockClient {values : values , i : 0 , hangingDuration : hangingDuration }
167
202
}
168
203
169
204
// GetStringValue implements experiments.Client.
170
205
func (c * mockClient ) GetStringValue (ctx context.Context , experimentName string , defaultValue string , attributes experiments.Attributes ) string {
171
206
defer func () {
172
207
c .i += 1
173
208
}()
209
+ time .Sleep (c .hangingDuration )
174
210
if c .i >= len (c .values ) {
175
211
return defaultValue
176
212
}
0 commit comments