multireader_test.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. package multireader
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "fmt"
  6. "io"
  7. "io/ioutil"
  8. "os"
  9. "strings"
  10. "testing"
  11. )
  12. func TestMultiReadSeekerReadAll(t *testing.T) {
  13. str := "hello world"
  14. s1 := strings.NewReader(str + " 1")
  15. s2 := strings.NewReader(str + " 2")
  16. s3 := strings.NewReader(str + " 3")
  17. mr := MultiReadSeeker(s1, s2, s3)
  18. expectedSize := int64(s1.Len() + s2.Len() + s3.Len())
  19. b, err := ioutil.ReadAll(mr)
  20. if err != nil {
  21. t.Fatal(err)
  22. }
  23. expected := "hello world 1hello world 2hello world 3"
  24. if string(b) != expected {
  25. t.Fatalf("ReadAll failed, got: %q, expected %q", string(b), expected)
  26. }
  27. size, err := mr.Seek(0, os.SEEK_END)
  28. if err != nil {
  29. t.Fatal(err)
  30. }
  31. if size != expectedSize {
  32. t.Fatalf("reader size does not match, got %d, expected %d", size, expectedSize)
  33. }
  34. // Reset the position and read again
  35. pos, err := mr.Seek(0, os.SEEK_SET)
  36. if err != nil {
  37. t.Fatal(err)
  38. }
  39. if pos != 0 {
  40. t.Fatalf("expected position to be set to 0, got %d", pos)
  41. }
  42. b, err = ioutil.ReadAll(mr)
  43. if err != nil {
  44. t.Fatal(err)
  45. }
  46. if string(b) != expected {
  47. t.Fatalf("ReadAll failed, got: %q, expected %q", string(b), expected)
  48. }
  49. // The positions of some readers are not 0
  50. s1.Seek(0, os.SEEK_SET)
  51. s2.Seek(0, os.SEEK_END)
  52. s3.Seek(0, os.SEEK_SET)
  53. mr = MultiReadSeeker(s1, s2, s3)
  54. b, err = ioutil.ReadAll(mr)
  55. if err != nil {
  56. t.Fatal(err)
  57. }
  58. if string(b) != expected {
  59. t.Fatalf("ReadAll failed, got: %q, expected %q", string(b), expected)
  60. }
  61. }
  62. func TestMultiReadSeekerReadEach(t *testing.T) {
  63. str := "hello world"
  64. s1 := strings.NewReader(str + " 1")
  65. s2 := strings.NewReader(str + " 2")
  66. s3 := strings.NewReader(str + " 3")
  67. mr := MultiReadSeeker(s1, s2, s3)
  68. var totalBytes int64
  69. for i, s := range []*strings.Reader{s1, s2, s3} {
  70. sLen := int64(s.Len())
  71. buf := make([]byte, s.Len())
  72. expected := []byte(fmt.Sprintf("%s %d", str, i+1))
  73. if _, err := mr.Read(buf); err != nil && err != io.EOF {
  74. t.Fatal(err)
  75. }
  76. if !bytes.Equal(buf, expected) {
  77. t.Fatalf("expected %q to be %q", string(buf), string(expected))
  78. }
  79. pos, err := mr.Seek(0, os.SEEK_CUR)
  80. if err != nil {
  81. t.Fatalf("iteration: %d, error: %v", i+1, err)
  82. }
  83. // check that the total bytes read is the current position of the seeker
  84. totalBytes += sLen
  85. if pos != totalBytes {
  86. t.Fatalf("expected current position to be: %d, got: %d, iteration: %d", totalBytes, pos, i+1)
  87. }
  88. // This tests not only that SEEK_SET and SEEK_CUR give the same values, but that the next iteration is in the expected position as well
  89. newPos, err := mr.Seek(pos, os.SEEK_SET)
  90. if err != nil {
  91. t.Fatal(err)
  92. }
  93. if newPos != pos {
  94. t.Fatalf("expected to get same position when calling SEEK_SET with value from SEEK_CUR, cur: %d, set: %d", pos, newPos)
  95. }
  96. }
  97. }
  98. func TestMultiReadSeekerReadSpanningChunks(t *testing.T) {
  99. str := "hello world"
  100. s1 := strings.NewReader(str + " 1")
  101. s2 := strings.NewReader(str + " 2")
  102. s3 := strings.NewReader(str + " 3")
  103. mr := MultiReadSeeker(s1, s2, s3)
  104. buf := make([]byte, s1.Len()+3)
  105. _, err := mr.Read(buf)
  106. if err != nil {
  107. t.Fatal(err)
  108. }
  109. // expected is the contents of s1 + 3 bytes from s2, ie, the `hel` at the end of this string
  110. expected := "hello world 1hel"
  111. if string(buf) != expected {
  112. t.Fatalf("expected %s to be %s", string(buf), expected)
  113. }
  114. }
  115. func TestMultiReadSeekerNegativeSeek(t *testing.T) {
  116. str := "hello world"
  117. s1 := strings.NewReader(str + " 1")
  118. s2 := strings.NewReader(str + " 2")
  119. s3 := strings.NewReader(str + " 3")
  120. mr := MultiReadSeeker(s1, s2, s3)
  121. s1Len := s1.Len()
  122. s2Len := s2.Len()
  123. s3Len := s3.Len()
  124. s, err := mr.Seek(int64(-1*s3.Len()), os.SEEK_END)
  125. if err != nil {
  126. t.Fatal(err)
  127. }
  128. if s != int64(s1Len+s2Len) {
  129. t.Fatalf("expected %d to be %d", s, s1.Len()+s2.Len())
  130. }
  131. buf := make([]byte, s3Len)
  132. if _, err := mr.Read(buf); err != nil && err != io.EOF {
  133. t.Fatal(err)
  134. }
  135. expected := fmt.Sprintf("%s %d", str, 3)
  136. if string(buf) != fmt.Sprintf("%s %d", str, 3) {
  137. t.Fatalf("expected %q to be %q", string(buf), expected)
  138. }
  139. }
  140. func TestMultiReadSeekerCurAfterSet(t *testing.T) {
  141. str := "hello world"
  142. s1 := strings.NewReader(str + " 1")
  143. s2 := strings.NewReader(str + " 2")
  144. s3 := strings.NewReader(str + " 3")
  145. mr := MultiReadSeeker(s1, s2, s3)
  146. mid := int64(s1.Len() + s2.Len()/2)
  147. size, err := mr.Seek(mid, os.SEEK_SET)
  148. if err != nil {
  149. t.Fatal(err)
  150. }
  151. if size != mid {
  152. t.Fatalf("reader size does not match, got %d, expected %d", size, mid)
  153. }
  154. size, err = mr.Seek(3, os.SEEK_CUR)
  155. if err != nil {
  156. t.Fatal(err)
  157. }
  158. if size != mid+3 {
  159. t.Fatalf("reader size does not match, got %d, expected %d", size, mid+3)
  160. }
  161. size, err = mr.Seek(5, os.SEEK_CUR)
  162. if err != nil {
  163. t.Fatal(err)
  164. }
  165. if size != mid+8 {
  166. t.Fatalf("reader size does not match, got %d, expected %d", size, mid+8)
  167. }
  168. size, err = mr.Seek(10, os.SEEK_CUR)
  169. if err != nil {
  170. t.Fatal(err)
  171. }
  172. if size != mid+18 {
  173. t.Fatalf("reader size does not match, got %d, expected %d", size, mid+18)
  174. }
  175. }
  176. func TestMultiReadSeekerSmallReads(t *testing.T) {
  177. readers := []io.ReadSeeker{}
  178. for i := 0; i < 10; i++ {
  179. integer := make([]byte, 4)
  180. binary.BigEndian.PutUint32(integer, uint32(i))
  181. readers = append(readers, bytes.NewReader(integer))
  182. }
  183. reader := MultiReadSeeker(readers...)
  184. for i := 0; i < 10; i++ {
  185. var integer uint32
  186. if err := binary.Read(reader, binary.BigEndian, &integer); err != nil {
  187. t.Fatalf("Read from NewMultiReadSeeker failed: %v", err)
  188. }
  189. if uint32(i) != integer {
  190. t.Fatalf("Read wrong value from NewMultiReadSeeker: %d != %d", i, integer)
  191. }
  192. }
  193. }