fix(process): handle zero-capacity ring buffers

This commit is contained in:
Virgil 2026-04-04 02:07:23 +00:00
parent 73b0ffecc0
commit 38a9f034a7
2 changed files with 21 additions and 0 deletions

View file

@ -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

View file

@ -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())
}
})
}