Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions ring_buffer.go
Original file line number Diff line number Diff line change
Expand Up @@ -664,6 +664,10 @@ func (r *RingBuffer) write(p []byte) (n int, err error) {
if len(p) > avail {
// Advance read pointer to make room
needed := len(p) - avail
// Never discard more than the buffer actually holds.
if used := r.size - avail; needed > used {
needed = used
}
r.r = (r.r + needed) % r.size
// If buffer was full, it's no longer full after advancing read pointer
r.isFull = false
Expand Down
30 changes: 30 additions & 0 deletions ring_buffer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2193,3 +2193,33 @@ type result struct {
data string
err error
}

func TestRingBuffer_OverwriteMode_WriteLargerThanCapacity(t *testing.T) {
for _, tt := range []struct {
name string
prefill string
write string
want string
}{
{"empty", "", "abcdef", "abcd"},
{"empty_odd", "", "abcde", "abcd"},
{"partial", "ab", "cdefgh", "cdef"},
{"full", "abcd", "efghij", "efgh"},
} {
t.Run(tt.name, func(t *testing.T) {
rb := New(4).SetOverwrite(true)
if tt.prefill != "" {
if _, err := rb.Write([]byte(tt.prefill)); err != nil {
t.Fatalf("prefill: %v", err)
}
}
n, err := rb.Write([]byte(tt.write))
if got := string(rb.Bytes(nil)); got != tt.want {
t.Errorf("Bytes = %q, want %q (n=%d err=%v)", got, tt.want, n, err)
}
if rb.Length() != 4 {
t.Errorf("Length = %d, want 4", rb.Length())
}
})
}
}
Loading