| // 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" | |
| "io" | |
| "strings" | |
| "testing" | |
| ) | |
| func TestOneByteReader_nonEmptyReader(t *testing.T) { | |
| msg := "Hello, World!" | |
| buf := new(bytes.Buffer) | |
| buf.WriteString(msg) | |
| obr := OneByteReader(buf) | |
| var b []byte | |
| n, err := obr.Read(b) | |
| if err != nil || n != 0 { | |
| t.Errorf("Empty buffer read returned n=%d err=%v", n, err) | |
| } | |
| b = make([]byte, 3) | |
| // Read from obr until EOF. | |
| got := new(strings.Builder) | |
| for i := 0; ; i++ { | |
| n, err = obr.Read(b) | |
| if err != nil { | |
| break | |
| } | |
| if g, w := n, 1; g != w { | |
| t.Errorf("Iteration #%d read %d bytes, want %d", i, g, w) | |
| } | |
| got.Write(b[:n]) | |
| } | |
| if g, w := err, io.EOF; g != w { | |
| t.Errorf("Unexpected error after reading all bytes\n\tGot: %v\n\tWant: %v", g, w) | |
| } | |
| if g, w := got.String(), "Hello, World!"; g != w { | |
| t.Errorf("Read mismatch\n\tGot: %q\n\tWant: %q", g, w) | |
| } | |
| } | |
| func TestOneByteReader_emptyReader(t *testing.T) { | |
| r := new(bytes.Buffer) | |
| obr := OneByteReader(r) | |
| var b []byte | |
| if n, err := obr.Read(b); err != nil || n != 0 { | |
| t.Errorf("Empty buffer read returned n=%d err=%v", n, err) | |
| } | |
| b = make([]byte, 5) | |
| n, err := obr.Read(b) | |
| if g, w := err, io.EOF; g != w { | |
| t.Errorf("Error mismatch\n\tGot: %v\n\tWant: %v", g, w) | |
| } | |
| if g, w := n, 0; g != w { | |
| t.Errorf("Unexpectedly read %d bytes, wanted %d", g, w) | |
| } | |
| } | |
| func TestHalfReader_nonEmptyReader(t *testing.T) { | |
| msg := "Hello, World!" | |
| buf := new(bytes.Buffer) | |
| buf.WriteString(msg) | |
| // empty read buffer | |
| hr := HalfReader(buf) | |
| var b []byte | |
| n, err := hr.Read(b) | |
| if err != nil || n != 0 { | |
| t.Errorf("Empty buffer read returned n=%d err=%v", n, err) | |
| } | |
| // non empty read buffer | |
| b = make([]byte, 2) | |
| got := new(strings.Builder) | |
| for i := 0; ; i++ { | |
| n, err = hr.Read(b) | |
| if err != nil { | |
| break | |
| } | |
| if g, w := n, 1; g != w { | |
| t.Errorf("Iteration #%d read %d bytes, want %d", i, g, w) | |
| } | |
| got.Write(b[:n]) | |
| } | |
| if g, w := err, io.EOF; g != w { | |
| t.Errorf("Unexpected error after reading all bytes\n\tGot: %v\n\tWant: %v", g, w) | |
| } | |
| if g, w := got.String(), "Hello, World!"; g != w { | |
| t.Errorf("Read mismatch\n\tGot: %q\n\tWant: %q", g, w) | |
| } | |
| } | |
| func TestHalfReader_emptyReader(t *testing.T) { | |
| r := new(bytes.Buffer) | |
| hr := HalfReader(r) | |
| var b []byte | |
| if n, err := hr.Read(b); err != nil || n != 0 { | |
| t.Errorf("Empty buffer read returned n=%d err=%v", n, err) | |
| } | |
| b = make([]byte, 5) | |
| n, err := hr.Read(b) | |
| if g, w := err, io.EOF; g != w { | |
| t.Errorf("Error mismatch\n\tGot: %v\n\tWant: %v", g, w) | |
| } | |
| if g, w := n, 0; g != w { | |
| t.Errorf("Unexpectedly read %d bytes, wanted %d", g, w) | |
| } | |
| } | |
| func TestTimeOutReader_nonEmptyReader(t *testing.T) { | |
| msg := "Hello, World!" | |
| buf := new(bytes.Buffer) | |
| buf.WriteString(msg) | |
| // empty read buffer | |
| tor := TimeoutReader(buf) | |
| var b []byte | |
| n, err := tor.Read(b) | |
| if err != nil || n != 0 { | |
| t.Errorf("Empty buffer read returned n=%d err=%v", n, err) | |
| } | |
| // Second call should timeout | |
| n, err = tor.Read(b) | |
| if g, w := err, ErrTimeout; g != w { | |
| t.Errorf("Error mismatch\n\tGot: %v\n\tWant: %v", g, w) | |
| } | |
| if g, w := n, 0; g != w { | |
| t.Errorf("Unexpectedly read %d bytes, wanted %d", g, w) | |
| } | |
| // non empty read buffer | |
| tor2 := TimeoutReader(buf) | |
| b = make([]byte, 3) | |
| if n, err := tor2.Read(b); err != nil || n == 0 { | |
| t.Errorf("Empty buffer read returned n=%d err=%v", n, err) | |
| } | |
| // Second call should timeout | |
| n, err = tor2.Read(b) | |
| if g, w := err, ErrTimeout; g != w { | |
| t.Errorf("Error mismatch\n\tGot: %v\n\tWant: %v", g, w) | |
| } | |
| if g, w := n, 0; g != w { | |
| t.Errorf("Unexpectedly read %d bytes, wanted %d", g, w) | |
| } | |
| } | |
| func TestTimeOutReader_emptyReader(t *testing.T) { | |
| r := new(bytes.Buffer) | |
| // empty read buffer | |
| tor := TimeoutReader(r) | |
| var b []byte | |
| if n, err := tor.Read(b); err != nil || n != 0 { | |
| t.Errorf("Empty buffer read returned n=%d err=%v", n, err) | |
| } | |
| // Second call should timeout | |
| n, err := tor.Read(b) | |
| if g, w := err, ErrTimeout; g != w { | |
| t.Errorf("Error mismatch\n\tGot: %v\n\tWant: %v", g, w) | |
| } | |
| if g, w := n, 0; g != w { | |
| t.Errorf("Unexpectedly read %d bytes, wanted %d", g, w) | |
| } | |
| // non empty read buffer | |
| tor2 := TimeoutReader(r) | |
| b = make([]byte, 5) | |
| if n, err := tor2.Read(b); err != io.EOF || n != 0 { | |
| t.Errorf("Empty buffer read returned n=%d err=%v", n, err) | |
| } | |
| // Second call should timeout | |
| n, err = tor2.Read(b) | |
| if g, w := err, ErrTimeout; g != w { | |
| t.Errorf("Error mismatch\n\tGot: %v\n\tWant: %v", g, w) | |
| } | |
| if g, w := n, 0; g != w { | |
| t.Errorf("Unexpectedly read %d bytes, wanted %d", g, w) | |
| } | |
| } | |
| func TestDataErrReader_nonEmptyReader(t *testing.T) { | |
| msg := "Hello, World!" | |
| buf := new(bytes.Buffer) | |
| buf.WriteString(msg) | |
| der := DataErrReader(buf) | |
| b := make([]byte, 3) | |
| got := new(strings.Builder) | |
| var n int | |
| var err error | |
| for { | |
| n, err = der.Read(b) | |
| got.Write(b[:n]) | |
| if err != nil { | |
| break | |
| } | |
| } | |
| if err != io.EOF || n == 0 { | |
| t.Errorf("Last Read returned n=%d err=%v", n, err) | |
| } | |
| if g, w := got.String(), "Hello, World!"; g != w { | |
| t.Errorf("Read mismatch\n\tGot: %q\n\tWant: %q", g, w) | |
| } | |
| } | |
| func TestDataErrReader_emptyReader(t *testing.T) { | |
| r := new(bytes.Buffer) | |
| der := DataErrReader(r) | |
| var b []byte | |
| if n, err := der.Read(b); err != io.EOF || n != 0 { | |
| t.Errorf("Empty buffer read returned n=%d err=%v", n, err) | |
| } | |
| b = make([]byte, 5) | |
| n, err := der.Read(b) | |
| if g, w := err, io.EOF; g != w { | |
| t.Errorf("Error mismatch\n\tGot: %v\n\tWant: %v", g, w) | |
| } | |
| if g, w := n, 0; g != w { | |
| t.Errorf("Unexpectedly read %d bytes, wanted %d", g, w) | |
| } | |
| } | |
| func TestErrReader(t *testing.T) { | |
| cases := []struct { | |
| name string | |
| err error | |
| }{ | |
| {"nil error", nil}, | |
| {"non-nil error", errors.New("io failure")}, | |
| {"io.EOF", io.EOF}, | |
| } | |
| for _, tt := range cases { | |
| t.Run(tt.name, func(t *testing.T) { | |
| n, err := ErrReader(tt.err).Read(nil) | |
| if err != tt.err { | |
| t.Fatalf("Error mismatch\nGot: %v\nWant: %v", err, tt.err) | |
| } | |
| if n != 0 { | |
| t.Fatalf("Byte count mismatch: got %d want 0", n) | |
| } | |
| }) | |
| } | |
| } | |
| func TestStringsReader(t *testing.T) { | |
| const msg = "Now is the time for all good gophers." | |
| r := strings.NewReader(msg) | |
| if err := TestReader(r, []byte(msg)); err != nil { | |
| t.Fatal(err) | |
| } | |
| } |