| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- package lz4stream
- import (
- "bytes"
- "fmt"
- "strings"
- "testing"
- "github.com/pierrec/lz4/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()
- block := NewFrameDataBlock(lz4block.Index(size))
- block.Compress(f, []byte(data), lz4block.Fast)
- if err := block.Write(f, zbuf); err != nil {
- t.Fatal(err)
- }
- buf := make([]byte, size)
- n, err := block.Uncompress(f, zbuf, buf)
- if err != nil {
- t.Fatal(err)
- }
- if got, want := n, len(data); got != want {
- t.Fatalf("got %d; want %d", got, want)
- }
- if got, want := string(buf[:n]), data; got != want {
- t.Fatalf("got %q; want %q", got, want)
- }
- })
- }
- }
|