// Copyright 2014 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 flate import ( "bufio" "bytes" "io" "strings" "testing" ) func TestReset(t *testing.T) { ss := []string{ "lorem ipsum izzle fo rizzle", "the quick brown fox jumped over", } deflated := make([]bytes.Buffer, 2) for i, s := range ss { w, _ := NewWriter(&deflated[i], 1) w.Write([]byte(s)) w.Close() } inflated := make([]bytes.Buffer, 2) f := NewReader(&deflated[0]) io.Copy(&inflated[0], f) f.(Resetter).Reset(&deflated[1], nil) io.Copy(&inflated[1], f) f.Close() for i, s := range ss { if s != inflated[i].String() { t.Errorf("inflated[%d]:\ngot %q\nwant %q", i, inflated[i], s) } } } func TestReaderTruncated(t *testing.T) { vectors := []struct{ input, output string }{ {"\x00", ""}, {"\x00\f", ""}, {"\x00\f\x00", ""}, {"\x00\f\x00\xf3\xff", ""}, {"\x00\f\x00\xf3\xffhello", "hello"}, {"\x00\f\x00\xf3\xffhello, world", "hello, world"}, {"\x02", ""}, {"\xf2H\xcd", "He"}, {"\xf2H͙0a\u0084\t", "Hel\x90\x90\x90\x90\x90"}, {"\xf2H͙0a\u0084\t\x00", "Hel\x90\x90\x90\x90\x90"}, } for i, v := range vectors { r := strings.NewReader(v.input) zr := NewReader(r) b, err := io.ReadAll(zr) if err != io.ErrUnexpectedEOF { t.Errorf("test %d, error mismatch: got %v, want io.ErrUnexpectedEOF", i, err) } if string(b) != v.output { t.Errorf("test %d, output mismatch: got %q, want %q", i, b, v.output) } } } func TestResetDict(t *testing.T) { dict := []byte("the lorem fox") ss := []string{ "lorem ipsum izzle fo rizzle", "the quick brown fox jumped over", } deflated := make([]bytes.Buffer, len(ss)) for i, s := range ss { w, _ := NewWriterDict(&deflated[i], DefaultCompression, dict) w.Write([]byte(s)) w.Close() } inflated := make([]bytes.Buffer, len(ss)) f := NewReader(nil) for i := range inflated { f.(Resetter).Reset(&deflated[i], dict) io.Copy(&inflated[i], f) } f.Close() for i, s := range ss { if s != inflated[i].String() { t.Errorf("inflated[%d]:\ngot %q\nwant %q", i, inflated[i], s) } } } func TestReaderReusesReaderBuffer(t *testing.T) { encodedReader := bytes.NewReader([]byte{}) encodedNotByteReader := struct{ io.Reader }{encodedReader} t.Run("BufferIsReused", func(t *testing.T) { f := NewReader(encodedNotByteReader).(*decompressor) bufioR, ok := f.r.(*bufio.Reader) if !ok { t.Fatalf("bufio.Reader should be created") } f.Reset(encodedNotByteReader, nil) if bufioR != f.r { t.Fatalf("bufio.Reader was not reused") } }) t.Run("BufferIsNotReusedWhenGotByteReader", func(t *testing.T) { f := NewReader(encodedNotByteReader).(*decompressor) if _, ok := f.r.(*bufio.Reader); !ok { t.Fatalf("bufio.Reader should be created") } f.Reset(encodedReader, nil) if f.r != encodedReader { t.Fatalf("provided io.ByteReader should be used directly") } }) t.Run("BufferIsCreatedAfterByteReader", func(t *testing.T) { for i, r := range []io.Reader{encodedReader, bufio.NewReader(encodedReader)} { f := NewReader(r).(*decompressor) if f.r != r { t.Fatalf("provided io.ByteReader should be used directly, i=%d", i) } f.Reset(encodedNotByteReader, nil) if _, ok := f.r.(*bufio.Reader); !ok { t.Fatalf("bufio.Reader should be created, i=%d", i) } } }) }