@@ -125,6 +125,18 @@ func TestPoll(t *testing.T) {
125
125
assert .Equal (t , ErrTimeout , err )
126
126
}
127
127
128
+ func TestPollNoMemoryLeak (t * testing.T ) {
129
+ q := New (0 )
130
+
131
+ assert .Len (t , q .waiters , 0 )
132
+
133
+ for i := 0 ; i < 10 ; i ++ {
134
+ // Poll() should cleanup waiters after timeout
135
+ q .Poll (1 , time .Nanosecond )
136
+ assert .Len (t , q .waiters , 0 )
137
+ }
138
+ }
139
+
128
140
func TestAddEmptyPut (t * testing.T ) {
129
141
q := New (10 )
130
142
@@ -419,6 +431,68 @@ func TestTakeUntilOnDisposedQueue(t *testing.T) {
419
431
assert .IsType (t , ErrDisposed , err )
420
432
}
421
433
434
+ func TestWaiters (t * testing.T ) {
435
+ s1 , s2 , s3 , s4 := newSema (), newSema (), newSema (), newSema ()
436
+
437
+ w := waiters {}
438
+ assert .Len (t , w , 0 )
439
+
440
+ //
441
+ // test put()
442
+ w .put (s1 )
443
+ assert .Equal (t , waiters {s1 }, w )
444
+
445
+ w .put (s2 )
446
+ w .put (s3 )
447
+ w .put (s4 )
448
+ assert .Equal (t , waiters {s1 , s2 , s3 , s4 }, w )
449
+
450
+ //
451
+ // test remove()
452
+ //
453
+ // remove from middle
454
+ w .remove (s2 )
455
+ assert .Equal (t , waiters {s1 , s3 , s4 }, w )
456
+
457
+ // remove non-existing element
458
+ w .remove (s2 )
459
+ assert .Equal (t , waiters {s1 , s3 , s4 }, w )
460
+
461
+ // remove from beginning
462
+ w .remove (s1 )
463
+ assert .Equal (t , waiters {s3 , s4 }, w )
464
+
465
+ // remove from end
466
+ w .remove (s4 )
467
+ assert .Equal (t , waiters {s3 }, w )
468
+
469
+ // remove last element
470
+ w .remove (s3 )
471
+ assert .Empty (t , w )
472
+
473
+ // remove non-existing element
474
+ w .remove (s3 )
475
+ assert .Empty (t , w )
476
+
477
+ //
478
+ // test get()
479
+ //
480
+ // start with 3 elements in list
481
+ w .put (s1 )
482
+ w .put (s2 )
483
+ w .put (s3 )
484
+ assert .Equal (t , waiters {s1 , s2 , s3 }, w )
485
+
486
+ // get() returns each item in insertion order
487
+ assert .Equal (t , s1 , w .get ())
488
+ assert .Equal (t , s2 , w .get ())
489
+ w .put (s4 ) // interleave a put(), item should go to the end
490
+ assert .Equal (t , s3 , w .get ())
491
+ assert .Equal (t , s4 , w .get ())
492
+ assert .Empty (t , w )
493
+ assert .Nil (t , w .get ())
494
+ }
495
+
422
496
func TestExecuteInParallel (t * testing.T ) {
423
497
q := New (10 )
424
498
for i := 0 ; i < 10 ; i ++ {
0 commit comments