summaryrefslogtreecommitdiff
path: root/src/pkg/compress/zlib/writer_test.go
diff options
context:
space:
mode:
authorNigel Tao <nigeltao@golang.org>2009-09-29 19:47:05 -0700
committerNigel Tao <nigeltao@golang.org>2009-09-29 19:47:05 -0700
commitfd602c7c5237e50cf022de60b7b8f7a1eb7a9b88 (patch)
tree220c5147e4baec4cf1cbfb29973fc55057789af4 /src/pkg/compress/zlib/writer_test.go
parentf4d5ae2cdcec8bf45b6cbe2e56a55bf621d4f3d2 (diff)
downloadgolang-fd602c7c5237e50cf022de60b7b8f7a1eb7a9b88.tar.gz
ZLIB deflater.
R=rsc APPROVED=rsc DELTA=222 (219 added, 0 deleted, 3 changed) OCL=35031 CL=35129
Diffstat (limited to 'src/pkg/compress/zlib/writer_test.go')
-rw-r--r--src/pkg/compress/zlib/writer_test.go105
1 files changed, 105 insertions, 0 deletions
diff --git a/src/pkg/compress/zlib/writer_test.go b/src/pkg/compress/zlib/writer_test.go
new file mode 100644
index 000000000..ee041d050
--- /dev/null
+++ b/src/pkg/compress/zlib/writer_test.go
@@ -0,0 +1,105 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package zlib
+
+import (
+ "io";
+ "os";
+ "testing";
+)
+
+var filenames = []string {
+ "testdata/e.txt",
+ "testdata/pi.txt",
+}
+
+// Tests that compressing and then decompressing the given file at the given compression level
+// yields equivalent bytes to the original file.
+func testFileLevel(t *testing.T, fn string, level int) {
+ // Read the file, as golden output.
+ golden, err := os.Open(fn, os.O_RDONLY, 0444);
+ if err != nil {
+ t.Errorf("%s (level=%d): %v", fn, level, err);
+ return;
+ }
+ defer golden.Close();
+
+ // Read the file again, and push it through a pipe that compresses at the write end, and decompresses at the read end.
+ raw, err := os.Open(fn, os.O_RDONLY, 0444);
+ if err != nil {
+ t.Errorf("%s (level=%d): %v", fn, level, err);
+ return;
+ }
+ piper, pipew := io.Pipe();
+ defer piper.Close();
+ go func() {
+ defer raw.Close();
+ defer pipew.Close();
+ zlibw, err := NewDeflaterLevel(pipew, level);
+ if err != nil {
+ t.Errorf("%s (level=%d): %v", fn, level, err);
+ return;
+ }
+ defer zlibw.Close();
+ var b [1024]byte;
+ for {
+ n, err0 := raw.Read(&b);
+ if err0 != nil && err0 != os.EOF {
+ t.Errorf("%s (level=%d): %v", fn, level, err0);
+ return;
+ }
+ _, err1 := zlibw.Write(b[0:n]);
+ if err1 == os.EPIPE {
+ // Fail, but do not report the error, as some other (presumably reportable) error broke the pipe.
+ return;
+ }
+ if err1 != nil {
+ t.Errorf("%s (level=%d): %v", fn, level, err1);
+ return;
+ }
+ if err0 == os.EOF {
+ break;
+ }
+ }
+ }();
+ zlibr, err := NewInflater(piper);
+ if err != nil {
+ t.Errorf("%s (level=%d): %v", fn, level, err);
+ return;
+ }
+ defer zlibr.Close();
+
+ // Compare the two.
+ b0, err0 := io.ReadAll(golden);
+ b1, err1 := io.ReadAll(zlibr);
+ if err0 != nil {
+ t.Errorf("%s (level=%d): %v", fn, level, err0);
+ return;
+ }
+ if err1 != nil {
+ t.Errorf("%s (level=%d): %v", fn, level, err1);
+ return;
+ }
+ if len(b0) != len(b1) {
+ t.Errorf("%s (level=%d): length mismatch %d versus %d", fn, level, len(b0), len(b1));
+ return;
+ }
+ for i := 0; i < len(b0); i++ {
+ if b0[i] != b1[i] {
+ t.Errorf("%s (level=%d): mismatch at %d, 0x%02x versus 0x%02x\n", fn, level, i, b0[i], b1[i]);
+ return;
+ }
+ }
+}
+
+func TestWriter(t *testing.T) {
+ for _, fn := range filenames {
+ testFileLevel(t, fn, DefaultCompression);
+ testFileLevel(t, fn, NoCompression);
+ for level := BestSpeed; level <= BestCompression; level++ {
+ testFileLevel(t, fn, level);
+ }
+ }
+}