github.com/MetalBlockchain/metalgo@v1.11.9/utils/buffer/unbounded_blocking_deque_test.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package buffer 5 6 import ( 7 "sync" 8 "testing" 9 10 "github.com/stretchr/testify/require" 11 ) 12 13 func TestUnboundedBlockingDequePush(t *testing.T) { 14 require := require.New(t) 15 16 deque := NewUnboundedBlockingDeque[int](2) 17 require.Empty(deque.List()) 18 _, ok := deque.Index(0) 19 require.False(ok) 20 21 ok = deque.PushRight(1) 22 require.True(ok) 23 require.Equal([]int{1}, deque.List()) 24 got, ok := deque.Index(0) 25 require.True(ok) 26 require.Equal(1, got) 27 28 ok = deque.PushRight(2) 29 require.True(ok) 30 require.Equal([]int{1, 2}, deque.List()) 31 got, ok = deque.Index(0) 32 require.True(ok) 33 require.Equal(1, got) 34 got, ok = deque.Index(1) 35 require.True(ok) 36 require.Equal(2, got) 37 _, ok = deque.Index(2) 38 require.False(ok) 39 40 ch, ok := deque.PopLeft() 41 require.True(ok) 42 require.Equal(1, ch) 43 require.Equal([]int{2}, deque.List()) 44 got, ok = deque.Index(0) 45 require.True(ok) 46 require.Equal(2, got) 47 } 48 49 func TestUnboundedBlockingDequePop(t *testing.T) { 50 require := require.New(t) 51 52 deque := NewUnboundedBlockingDeque[int](2) 53 require.Empty(deque.List()) 54 55 ok := deque.PushRight(1) 56 require.True(ok) 57 require.Equal([]int{1}, deque.List()) 58 got, ok := deque.Index(0) 59 require.True(ok) 60 require.Equal(1, got) 61 62 ch, ok := deque.PopLeft() 63 require.True(ok) 64 require.Equal(1, ch) 65 require.Empty(deque.List()) 66 67 wg := &sync.WaitGroup{} 68 wg.Add(1) 69 go func() { 70 ch, ok := deque.PopLeft() 71 require.True(ok) 72 require.Equal(2, ch) 73 wg.Done() 74 }() 75 76 ok = deque.PushRight(2) 77 require.True(ok) 78 wg.Wait() 79 require.Empty(deque.List()) 80 _, ok = deque.Index(0) 81 require.False(ok) 82 } 83 84 func TestUnboundedBlockingDequeClose(t *testing.T) { 85 require := require.New(t) 86 87 deque := NewUnboundedBlockingDeque[int](2) 88 89 ok := deque.PushLeft(1) 90 require.True(ok) 91 92 deque.Close() 93 94 _, ok = deque.PopRight() 95 require.False(ok) 96 97 ok = deque.PushLeft(1) 98 require.False(ok) 99 }