2009-09-29 20:47:05 -06:00
|
|
|
// 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";
|
2009-12-02 23:02:14 -07:00
|
|
|
"io/ioutil";
|
2009-09-29 20:47:05 -06:00
|
|
|
"os";
|
|
|
|
"testing";
|
|
|
|
)
|
|
|
|
|
2009-10-06 15:55:39 -06:00
|
|
|
var filenames = []string{
|
2009-09-29 20:47:05 -06:00
|
|
|
"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.
|
2009-11-09 13:07:39 -07:00
|
|
|
return
|
2009-09-29 20:47:05 -06:00
|
|
|
}
|
|
|
|
if err1 != nil {
|
|
|
|
t.Errorf("%s (level=%d): %v", fn, level, err1);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if err0 == os.EOF {
|
2009-11-09 13:07:39 -07:00
|
|
|
break
|
2009-09-29 20:47:05 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}();
|
|
|
|
zlibr, err := NewInflater(piper);
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("%s (level=%d): %v", fn, level, err);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
defer zlibr.Close();
|
|
|
|
|
|
|
|
// Compare the two.
|
2009-12-02 23:02:14 -07:00
|
|
|
b0, err0 := ioutil.ReadAll(golden);
|
|
|
|
b1, err1 := ioutil.ReadAll(zlibr);
|
2009-09-29 20:47:05 -06:00
|
|
|
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++ {
|
2009-11-09 13:07:39 -07:00
|
|
|
testFileLevel(t, fn, level)
|
2009-09-29 20:47:05 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|