frame_test.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package lz4stream
  2. import (
  3. "bytes"
  4. "fmt"
  5. "strings"
  6. "testing"
  7. "github.com/pierrec/lz4/internal/lz4block"
  8. )
  9. func TestFrameDescriptor(t *testing.T) {
  10. for _, tc := range []struct {
  11. flags string
  12. bsum, csize, csum bool
  13. size uint64
  14. bsize uint32
  15. }{
  16. {"\x64\x40\xa7", false, false, true, 0, lz4block.Block64Kb},
  17. {"\x64\x50\x08", false, false, true, 0, lz4block.Block256Kb},
  18. {"\x64\x60\x85", false, false, true, 0, lz4block.Block1Mb},
  19. {"\x64\x70\xb9", false, false, true, 0, lz4block.Block4Mb},
  20. } {
  21. s := tc.flags
  22. label := fmt.Sprintf("%02x %02x %02x", s[0], s[1], s[2])
  23. t.Run(label, func(t *testing.T) {
  24. r := strings.NewReader(tc.flags)
  25. f := NewFrame()
  26. var fd FrameDescriptor
  27. if err := fd.initR(f, r); err != nil {
  28. t.Fatal(err)
  29. }
  30. if got, want := fd.Flags.BlockChecksum(), tc.bsum; got != want {
  31. t.Fatalf("got %v; want %v\n", got, want)
  32. }
  33. if got, want := fd.Flags.Size(), tc.csize; got != want {
  34. t.Fatalf("got %v; want %v\n", got, want)
  35. }
  36. if got, want := fd.Flags.ContentChecksum(), tc.csum; got != want {
  37. t.Fatalf("got %v; want %v\n", got, want)
  38. }
  39. if got, want := fd.ContentSize, tc.size; got != want {
  40. t.Fatalf("got %v; want %v\n", got, want)
  41. }
  42. if got, want := fd.Flags.BlockSizeIndex(), lz4block.Index(tc.bsize); got != want {
  43. t.Fatalf("got %v; want %v\n", got, want)
  44. }
  45. buf := new(bytes.Buffer)
  46. fd.initW()
  47. fd.Checksum = 0
  48. if err := fd.Write(f, buf); err != nil {
  49. t.Fatal(err)
  50. }
  51. // Skip the magic number set in the first 4 bytes.
  52. if got, want := buf.String()[4:], tc.flags; got != want {
  53. t.Fatalf("got %q; want %q\n", got, want)
  54. }
  55. })
  56. }
  57. }
  58. func TestFrameDataBlock(t *testing.T) {
  59. const sample = "abcd4566878dsvddddddqvq&&&&&((èdvshdvsvdsdh)"
  60. min := func(a, b int) int {
  61. if a < b {
  62. return a
  63. }
  64. return b
  65. }
  66. for _, tc := range []struct {
  67. data string
  68. size uint32
  69. }{
  70. {"", lz4block.Block64Kb},
  71. {sample, lz4block.Block64Kb},
  72. {strings.Repeat(sample, 10), lz4block.Block64Kb},
  73. {strings.Repeat(sample, 5000), lz4block.Block256Kb},
  74. {strings.Repeat(sample, 5000), lz4block.Block1Mb},
  75. {strings.Repeat(sample, 23000), lz4block.Block1Mb},
  76. {strings.Repeat(sample, 93000), lz4block.Block4Mb},
  77. } {
  78. label := fmt.Sprintf("%s (%d)", tc.data[:min(len(tc.data), 10)], len(tc.data))
  79. t.Run(label, func(t *testing.T) {
  80. data := tc.data
  81. size := tc.size
  82. zbuf := new(bytes.Buffer)
  83. f := NewFrame()
  84. block := NewFrameDataBlock(lz4block.Index(size))
  85. block.Compress(f, []byte(data), lz4block.Fast)
  86. if err := block.Write(f, zbuf); err != nil {
  87. t.Fatal(err)
  88. }
  89. buf := make([]byte, size)
  90. n, err := block.Uncompress(f, zbuf, buf)
  91. if err != nil {
  92. t.Fatal(err)
  93. }
  94. if got, want := n, len(data); got != want {
  95. t.Fatalf("got %d; want %d", got, want)
  96. }
  97. if got, want := string(buf[:n]), data; got != want {
  98. t.Fatalf("got %q; want %q", got, want)
  99. }
  100. })
  101. }
  102. }