1 // Copyright 2009 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.
5 // Package iotest implements Readers and Writers useful mainly for testing.
13 // OneByteReader returns a Reader that implements
14 // each non-empty Read by reading one byte from r.
15 func OneByteReader(r io
.Reader
) io
.Reader
{ return &oneByteReader
{r
} }
17 type oneByteReader
struct {
21 func (r
*oneByteReader
) Read(p
[]byte) (int, error
) {
25 return r
.r
.Read(p
[0:1])
28 // HalfReader returns a Reader that implements Read
29 // by reading half as many requested bytes from r.
30 func HalfReader(r io
.Reader
) io
.Reader
{ return &halfReader
{r
} }
32 type halfReader
struct {
36 func (r
*halfReader
) Read(p
[]byte) (int, error
) {
37 return r
.r
.Read(p
[0 : (len(p
)+1)/2])
40 // DataErrReader changes the way errors are handled by a Reader. Normally, a
41 // Reader returns an error (typically EOF) from the first Read call after the
42 // last piece of data is read. DataErrReader wraps a Reader and changes its
43 // behavior so the final error is returned along with the final data, instead
44 // of in the first call after the final data.
45 func DataErrReader(r io
.Reader
) io
.Reader
{ return &dataErrReader
{r
, nil, make([]byte, 1024)} }
47 type dataErrReader
struct {
53 func (r
*dataErrReader
) Read(p
[]byte) (n
int, err error
) {
54 // loop because first call needs two reads:
55 // one to get data and a second to look for an error.
57 if len(r
.unread
) == 0 {
58 n1
, err1
:= r
.r
.Read(r
.data
)
59 r
.unread
= r
.data
[0:n1
]
62 if n
> 0 || err
!= nil {
66 r
.unread
= r
.unread
[n
:]
71 var ErrTimeout
= errors
.New("timeout")
73 // TimeoutReader returns ErrTimeout on the second read
74 // with no data. Subsequent calls to read succeed.
75 func TimeoutReader(r io
.Reader
) io
.Reader
{ return &timeoutReader
{r
, 0} }
77 type timeoutReader
struct {
82 func (r
*timeoutReader
) Read(p
[]byte) (int, error
) {