X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/08fe6b0770ad8b4aa5115052126f1e0d51dca1fa..d235817fee3a904eeff85381c1a5227474900852:/sdk/go/asyncbuf/buf_test.go diff --git a/sdk/go/asyncbuf/buf_test.go b/sdk/go/asyncbuf/buf_test.go index 198ebaf512..cc742a8cbe 100644 --- a/sdk/go/asyncbuf/buf_test.go +++ b/sdk/go/asyncbuf/buf_test.go @@ -90,6 +90,53 @@ func (s *Suite) TestWriteReadCloseRead(c *check.C) { <-done } +func (s *Suite) TestReadAtEOF(c *check.C) { + buf := make([]byte, 8) + + b := NewBuffer([]byte{1, 2, 3}) + + r := b.NewReader() + n, err := r.Read(buf) + c.Check(n, check.Equals, 3) + c.Check(err, check.IsNil) + + // Reading zero bytes at EOF, but before Close(), doesn't + // block or error + done := make(chan bool) + go func() { + defer close(done) + n, err = r.Read(buf[:0]) + c.Check(n, check.Equals, 0) + c.Check(err, check.IsNil) + }() + select { + case <-done: + case <-time.After(time.Second): + c.Error("timeout") + } + + b.Close() + + // Reading zero bytes after Close() returns EOF + n, err = r.Read(buf[:0]) + c.Check(n, check.Equals, 0) + c.Check(err, check.Equals, io.EOF) + + // Reading from start after Close() returns 3 bytes, then EOF + r = b.NewReader() + n, err = r.Read(buf) + c.Check(n, check.Equals, 3) + if err != nil { + c.Check(err, check.Equals, io.EOF) + } + n, err = r.Read(buf[:0]) + c.Check(n, check.Equals, 0) + c.Check(err, check.Equals, io.EOF) + n, err = r.Read(buf) + c.Check(n, check.Equals, 0) + c.Check(err, check.Equals, io.EOF) +} + func (s *Suite) TestCloseWithError(c *check.C) { errFake := errors.New("it's not even a real error")