frame_test.go 2.7 KB

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