mirror of
https://github.com/golang/go
synced 2024-10-04 20:21:22 -06:00
b0683bd77a
this breaks the dependency of package io on package bytes. R=rsc CC=golang-dev https://golang.org/cl/163085
107 lines
2.5 KiB
Go
107 lines
2.5 KiB
Go
// 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";
|
|
"io/ioutil";
|
|
"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 := ioutil.ReadAll(golden);
|
|
b1, err1 := ioutil.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)
|
|
}
|
|
}
|
|
}
|