Source file src/testing/iotest/logger_test.go

     1  // Copyright 2019 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package iotest
     6  
     7  import (
     8  	"bytes"
     9  	"errors"
    10  	"fmt"
    11  	"log"
    12  	"testing"
    13  )
    14  
    15  type errWriter struct {
    16  	err error
    17  }
    18  
    19  func (w errWriter) Write([]byte) (int, error) {
    20  	return 0, w.err
    21  }
    22  
    23  func TestWriteLogger(t *testing.T) {
    24  	olw := log.Writer()
    25  	olf := log.Flags()
    26  	olp := log.Prefix()
    27  
    28  	// Revert the original log settings before we exit.
    29  	defer func() {
    30  		log.SetFlags(olf)
    31  		log.SetPrefix(olp)
    32  		log.SetOutput(olw)
    33  	}()
    34  
    35  	lOut := new(bytes.Buffer)
    36  	log.SetPrefix("lw: ")
    37  	log.SetOutput(lOut)
    38  	log.SetFlags(0)
    39  
    40  	lw := new(bytes.Buffer)
    41  	wl := NewWriteLogger("write:", lw)
    42  	if _, err := wl.Write([]byte("Hello, World!")); err != nil {
    43  		t.Fatalf("Unexpectedly failed to write: %v", err)
    44  	}
    45  
    46  	if g, w := lw.String(), "Hello, World!"; g != w {
    47  		t.Errorf("WriteLogger mismatch\n\tgot:  %q\n\twant: %q", g, w)
    48  	}
    49  	wantLogWithHex := fmt.Sprintf("lw: write: %x\n", "Hello, World!")
    50  	if g, w := lOut.String(), wantLogWithHex; g != w {
    51  		t.Errorf("WriteLogger mismatch\n\tgot:  %q\n\twant: %q", g, w)
    52  	}
    53  }
    54  
    55  func TestWriteLogger_errorOnWrite(t *testing.T) {
    56  	olw := log.Writer()
    57  	olf := log.Flags()
    58  	olp := log.Prefix()
    59  
    60  	// Revert the original log settings before we exit.
    61  	defer func() {
    62  		log.SetFlags(olf)
    63  		log.SetPrefix(olp)
    64  		log.SetOutput(olw)
    65  	}()
    66  
    67  	lOut := new(bytes.Buffer)
    68  	log.SetPrefix("lw: ")
    69  	log.SetOutput(lOut)
    70  	log.SetFlags(0)
    71  
    72  	lw := errWriter{err: errors.New("Write Error!")}
    73  	wl := NewWriteLogger("write:", lw)
    74  	if _, err := wl.Write([]byte("Hello, World!")); err == nil {
    75  		t.Fatalf("Unexpectedly succeeded to write: %v", err)
    76  	}
    77  
    78  	wantLogWithHex := fmt.Sprintf("lw: write: %x: %v\n", "", "Write Error!")
    79  	if g, w := lOut.String(), wantLogWithHex; g != w {
    80  		t.Errorf("WriteLogger mismatch\n\tgot:  %q\n\twant: %q", g, w)
    81  	}
    82  }
    83  
    84  func TestReadLogger(t *testing.T) {
    85  	olw := log.Writer()
    86  	olf := log.Flags()
    87  	olp := log.Prefix()
    88  
    89  	// Revert the original log settings before we exit.
    90  	defer func() {
    91  		log.SetFlags(olf)
    92  		log.SetPrefix(olp)
    93  		log.SetOutput(olw)
    94  	}()
    95  
    96  	lOut := new(bytes.Buffer)
    97  	log.SetPrefix("lr: ")
    98  	log.SetOutput(lOut)
    99  	log.SetFlags(0)
   100  
   101  	data := []byte("Hello, World!")
   102  	p := make([]byte, len(data))
   103  	lr := bytes.NewReader(data)
   104  	rl := NewReadLogger("read:", lr)
   105  
   106  	n, err := rl.Read(p)
   107  	if err != nil {
   108  		t.Fatalf("Unexpectedly failed to read: %v", err)
   109  	}
   110  
   111  	if g, w := p[:n], data; !bytes.Equal(g, w) {
   112  		t.Errorf("ReadLogger mismatch\n\tgot:  %q\n\twant: %q", g, w)
   113  	}
   114  
   115  	wantLogWithHex := fmt.Sprintf("lr: read: %x\n", "Hello, World!")
   116  	if g, w := lOut.String(), wantLogWithHex; g != w {
   117  		t.Errorf("ReadLogger mismatch\n\tgot:  %q\n\twant: %q", g, w)
   118  	}
   119  }
   120  
   121  func TestReadLogger_errorOnRead(t *testing.T) {
   122  	olw := log.Writer()
   123  	olf := log.Flags()
   124  	olp := log.Prefix()
   125  
   126  	// Revert the original log settings before we exit.
   127  	defer func() {
   128  		log.SetFlags(olf)
   129  		log.SetPrefix(olp)
   130  		log.SetOutput(olw)
   131  	}()
   132  
   133  	lOut := new(bytes.Buffer)
   134  	log.SetPrefix("lr: ")
   135  	log.SetOutput(lOut)
   136  	log.SetFlags(0)
   137  
   138  	data := []byte("Hello, World!")
   139  	p := make([]byte, len(data))
   140  
   141  	lr := ErrReader(errors.New("io failure"))
   142  	rl := NewReadLogger("read", lr)
   143  	n, err := rl.Read(p)
   144  	if err == nil {
   145  		t.Fatalf("Unexpectedly succeeded to read: %v", err)
   146  	}
   147  
   148  	wantLogWithHex := fmt.Sprintf("lr: read %x: io failure\n", p[:n])
   149  	if g, w := lOut.String(), wantLogWithHex; g != w {
   150  		t.Errorf("ReadLogger mismatch\n\tgot:  %q\n\twant: %q", g, w)
   151  	}
   152  }
   153  

View as plain text