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) } } }