10 // Gocheck boilerplate
11 func Test(t *testing.T) { TestingT(t) }
13 var _ = Suite(&StandaloneSuite{})
16 type StandaloneSuite struct{}
18 func ReadIntoBufferHelper(c *C, bufsize int) {
19 buffer := make([]byte, bufsize)
21 reader, writer := io.Pipe()
22 slices := make(chan readerSlice)
24 go readIntoBuffer(buffer, reader, slices)
27 out := make([]byte, 128)
28 for i := 0; i < 128; i += 1 {
33 c.Check(len(s1.slice), Equals, 128)
34 c.Check(s1.reader_error, Equals, nil)
35 for i := 0; i < 128; i += 1 {
36 c.Check(s1.slice[i], Equals, byte(i))
38 for i := 0; i < len(buffer); i += 1 {
40 c.Check(buffer[i], Equals, byte(i))
42 c.Check(buffer[i], Equals, byte(0))
47 out := make([]byte, 96)
48 for i := 0; i < 96; i += 1 {
53 c.Check(len(s1.slice), Equals, 96)
54 c.Check(s1.reader_error, Equals, nil)
55 for i := 0; i < 96; i += 1 {
56 c.Check(s1.slice[i], Equals, byte(i/2))
58 for i := 0; i < len(buffer); i += 1 {
60 c.Check(buffer[i], Equals, byte(i))
61 } else if i < (128 + 96) {
62 c.Check(buffer[i], Equals, byte((i-128)/2))
64 c.Check(buffer[i], Equals, byte(0))
71 c.Check(len(s1.slice), Equals, 0)
72 c.Check(s1.reader_error, Equals, io.EOF)
76 func (s *StandaloneSuite) TestReadIntoBuffer(c *C) {
77 ReadIntoBufferHelper(c, 512)
78 ReadIntoBufferHelper(c, 225)
79 ReadIntoBufferHelper(c, 224)
82 func (s *StandaloneSuite) TestReadIntoShortBuffer(c *C) {
83 buffer := make([]byte, 223)
84 reader, writer := io.Pipe()
85 slices := make(chan readerSlice)
87 go readIntoBuffer(buffer, reader, slices)
90 out := make([]byte, 128)
91 for i := 0; i < 128; i += 1 {
96 c.Check(len(s1.slice), Equals, 128)
97 c.Check(s1.reader_error, Equals, nil)
98 for i := 0; i < 128; i += 1 {
99 c.Check(s1.slice[i], Equals, byte(i))
101 for i := 0; i < len(buffer); i += 1 {
103 c.Check(buffer[i], Equals, byte(i))
105 c.Check(buffer[i], Equals, byte(0))
110 out := make([]byte, 96)
111 for i := 0; i < 96; i += 1 {
115 // Write will deadlock because it can't write all the data, so
116 // spin it off to a goroutine
120 c.Check(len(s1.slice), Equals, 95)
121 c.Check(s1.reader_error, Equals, nil)
122 for i := 0; i < 95; i += 1 {
123 c.Check(s1.slice[i], Equals, byte(i/2))
125 for i := 0; i < len(buffer); i += 1 {
127 c.Check(buffer[i], Equals, byte(i))
128 } else if i < (128 + 95) {
129 c.Check(buffer[i], Equals, byte((i-128)/2))
131 c.Check(buffer[i], Equals, byte(0))
138 c.Check(len(s1.slice), Equals, 0)
139 c.Check(s1.reader_error, Equals, io.ErrShortBuffer)
144 func (s *StandaloneSuite) TestTransfer(c *C) {
145 reader, writer := io.Pipe()
147 tr := StartTransferFromReader(512, reader)
149 br1 := tr.MakeBufferReader()
150 out := make([]byte, 128)
153 // Write some data, and read into a buffer shorter than
155 for i := 0; i < 128; i += 1 {
159 writer.Write(out[:100])
161 in := make([]byte, 64)
162 n, err := br1.Read(in)
164 c.Check(n, Equals, 64)
165 c.Check(err, Equals, nil)
167 for i := 0; i < 64; i += 1 {
168 c.Check(in[i], Equals, out[i])
173 // Write some more data, and read into buffer longer than
175 in := make([]byte, 64)
176 n, err := br1.Read(in)
177 c.Check(n, Equals, 36)
178 c.Check(err, Equals, nil)
180 for i := 0; i < 36; i += 1 {
181 c.Check(in[i], Equals, out[64+i])
187 // Test read before write
193 in := make([]byte, 64)
196 n, err := br1.Read(in)
200 time.Sleep(100 * time.Millisecond)
201 writer.Write(out[100:])
205 c.Check(got.n, Equals, 28)
206 c.Check(got.err, Equals, nil)
208 for i := 0; i < 28; i += 1 {
209 c.Check(in[i], Equals, out[100+i])
213 br2 := tr.MakeBufferReader()
215 // Test 'catch up' reader
216 in := make([]byte, 256)
217 n, err := br2.Read(in)
219 c.Check(n, Equals, 128)
220 c.Check(err, Equals, nil)
222 for i := 0; i < 128; i += 1 {
223 c.Check(in[i], Equals, out[i])
228 // Test closing the reader
230 status := <-tr.Reader_status
231 c.Check(status, Equals, io.EOF)
233 in := make([]byte, 256)
234 n1, err1 := br1.Read(in)
235 n2, err2 := br2.Read(in)
236 c.Check(n1, Equals, 0)
237 c.Check(err1, Equals, io.EOF)
238 c.Check(n2, Equals, 0)
239 c.Check(err2, Equals, io.EOF)
243 // Test 'catch up' reader after closing
244 br3 := tr.MakeBufferReader()
245 in := make([]byte, 256)
246 n, err := br3.Read(in)
248 c.Check(n, Equals, 128)
249 c.Check(err, Equals, nil)
251 for i := 0; i < 128; i += 1 {
252 c.Check(in[i], Equals, out[i])
255 n, err = br3.Read(in)
257 c.Check(n, Equals, 0)
258 c.Check(err, Equals, io.EOF)
262 func (s *StandaloneSuite) TestTransferShortBuffer(c *C) {
263 reader, writer := io.Pipe()
265 // Buffer for reads from 'r'
266 buffer := make([]byte, 100)
268 // Read requests on Transfer() buffer
269 requests := make(chan readRequest)
270 defer close(requests)
272 // Reporting reader error states
273 reader_status := make(chan error)
275 go transfer(buffer, reader, requests, reader_status)
277 out := make([]byte, 101)
280 status := <-reader_status
281 c.Check(status, Equals, io.ErrShortBuffer)
284 func (s *StandaloneSuite) TestTransferFromBuffer(c *C) {
285 // Buffer for reads from 'r'
286 buffer := make([]byte, 100)
287 for i := 0; i < 100; i += 1 {
291 tr := StartTransferFromSlice(buffer)
293 br1 := tr.MakeBufferReader()
295 in := make([]byte, 64)
297 n, err := br1.Read(in)
299 c.Check(n, Equals, 64)
300 c.Check(err, Equals, nil)
302 for i := 0; i < 64; i += 1 {
303 c.Check(in[i], Equals, buffer[i])
307 n, err := br1.Read(in)
309 c.Check(n, Equals, 36)
310 c.Check(err, Equals, nil)
312 for i := 0; i < 36; i += 1 {
313 c.Check(in[i], Equals, buffer[64+i])
317 n, err := br1.Read(in)
319 c.Check(n, Equals, 0)
320 c.Check(err, Equals, io.EOF)
324 func (s *StandaloneSuite) TestTransferIoCopy(c *C) {
325 // Buffer for reads from 'r'
326 buffer := make([]byte, 100)
327 for i := 0; i < 100; i += 1 {
331 tr := StartTransferFromSlice(buffer)
333 br1 := tr.MakeBufferReader()
335 reader, writer := io.Pipe()
338 p := make([]byte, 100)
339 n, err := reader.Read(p)
340 c.Check(n, Equals, 100)
341 c.Check(err, Equals, nil)
342 c.Check(p, DeepEquals, buffer)