fix(process): handle zero-capacity ring buffers
This commit is contained in:
parent
73b0ffecc0
commit
38a9f034a7
2 changed files with 21 additions and 0 deletions
|
|
@ -15,6 +15,9 @@ type RingBuffer struct {
|
|||
|
||||
// NewRingBuffer creates a ring buffer with the given capacity.
|
||||
func NewRingBuffer(size int) *RingBuffer {
|
||||
if size < 0 {
|
||||
size = 0
|
||||
}
|
||||
return &RingBuffer{
|
||||
data: make([]byte, size),
|
||||
size: size,
|
||||
|
|
@ -26,6 +29,10 @@ func (rb *RingBuffer) Write(p []byte) (n int, err error) {
|
|||
rb.mu.Lock()
|
||||
defer rb.mu.Unlock()
|
||||
|
||||
if rb.size == 0 {
|
||||
return len(p), nil
|
||||
}
|
||||
|
||||
for _, b := range p {
|
||||
rb.data[rb.end] = b
|
||||
rb.end = (rb.end + 1) % rb.size
|
||||
|
|
|
|||
|
|
@ -69,4 +69,18 @@ func TestRingBuffer(t *testing.T) {
|
|||
bytes[0] = 'x'
|
||||
assert.Equal(t, "hello", rb.String())
|
||||
})
|
||||
|
||||
t.Run("zero or negative capacity is a no-op", func(t *testing.T) {
|
||||
for _, size := range []int{0, -1} {
|
||||
rb := NewRingBuffer(size)
|
||||
|
||||
n, err := rb.Write([]byte("discarded"))
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, len("discarded"), n)
|
||||
assert.Equal(t, 0, rb.Cap())
|
||||
assert.Equal(t, 0, rb.Len())
|
||||
assert.Equal(t, "", rb.String())
|
||||
assert.Nil(t, rb.Bytes())
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue