Commit 01182425 authored by Brad Fitzpatrick's avatar Brad Fitzpatrick

strings, bytes: fix Reader 0 byte read at EOF

0 byte reads at EOF weren't returning EOF.

Change-Id: I19b5fd5a72e83d49566a230ce4067be03f00d14b
Reviewed-on: https://go-review.googlesource.com/22740Reviewed-by: 's avatarBryan Mills <bcmills@google.com>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 15f7a66f
...@@ -36,9 +36,6 @@ func (r *Reader) Len() int { ...@@ -36,9 +36,6 @@ func (r *Reader) Len() int {
func (r *Reader) Size() int64 { return int64(len(r.s)) } func (r *Reader) Size() int64 { return int64(len(r.s)) }
func (r *Reader) Read(b []byte) (n int, err error) { func (r *Reader) Read(b []byte) (n int, err error) {
if len(b) == 0 {
return 0, nil
}
if r.i >= int64(len(r.s)) { if r.i >= int64(len(r.s)) {
return 0, io.EOF return 0, io.EOF
} }
......
...@@ -21,14 +21,15 @@ func TestReader(t *testing.T) { ...@@ -21,14 +21,15 @@ func TestReader(t *testing.T) {
n int n int
want string want string
wantpos int64 wantpos int64
readerr error
seekerr string seekerr string
}{ }{
{seek: io.SeekStart, off: 0, n: 20, want: "0123456789"}, {seek: io.SeekStart, off: 0, n: 20, want: "0123456789"},
{seek: io.SeekStart, off: 1, n: 1, want: "1"}, {seek: io.SeekStart, off: 1, n: 1, want: "1"},
{seek: io.SeekCurrent, off: 1, wantpos: 3, n: 2, want: "34"}, {seek: io.SeekCurrent, off: 1, wantpos: 3, n: 2, want: "34"},
{seek: io.SeekStart, off: -1, seekerr: "bytes.Reader.Seek: negative position"}, {seek: io.SeekStart, off: -1, seekerr: "bytes.Reader.Seek: negative position"},
{seek: io.SeekStart, off: 1 << 33, wantpos: 1 << 33}, {seek: io.SeekStart, off: 1 << 33, wantpos: 1 << 33, readerr: io.EOF},
{seek: io.SeekCurrent, off: 1, wantpos: 1<<33 + 1}, {seek: io.SeekCurrent, off: 1, wantpos: 1<<33 + 1, readerr: io.EOF},
{seek: io.SeekStart, n: 5, want: "01234"}, {seek: io.SeekStart, n: 5, want: "01234"},
{seek: io.SeekCurrent, n: 5, want: "56789"}, {seek: io.SeekCurrent, n: 5, want: "56789"},
{seek: io.SeekEnd, off: -1, n: 1, wantpos: 9, want: "9"}, {seek: io.SeekEnd, off: -1, n: 1, wantpos: 9, want: "9"},
...@@ -49,8 +50,8 @@ func TestReader(t *testing.T) { ...@@ -49,8 +50,8 @@ func TestReader(t *testing.T) {
} }
buf := make([]byte, tt.n) buf := make([]byte, tt.n)
n, err := r.Read(buf) n, err := r.Read(buf)
if err != nil { if err != tt.readerr {
t.Errorf("%d. read = %v", i, err) t.Errorf("%d. read = %v; want %v", i, err, tt.readerr)
continue continue
} }
got := string(buf[:n]) got := string(buf[:n])
...@@ -173,7 +174,7 @@ func TestReaderLen(t *testing.T) { ...@@ -173,7 +174,7 @@ func TestReaderLen(t *testing.T) {
t.Errorf("r.Len(): got %d, want %d", got, want) t.Errorf("r.Len(): got %d, want %d", got, want)
} }
if n, err := r.Read(make([]byte, 1)); err != nil || n != 1 { if n, err := r.Read(make([]byte, 1)); err != nil || n != 1 {
t.Errorf("Read failed: read %d %v", n, err) t.Errorf("Read failed: read %d %v; want 1, nil", n, err)
} }
if got, want := r.Len(), 0; got != want { if got, want := r.Len(), 0; got != want {
t.Errorf("r.Len(): got %d, want %d", got, want) t.Errorf("r.Len(): got %d, want %d", got, want)
......
...@@ -35,9 +35,6 @@ func (r *Reader) Len() int { ...@@ -35,9 +35,6 @@ func (r *Reader) Len() int {
func (r *Reader) Size() int64 { return int64(len(r.s)) } func (r *Reader) Size() int64 { return int64(len(r.s)) }
func (r *Reader) Read(b []byte) (n int, err error) { func (r *Reader) Read(b []byte) (n int, err error) {
if len(b) == 0 {
return 0, nil
}
if r.i >= int64(len(r.s)) { if r.i >= int64(len(r.s)) {
return 0, io.EOF return 0, io.EOF
} }
......
...@@ -22,14 +22,15 @@ func TestReader(t *testing.T) { ...@@ -22,14 +22,15 @@ func TestReader(t *testing.T) {
n int n int
want string want string
wantpos int64 wantpos int64
readerr error
seekerr string seekerr string
}{ }{
{seek: io.SeekStart, off: 0, n: 20, want: "0123456789"}, {seek: io.SeekStart, off: 0, n: 20, want: "0123456789"},
{seek: io.SeekStart, off: 1, n: 1, want: "1"}, {seek: io.SeekStart, off: 1, n: 1, want: "1"},
{seek: io.SeekCurrent, off: 1, wantpos: 3, n: 2, want: "34"}, {seek: io.SeekCurrent, off: 1, wantpos: 3, n: 2, want: "34"},
{seek: io.SeekStart, off: -1, seekerr: "strings.Reader.Seek: negative position"}, {seek: io.SeekStart, off: -1, seekerr: "strings.Reader.Seek: negative position"},
{seek: io.SeekStart, off: 1 << 33, wantpos: 1 << 33}, {seek: io.SeekStart, off: 1 << 33, wantpos: 1 << 33, readerr: io.EOF},
{seek: io.SeekCurrent, off: 1, wantpos: 1<<33 + 1}, {seek: io.SeekCurrent, off: 1, wantpos: 1<<33 + 1, readerr: io.EOF},
{seek: io.SeekStart, n: 5, want: "01234"}, {seek: io.SeekStart, n: 5, want: "01234"},
{seek: io.SeekCurrent, n: 5, want: "56789"}, {seek: io.SeekCurrent, n: 5, want: "56789"},
{seek: io.SeekEnd, off: -1, n: 1, wantpos: 9, want: "9"}, {seek: io.SeekEnd, off: -1, n: 1, wantpos: 9, want: "9"},
...@@ -50,8 +51,8 @@ func TestReader(t *testing.T) { ...@@ -50,8 +51,8 @@ func TestReader(t *testing.T) {
} }
buf := make([]byte, tt.n) buf := make([]byte, tt.n)
n, err := r.Read(buf) n, err := r.Read(buf)
if err != nil { if err != tt.readerr {
t.Errorf("%d. read = %v", i, err) t.Errorf("%d. read = %v; want %v", i, err, tt.readerr)
continue continue
} }
got := string(buf[:n]) got := string(buf[:n])
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment