writer_test.go 3.5 KB

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