Source file src/testing/iotest/reader_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  	"io"
    11  	"strings"
    12  	"testing"
    13  )
    14  
    15  func TestOneByteReader_nonEmptyReader(t *testing.T) {
    16  	msg := "Hello, World!"
    17  	buf := new(bytes.Buffer)
    18  	buf.WriteString(msg)
    19  
    20  	obr := OneByteReader(buf)
    21  	var b []byte
    22  	n, err := obr.Read(b)
    23  	if err != nil || n != 0 {
    24  		t.Errorf("Empty buffer read returned n=%d err=%v", n, err)
    25  	}
    26  
    27  	b = make([]byte, 3)
    28  	// Read from obr until EOF.
    29  	got := new(strings.Builder)
    30  	for i := 0; ; i++ {
    31  		n, err = obr.Read(b)
    32  		if err != nil {
    33  			break
    34  		}
    35  		if g, w := n, 1; g != w {
    36  			t.Errorf("Iteration #%d read %d bytes, want %d", i, g, w)
    37  		}
    38  		got.Write(b[:n])
    39  	}
    40  	if g, w := err, io.EOF; g != w {
    41  		t.Errorf("Unexpected error after reading all bytes\n\tGot:  %v\n\tWant: %v", g, w)
    42  	}
    43  	if g, w := got.String(), "Hello, World!"; g != w {
    44  		t.Errorf("Read mismatch\n\tGot:  %q\n\tWant: %q", g, w)
    45  	}
    46  }
    47  
    48  func TestOneByteReader_emptyReader(t *testing.T) {
    49  	r := new(bytes.Buffer)
    50  
    51  	obr := OneByteReader(r)
    52  	var b []byte
    53  	if n, err := obr.Read(b); err != nil || n != 0 {
    54  		t.Errorf("Empty buffer read returned n=%d err=%v", n, err)
    55  	}
    56  
    57  	b = make([]byte, 5)
    58  	n, err := obr.Read(b)
    59  	if g, w := err, io.EOF; g != w {
    60  		t.Errorf("Error mismatch\n\tGot:  %v\n\tWant: %v", g, w)
    61  	}
    62  	if g, w := n, 0; g != w {
    63  		t.Errorf("Unexpectedly read %d bytes, wanted %d", g, w)
    64  	}
    65  }
    66  
    67  func TestHalfReader_nonEmptyReader(t *testing.T) {
    68  	msg := "Hello, World!"
    69  	buf := new(bytes.Buffer)
    70  	buf.WriteString(msg)
    71  	// empty read buffer
    72  	hr := HalfReader(buf)
    73  	var b []byte
    74  	n, err := hr.Read(b)
    75  	if err != nil || n != 0 {
    76  		t.Errorf("Empty buffer read returned n=%d err=%v", n, err)
    77  	}
    78  	// non empty read buffer
    79  	b = make([]byte, 2)
    80  	got := new(strings.Builder)
    81  	for i := 0; ; i++ {
    82  		n, err = hr.Read(b)
    83  		if err != nil {
    84  			break
    85  		}
    86  		if g, w := n, 1; g != w {
    87  			t.Errorf("Iteration #%d read %d bytes, want %d", i, g, w)
    88  		}
    89  		got.Write(b[:n])
    90  	}
    91  	if g, w := err, io.EOF; g != w {
    92  		t.Errorf("Unexpected error after reading all bytes\n\tGot:  %v\n\tWant: %v", g, w)
    93  	}
    94  	if g, w := got.String(), "Hello, World!"; g != w {
    95  		t.Errorf("Read mismatch\n\tGot:  %q\n\tWant: %q", g, w)
    96  	}
    97  }
    98  
    99  func TestHalfReader_emptyReader(t *testing.T) {
   100  	r := new(bytes.Buffer)
   101  
   102  	hr := HalfReader(r)
   103  	var b []byte
   104  	if n, err := hr.Read(b); err != nil || n != 0 {
   105  		t.Errorf("Empty buffer read returned n=%d err=%v", n, err)
   106  	}
   107  
   108  	b = make([]byte, 5)
   109  	n, err := hr.Read(b)
   110  	if g, w := err, io.EOF; g != w {
   111  		t.Errorf("Error mismatch\n\tGot:  %v\n\tWant: %v", g, w)
   112  	}
   113  	if g, w := n, 0; g != w {
   114  		t.Errorf("Unexpectedly read %d bytes, wanted %d", g, w)
   115  	}
   116  }
   117  
   118  func TestTimeOutReader_nonEmptyReader(t *testing.T) {
   119  	msg := "Hello, World!"
   120  	buf := new(bytes.Buffer)
   121  	buf.WriteString(msg)
   122  	// empty read buffer
   123  	tor := TimeoutReader(buf)
   124  	var b []byte
   125  	n, err := tor.Read(b)
   126  	if err != nil || n != 0 {
   127  		t.Errorf("Empty buffer read returned n=%d err=%v", n, err)
   128  	}
   129  	// Second call should timeout
   130  	n, err = tor.Read(b)
   131  	if g, w := err, ErrTimeout; g != w {
   132  		t.Errorf("Error mismatch\n\tGot:  %v\n\tWant: %v", g, w)
   133  	}
   134  	if g, w := n, 0; g != w {
   135  		t.Errorf("Unexpectedly read %d bytes, wanted %d", g, w)
   136  	}
   137  	// non empty read buffer
   138  	tor2 := TimeoutReader(buf)
   139  	b = make([]byte, 3)
   140  	if n, err := tor2.Read(b); err != nil || n == 0 {
   141  		t.Errorf("Empty buffer read returned n=%d err=%v", n, err)
   142  	}
   143  	// Second call should timeout
   144  	n, err = tor2.Read(b)
   145  	if g, w := err, ErrTimeout; g != w {
   146  		t.Errorf("Error mismatch\n\tGot:  %v\n\tWant: %v", g, w)
   147  	}
   148  	if g, w := n, 0; g != w {
   149  		t.Errorf("Unexpectedly read %d bytes, wanted %d", g, w)
   150  	}
   151  }
   152  
   153  func TestTimeOutReader_emptyReader(t *testing.T) {
   154  	r := new(bytes.Buffer)
   155  	// empty read buffer
   156  	tor := TimeoutReader(r)
   157  	var b []byte
   158  	if n, err := tor.Read(b); err != nil || n != 0 {
   159  		t.Errorf("Empty buffer read returned n=%d err=%v", n, err)
   160  	}
   161  	// Second call should timeout
   162  	n, err := tor.Read(b)
   163  	if g, w := err, ErrTimeout; g != w {
   164  		t.Errorf("Error mismatch\n\tGot:  %v\n\tWant: %v", g, w)
   165  	}
   166  	if g, w := n, 0; g != w {
   167  		t.Errorf("Unexpectedly read %d bytes, wanted %d", g, w)
   168  	}
   169  	// non empty read buffer
   170  	tor2 := TimeoutReader(r)
   171  	b = make([]byte, 5)
   172  	if n, err := tor2.Read(b); err != io.EOF || n != 0 {
   173  		t.Errorf("Empty buffer read returned n=%d err=%v", n, err)
   174  	}
   175  	// Second call should timeout
   176  	n, err = tor2.Read(b)
   177  	if g, w := err, ErrTimeout; g != w {
   178  		t.Errorf("Error mismatch\n\tGot:  %v\n\tWant: %v", g, w)
   179  	}
   180  	if g, w := n, 0; g != w {
   181  		t.Errorf("Unexpectedly read %d bytes, wanted %d", g, w)
   182  	}
   183  }
   184  
   185  func TestDataErrReader_nonEmptyReader(t *testing.T) {
   186  	msg := "Hello, World!"
   187  	buf := new(bytes.Buffer)
   188  	buf.WriteString(msg)
   189  
   190  	der := DataErrReader(buf)
   191  
   192  	b := make([]byte, 3)
   193  	got := new(strings.Builder)
   194  	var n int
   195  	var err error
   196  	for {
   197  		n, err = der.Read(b)
   198  		got.Write(b[:n])
   199  		if err != nil {
   200  			break
   201  		}
   202  	}
   203  	if err != io.EOF || n == 0 {
   204  		t.Errorf("Last Read returned n=%d err=%v", n, err)
   205  	}
   206  	if g, w := got.String(), "Hello, World!"; g != w {
   207  		t.Errorf("Read mismatch\n\tGot:  %q\n\tWant: %q", g, w)
   208  	}
   209  }
   210  
   211  func TestDataErrReader_emptyReader(t *testing.T) {
   212  	r := new(bytes.Buffer)
   213  
   214  	der := DataErrReader(r)
   215  	var b []byte
   216  	if n, err := der.Read(b); err != io.EOF || n != 0 {
   217  		t.Errorf("Empty buffer read returned n=%d err=%v", n, err)
   218  	}
   219  
   220  	b = make([]byte, 5)
   221  	n, err := der.Read(b)
   222  	if g, w := err, io.EOF; g != w {
   223  		t.Errorf("Error mismatch\n\tGot:  %v\n\tWant: %v", g, w)
   224  	}
   225  	if g, w := n, 0; g != w {
   226  		t.Errorf("Unexpectedly read %d bytes, wanted %d", g, w)
   227  	}
   228  }
   229  
   230  func TestErrReader(t *testing.T) {
   231  	cases := []struct {
   232  		name string
   233  		err  error
   234  	}{
   235  		{"nil error", nil},
   236  		{"non-nil error", errors.New("io failure")},
   237  		{"io.EOF", io.EOF},
   238  	}
   239  
   240  	for _, tt := range cases {
   241  		tt := tt
   242  		t.Run(tt.name, func(t *testing.T) {
   243  			n, err := ErrReader(tt.err).Read(nil)
   244  			if err != tt.err {
   245  				t.Fatalf("Error mismatch\nGot:  %v\nWant: %v", err, tt.err)
   246  			}
   247  			if n != 0 {
   248  				t.Fatalf("Byte count mismatch: got %d want 0", n)
   249  			}
   250  		})
   251  	}
   252  }
   253  
   254  func TestStringsReader(t *testing.T) {
   255  	const msg = "Now is the time for all good gophers."
   256  
   257  	r := strings.NewReader(msg)
   258  	if err := TestReader(r, []byte(msg)); err != nil {
   259  		t.Fatal(err)
   260  	}
   261  }
   262  

View as plain text