1
0
buffer/peek_test.go
2026-02-17 16:58:00 +01:00

229 lines
4.0 KiB
Go

package buffer_test
import (
"testing"
"code.squareroundforest.org/arpio/buffer"
"bytes"
"io"
"errors"
)
func TestPeek(t *testing.T) {
t.Run("peek across segments", func(t *testing.T) {
g := &gen{max: 1 << 15}
o := buffer.Options{
Pool: buffer.NoPool(128),
ReadSize: 8,
}
r := buffer.ReaderFrom(g, o)
p, err := r.Peek(2*128 + 30)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(p, generate(2*128+30)) {
t.Fatal("failed to peek", len(p))
}
})
t.Run("err before and after consumed", func(t *testing.T) {
g := &gen{
max: 12,
fastErr: true,
}
o := buffer.Options{Pool: buffer.NoPool(1 << 12)}
r := buffer.ReaderFrom(g, o)
b, err := r.Peek(18)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(b, generate(12)) {
t.Fatal("invalid content", len(b))
}
b, err = r.Peek(18)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(b, generate(12)) {
t.Fatal("invalid content", len(b))
}
b, err = io.ReadAll(r)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(b, generate(12)) {
t.Fatal("invalid content", len(b))
}
b, err = r.Peek(18)
if !errors.Is(err, io.EOF) {
t.Fatal("failed EOF")
}
if len(b) != 0 {
t.Fatal("invalid content", len(b))
}
})
t.Run("err immediately on first try to fill", func(t *testing.T) {
g := &gen{}
o := buffer.Options{Pool: buffer.NoPool(1 << 12)}
r := buffer.ReaderFrom(g, o)
b, err := r.Peek(18)
if !errors.Is(err, io.EOF) {
t.Fatal("failed EOF")
}
if len(b) != 0 {
t.Fatal("invalid content")
}
})
t.Run("peek on empty", func(t *testing.T) {
g := &gen{max: 1 << 15}
o := buffer.Options{Pool: buffer.NoPool(1 << 12)}
r := buffer.ReaderFrom(g, o)
b, err := r.Peek(18)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(b, generate(18)) {
t.Fatal("invalid content")
}
})
t.Run("peek multiple segments", func(t *testing.T) {
g := &gen{max: 1 << 15}
o := buffer.Options{
Pool: buffer.NoPool(64),
ReadSize: 16,
}
r := buffer.ReaderFrom(g, o)
b, err := r.Peek(160)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(b, generate(160)) {
t.Fatal("invalid content")
}
})
t.Run("peek on partially filled", func(t *testing.T) {
g := &gen{max: 1 << 15}
o := buffer.Options{
Pool: buffer.NoPool(64),
ReadSize: 16,
}
r := buffer.ReaderFrom(g, o)
b, err := r.Peek(16)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(b, generate(16)) {
t.Fatal("invalid content")
}
b, err = r.Peek(48)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(b, generate(48)) {
t.Fatal("invalid content")
}
})
t.Run("peek on partially filled multiple segments", func(t *testing.T) {
g := &gen{max: 1 << 15}
o := buffer.Options{
Pool: buffer.NoPool(64),
ReadSize: 16,
}
r := buffer.ReaderFrom(g, o)
b, err := r.Peek(160)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(b, generate(160)) {
t.Fatal("invalid content")
}
b, err = r.Peek(144)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(b, generate(144)) {
t.Fatal("invalid content")
}
})
t.Run("peek not enough available", func(t *testing.T) {
g := &gen{
max: 12,
fastErr: true,
}
o := buffer.Options{Pool: buffer.NoPool(1 << 12)}
r := buffer.ReaderFrom(g, o)
b, err := r.Peek(18)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(b, generate(12)) {
t.Fatal("invalid content")
}
})
t.Run("peek not enough available multiple segments", func(t *testing.T) {
g := &gen{
max: 144,
fastErr: true,
}
o := buffer.Options{
Pool: buffer.NoPool(64),
ReadSize: 16,
}
r := buffer.ReaderFrom(g, o)
b, err := r.Peek(214)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(b, generate(144)) {
t.Fatal("invalid content")
}
})
t.Run("peek zero", func(t *testing.T) {
g := &gen{max: 1 << 15}
o := buffer.Options{Pool: buffer.NoPool(1 << 12)}
r := buffer.ReaderFrom(g, o)
b, err := r.Peek(0)
if err != nil {
t.Fatal(err)
}
if len(b) != 0 {
t.Fatal("ivnalid content")
}
})
}