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 // The iotest package implements Readers and Writers
6 // useful only for testing.
14 // OneByteReader returns a Reader that implements
15 // each non-empty Read by reading one byte from r.
16 func OneByteReader(r io
.Reader
) io
.Reader
{ return &oneByteReader
{r
} }
18 type oneByteReader
struct {
22 func (r
*oneByteReader
) Read(p
[]byte) (int, os
.Error
) {
26 return r
.r
.Read(p
[0:1])
29 // HalfReader returns a Reader that implements Read
30 // by reading half as many requested bytes from r.
31 func HalfReader(r io
.Reader
) io
.Reader
{ return &halfReader
{r
} }
33 type halfReader
struct {
37 func (r
*halfReader
) Read(p
[]byte) (int, os
.Error
) {
38 return r
.r
.Read(p
[0 : (len(p
)+1)/2])
42 // DataErrReader returns a Reader that returns the final
43 // error with the last data read, instead of by itself with
44 // zero bytes of 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 os
.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
]
66 r
.unread
= r
.unread
[n
:]