| // 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 { |
| tt := tt |
| 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) |
| } |
| } |