| // 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) |
| } |
| } |