writer_test.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. package lz4_test
  2. import (
  3. "bytes"
  4. "fmt"
  5. "io"
  6. "io/ioutil"
  7. "os"
  8. "reflect"
  9. "testing"
  10. )
  11. func TestWriter(t *testing.T) {
  12. goldenFiles := []string{
  13. "testdata/e.txt",
  14. "testdata/gettysburg.txt",
  15. "testdata/Mark.Twain-Tom.Sawyer.txt",
  16. "testdata/Mark.Twain-Tom.Sawyer_long.txt",
  17. "testdata/pg1661.txt",
  18. "testdata/pi.txt",
  19. "testdata/random.data",
  20. "testdata/repeat.txt",
  21. }
  22. for _, fname := range goldenFiles {
  23. for _, size := range []int{0, 4} {
  24. for _, header := range []Header{
  25. {}, // Default header.
  26. {BlockChecksum: true},
  27. {NoChecksum: true},
  28. {BlockMaxSize: 64 << 10}, // 64Kb
  29. {CompressionLevel: 10},
  30. {Size: 123},
  31. } {
  32. label := fmt.Sprintf("%s/%s", fname, header)
  33. t.Run(label, func(t *testing.T) {
  34. fname := fname
  35. header := header
  36. t.Parallel()
  37. raw, err := ioutil.ReadFile(fname)
  38. if err != nil {
  39. t.Fatal(err)
  40. }
  41. r := bytes.NewReader(raw)
  42. // Compress.
  43. var zout bytes.Buffer
  44. zw := NewWriter(&zout)
  45. zw.Header = header
  46. zw.WithConcurrency(size)
  47. _, err = io.Copy(zw, r)
  48. if err != nil {
  49. t.Fatal(err)
  50. }
  51. err = zw.Close()
  52. if err != nil {
  53. t.Fatal(err)
  54. }
  55. // Uncompress.
  56. var out bytes.Buffer
  57. zr := NewReader(&zout)
  58. n, err := io.Copy(&out, zr)
  59. if err != nil {
  60. t.Fatal(err)
  61. }
  62. // The uncompressed data must be the same as the initial input.
  63. if got, want := int(n), len(raw); got != want {
  64. t.Errorf("invalid sizes: got %d; want %d", got, want)
  65. }
  66. if got, want := out.Bytes(), raw; !reflect.DeepEqual(got, want) {
  67. t.Fatal("uncompressed data does not match original")
  68. }
  69. })
  70. }
  71. }
  72. }
  73. }
  74. func TestIssue41(t *testing.T) {
  75. r, w := io.Pipe()
  76. zw := NewWriter(w)
  77. zr := NewReader(r)
  78. data := "x"
  79. go func() {
  80. _, _ = fmt.Fprint(zw, data)
  81. _ = zw.Flush()
  82. _ = zw.Close()
  83. _ = w.Close()
  84. }()
  85. var buf bytes.Buffer
  86. _, _ = buf.ReadFrom(zr)
  87. if got, want := buf.String(), data; got != want {
  88. t.Fatal("uncompressed data does not match original")
  89. }
  90. }
  91. func TestIssue43(t *testing.T) {
  92. r, w := io.Pipe()
  93. go func() {
  94. defer w.Close()
  95. f, err := os.Open("testdata/issue43.data")
  96. if err != nil {
  97. t.Fatal(err)
  98. }
  99. defer f.Close()
  100. zw := NewWriter(w)
  101. defer zw.Close()
  102. _, err = io.Copy(zw, f)
  103. if err != nil {
  104. t.Fatal(err)
  105. }
  106. }()
  107. _, err := io.Copy(ioutil.Discard, NewReader(r))
  108. if err != nil {
  109. t.Fatal(err)
  110. }
  111. }
  112. func TestIssue51(t *testing.T) {
  113. data, err := ioutil.ReadFile("testdata/issue51.data")
  114. if err != nil {
  115. t.Fatal(err)
  116. }
  117. zbuf := make([]byte, 8192)
  118. ht := make([]int, htSize)
  119. n, err := CompressBlock(data, zbuf, ht)
  120. if err != nil {
  121. t.Fatal(err)
  122. }
  123. zbuf = zbuf[:n]
  124. buf := make([]byte, 8192)
  125. n, err = UncompressBlock(zbuf, buf)
  126. if err != nil {
  127. t.Fatal(err)
  128. }
  129. buf = buf[:n]
  130. if !bytes.Equal(data, buf) {
  131. t.Fatal("processed data does not match input")
  132. }
  133. }
  134. func TestIssue71(t *testing.T) {
  135. for _, tc := range []string{
  136. "abc", // < mfLimit
  137. "abcdefghijklmnopq", // > mfLimit
  138. } {
  139. t.Run(tc, func(t *testing.T) {
  140. src := []byte(tc)
  141. bound := CompressBlockBound(len(tc))
  142. // Small buffer.
  143. zSmall := make([]byte, bound-1)
  144. n, err := CompressBlock(src, zSmall, nil)
  145. if err != nil {
  146. t.Fatal(err)
  147. }
  148. if n != 0 {
  149. t.Fatal("should be incompressible")
  150. }
  151. // Large enough buffer.
  152. zLarge := make([]byte, bound)
  153. n, err = CompressBlock(src, zLarge, nil)
  154. if err != nil {
  155. t.Fatal(err)
  156. }
  157. if n == 0 {
  158. t.Fatal("should be compressible")
  159. }
  160. })
  161. }
  162. }