blob: 1d222372caf384c9dcbaf12c1350c46feb07cf7c [file] [log] [blame]
// Copyright 2019 The Go 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 iotest
import (
"bytes"
"errors"
"io"
"strings"
"testing"
)
func TestOneByteReader_nonEmptyReader(t *testing.T) {
msg := "Hello, World!"
buf := new(bytes.Buffer)
buf.WriteString(msg)
obr := OneByteReader(buf)
var b []byte
n, err := obr.Read(b)
if err != nil || n != 0 {
t.Errorf("Empty buffer read returned n=%d err=%v", n, err)
}
b = make([]byte, 3)
// Read from obr until EOF.
got := new(strings.Builder)
for i := 0; ; i++ {
n, err = obr.Read(b)
if err != nil {
break
}
if g, w := n, 1; g != w {
t.Errorf("Iteration #%d read %d bytes, want %d", i, g, w)
}
got.Write(b[:n])
}
if g, w := err, io.EOF; g != w {
t.Errorf("Unexpected error after reading all bytes\n\tGot: %v\n\tWant: %v", g, w)
}
if g, w := got.String(), "Hello, World!"; g != w {
t.Errorf("Read mismatch\n\tGot: %q\n\tWant: %q", g, w)
}
}
func TestOneByteReader_emptyReader(t *testing.T) {
r := new(bytes.Buffer)
obr := OneByteReader(r)
var b []byte
if n, err := obr.Read(b); err != nil || n != 0 {
t.Errorf("Empty buffer read returned n=%d err=%v", n, err)
}
b = make([]byte, 5)
n, err := obr.Read(b)
if g, w := err, io.EOF; g != w {
t.Errorf("Error mismatch\n\tGot: %v\n\tWant: %v", g, w)
}
if g, w := n, 0; g != w {
t.Errorf("Unexpectedly read %d bytes, wanted %d", g, w)
}
}
func TestHalfReader_nonEmptyReader(t *testing.T) {
msg := "Hello, World!"
buf := new(bytes.Buffer)
buf.WriteString(msg)
// empty read buffer
hr := HalfReader(buf)
var b []byte
n, err := hr.Read(b)
if err != nil || n != 0 {
t.Errorf("Empty buffer read returned n=%d err=%v", n, err)
}
// non empty read buffer
b = make([]byte, 2)
got := new(strings.Builder)
for i := 0; ; i++ {
n, err = hr.Read(b)
if err != nil {
break
}
if g, w := n, 1; g != w {
t.Errorf("Iteration #%d read %d bytes, want %d", i, g, w)
}
got.Write(b[:n])
}
if g, w := err, io.EOF; g != w {
t.Errorf("Unexpected error after reading all bytes\n\tGot: %v\n\tWant: %v", g, w)
}
if g, w := got.String(), "Hello, World!"; g != w {
t.Errorf("Read mismatch\n\tGot: %q\n\tWant: %q", g, w)
}
}
func TestHalfReader_emptyReader(t *testing.T) {
r := new(bytes.Buffer)
hr := HalfReader(r)
var b []byte
if n, err := hr.Read(b); err != nil || n != 0 {
t.Errorf("Empty buffer read returned n=%d err=%v", n, err)
}
b = make([]byte, 5)
n, err := hr.Read(b)
if g, w := err, io.EOF; g != w {
t.Errorf("Error mismatch\n\tGot: %v\n\tWant: %v", g, w)
}
if g, w := n, 0; g != w {
t.Errorf("Unexpectedly read %d bytes, wanted %d", g, w)
}
}
func TestTimeOutReader_nonEmptyReader(t *testing.T) {
msg := "Hello, World!"
buf := new(bytes.Buffer)
buf.WriteString(msg)
// empty read buffer
tor := TimeoutReader(buf)
var b []byte
n, err := tor.Read(b)
if err != nil || n != 0 {
t.Errorf("Empty buffer read returned n=%d err=%v", n, err)
}
// Second call should timeout
n, err = tor.Read(b)
if g, w := err, ErrTimeout; g != w {
t.Errorf("Error mismatch\n\tGot: %v\n\tWant: %v", g, w)
}
if g, w := n, 0; g != w {
t.Errorf("Unexpectedly read %d bytes, wanted %d", g, w)
}
// non empty read buffer
tor2 := TimeoutReader(buf)
b = make([]byte, 3)
if n, err := tor2.Read(b); err != nil || n == 0 {
t.Errorf("Empty buffer read returned n=%d err=%v", n, err)
}
// Second call should timeout
n, err = tor2.Read(b)
if g, w := err, ErrTimeout; g != w {
t.Errorf("Error mismatch\n\tGot: %v\n\tWant: %v", g, w)
}
if g, w := n, 0; g != w {
t.Errorf("Unexpectedly read %d bytes, wanted %d", g, w)
}
}
func TestTimeOutReader_emptyReader(t *testing.T) {
r := new(bytes.Buffer)
// empty read buffer
tor := TimeoutReader(r)
var b []byte
if n, err := tor.Read(b); err != nil || n != 0 {
t.Errorf("Empty buffer read returned n=%d err=%v", n, err)
}
// Second call should timeout
n, err := tor.Read(b)
if g, w := err, ErrTimeout; g != w {
t.Errorf("Error mismatch\n\tGot: %v\n\tWant: %v", g, w)
}
if g, w := n, 0; g != w {
t.Errorf("Unexpectedly read %d bytes, wanted %d", g, w)
}
// non empty read buffer
tor2 := TimeoutReader(r)
b = make([]byte, 5)
if n, err := tor2.Read(b); err != io.EOF || n != 0 {
t.Errorf("Empty buffer read returned n=%d err=%v", n, err)
}
// Second call should timeout
n, err = tor2.Read(b)
if g, w := err, ErrTimeout; g != w {
t.Errorf("Error mismatch\n\tGot: %v\n\tWant: %v", g, w)
}
if g, w := n, 0; g != w {
t.Errorf("Unexpectedly read %d bytes, wanted %d", g, w)
}
}
func TestDataErrReader_nonEmptyReader(t *testing.T) {
msg := "Hello, World!"
buf := new(bytes.Buffer)
buf.WriteString(msg)
der := DataErrReader(buf)
b := make([]byte, 3)
got := new(strings.Builder)
var n int
var err error
for {
n, err = der.Read(b)
got.Write(b[:n])
if err != nil {
break
}
}
if err != io.EOF || n == 0 {
t.Errorf("Last Read returned n=%d err=%v", n, err)
}
if g, w := got.String(), "Hello, World!"; g != w {
t.Errorf("Read mismatch\n\tGot: %q\n\tWant: %q", g, w)
}
}
func TestDataErrReader_emptyReader(t *testing.T) {
r := new(bytes.Buffer)
der := DataErrReader(r)
var b []byte
if n, err := der.Read(b); err != io.EOF || n != 0 {
t.Errorf("Empty buffer read returned n=%d err=%v", n, err)
}
b = make([]byte, 5)
n, err := der.Read(b)
if g, w := err, io.EOF; g != w {
t.Errorf("Error mismatch\n\tGot: %v\n\tWant: %v", g, w)
}
if g, w := n, 0; g != w {
t.Errorf("Unexpectedly read %d bytes, wanted %d", g, w)
}
}
func TestErrReader(t *testing.T) {
cases := []struct {
name string
err error
}{
{"nil error", nil},
{"non-nil error", errors.New("io failure")},
{"io.EOF", io.EOF},
}
for _, tt := range cases {
tt := tt
t.Run(tt.name, func(t *testing.T) {
n, err := ErrReader(tt.err).Read(nil)
if err != tt.err {
t.Fatalf("Error mismatch\nGot: %v\nWant: %v", err, tt.err)
}
if n != 0 {
t.Fatalf("Byte count mismatch: got %d want 0", n)
}
})
}
}
func TestStringsReader(t *testing.T) {
const msg = "Now is the time for all good gophers."
r := strings.NewReader(msg)
if err := TestReader(r, []byte(msg)); err != nil {
t.Fatal(err)
}
}