Commit 461adfd8 authored by Klaus Post's avatar Klaus Post Committed by Joe Tsai

compress/flate: make compression level 0 consistent

Tests for determinism was not working as intended since io.Copybuffer
uses the io.WriterTo if available.

This exposed that level 0 (no compression) changed output
based on the number of writes and buffers given to the
writer.

Previously, Write would emit a new raw block (BTYPE=00) for
every non-empty call to Write.

This CL fixes it such that a raw block is only emitted upon
the following conditions:
 	* A full window is obtained (every 65535 bytes)
 	* Flush is called
 	* Close is called

Change-Id: I807f866d97e2db7820f11febab30a96266a6cbf1
Reviewed-on: https://go-review.googlesource.com/31174
Run-TryBot: Joe Tsai <thebrokentoaster@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarJoe Tsai <thebrokentoaster@gmail.com>
parent 2e196b15
...@@ -521,10 +521,10 @@ func (d *compressor) fillStore(b []byte) int { ...@@ -521,10 +521,10 @@ func (d *compressor) fillStore(b []byte) int {
} }
func (d *compressor) store() { func (d *compressor) store() {
if d.windowEnd > 0 { if d.windowEnd > 0 && (d.windowEnd == maxStoreBlockSize || d.sync) {
d.err = d.writeStoredBlock(d.window[:d.windowEnd]) d.err = d.writeStoredBlock(d.window[:d.windowEnd])
d.windowEnd = 0
} }
d.windowEnd = 0
} }
// storeHuff compresses and stores the currently added data // storeHuff compresses and stores the currently added data
......
...@@ -75,7 +75,7 @@ func TestWriteError(t *testing.T) { ...@@ -75,7 +75,7 @@ func TestWriteError(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("NewWriter: level %d: %v", l, err) t.Fatalf("NewWriter: level %d: %v", l, err)
} }
n, err := io.CopyBuffer(w, bytes.NewBuffer(in), copyBuffer) n, err := io.CopyBuffer(w, struct{ io.Reader }{bytes.NewBuffer(in)}, copyBuffer)
if err == nil { if err == nil {
t.Fatalf("Level %d: Expected an error, writer was %#v", l, ew) t.Fatalf("Level %d: Expected an error, writer was %#v", l, ew)
} }
...@@ -142,7 +142,7 @@ func testDeterministic(i int, t *testing.T) { ...@@ -142,7 +142,7 @@ func testDeterministic(i int, t *testing.T) {
} }
// Use a very small prime sized buffer. // Use a very small prime sized buffer.
cbuf := make([]byte, 787) cbuf := make([]byte, 787)
_, err = io.CopyBuffer(w, br, cbuf) _, err = io.CopyBuffer(w, struct{ io.Reader }{br}, cbuf)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
...@@ -157,7 +157,7 @@ func testDeterministic(i int, t *testing.T) { ...@@ -157,7 +157,7 @@ func testDeterministic(i int, t *testing.T) {
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
_, err = io.CopyBuffer(w2, br2, cbuf) _, err = io.CopyBuffer(w2, struct{ io.Reader }{br2}, cbuf)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
......
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