Browse Source

Merge pull request #83 from greatroar/fix-writeto

lz4.Reader.WriteTo should return number of bytes written
Pierre Curto 5 years ago
parent
commit
22f5d580d5
2 changed files with 32 additions and 1 deletions
  1. 1 1
      reader.go
  2. 31 0
      reader_test.go

+ 1 - 1
reader.go

@@ -182,8 +182,8 @@ func (r *Reader) WriteTo(w io.Writer) (n int64, err error) {
 			return
 		}
 		r.handler(bn)
+		bn, err = w.Write(data[:bn])
 		n += int64(bn)
-		_, err = w.Write(data[:bn])
 		if err != nil {
 			return
 		}

+ 31 - 0
reader_test.go

@@ -2,6 +2,7 @@ package lz4_test
 
 import (
 	"bytes"
+	"errors"
 	"io"
 	"io/ioutil"
 	"os"
@@ -101,3 +102,33 @@ func TestReader_Reset(t *testing.T) {
 		t.Fatal("result does not match original")
 	}
 }
+
+type brokenWriter int
+
+func (w *brokenWriter) Write(p []byte) (n int, err error) {
+	n = len(p)
+	if n > int(*w) {
+		n = int(*w)
+		err = errors.New("broken")
+	}
+	*w -= brokenWriter(n)
+	return
+}
+
+// WriteTo should report the number of bytes successfully written,
+// not the number successfully decompressed.
+func TestWriteToBrokenWriter(t *testing.T) {
+	const capacity = 10
+	w := brokenWriter(capacity)
+	r := lz4.NewReader(bytes.NewReader(pg1661LZ4))
+
+	n, err := r.WriteTo(&w)
+	switch {
+	case n > capacity:
+		t.Errorf("reported number of bytes written %d too big", n)
+	case err == nil:
+		t.Error("no error from broken Writer")
+	case err.Error() != "broken":
+		t.Errorf("unexpected error %q", err.Error())
+	}
+}