github.com/AndrienkoAleksandr/go@v0.0.19/src/testing/iotest/reader_test.go (about) 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 }