blob: 0eff379f9ff2613441bcdd58c6d6605016827d86 [file]
package zstd
import (
"bytes"
"io"
"os"
"testing"
snappy "github.com/klauspost/compress/internal/snapref"
)
func TestSnappy_ConvertSimple(t *testing.T) {
in, err := os.ReadFile("testdata/z000028")
if err != nil {
t.Fatal(err)
}
var comp bytes.Buffer
w := snappy.NewBufferedWriter(&comp)
_, err = io.Copy(w, bytes.NewBuffer(in))
if err != nil {
t.Fatal(err)
}
err = w.Close()
if err != nil {
t.Fatal(err)
}
snapLen := comp.Len()
s := SnappyConverter{}
var dst bytes.Buffer
n, err := s.Convert(&comp, &dst)
if err != io.EOF {
t.Fatal(err)
}
if n != int64(dst.Len()) {
t.Errorf("Dest was %d bytes, but said to have written %d bytes", dst.Len(), n)
}
t.Log("SnappyConverter len", snapLen, "-> zstd len", dst.Len())
dec, err := NewReader(nil)
if err != nil {
t.Fatal(err)
}
defer dec.Close()
decoded, err := dec.DecodeAll(dst.Bytes(), nil)
if err != nil {
t.Error(err, len(decoded))
}
if !bytes.Equal(decoded, in) {
os.WriteFile("testdata/z000028.got", decoded, os.ModePerm)
t.Fatal("Decoded does not match")
}
t.Log("Encoded content matched")
}
func TestSnappy_ConvertXML(t *testing.T) {
f, err := os.Open("testdata/xml.zst")
if err != nil {
t.Fatal(err)
}
defer f.Close()
dec, err := NewReader(f)
if err != nil {
t.Fatal(err)
}
defer dec.Close()
in, err := io.ReadAll(dec)
if err != nil {
t.Fatal(err)
}
var comp bytes.Buffer
w := snappy.NewBufferedWriter(&comp)
_, err = io.Copy(w, bytes.NewBuffer(in))
if err != nil {
t.Fatal(err)
}
err = w.Close()
if err != nil {
t.Fatal(err)
}
snapLen := comp.Len()
s := SnappyConverter{}
var dst bytes.Buffer
n, err := s.Convert(&comp, &dst)
if err != io.EOF {
t.Fatal(err)
}
if n != int64(dst.Len()) {
t.Errorf("Dest was %d bytes, but said to have written %d bytes", dst.Len(), n)
}
t.Log("Snappy len", snapLen, "-> zstd len", dst.Len())
decoded, err := dec.DecodeAll(dst.Bytes(), nil)
if err != nil {
t.Error(err, len(decoded))
}
if !bytes.Equal(decoded, in) {
os.WriteFile("testdata/xml.got", decoded, os.ModePerm)
t.Fatal("Decoded does not match")
}
t.Log("Encoded content matched")
}
func TestSnappy_ConvertSilesia(t *testing.T) {
if testing.Short() {
t.SkipNow()
}
in, err := os.ReadFile("testdata/silesia.tar")
if err != nil {
if os.IsNotExist(err) {
t.Skip("Missing testdata/silesia.tar")
return
}
t.Fatal(err)
}
var comp bytes.Buffer
w := snappy.NewBufferedWriter(&comp)
_, err = io.Copy(w, bytes.NewBuffer(in))
if err != nil {
t.Fatal(err)
}
err = w.Close()
if err != nil {
t.Fatal(err)
}
snapLen := comp.Len()
s := SnappyConverter{}
var dst bytes.Buffer
n, err := s.Convert(&comp, &dst)
if err != io.EOF {
t.Fatal(err)
}
if n != int64(dst.Len()) {
t.Errorf("Dest was %d bytes, but said to have written %d bytes", dst.Len(), n)
}
t.Log("SnappyConverter len", snapLen, "-> zstd len", dst.Len())
dec, err := NewReader(nil)
if err != nil {
t.Fatal(err)
}
defer dec.Close()
decoded, err := dec.DecodeAll(dst.Bytes(), nil)
if err != nil {
t.Error(err, len(decoded))
}
if !bytes.Equal(decoded, in) {
os.WriteFile("testdata/silesia.tar.got", decoded, os.ModePerm)
t.Fatal("Decoded does not match")
}
t.Log("Encoded content matched")
}
func TestSnappy_ConvertEnwik9(t *testing.T) {
if testing.Short() {
t.SkipNow()
}
file := "testdata/enwik9.zst"
f, err := os.Open(file)
if err != nil {
if os.IsNotExist(err) {
t.Skip("To run extended tests, download http://mattmahoney.net/dc/enwik9.zip unzip it \n" +
"compress it with 'zstd -15 -T0 enwik9' and place it in " + file)
}
}
defer f.Close()
dec, err := NewReader(f)
if err != nil {
t.Fatal(err)
}
defer dec.Close()
in, err := io.ReadAll(dec)
if err != nil {
t.Fatal(err)
}
var comp bytes.Buffer
w := snappy.NewBufferedWriter(&comp)
_, err = io.Copy(w, bytes.NewBuffer(in))
if err != nil {
t.Fatal(err)
}
err = w.Close()
if err != nil {
t.Fatal(err)
}
snapLen := comp.Len()
s := SnappyConverter{}
var dst bytes.Buffer
n, err := s.Convert(&comp, &dst)
if err != io.EOF {
t.Fatal(err)
}
if n != int64(dst.Len()) {
t.Errorf("Dest was %d bytes, but said to have written %d bytes", dst.Len(), n)
}
t.Log("SnappyConverter len", snapLen, "-> zstd len", dst.Len())
decoded, err := dec.DecodeAll(dst.Bytes(), nil)
if err != nil {
t.Error(err, len(decoded))
}
if !bytes.Equal(decoded, in) {
os.WriteFile("testdata/enwik9.got", decoded, os.ModePerm)
t.Fatal("Decoded does not match")
}
t.Log("Encoded content matched")
}
func BenchmarkSnappy_ConvertXML(b *testing.B) {
f, err := os.Open("testdata/xml.zst")
if err != nil {
b.Fatal(err)
}
defer f.Close()
dec, err := NewReader(f)
if err != nil {
b.Fatal(err)
}
defer dec.Close()
in, err := io.ReadAll(dec)
if err != nil {
b.Fatal(err)
}
var comp bytes.Buffer
w := snappy.NewBufferedWriter(&comp)
_, err = io.Copy(w, bytes.NewBuffer(in))
if err != nil {
b.Fatal(err)
}
err = w.Close()
if err != nil {
b.Fatal(err)
}
s := SnappyConverter{}
compBytes := comp.Bytes()
_, err = s.Convert(&comp, io.Discard)
if err != io.EOF {
b.Fatal(err)
}
b.ResetTimer()
b.ReportAllocs()
b.SetBytes(int64(len(in)))
for i := 0; i < b.N; i++ {
_, err := s.Convert(bytes.NewBuffer(compBytes), io.Discard)
if err != io.EOF {
b.Fatal(err)
}
}
}
func BenchmarkSnappy_Enwik9(b *testing.B) {
f, err := os.Open("testdata/enwik9.zst")
if err != nil {
b.Skip(err)
return
}
defer f.Close()
dec, err := NewReader(f)
if err != nil {
b.Fatal(err)
}
defer dec.Close()
in, err := io.ReadAll(dec)
if err != nil {
b.Fatal(err)
}
defer dec.Close()
var comp bytes.Buffer
w := snappy.NewBufferedWriter(&comp)
_, err = io.Copy(w, bytes.NewBuffer(in))
if err != nil {
b.Fatal(err)
}
err = w.Close()
if err != nil {
b.Fatal(err)
}
s := SnappyConverter{}
compBytes := comp.Bytes()
_, err = s.Convert(&comp, io.Discard)
if err != io.EOF {
b.Fatal(err)
}
b.ResetTimer()
b.ReportAllocs()
b.SetBytes(int64(len(in)))
for i := 0; i < b.N; i++ {
_, err := s.Convert(bytes.NewBuffer(compBytes), io.Discard)
if err != io.EOF {
b.Fatal(err)
}
}
}
func BenchmarkSnappy_ConvertSilesia(b *testing.B) {
in, err := os.ReadFile("testdata/silesia.tar")
if err != nil {
if os.IsNotExist(err) {
b.Skip("Missing testdata/silesia.tar")
return
}
b.Fatal(err)
}
var comp bytes.Buffer
w := snappy.NewBufferedWriter(&comp)
_, err = io.Copy(w, bytes.NewBuffer(in))
if err != nil {
b.Fatal(err)
}
err = w.Close()
if err != nil {
b.Fatal(err)
}
s := SnappyConverter{}
compBytes := comp.Bytes()
_, err = s.Convert(&comp, io.Discard)
if err != io.EOF {
b.Fatal(err)
}
b.ResetTimer()
b.ReportAllocs()
b.SetBytes(int64(len(in)))
for i := 0; i < b.N; i++ {
_, err := s.Convert(bytes.NewBuffer(compBytes), io.Discard)
if err != io.EOF {
b.Fatal(err)
}
}
}