]> Cypherpunks repositories - gostls13.git/commitdiff
bufio: save error from underlying ReadFrom
authorCuong Manh Le <cuong.manhle.vn@gmail.com>
Tue, 29 Oct 2019 06:45:40 +0000 (13:45 +0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Thu, 31 Oct 2019 16:02:25 +0000 (16:02 +0000)
Updates #35194

Change-Id: Ib854bc6250ddeb606d6ff6240179e23b98e4ac62
Reviewed-on: https://go-review.googlesource.com/c/go/+/203999
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/bufio/bufio.go
src/bufio/bufio_test.go

index c29f233f08a94d47a9c1e0003b0a8be66b7f95e9..d1d542a484664bfdd17cd2ee6188e6186336c032 100644 (file)
@@ -708,7 +708,9 @@ func (b *Writer) WriteString(s string) (int, error) {
 func (b *Writer) ReadFrom(r io.Reader) (n int64, err error) {
        if b.Buffered() == 0 {
                if w, ok := b.wr.(io.ReaderFrom); ok {
-                       return w.ReadFrom(r)
+                       n, err = w.ReadFrom(r)
+                       b.err = err
+                       return n, err
                }
        }
        var m int
index 782ca2149aa57bc68aee7221435a57d102fe3e31..3e085fd5d0cd58bd6d6cdd4d37230ed311efab5b 100644 (file)
@@ -1535,6 +1535,26 @@ func TestPartialReadEOF(t *testing.T) {
        }
 }
 
+type writerWithReadFromError struct{}
+
+func (w writerWithReadFromError) ReadFrom(r io.Reader) (int64, error) {
+       return 0, errors.New("writerWithReadFromError error")
+}
+
+func (w writerWithReadFromError) Write(b []byte) (n int, err error) {
+       return 10, nil
+}
+
+func TestWriterReadFromMustSetUnderlyingError(t *testing.T) {
+       var wr = NewWriter(writerWithReadFromError{})
+       if _, err := wr.ReadFrom(strings.NewReader("test2")); err == nil {
+               t.Fatal("expected ReadFrom returns error, got nil")
+       }
+       if _, err := wr.Write([]byte("123")); err == nil {
+               t.Fatal("expected Write returns error, got nil")
+       }
+}
+
 func BenchmarkReaderCopyOptimal(b *testing.B) {
        // Optimal case is where the underlying reader implements io.WriterTo
        srcBuf := bytes.NewBuffer(make([]byte, 8192))