@@ -250,6 +250,99 @@ func TestIPQueuePopOne(t *testing.T) {
250
250
q .recycle (& values )
251
251
}
252
252
253
+ func TestIPQueuePopOneLast (t * testing.T ) {
254
+ s := & Server {}
255
+ q := newIPQueue [int ](s , "test" )
256
+ q .push (1 )
257
+ <- q .ch
258
+ e , ok := q .popOneLast ()
259
+ if ! ok {
260
+ t .Fatal ("Got nil" )
261
+ }
262
+ if i := e ; i != 1 {
263
+ t .Fatalf ("Expected 1, got %v" , i )
264
+ }
265
+ if l := q .len (); l != 0 {
266
+ t .Fatalf ("Expected len to be 0, got %v" , l )
267
+ }
268
+ // That does not affect the number of notProcessed
269
+ if n := q .inProgress (); n != 0 {
270
+ t .Fatalf ("Expected count to be 0, got %v" , n )
271
+ }
272
+ select {
273
+ case <- q .ch :
274
+ t .Fatalf ("Should not have been notified of addition" )
275
+ default :
276
+ // OK
277
+ }
278
+ q .push (2 )
279
+ q .push (3 )
280
+ e , ok = q .popOneLast ()
281
+ if ! ok {
282
+ t .Fatal ("Got nil" )
283
+ }
284
+ if i := e ; i != 3 {
285
+ t .Fatalf ("Expected 3, got %v" , i )
286
+ }
287
+ if l := q .len (); l != 1 {
288
+ t .Fatalf ("Expected len to be 1, got %v" , l )
289
+ }
290
+ select {
291
+ case <- q .ch :
292
+ // OK
293
+ default :
294
+ t .Fatalf ("Should have been notified that there is more" )
295
+ }
296
+ e , ok = q .popOneLast ()
297
+ if ! ok {
298
+ t .Fatal ("Got nil" )
299
+ }
300
+ if i := e ; i != 2 {
301
+ t .Fatalf ("Expected 2, got %v" , i )
302
+ }
303
+ if l := q .len (); l != 0 {
304
+ t .Fatalf ("Expected len to be 0, got %v" , l )
305
+ }
306
+ select {
307
+ case <- q .ch :
308
+ t .Fatalf ("Should not have been notified that there is more" )
309
+ default :
310
+ // OK
311
+ }
312
+ // Calling it again now that we know there is nothing, we
313
+ // should get nil.
314
+ if e , ok = q .popOneLast (); ok {
315
+ t .Fatalf ("Expected nil, got %v" , e )
316
+ }
317
+
318
+ q = newIPQueue [int ](s , "test2" )
319
+ q .push (1 )
320
+ q .push (2 )
321
+ // Capture current capacity
322
+ q .Lock ()
323
+ c := cap (q .elts )
324
+ q .Unlock ()
325
+ e , ok = q .popOneLast ()
326
+ if ! ok || e != 2 {
327
+ t .Fatalf ("Invalid value: %v" , e )
328
+ }
329
+ if l := q .len (); l != 1 {
330
+ t .Fatalf ("Expected len to be 1, got %v" , l )
331
+ }
332
+ values := q .pop ()
333
+ if len (values ) != 1 || values [0 ] != 1 {
334
+ t .Fatalf ("Unexpected values: %v" , values )
335
+ }
336
+ if cap (values ) != c {
337
+ t .Fatalf ("Unexpected capacity: %v vs %v" , cap (values ), c )
338
+ }
339
+ if l := q .len (); l != 0 {
340
+ t .Fatalf ("Expected len to be 0, got %v" , l )
341
+ }
342
+ // Just make sure that this is ok...
343
+ q .recycle (& values )
344
+ }
345
+
253
346
func TestIPQueueMultiProducers (t * testing.T ) {
254
347
s := & Server {}
255
348
q := newIPQueue [int ](s , "test" )
@@ -382,7 +475,36 @@ func TestIPQueueDrain(t *testing.T) {
382
475
}
383
476
}
384
477
385
- func TestIPQueueSizeCalculation (t * testing.T ) {
478
+ func TestIPQueueSizeCalculationPopOne (t * testing.T ) {
479
+ type testType = [16 ]byte
480
+ var testValue testType
481
+
482
+ calc := ipqSizeCalculation [testType ](func (e testType ) uint64 {
483
+ return uint64 (len (e ))
484
+ })
485
+ s := & Server {}
486
+ q := newIPQueue [testType ](s , "test" , calc )
487
+
488
+ for i := 0 ; i < 10 ; i ++ {
489
+ testValue [0 ] = byte (i )
490
+ q .push (testValue )
491
+ require_Equal (t , q .len (), i + 1 )
492
+ require_Equal (t , q .size (), uint64 (i + 1 )* uint64 (len (testValue )))
493
+ }
494
+
495
+ for i := 10 ; i > 5 ; i -- {
496
+ v , _ := q .popOne ()
497
+ require_Equal (t , 10 - v [0 ], byte (i ))
498
+ require_Equal (t , q .len (), i - 1 )
499
+ require_Equal (t , q .size (), uint64 (i - 1 )* uint64 (len (testValue )))
500
+ }
501
+
502
+ q .pop ()
503
+ require_Equal (t , q .len (), 0 )
504
+ require_Equal (t , q .size (), 0 )
505
+ }
506
+
507
+ func TestIPQueueSizeCalculationPopOneLast (t * testing.T ) {
386
508
type testType = [16 ]byte
387
509
var testValue testType
388
510
@@ -393,13 +515,15 @@ func TestIPQueueSizeCalculation(t *testing.T) {
393
515
q := newIPQueue [testType ](s , "test" , calc )
394
516
395
517
for i := 0 ; i < 10 ; i ++ {
518
+ testValue [0 ] = byte (i )
396
519
q .push (testValue )
397
520
require_Equal (t , q .len (), i + 1 )
398
521
require_Equal (t , q .size (), uint64 (i + 1 )* uint64 (len (testValue )))
399
522
}
400
523
401
524
for i := 10 ; i > 5 ; i -- {
402
- q .popOne ()
525
+ v , _ := q .popOneLast ()
526
+ require_Equal (t , v [0 ]+ 1 , byte (i ))
403
527
require_Equal (t , q .len (), i - 1 )
404
528
require_Equal (t , q .size (), uint64 (i - 1 )* uint64 (len (testValue )))
405
529
}
0 commit comments