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  }