@@ -5,11 +5,11 @@ import (
5
5
"io"
6
6
"net/http"
7
7
stdlibhttptest "net/http/httptest"
8
- "net/url"
9
8
"testing"
10
9
"time"
11
10
12
11
"github.com/opentracing/opentracing-go/mocktracer"
12
+ "github.com/zalando/skipper/eskip"
13
13
"github.com/zalando/skipper/filters"
14
14
"github.com/zalando/skipper/metrics/metricstest"
15
15
"github.com/zalando/skipper/net/httptest"
@@ -19,11 +19,12 @@ import (
19
19
"github.com/zalando/skipper/scheduler"
20
20
)
21
21
22
- func TestCreateFifoFilter (t * testing.T ) {
22
+ func TestFifoCreateFilter (t * testing.T ) {
23
23
for _ , tt := range []struct {
24
24
name string
25
25
args []interface {}
26
26
wantParseErr bool
27
+ wantConfig scheduler.Config
27
28
}{
28
29
{
29
30
name : "fifo no args" ,
@@ -51,6 +52,11 @@ func TestCreateFifoFilter(t *testing.T) {
51
52
5 ,
52
53
"1s" ,
53
54
},
55
+ wantConfig : scheduler.Config {
56
+ MaxConcurrency : 3 ,
57
+ MaxQueueSize : 5 ,
58
+ Timeout : 1 * time .Second ,
59
+ },
54
60
},
55
61
{
56
62
name : "fifo wrong type arg1" ,
@@ -108,91 +114,59 @@ func TestCreateFifoFilter(t *testing.T) {
108
114
if err == nil && tt .wantParseErr {
109
115
t .Fatal ("Failed to get wanted error on create filter" )
110
116
}
117
+ if tt .wantParseErr {
118
+ return
119
+ }
111
120
112
- if _ , ok := ff .(* fifoFilter ); ! ok && err == nil {
121
+ f , ok := ff .(* fifoFilter )
122
+ if ! ok {
113
123
t .Fatal ("Failed to convert filter to *fifoFilter" )
114
124
}
125
+
126
+ // validate config
127
+ config := f .Config ()
128
+ if config != tt .wantConfig {
129
+ t .Fatalf ("Failed to get Config, got: %v, want: %v" , config , tt .wantConfig )
130
+ }
131
+ if f .queue != f .GetQueue () {
132
+ t .Fatal ("Failed to get expected queue" )
133
+ }
115
134
})
116
135
}
117
136
}
118
137
119
138
func TestFifo (t * testing.T ) {
120
139
for _ , tt := range []struct {
121
- name string
122
- args []interface {}
123
- freq int
124
- per time.Duration
125
- backendTime time.Duration
126
- clientTimeout time.Duration
127
- wantConfig scheduler.Config
128
- wantParseErr bool
129
- wantOkRate float64
130
- epsilon float64
140
+ name string
141
+ filter string
142
+ freq int
143
+ per time.Duration
144
+ backendTime time.Duration
145
+ wantOkRate float64
131
146
}{
132
147
{
133
- name : "fifo defaults" ,
134
- args : []interface {}{},
135
- wantParseErr : true ,
136
- },
137
- {
138
- name : "fifo simple ok" ,
139
- args : []interface {}{
140
- 3 ,
141
- 5 ,
142
- "1s" ,
143
- },
144
- freq : 20 ,
145
- per : 100 * time .Millisecond ,
146
- backendTime : 1 * time .Millisecond ,
147
- clientTimeout : time .Second ,
148
- wantConfig : scheduler.Config {
149
- MaxConcurrency : 3 ,
150
- MaxQueueSize : 5 ,
151
- Timeout : time .Second ,
152
- },
153
- wantParseErr : false ,
154
- wantOkRate : 1.0 ,
155
- epsilon : 1 ,
148
+ name : "fifo simple ok" ,
149
+ filter : `fifo(3, 5, "1s")` ,
150
+ freq : 20 ,
151
+ per : 100 * time .Millisecond ,
152
+ backendTime : 1 * time .Millisecond ,
153
+ wantOkRate : 1.0 ,
156
154
},
157
155
{
158
- name : "fifo with reaching max concurrency and queue timeouts" ,
159
- args : []interface {}{
160
- 3 ,
161
- 5 ,
162
- "10ms" ,
163
- },
164
- freq : 200 ,
165
- per : 100 * time .Millisecond ,
166
- backendTime : 10 * time .Millisecond ,
167
- clientTimeout : time .Second ,
168
- wantConfig : scheduler.Config {
169
- MaxConcurrency : 3 ,
170
- MaxQueueSize : 5 ,
171
- Timeout : 10 * time .Millisecond ,
172
- },
173
- wantParseErr : false ,
174
- wantOkRate : 0.1 ,
175
- epsilon : 1 ,
156
+ name : "fifo with reaching max concurrency and queue timeouts" ,
157
+ filter : `fifo(3, 5, "10ms")` ,
158
+ freq : 200 ,
159
+ per : 100 * time .Millisecond ,
160
+ backendTime : 10 * time .Millisecond ,
161
+ wantOkRate : 0.1 ,
176
162
},
177
163
{
178
- name : "fifo with reaching max concurrency and queue full" ,
179
- args : []interface {}{
180
- 1 ,
181
- 1 ,
182
- "250ms" ,
183
- },
184
- freq : 200 ,
185
- per : 100 * time .Millisecond ,
186
- backendTime : 100 * time .Millisecond ,
187
- clientTimeout : time .Second ,
188
- wantConfig : scheduler.Config {
189
- MaxConcurrency : 1 ,
190
- MaxQueueSize : 1 ,
191
- Timeout : 250 * time .Millisecond ,
192
- },
193
- wantParseErr : false ,
194
- wantOkRate : 0.0008 ,
195
- epsilon : 1 ,
164
+ name : "fifo with reaching max concurrency and queue full" ,
165
+ filter : `fifo(3, 5, "250ms")` ,
166
+ freq : 200 ,
167
+ per : 100 * time .Millisecond ,
168
+ backendTime : 100 * time .Millisecond ,
169
+ wantOkRate : 0.0008 ,
196
170
},
197
171
} {
198
172
t .Run (tt .name , func (t * testing.T ) {
@@ -201,29 +175,6 @@ func TestFifo(t *testing.T) {
201
175
t .Fatalf ("Failed to get name got %s want %s" , fs .Name (), filters .FifoName )
202
176
}
203
177
204
- // no parse error
205
- ff , err := fs .CreateFilter (tt .args )
206
- if err != nil && ! tt .wantParseErr {
207
- t .Fatalf ("Failed to parse filter: %v" , err )
208
- }
209
- if err == nil && tt .wantParseErr {
210
- t .Fatalf ("want parse error but have no: %v" , err )
211
- }
212
- if tt .wantParseErr {
213
- return
214
- }
215
-
216
- // validate config
217
- if f , ok := ff .(* fifoFilter ); ok {
218
- config := f .Config ()
219
- if config != tt .wantConfig {
220
- t .Fatalf ("Failed to get Config, got: %v, want: %v" , config , tt .wantConfig )
221
- }
222
- if f .queue != f .GetQueue () {
223
- t .Fatal ("Failed to get expected queue" )
224
- }
225
- }
226
-
227
178
metrics := & metricstest.MockMetrics {}
228
179
reg := scheduler .RegistryWith (scheduler.Options {
229
180
Metrics : metrics ,
@@ -241,22 +192,11 @@ func TestFifo(t *testing.T) {
241
192
}))
242
193
defer backend .Close ()
243
194
244
- var fmtStr string
245
- switch len (tt .args ) {
246
- case 0 :
247
- fmtStr = `aroute: * -> fifo() -> "%s"`
248
- case 1 :
249
- fmtStr = `aroute: * -> fifo(%v) -> "%s"`
250
- case 2 :
251
- fmtStr = `aroute: * -> fifo(%v, %v) -> "%s"`
252
- case 3 :
253
- fmtStr = `aroute: * -> fifo(%v, %v, "%v") -> "%s"`
254
- default :
255
- t .Fatalf ("Test not possible %d >3" , len (tt .args ))
195
+ if ff := eskip .MustParseFilters (tt .filter ); len (ff ) != 1 {
196
+ t .Fatalf ("expected one filter, got %d" , len (ff ))
256
197
}
257
198
258
- args := append (tt .args , backend .URL )
259
- doc := fmt .Sprintf (fmtStr , args ... )
199
+ doc := fmt .Sprintf (`aroute: * -> %s -> "%s"` , tt .filter , backend .URL )
260
200
t .Logf ("%s" , doc )
261
201
262
202
dc , err := testdataclient .NewDoc (doc )
@@ -285,22 +225,19 @@ func TestFifo(t *testing.T) {
285
225
ts := stdlibhttptest .NewServer (pr )
286
226
defer ts .Close ()
287
227
288
- reqURL , err := url . Parse (ts .URL )
228
+ rsp , err := ts . Client (). Get (ts .URL )
289
229
if err != nil {
290
- t .Fatalf ("Failed to parse url %s: %v" , ts .URL , err )
291
- }
292
-
293
- rsp , err := http .DefaultClient .Get (reqURL .String ())
294
- if err != nil {
295
- t .Fatalf ("Failed to get response from %s: %v" , reqURL .String (), err )
230
+ t .Fatalf ("Failed to get response from %s: %v" , ts .URL , err )
296
231
}
297
232
defer rsp .Body .Close ()
298
233
299
234
if rsp .StatusCode != http .StatusOK {
300
235
t .Fatalf ("Failed to get valid response from endpoint: %d" , rsp .StatusCode )
301
236
}
302
237
303
- va := httptest .NewVegetaAttacker (reqURL .String (), tt .freq , tt .per , tt .clientTimeout )
238
+ const clientTimeout = 1 * time .Second
239
+
240
+ va := httptest .NewVegetaAttacker (ts .URL , tt .freq , tt .per , clientTimeout )
304
241
va .Attack (io .Discard , 1 * time .Second , tt .name )
305
242
306
243
t .Logf ("Success [0..1]: %0.2f" , va .Success ())
@@ -327,40 +264,24 @@ func TestFifo(t *testing.T) {
327
264
}
328
265
}
329
266
330
- func TestConstantRouteUpdatesFifo (t * testing.T ) {
267
+ func TestFifoConstantRouteUpdates (t * testing.T ) {
331
268
for _ , tt := range []struct {
332
- name string
333
- args []interface {}
334
- freq int
335
- per time.Duration
336
- updateRate time.Duration
337
- backendTime time.Duration
338
- clientTimeout time.Duration
339
- wantConfig scheduler.Config
340
- wantParseErr bool
341
- wantOkRate float64
342
- epsilon float64
269
+ name string
270
+ filter string
271
+ freq int
272
+ per time.Duration
273
+ updateRate time.Duration
274
+ backendTime time.Duration
275
+ wantOkRate float64
343
276
}{
344
277
{
345
- name : "fifo simple ok" ,
346
- args : []interface {}{
347
- 3 ,
348
- 5 ,
349
- "1s" ,
350
- },
351
- freq : 20 ,
352
- per : 100 * time .Millisecond ,
353
- updateRate : 25 * time .Millisecond ,
354
- backendTime : 1 * time .Millisecond ,
355
- clientTimeout : time .Second ,
356
- wantConfig : scheduler.Config {
357
- MaxConcurrency : 3 ,
358
- MaxQueueSize : 5 ,
359
- Timeout : time .Second ,
360
- },
361
- wantParseErr : false ,
362
- wantOkRate : 1.0 ,
363
- epsilon : 1 ,
278
+ name : "fifo simple ok" ,
279
+ filter : `fifo(3, 5, "1s")` ,
280
+ freq : 20 ,
281
+ per : 100 * time .Millisecond ,
282
+ updateRate : 25 * time .Millisecond ,
283
+ backendTime : 1 * time .Millisecond ,
284
+ wantOkRate : 1.0 ,
364
285
},
365
286
} {
366
287
t .Run (tt .name , func (t * testing.T ) {
@@ -369,29 +290,6 @@ func TestConstantRouteUpdatesFifo(t *testing.T) {
369
290
t .Fatalf ("Failed to get name got %s want %s" , fs .Name (), filters .FifoName )
370
291
}
371
292
372
- // no parse error
373
- ff , err := fs .CreateFilter (tt .args )
374
- if err != nil && ! tt .wantParseErr {
375
- t .Fatalf ("Failed to parse filter: %v" , err )
376
- }
377
- if err == nil && tt .wantParseErr {
378
- t .Fatalf ("want parse error but have no: %v" , err )
379
- }
380
- if tt .wantParseErr {
381
- return
382
- }
383
-
384
- // validate config
385
- if f , ok := ff .(* fifoFilter ); ok {
386
- config := f .Config ()
387
- if config != tt .wantConfig {
388
- t .Fatalf ("Failed to get Config, got: %v, want: %v" , config , tt .wantConfig )
389
- }
390
- if f .queue != f .GetQueue () {
391
- t .Fatal ("Failed to get expected queue" )
392
- }
393
- }
394
-
395
293
metrics := & metricstest.MockMetrics {}
396
294
reg := scheduler .RegistryWith (scheduler.Options {
397
295
Metrics : metrics ,
@@ -409,8 +307,11 @@ func TestConstantRouteUpdatesFifo(t *testing.T) {
409
307
}))
410
308
defer backend .Close ()
411
309
412
- args := append (tt .args , backend .URL )
413
- doc := fmt .Sprintf (`aroute: * -> fifo(%v, %v, "%v") -> "%s"` , args ... )
310
+ if ff := eskip .MustParseFilters (tt .filter ); len (ff ) != 1 {
311
+ t .Fatalf ("expected one filter, got %d" , len (ff ))
312
+ }
313
+
314
+ doc := fmt .Sprintf (`aroute: * -> %s -> "%s"` , tt .filter , backend .URL )
414
315
415
316
dc , err := testdataclient .NewDoc (doc )
416
317
if err != nil {
@@ -438,14 +339,9 @@ func TestConstantRouteUpdatesFifo(t *testing.T) {
438
339
ts := stdlibhttptest .NewServer (pr )
439
340
defer ts .Close ()
440
341
441
- reqURL , err := url . Parse (ts .URL )
342
+ rsp , err := ts . Client (). Get (ts .URL )
442
343
if err != nil {
443
- t .Fatalf ("Failed to parse url %s: %v" , ts .URL , err )
444
- }
445
-
446
- rsp , err := http .DefaultClient .Get (reqURL .String ())
447
- if err != nil {
448
- t .Fatalf ("Failed to get response from %s: %v" , reqURL .String (), err )
344
+ t .Fatalf ("Failed to get response from %s: %v" , ts .URL , err )
449
345
}
450
346
defer rsp .Body .Close ()
451
347
@@ -475,7 +371,9 @@ func TestConstantRouteUpdatesFifo(t *testing.T) {
475
371
476
372
}(quit , tt .updateRate , doc , newDoc )
477
373
478
- va := httptest .NewVegetaAttacker (reqURL .String (), tt .freq , tt .per , tt .clientTimeout )
374
+ const clientTimeout = 1 * time .Second
375
+
376
+ va := httptest .NewVegetaAttacker (ts .URL , tt .freq , tt .per , clientTimeout )
479
377
va .Attack (io .Discard , 1 * time .Second , tt .name )
480
378
quit <- struct {}{}
481
379
0 commit comments