@@ -250,6 +250,99 @@ func TestIPQueuePopOne(t *testing.T) {
250250 q .recycle (& values )
251251}
252252
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+
253346func TestIPQueueMultiProducers (t * testing.T ) {
254347 s := & Server {}
255348 q := newIPQueue [int ](s , "test" )
@@ -382,7 +475,36 @@ func TestIPQueueDrain(t *testing.T) {
382475 }
383476}
384477
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 ) {
386508 type testType = [16 ]byte
387509 var testValue testType
388510
@@ -393,13 +515,15 @@ func TestIPQueueSizeCalculation(t *testing.T) {
393515 q := newIPQueue [testType ](s , "test" , calc )
394516
395517 for i := 0 ; i < 10 ; i ++ {
518+ testValue [0 ] = byte (i )
396519 q .push (testValue )
397520 require_Equal (t , q .len (), i + 1 )
398521 require_Equal (t , q .size (), uint64 (i + 1 )* uint64 (len (testValue )))
399522 }
400523
401524 for i := 10 ; i > 5 ; i -- {
402- q .popOne ()
525+ v , _ := q .popOneLast ()
526+ require_Equal (t , v [0 ]+ 1 , byte (i ))
403527 require_Equal (t , q .len (), i - 1 )
404528 require_Equal (t , q .size (), uint64 (i - 1 )* uint64 (len (testValue )))
405529 }
0 commit comments