229 lines
4.0 KiB
Go
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")
|
||
|
|
}
|
||
|
|
})
|
||
|
|
}
|