summaryrefslogtreecommitdiff
path: root/src/pkg/bytes
diff options
context:
space:
mode:
authorBrad Fitzpatrick <bradfitz@golang.org>2012-11-25 09:04:13 -0800
committerBrad Fitzpatrick <bradfitz@golang.org>2012-11-25 09:04:13 -0800
commit555fe961f288c067be9c5b8ab4998b70db1309f3 (patch)
tree14867745b48885b5b525800fbe4bf79eace5cf79 /src/pkg/bytes
parent721103bef976c3295d7dbb4698ece05fd0af1b8f (diff)
downloadgo-555fe961f288c067be9c5b8ab4998b70db1309f3.tar.gz
bytes, strings: fix Reader WriteTo return value on 0 bytes copied
Fixes issue 4421 R=golang-dev, dave, minux.ma, mchaten, rsc CC=golang-dev http://codereview.appspot.com/6855083
Diffstat (limited to 'src/pkg/bytes')
-rw-r--r--src/pkg/bytes/reader.go2
-rw-r--r--src/pkg/bytes/reader_test.go36
2 files changed, 33 insertions, 5 deletions
diff --git a/src/pkg/bytes/reader.go b/src/pkg/bytes/reader.go
index b34dfc11b..77511b945 100644
--- a/src/pkg/bytes/reader.go
+++ b/src/pkg/bytes/reader.go
@@ -125,7 +125,7 @@ func (r *Reader) Seek(offset int64, whence int) (int64, error) {
func (r *Reader) WriteTo(w io.Writer) (n int64, err error) {
r.prevRune = -1
if r.i >= len(r.s) {
- return 0, io.EOF
+ return 0, nil
}
b := r.s[r.i:]
m, err := w.Write(b)
diff --git a/src/pkg/bytes/reader_test.go b/src/pkg/bytes/reader_test.go
index 666881886..f0a3e26c4 100644
--- a/src/pkg/bytes/reader_test.go
+++ b/src/pkg/bytes/reader_test.go
@@ -8,6 +8,7 @@ import (
. "bytes"
"fmt"
"io"
+ "io/ioutil"
"os"
"testing"
)
@@ -88,16 +89,20 @@ func TestReaderAt(t *testing.T) {
}
func TestReaderWriteTo(t *testing.T) {
- for i := 3; i < 30; i += 3 {
- s := data[:len(data)/i]
- r := NewReader(testBytes[:len(testBytes)/i])
+ for i := 0; i < 30; i += 3 {
+ var l int
+ if i > 0 {
+ l = len(data) / i
+ }
+ s := data[:l]
+ r := NewReader(testBytes[:l])
var b Buffer
n, err := r.WriteTo(&b)
if expect := int64(len(s)); n != expect {
t.Errorf("got %v; want %v", n, expect)
}
if err != nil {
- t.Errorf("got error = %v; want nil", err)
+ t.Errorf("for length %d: got error = %v; want nil", l, err)
}
if b.String() != s {
t.Errorf("got string %q; want %q", b.String(), s)
@@ -107,3 +112,26 @@ func TestReaderWriteTo(t *testing.T) {
}
}
}
+
+// verify that copying from an empty reader always has the same results,
+// regardless of the presence of a WriteTo method.
+func TestReaderCopyNothing(t *testing.T) {
+ type nErr struct {
+ n int64
+ err error
+ }
+ type justReader struct {
+ io.Reader
+ }
+ type justWriter struct {
+ io.Writer
+ }
+ discard := justWriter{ioutil.Discard} // hide ReadFrom
+
+ var with, withOut nErr
+ with.n, with.err = io.Copy(discard, NewReader(nil))
+ withOut.n, withOut.err = io.Copy(discard, justReader{NewReader(nil)})
+ if with != withOut {
+ t.Errorf("behavior differs: with = %#v; without: %#v", with, withOut)
+ }
+}