blob: fec4467cc67d1987831585a1ba254d4c26ecae35 [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"
"fmt"
"log"
"testing"
)
type errWriter struct {
err error
}
func (w errWriter) Write([]byte) (int, error) {
return 0, w.err
}
func TestWriteLogger(t *testing.T) {
olw := log.Writer()
olf := log.Flags()
olp := log.Prefix()
// Revert the original log settings before we exit.
defer func() {
log.SetFlags(olf)
log.SetPrefix(olp)
log.SetOutput(olw)
}()
lOut := new(bytes.Buffer)
log.SetPrefix("lw: ")
log.SetOutput(lOut)
log.SetFlags(0)
lw := new(bytes.Buffer)
wl := NewWriteLogger("write:", lw)
if _, err := wl.Write([]byte("Hello, World!")); err != nil {
t.Fatalf("Unexpectedly failed to write: %v", err)
}
if g, w := lw.String(), "Hello, World!"; g != w {
t.Errorf("WriteLogger mismatch\n\tgot: %q\n\twant: %q", g, w)
}
wantLogWithHex := fmt.Sprintf("lw: write: %x\n", "Hello, World!")
if g, w := lOut.String(), wantLogWithHex; g != w {
t.Errorf("WriteLogger mismatch\n\tgot: %q\n\twant: %q", g, w)
}
}
func TestWriteLogger_errorOnWrite(t *testing.T) {
olw := log.Writer()
olf := log.Flags()
olp := log.Prefix()
// Revert the original log settings before we exit.
defer func() {
log.SetFlags(olf)
log.SetPrefix(olp)
log.SetOutput(olw)
}()
lOut := new(bytes.Buffer)
log.SetPrefix("lw: ")
log.SetOutput(lOut)
log.SetFlags(0)
lw := errWriter{err: errors.New("Write Error!")}
wl := NewWriteLogger("write:", lw)
if _, err := wl.Write([]byte("Hello, World!")); err == nil {
t.Fatalf("Unexpectedly succeeded to write: %v", err)
}
wantLogWithHex := fmt.Sprintf("lw: write: %x: %v\n", "", "Write Error!")
if g, w := lOut.String(), wantLogWithHex; g != w {
t.Errorf("WriteLogger mismatch\n\tgot: %q\n\twant: %q", g, w)
}
}
func TestReadLogger(t *testing.T) {
olw := log.Writer()
olf := log.Flags()
olp := log.Prefix()
// Revert the original log settings before we exit.
defer func() {
log.SetFlags(olf)
log.SetPrefix(olp)
log.SetOutput(olw)
}()
lOut := new(bytes.Buffer)
log.SetPrefix("lr: ")
log.SetOutput(lOut)
log.SetFlags(0)
data := []byte("Hello, World!")
p := make([]byte, len(data))
lr := bytes.NewReader(data)
rl := NewReadLogger("read:", lr)
n, err := rl.Read(p)
if err != nil {
t.Fatalf("Unexpectedly failed to read: %v", err)
}
if g, w := p[:n], data; !bytes.Equal(g, w) {
t.Errorf("ReadLogger mismatch\n\tgot: %q\n\twant: %q", g, w)
}
wantLogWithHex := fmt.Sprintf("lr: read: %x\n", "Hello, World!")
if g, w := lOut.String(), wantLogWithHex; g != w {
t.Errorf("ReadLogger mismatch\n\tgot: %q\n\twant: %q", g, w)
}
}
func TestReadLogger_errorOnRead(t *testing.T) {
olw := log.Writer()
olf := log.Flags()
olp := log.Prefix()
// Revert the original log settings before we exit.
defer func() {
log.SetFlags(olf)
log.SetPrefix(olp)
log.SetOutput(olw)
}()
lOut := new(bytes.Buffer)
log.SetPrefix("lr: ")
log.SetOutput(lOut)
log.SetFlags(0)
data := []byte("Hello, World!")
p := make([]byte, len(data))
lr := ErrReader(errors.New("io failure"))
rl := NewReadLogger("read", lr)
n, err := rl.Read(p)
if err == nil {
t.Fatalf("Unexpectedly succeeded to read: %v", err)
}
wantLogWithHex := fmt.Sprintf("lr: read %x: io failure\n", p[:n])
if g, w := lOut.String(), wantLogWithHex; g != w {
t.Errorf("ReadLogger mismatch\n\tgot: %q\n\twant: %q", g, w)
}
}