writer_test.go 3.4 KB

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