github.com/cockroachdb/cockroach@v20.2.0-alpha.1+incompatible/pkg/util/ring/ring_buffer_test.go (about)

     1  // Copyright 2018 The Cockroach Authors.
     2  //
     3  // Use of this software is governed by the Business Source License
     4  // included in the file licenses/BSL.txt.
     5  //
     6  // As of the Change Date specified in that file, in accordance with
     7  // the Business Source License, use of this software will be governed
     8  // by the Apache License, Version 2.0, included in the file
     9  // licenses/APL.txt.
    10  
    11  package ring
    12  
    13  import (
    14  	"math/rand"
    15  	"testing"
    16  
    17  	"github.com/stretchr/testify/require"
    18  )
    19  
    20  const maxCount = 1000
    21  
    22  func testRingBuffer(t *testing.T, count int) {
    23  	var buffer Buffer
    24  	naiveBuffer := make([]interface{}, 0, count)
    25  	for elementIdx := 0; elementIdx < count; elementIdx++ {
    26  		switch rand.Intn(4) {
    27  		case 0:
    28  			buffer.AddFirst(elementIdx)
    29  			naiveBuffer = append([]interface{}{elementIdx}, naiveBuffer...)
    30  		case 1:
    31  			buffer.AddLast(elementIdx)
    32  			naiveBuffer = append(naiveBuffer, elementIdx)
    33  		case 2:
    34  			if len(naiveBuffer) > 0 {
    35  				buffer.RemoveFirst()
    36  				// NB: shift to preserve length.
    37  				copy(naiveBuffer, naiveBuffer[1:])
    38  				naiveBuffer = naiveBuffer[:len(naiveBuffer)-1]
    39  			}
    40  		case 3:
    41  			if len(naiveBuffer) > 0 {
    42  				buffer.RemoveLast()
    43  				naiveBuffer = naiveBuffer[:len(naiveBuffer)-1]
    44  			}
    45  		default:
    46  			t.Fatal("unexpected")
    47  		}
    48  
    49  		require.Equal(t, len(naiveBuffer), buffer.Len())
    50  		for pos, el := range naiveBuffer {
    51  			res := buffer.Get(pos)
    52  			require.Equal(t, el, res)
    53  		}
    54  		if len(naiveBuffer) > 0 {
    55  			require.Equal(t, naiveBuffer[0], buffer.GetFirst())
    56  			require.Equal(t, naiveBuffer[len(naiveBuffer)-1], buffer.GetLast())
    57  		}
    58  	}
    59  }
    60  
    61  func TestRingBuffer(t *testing.T) {
    62  	for count := 1; count <= maxCount; count++ {
    63  		testRingBuffer(t, count)
    64  	}
    65  }
    66  
    67  func TestRingBufferCapacity(t *testing.T) {
    68  	var b Buffer
    69  
    70  	require.Panics(t, func() { b.Reserve(-1) })
    71  	require.Equal(t, 0, b.Len())
    72  	require.Equal(t, 0, b.Cap())
    73  
    74  	b.Reserve(0)
    75  	require.Equal(t, 0, b.Len())
    76  	require.Equal(t, 0, b.Cap())
    77  
    78  	b.AddFirst("a")
    79  	require.Equal(t, 1, b.Len())
    80  	require.Equal(t, 1, b.Cap())
    81  	require.Panics(t, func() { b.Reserve(0) })
    82  	require.Equal(t, 1, b.Len())
    83  	require.Equal(t, 1, b.Cap())
    84  	b.Reserve(1)
    85  	require.Equal(t, 1, b.Len())
    86  	require.Equal(t, 1, b.Cap())
    87  	b.Reserve(2)
    88  	require.Equal(t, 1, b.Len())
    89  	require.Equal(t, 2, b.Cap())
    90  
    91  	b.AddLast("z")
    92  	require.Equal(t, 2, b.Len())
    93  	require.Equal(t, 2, b.Cap())
    94  	require.Panics(t, func() { b.Reserve(1) })
    95  	require.Equal(t, 2, b.Len())
    96  	require.Equal(t, 2, b.Cap())
    97  	b.Reserve(2)
    98  	require.Equal(t, 2, b.Len())
    99  	require.Equal(t, 2, b.Cap())
   100  	b.Reserve(9)
   101  	require.Equal(t, 2, b.Len())
   102  	require.Equal(t, 9, b.Cap())
   103  
   104  	b.RemoveFirst()
   105  	require.Equal(t, 1, b.Len())
   106  	require.Equal(t, 9, b.Cap())
   107  	b.Reserve(1)
   108  	require.Equal(t, 1, b.Len())
   109  	require.Equal(t, 9, b.Cap())
   110  	b.RemoveLast()
   111  	require.Equal(t, 0, b.Len())
   112  	require.Equal(t, 9, b.Cap())
   113  	b.Reserve(0)
   114  	require.Equal(t, 0, b.Len())
   115  	require.Equal(t, 9, b.Cap())
   116  }