blob: f4895db66d1bca4a36f3abc7f7ac354e2c86438f [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package vom
// TODO(toddw): Add more exhaustive tests of decbuf SetLimit and fill.
import (
"io"
"strings"
"testing"
)
func expectEncbufBytes(t *testing.T, b *encbuf, expect string) {
if got, want := b.Len(), len(expect); got != want {
t.Errorf("len got %d, want %d", got, want)
}
if got, want := string(b.Bytes()), expect; got != want {
t.Errorf("bytes got %q, want %q", b.Bytes(), expect)
}
}
func TestEncbuf(t *testing.T) {
b := newEncbuf()
expectEncbufBytes(t, b, "")
copy(b.Grow(5), "abcde*****")
expectEncbufBytes(t, b, "abcde")
b.WriteOneByte('1')
expectEncbufBytes(t, b, "abcde1")
b.Write([]byte("def"))
expectEncbufBytes(t, b, "abcde1def")
b.Reset()
expectEncbufBytes(t, b, "")
b.Write([]byte("123"))
expectEncbufBytes(t, b, "123")
}
func testEncbufReserve(t *testing.T, base int) {
for _, size := range []int{base - 1, base, base + 1} {
str := strings.Repeat("x", size)
// Test starting empty and writing size.
b := newEncbuf()
b.Write([]byte(str))
expectEncbufBytes(t, b, str)
b.Write([]byte(str))
expectEncbufBytes(t, b, str+str)
// Test starting with one byte and writing size.
b = newEncbuf()
b.WriteOneByte('A')
expectEncbufBytes(t, b, "A")
b.Write([]byte(str))
expectEncbufBytes(t, b, "A"+str)
b.Write([]byte(str))
expectEncbufBytes(t, b, "A"+str+str)
}
}
func TestEncbufReserve(t *testing.T) {
testEncbufReserve(t, minBufFree)
testEncbufReserve(t, minBufFree*2)
testEncbufReserve(t, minBufFree*3)
testEncbufReserve(t, minBufFree*4)
}
func expectReadAvailable(t *testing.T, mode string, b *decbuf, n int, expect string, expectErr error) {
var err error
if !b.IsAvailable(n) {
err = b.Fill(n)
}
if got, want := err, expectErr; got != want {
t.Errorf("%s ReadAvailable err got %v, want %v", mode, got, want)
}
if err != nil {
return
}
buf := b.ReadAvailable(n)
if got, want := string(buf), expect; got != want {
t.Errorf("%s ReadAvailable buf got %q, want %q", mode, got, want)
}
}
func expectSkip(t *testing.T, mode string, b *decbuf, n int, expectErr error) {
err := b.Skip(n)
if got, want := err, expectErr; got != want {
t.Errorf("%s Skip err got %v, want %v", mode, got, want)
}
}
func expectPeekAvailable(t *testing.T, mode string, b *decbuf, n int, expect string, expectErr error) {
var err error
if !b.IsAvailable(n) {
err = b.Fill(n)
}
if got, want := err, expectErr; got != want {
t.Errorf("%s PeekAvailable err got %v, want %v", mode, got, want)
return
}
if err != nil {
return
}
buf := b.PeekAvailable(n)
if got, want := string(buf), expect; got != want {
t.Errorf("%s PeekAvailable buf got %q, want %q", mode, got, want)
}
}
func expectReadAvailableByte(t *testing.T, mode string, b *decbuf, expect byte, expectErr error) {
var err error
if !b.IsAvailable(1) {
err = b.Fill(1)
}
if got, want := err, expectErr; got != want {
t.Errorf("%s ReadAvailableByte err got %v, want %v", mode, got, want)
}
if err != nil {
return
}
if got, want := b.ReadAvailableByte(), expect; got != want {
t.Errorf("%s ReadAvailableByte buf got %q, want %q", mode, got, want)
}
}
func expectPeekAvailableByte(t *testing.T, mode string, b *decbuf, expect byte, expectErr error) {
var err error
if !b.IsAvailable(1) {
err = b.Fill(1)
}
if got, want := err, expectErr; got != want {
t.Errorf("%s PeekAvailableByte err got %v, want %v", mode, got, want)
}
if err != nil {
return
}
if got, want := b.PeekAvailableByte(), expect; got != want {
t.Errorf("%s PeekAvailableByte buf got %q, want %q", mode, got, want)
}
}
func expectReadIntoBuf(t *testing.T, mode string, b *decbuf, n int, expect string, expectErr error) {
buf := make([]byte, n)
err := b.ReadIntoBuf(buf)
if got, want := err, expectErr; got != want {
t.Errorf("%s ReadIntoBuf err got %v, want %v", mode, got, want)
}
if err == nil {
if got, want := string(buf), expect; got != want {
t.Errorf("%s ReadIntoBuf buf got %q, want %q", mode, got, want)
}
}
}
func TestDecbufReadAvailable(t *testing.T) {
fn := func(mode string, b *decbuf) {
expectReadAvailable(t, mode, b, 1, "a", nil)
expectReadAvailable(t, mode, b, 2, "bc", nil)
expectReadAvailable(t, mode, b, 3, "def", nil)
expectReadAvailable(t, mode, b, 4, "ghij", nil)
expectReadAvailable(t, mode, b, 1, "", io.EOF)
expectReadAvailable(t, mode, b, 1, "", io.EOF)
}
for _, mode := range AllReadModes {
fn(mode.String(), newDecbuf(mode.TestReader(ABCReader(10))))
}
fn("fromBytes", newDecbufFromBytes(ABCBytes(10)))
}
func TestDecbufSkip(t *testing.T) {
fn := func(mode string, b *decbuf) {
expectSkip(t, mode, b, 1, nil)
expectReadAvailable(t, mode, b, 2, "bc", nil)
expectSkip(t, mode, b, 3, nil)
expectReadAvailable(t, mode, b, 2, "gh", nil)
expectSkip(t, mode, b, 2, nil)
expectSkip(t, mode, b, 1, io.EOF)
expectSkip(t, mode, b, 1, io.EOF)
expectReadAvailable(t, mode, b, 1, "", io.EOF)
expectReadAvailable(t, mode, b, 1, "", io.EOF)
}
for _, mode := range AllReadModes {
fn(mode.String(), newDecbuf(mode.TestReader(ABCReader(10))))
}
fn("fromBytes", newDecbufFromBytes(ABCBytes(10)))
}
func TestDecbufPeekAvailable(t *testing.T) {
fn := func(mode string, b *decbuf) {
expectPeekAvailable(t, mode, b, 1, "a", nil)
expectPeekAvailable(t, mode, b, 2, "ab", nil)
expectPeekAvailable(t, mode, b, 3, "abc", nil)
expectPeekAvailable(t, mode, b, 4, "", io.EOF)
expectPeekAvailable(t, mode, b, 1, "a", nil)
expectPeekAvailable(t, mode, b, 2, "ab", nil)
expectPeekAvailable(t, mode, b, 3, "abc", nil)
expectPeekAvailable(t, mode, b, 4, "", io.EOF)
expectReadAvailable(t, mode, b, 1, "a", nil)
expectPeekAvailable(t, mode, b, 1, "b", nil)
expectPeekAvailable(t, mode, b, 2, "bc", nil)
expectPeekAvailable(t, mode, b, 3, "", io.EOF)
expectPeekAvailable(t, mode, b, 1, "b", nil)
expectPeekAvailable(t, mode, b, 2, "bc", nil)
expectPeekAvailable(t, mode, b, 3, "", io.EOF)
expectReadAvailable(t, mode, b, 1, "b", nil)
expectPeekAvailable(t, mode, b, 1, "c", nil)
expectPeekAvailable(t, mode, b, 2, "", io.EOF)
expectPeekAvailable(t, mode, b, 1, "c", nil)
expectPeekAvailable(t, mode, b, 2, "", io.EOF)
expectReadAvailable(t, mode, b, 1, "c", nil)
expectPeekAvailable(t, mode, b, 1, "", io.EOF)
expectPeekAvailable(t, mode, b, 1, "", io.EOF)
expectReadAvailable(t, mode, b, 1, "", io.EOF)
expectPeekAvailable(t, mode, b, 1, "", io.EOF)
expectPeekAvailable(t, mode, b, 1, "", io.EOF)
}
for _, mode := range AllReadModes {
fn(mode.String(), newDecbuf(mode.TestReader(ABCReader(3))))
}
fn("fromBytes", newDecbufFromBytes(ABCBytes(3)))
}
func TestDecbufReadAvailableByte(t *testing.T) {
fn := func(mode string, b *decbuf) {
expectReadAvailableByte(t, mode, b, 'a', nil)
expectReadAvailableByte(t, mode, b, 'b', nil)
expectReadAvailableByte(t, mode, b, 'c', nil)
expectReadAvailableByte(t, mode, b, 0, io.EOF)
expectReadAvailableByte(t, mode, b, 0, io.EOF)
}
for _, mode := range AllReadModes {
fn(mode.String(), newDecbuf(mode.TestReader(ABCReader(3))))
}
fn("fromBytes", newDecbufFromBytes(ABCBytes(3)))
}
func TestDecbufPeekAvailableByte(t *testing.T) {
fn := func(mode string, b *decbuf) {
expectPeekAvailableByte(t, mode, b, 'a', nil)
expectPeekAvailableByte(t, mode, b, 'a', nil)
expectReadAvailableByte(t, mode, b, 'a', nil)
expectPeekAvailableByte(t, mode, b, 'b', nil)
expectPeekAvailableByte(t, mode, b, 'b', nil)
expectReadAvailableByte(t, mode, b, 'b', nil)
expectPeekAvailableByte(t, mode, b, 'c', nil)
expectPeekAvailableByte(t, mode, b, 'c', nil)
expectReadAvailableByte(t, mode, b, 'c', nil)
expectPeekAvailableByte(t, mode, b, 0, io.EOF)
expectPeekAvailableByte(t, mode, b, 0, io.EOF)
expectReadAvailableByte(t, mode, b, 0, io.EOF)
}
for _, mode := range AllReadModes {
fn(mode.String(), newDecbuf(mode.TestReader(ABCReader(3))))
}
fn("fromBytes", newDecbufFromBytes(ABCBytes(3)))
}
func TestDecbufReadIntoBuf(t *testing.T) {
fn1 := func(mode string, b *decbuf) {
// Start ReadFull from beginning.
expectReadIntoBuf(t, mode, b, 3, "abc", nil)
expectReadIntoBuf(t, mode, b, 3, "def", nil)
expectReadIntoBuf(t, mode, b, 1, "", io.EOF)
expectReadIntoBuf(t, mode, b, 1, "", io.EOF)
}
fn2 := func(mode string, b *decbuf) {
// Start ReadFull after reading 1 byte, which fills the buffer.
expectReadAvailable(t, mode, b, 1, "a", nil)
expectReadIntoBuf(t, mode, b, 2, "bc", nil)
expectReadIntoBuf(t, mode, b, 3, "def", nil)
expectReadIntoBuf(t, mode, b, 1, "", io.EOF)
expectReadIntoBuf(t, mode, b, 1, "", io.EOF)
}
for _, mode := range AllReadModes {
fn1(mode.String(), newDecbuf(mode.TestReader(ABCReader(6))))
fn2(mode.String(), newDecbuf(mode.TestReader(ABCReader(6))))
}
fn1("fromBytes", newDecbufFromBytes(ABCBytes(6)))
fn2("fromBytes", newDecbufFromBytes(ABCBytes(6)))
}