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 // Buffer for reads from 'r'
148 buffer := make([]byte, 512)
150 // Read requests on Transfer() buffer
151 requests := make(chan ReadRequest)
152 defer close(requests)
154 // Reporting reader error states
155 reader_status := make(chan error)
157 go Transfer(buffer, reader, requests, reader_status)
159 br1 := MakeBufferReader(requests)
160 out := make([]byte, 128)
163 // Write some data, and read into a buffer shorter than
165 for i := 0; i < 128; i += 1 {
169 writer.Write(out[:100])
171 in := make([]byte, 64)
172 n, err := br1.Read(in)
174 c.Check(n, Equals, 64)
175 c.Check(err, Equals, nil)
177 for i := 0; i < 64; i += 1 {
178 c.Check(in[i], Equals, out[i])
183 // Write some more data, and read into buffer longer than
185 in := make([]byte, 64)
186 n, err := br1.Read(in)
187 c.Check(n, Equals, 36)
188 c.Check(err, Equals, nil)
190 for i := 0; i < 36; i += 1 {
191 c.Check(in[i], Equals, out[64+i])
197 // Test read before write
203 in := make([]byte, 64)
206 n, err := br1.Read(in)
210 time.Sleep(100 * time.Millisecond)
211 writer.Write(out[100:])
215 c.Check(got.n, Equals, 28)
216 c.Check(got.err, Equals, nil)
218 for i := 0; i < 28; i += 1 {
219 c.Check(in[i], Equals, out[100+i])
223 br2 := MakeBufferReader(requests)
225 // Test 'catch up' reader
226 in := make([]byte, 256)
227 n, err := br2.Read(in)
229 c.Check(n, Equals, 128)
230 c.Check(err, Equals, nil)
232 for i := 0; i < 128; i += 1 {
233 c.Check(in[i], Equals, out[i])
238 // Test closing the reader
240 status := <-reader_status
241 c.Check(status, Equals, io.EOF)
243 in := make([]byte, 256)
244 n1, err1 := br1.Read(in)
245 n2, err2 := br2.Read(in)
246 c.Check(n1, Equals, 0)
247 c.Check(err1, Equals, io.EOF)
248 c.Check(n2, Equals, 0)
249 c.Check(err2, Equals, io.EOF)
253 // Test 'catch up' reader after closing
254 br3 := MakeBufferReader(requests)
255 in := make([]byte, 256)
256 n, err := br3.Read(in)
258 c.Check(n, Equals, 128)
259 c.Check(err, Equals, nil)
261 for i := 0; i < 128; i += 1 {
262 c.Check(in[i], Equals, out[i])
265 n, err = br3.Read(in)
267 c.Check(n, Equals, 0)
268 c.Check(err, Equals, io.EOF)
272 func (s *StandaloneSuite) TestTransferShortBuffer(c *C) {
273 reader, writer := io.Pipe()
275 // Buffer for reads from 'r'
276 buffer := make([]byte, 100)
278 // Read requests on Transfer() buffer
279 requests := make(chan ReadRequest)
280 defer close(requests)
282 // Reporting reader error states
283 reader_status := make(chan error)
285 go Transfer(buffer, reader, requests, reader_status)
287 out := make([]byte, 101)
290 status := <-reader_status
291 c.Check(status, Equals, io.ErrShortBuffer)
294 func (s *StandaloneSuite) TestTransferFromBuffer(c *C) {
295 // Buffer for reads from 'r'
296 buffer := make([]byte, 100)
297 for i := 0; i < 100; i += 1 {
301 // Read requests on Transfer() buffer
302 requests := make(chan ReadRequest)
303 defer close(requests)
305 go Transfer(buffer, nil, requests, nil)
307 br1 := MakeBufferReader(requests)
309 in := make([]byte, 64)
311 n, err := br1.Read(in)
313 c.Check(n, Equals, 64)
314 c.Check(err, Equals, nil)
316 for i := 0; i < 64; i += 1 {
317 c.Check(in[i], Equals, buffer[i])
321 n, err := br1.Read(in)
323 c.Check(n, Equals, 36)
324 c.Check(err, Equals, nil)
326 for i := 0; i < 36; i += 1 {
327 c.Check(in[i], Equals, buffer[64+i])
331 n, err := br1.Read(in)
333 c.Check(n, Equals, 0)
334 c.Check(err, Equals, io.EOF)
338 func (s *StandaloneSuite) TestTransferIoCopy(c *C) {
339 // Buffer for reads from 'r'
340 buffer := make([]byte, 100)
341 for i := 0; i < 100; i += 1 {
345 // Read requests on Transfer() buffer
346 requests := make(chan ReadRequest)
347 defer close(requests)
349 go Transfer(buffer, nil, requests, nil)
351 br1 := MakeBufferReader(requests)
353 reader, writer := io.Pipe()
356 p := make([]byte, 100)
357 n, err := reader.Read(p)
358 c.Check(n, Equals, 100)
359 c.Check(err, Equals, nil)
360 c.Check(p, DeepEquals, buffer)