1
0
buffer/buffered_test.go

152 lines
3.1 KiB
Go
Raw Permalink Normal View History

2026-02-17 16:58:00 +01:00
package buffer_test
import (
"bytes"
2026-02-22 16:30:37 +01:00
"code.squareroundforest.org/arpio/buffer"
"testing"
2026-02-17 16:58:00 +01:00
)
func TestBuffered(t *testing.T) {
2026-02-22 16:30:37 +01:00
for title, cr := range map[string]createReader{"reader": buffer.BufferedReader, "content": testContent} {
t.Run(title, func(t *testing.T) {
t.Run("none buffered", func(t *testing.T) {
g := &gen{max: 1 << 15}
o := buffer.Options{Pool: buffer.NoPool(1 << 12)}
r := cr(g, o)
b := r.Buffered()
if len(b) != 0 {
t.Fatal("invalid content")
}
})
t.Run("buffered after error", func(t *testing.T) {
g := &gen{
max: 12,
fastErr: true,
}
o := buffer.Options{Pool: buffer.NoPool(1 << 12)}
r := cr(g, o)
b, err := r.Peek(18)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(b, generate(12)) {
t.Fatal("invalid content")
}
b = r.Buffered()
if !bytes.Equal(b, generate(12)) {
t.Fatal("invalid content")
}
})
t.Run("all buffered", func(t *testing.T) {
g := &gen{max: 1 << 15}
o := buffer.Options{Pool: buffer.NoPool(64)}
r := cr(g, o)
b, err := r.Peek(48)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(b, generate(48)) {
t.Fatal("invalid content 1", len(b))
}
b = r.Buffered()
if !bytes.Equal(b, generate(64)) {
t.Fatal("invalid content 2", len(b))
}
})
t.Run("buffered across segments", func(t *testing.T) {
g := &gen{max: 1 << 15}
o := buffer.Options{Pool: buffer.NoPool(64)}
r := cr(g, o)
b, err := r.Peek(144)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(b, generate(144)) {
t.Fatal("invalid content 1", len(b))
}
b = r.Buffered()
if !bytes.Equal(b, generate(192)) {
t.Fatal("invalid content 2", len(b))
}
})
t.Run("buffered mid segment", func(t *testing.T) {
g := &gen{max: 1 << 15}
o := buffer.Options{Pool: buffer.NoPool(128)}
r := cr(g, o)
b := make([]byte, 32)
n, err := r.Read(b)
if err != nil {
t.Fatal(err)
}
if n != 32 {
t.Fatal("invalid read length", n)
}
if !bytes.Equal(b, generate(32)) {
t.Fatal("invalid content 1")
}
b = r.Buffered()
if !bytes.Equal(b, generate(128)[32:]) {
t.Fatal("invalid content 2")
}
})
t.Run("buffered mid segment across segments", func(t *testing.T) {
g := &gen{max: 1 << 15}
o := buffer.Options{Pool: buffer.NoPool(128)}
r := cr(g, o)
b, err := r.Peek(288)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(b, generate(288)) {
t.Fatal("invalid content 1")
}
b = r.Buffered()
if !bytes.Equal(b, generate(384)) {
t.Fatal("invalid content 2", len(b))
}
})
t.Run("zero buffered mid segment", func(t *testing.T) {
g := &gen{max: 1 << 15}
o := buffer.Options{Pool: buffer.NoPool(64)}
r := cr(g, o)
b := make([]byte, 64)
n, err := r.Read(b)
if err != nil {
t.Fatal(err)
}
if n != 64 {
t.Fatal("invalid read length", n)
}
if !bytes.Equal(b, generate(64)) {
t.Fatal("invalid content 1")
}
b = r.Buffered()
if len(b) != 0 {
t.Fatal("invalid content 2", len(b))
}
})
})
}
2026-02-17 16:58:00 +01:00
}