115 lines
3.1 KiB
Go
115 lines
3.1 KiB
Go
package lz4stream
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/pierrec/lz4/v4/internal/lz4block"
|
|
)
|
|
|
|
func TestFrameDescriptor(t *testing.T) {
|
|
for _, tc := range []struct {
|
|
flags string
|
|
bsum, csize, csum bool
|
|
size uint64
|
|
bsize uint32
|
|
}{
|
|
{"\x64\x40\xa7", false, false, true, 0, lz4block.Block64Kb},
|
|
{"\x64\x50\x08", false, false, true, 0, lz4block.Block256Kb},
|
|
{"\x64\x60\x85", false, false, true, 0, lz4block.Block1Mb},
|
|
{"\x64\x70\xb9", false, false, true, 0, lz4block.Block4Mb},
|
|
} {
|
|
s := tc.flags
|
|
label := fmt.Sprintf("%02x %02x %02x", s[0], s[1], s[2])
|
|
t.Run(label, func(t *testing.T) {
|
|
r := strings.NewReader(tc.flags)
|
|
f := NewFrame()
|
|
var fd FrameDescriptor
|
|
if err := fd.initR(f, r); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if got, want := fd.Flags.BlockChecksum(), tc.bsum; got != want {
|
|
t.Fatalf("got %v; want %v\n", got, want)
|
|
}
|
|
if got, want := fd.Flags.Size(), tc.csize; got != want {
|
|
t.Fatalf("got %v; want %v\n", got, want)
|
|
}
|
|
if got, want := fd.Flags.ContentChecksum(), tc.csum; got != want {
|
|
t.Fatalf("got %v; want %v\n", got, want)
|
|
}
|
|
if got, want := fd.ContentSize, tc.size; got != want {
|
|
t.Fatalf("got %v; want %v\n", got, want)
|
|
}
|
|
if got, want := fd.Flags.BlockSizeIndex(), lz4block.Index(tc.bsize); got != want {
|
|
t.Fatalf("got %v; want %v\n", got, want)
|
|
}
|
|
|
|
buf := new(bytes.Buffer)
|
|
fd.initW()
|
|
fd.Checksum = 0
|
|
if err := fd.Write(f, buf); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
// Skip the magic number set in the first 4 bytes.
|
|
if got, want := buf.String()[4:], tc.flags; got != want {
|
|
t.Fatalf("got %q; want %q\n", got, want)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestFrameDataBlock(t *testing.T) {
|
|
const sample = "abcd4566878dsvddddddqvq&&&&&((èdvshdvsvdsdh)"
|
|
min := func(a, b int) int {
|
|
if a < b {
|
|
return a
|
|
}
|
|
return b
|
|
}
|
|
for _, tc := range []struct {
|
|
data string
|
|
size uint32
|
|
}{
|
|
{"", lz4block.Block64Kb},
|
|
{sample, lz4block.Block64Kb},
|
|
{strings.Repeat(sample, 10), lz4block.Block64Kb},
|
|
{strings.Repeat(sample, 5000), lz4block.Block256Kb},
|
|
{strings.Repeat(sample, 5000), lz4block.Block1Mb},
|
|
{strings.Repeat(sample, 23000), lz4block.Block1Mb},
|
|
{strings.Repeat(sample, 93000), lz4block.Block4Mb},
|
|
} {
|
|
label := fmt.Sprintf("%s (%d)", tc.data[:min(len(tc.data), 10)], len(tc.data))
|
|
t.Run(label, func(t *testing.T) {
|
|
data := tc.data
|
|
size := tc.size
|
|
zbuf := new(bytes.Buffer)
|
|
f := NewFrame()
|
|
f.Descriptor.Flags.BlockSizeIndexSet(lz4block.Index(size))
|
|
|
|
block := NewFrameDataBlock(f)
|
|
block.Compress(f, []byte(data), lz4block.Fast)
|
|
if err := block.Write(f, zbuf); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if _, err := block.Read(f, zbuf, 0); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
buf := make([]byte, size)
|
|
buf, err := block.Uncompress(f, buf, false)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if got, want := len(buf), len(data); got != want {
|
|
t.Fatalf("got %d; want %d", got, want)
|
|
}
|
|
if got, want := string(buf), data; got != want {
|
|
t.Fatalf("got %q; want %q", got, want)
|
|
}
|
|
})
|
|
}
|
|
}
|