123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- // 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 (
- "bytes"
- "io"
- "testing"
- )
- type zlibTest struct {
- desc string
- raw string
- compressed []byte
- dict []byte
- err error
- }
- // Compare-to-golden test data was generated by the ZLIB example program at
- // http://www.zlib.net/zpipe.c
- var zlibTests = []zlibTest{
- {
- "truncated empty",
- "",
- []byte{},
- nil,
- io.ErrUnexpectedEOF,
- },
- {
- "truncated dict",
- "",
- []byte{0x78, 0xbb},
- []byte{0x00},
- io.ErrUnexpectedEOF,
- },
- {
- "truncated checksum",
- "",
- []byte{0x78, 0xbb, 0x00, 0x01, 0x00, 0x01, 0xca, 0x48,
- 0xcd, 0xc9, 0xc9, 0xd7, 0x51, 0x28, 0xcf, 0x2f,
- 0xca, 0x49, 0x01, 0x04, 0x00, 0x00, 0xff, 0xff,
- },
- []byte{0x00},
- io.ErrUnexpectedEOF,
- },
- {
- "empty",
- "",
- []byte{0x78, 0x9c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01},
- nil,
- nil,
- },
- {
- "goodbye",
- "goodbye, world",
- []byte{
- 0x78, 0x9c, 0x4b, 0xcf, 0xcf, 0x4f, 0x49, 0xaa,
- 0x4c, 0xd5, 0x51, 0x28, 0xcf, 0x2f, 0xca, 0x49,
- 0x01, 0x00, 0x28, 0xa5, 0x05, 0x5e,
- },
- nil,
- nil,
- },
- {
- "bad header",
- "",
- []byte{0x78, 0x9f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01},
- nil,
- ErrHeader,
- },
- {
- "bad checksum",
- "",
- []byte{0x78, 0x9c, 0x03, 0x00, 0x00, 0x00, 0x00, 0xff},
- nil,
- ErrChecksum,
- },
- {
- "not enough data",
- "",
- []byte{0x78, 0x9c, 0x03, 0x00, 0x00, 0x00},
- nil,
- io.ErrUnexpectedEOF,
- },
- {
- "excess data is silently ignored",
- "",
- []byte{
- 0x78, 0x9c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01,
- 0x78, 0x9c, 0xff,
- },
- nil,
- nil,
- },
- {
- "dictionary",
- "Hello, World!\n",
- []byte{
- 0x78, 0xbb, 0x1c, 0x32, 0x04, 0x27, 0xf3, 0x00,
- 0xb1, 0x75, 0x20, 0x1c, 0x45, 0x2e, 0x00, 0x24,
- 0x12, 0x04, 0x74,
- },
- []byte{
- 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x0a,
- },
- nil,
- },
- {
- "wrong dictionary",
- "",
- []byte{
- 0x78, 0xbb, 0x1c, 0x32, 0x04, 0x27, 0xf3, 0x00,
- 0xb1, 0x75, 0x20, 0x1c, 0x45, 0x2e, 0x00, 0x24,
- 0x12, 0x04, 0x74,
- },
- []byte{
- 0x48, 0x65, 0x6c, 0x6c,
- },
- ErrDictionary,
- },
- {
- "truncated zlib stream amid raw-block",
- "hello",
- []byte{
- 0x78, 0x9c, 0x00, 0x0c, 0x00, 0xf3, 0xff, 0x68, 0x65, 0x6c, 0x6c, 0x6f,
- },
- nil,
- io.ErrUnexpectedEOF,
- },
- {
- "truncated zlib stream amid fixed-block",
- "He",
- []byte{
- 0x78, 0x9c, 0xf2, 0x48, 0xcd,
- },
- nil,
- io.ErrUnexpectedEOF,
- },
- }
- func TestDecompressor(t *testing.T) {
- b := new(bytes.Buffer)
- for _, tt := range zlibTests {
- in := bytes.NewReader(tt.compressed)
- zr, err := NewReaderDict(in, tt.dict)
- if err != nil {
- if err != tt.err {
- t.Errorf("%s: NewReader: %s", tt.desc, err)
- }
- continue
- }
- defer zr.Close()
- // Read and verify correctness of data.
- b.Reset()
- n, err := io.Copy(b, zr)
- if err != nil {
- if err != tt.err {
- t.Errorf("%s: io.Copy: %v want %v", tt.desc, err, tt.err)
- }
- continue
- }
- s := b.String()
- if s != tt.raw {
- t.Errorf("%s: got %d-byte %q want %d-byte %q", tt.desc, n, s, len(tt.raw), tt.raw)
- }
- // Check for sticky errors.
- if n, err := zr.Read([]byte{0}); n != 0 || err != io.EOF {
- t.Errorf("%s: Read() = (%d, %v), want (0, io.EOF)", tt.desc, n, err)
- }
- if err := zr.Close(); err != nil {
- t.Errorf("%s: Close() = %v, want nil", tt.desc, err)
- }
- }
- }
|