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

View as plain text