| | |
| | |
| | |
| |
|
| | 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) |
| | |
| | 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) |
| | |
| | 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) |
| | } |
| | |
| | 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) |
| | |
| | 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) |
| | } |
| | |
| | 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) |
| | } |
| | |
| | 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) |
| | } |
| | |
| | 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) |
| | |
| | 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) |
| | } |
| | |
| | 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) |
| | } |
| | |
| | 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) |
| | } |
| | |
| | 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) |
| | } |
| | } |
| |
|