// Copyright 2010 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 gzip import ( "io" "io/ioutil" "testing" ) // pipe creates two ends of a pipe that gzip and gunzip, and runs dfunc at the // writer end and ifunc at the reader end. func pipe(t *testing.T, dfunc func(*Compressor), cfunc func(*Decompressor)) { piper, pipew := io.Pipe() defer piper.Close() go func() { defer pipew.Close() compressor, err := NewWriter(pipew) if err != nil { t.Fatalf("%v", err) } defer compressor.Close() dfunc(compressor) }() decompressor, err := NewReader(piper) if err != nil { t.Fatalf("%v", err) } defer decompressor.Close() cfunc(decompressor) } // Tests that an empty payload still forms a valid GZIP stream. func TestEmpty(t *testing.T) { pipe(t, func(compressor *Compressor) {}, func(decompressor *Decompressor) { b, err := ioutil.ReadAll(decompressor) if err != nil { t.Fatalf("%v", err) } if len(b) != 0 { t.Fatalf("did not read an empty slice") } }) } // Tests that gzipping and then gunzipping is the identity function. func TestWriter(t *testing.T) { pipe(t, func(compressor *Compressor) { compressor.Comment = "comment" compressor.Extra = []byte("extra") compressor.Mtime = 1e8 compressor.Name = "name" _, err := compressor.Write([]byte("payload")) if err != nil { t.Fatalf("%v", err) } }, func(decompressor *Decompressor) { b, err := ioutil.ReadAll(decompressor) if err != nil { t.Fatalf("%v", err) } if string(b) != "payload" { t.Fatalf("payload is %q, want %q", string(b), "payload") } if decompressor.Comment != "comment" { t.Fatalf("comment is %q, want %q", decompressor.Comment, "comment") } if string(decompressor.Extra) != "extra" { t.Fatalf("extra is %q, want %q", decompressor.Extra, "extra") } if decompressor.Mtime != 1e8 { t.Fatalf("mtime is %d, want %d", decompressor.Mtime, uint32(1e8)) } if decompressor.Name != "name" { t.Fatalf("name is %q, want %q", decompressor.Name, "name") } }) }