diff options
author | Nigel Tao <nigeltao@golang.org> | 2009-09-29 19:47:05 -0700 |
---|---|---|
committer | Nigel Tao <nigeltao@golang.org> | 2009-09-29 19:47:05 -0700 |
commit | fd602c7c5237e50cf022de60b7b8f7a1eb7a9b88 (patch) | |
tree | 220c5147e4baec4cf1cbfb29973fc55057789af4 /src/pkg/compress/zlib/writer_test.go | |
parent | f4d5ae2cdcec8bf45b6cbe2e56a55bf621d4f3d2 (diff) | |
download | golang-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.go | 105 |
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); + } + } +} |