| 251 | } |
| 252 | |
| 253 | func (e *Expecter) ReadLine(ctx context.Context) string { |
| 254 | e.t.Helper() |
| 255 | |
| 256 | var buffer bytes.Buffer |
| 257 | err := e.doMatchWithDeadline(ctx, "ReadLine", func(rd *bufio.Reader) error { |
| 258 | for { |
| 259 | r, _, err := rd.ReadRune() |
| 260 | if err != nil { |
| 261 | return err |
| 262 | } |
| 263 | if r == '\n' { |
| 264 | return nil |
| 265 | } |
| 266 | if r == '\r' { |
| 267 | // Peek the next rune to see if it's an LF and then consume |
| 268 | // it. |
| 269 | |
| 270 | // Unicode code points can be up to 4 bytes, but the |
| 271 | // ones we're looking for are only 1 byte. |
| 272 | b, _ := rd.Peek(1) |
| 273 | if len(b) == 0 { |
| 274 | return nil |
| 275 | } |
| 276 | |
| 277 | r, _ = utf8.DecodeRune(b) |
| 278 | if r == '\n' { |
| 279 | _, _, err = rd.ReadRune() |
| 280 | if err != nil { |
| 281 | return err |
| 282 | } |
| 283 | } |
| 284 | |
| 285 | return nil |
| 286 | } |
| 287 | |
| 288 | _, err = buffer.WriteRune(r) |
| 289 | if err != nil { |
| 290 | return err |
| 291 | } |
| 292 | } |
| 293 | }) |
| 294 | if err != nil { |
| 295 | e.fatalf("read error", "%v (wanted newline; got %q)", err, buffer.String()) |
| 296 | return "" |
| 297 | } |
| 298 | e.Logf("matched newline = %q", buffer.String()) |
| 299 | return buffer.String() |
| 300 | } |
| 301 | |
| 302 | func (e *Expecter) ReadAll() []byte { |
| 303 | e.t.Helper() |