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 }