You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

chunked_split_test.go 6.0 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. package io
  2. import (
  3. "bytes"
  4. "io"
  5. "sync"
  6. "testing"
  7. . "github.com/smartystreets/goconvey/convey"
  8. )
  9. func Test_RoundRobin(t *testing.T) {
  10. Convey("数据长度为chunkSize的整数倍", t, func() {
  11. input := []byte{
  12. 1, 2, 3, 4, 5, 6, 7, 8, 9,
  13. 1, 2, 3, 4, 5, 6, 7, 8, 9,
  14. }
  15. outputs := ChunkedSplit(bytes.NewReader(input), 3, 3)
  16. wg := sync.WaitGroup{}
  17. wg.Add(3)
  18. o1 := make([]byte, 10)
  19. var e1 error
  20. var rd1 int
  21. go func() {
  22. rd1, e1 = io.ReadFull(outputs[0], o1)
  23. wg.Done()
  24. }()
  25. o2 := make([]byte, 10)
  26. var e2 error
  27. var rd2 int
  28. go func() {
  29. rd2, e2 = io.ReadFull(outputs[1], o2)
  30. wg.Done()
  31. }()
  32. o3 := make([]byte, 10)
  33. var e3 error
  34. var rd3 int
  35. go func() {
  36. rd3, e3 = io.ReadFull(outputs[2], o3)
  37. wg.Done()
  38. }()
  39. wg.Wait()
  40. So(e1, ShouldEqual, io.ErrUnexpectedEOF)
  41. So(o1[:rd1], ShouldResemble, []byte{1, 2, 3, 1, 2, 3})
  42. So(e2, ShouldEqual, io.ErrUnexpectedEOF)
  43. So(o2[:rd2], ShouldResemble, []byte{4, 5, 6, 4, 5, 6})
  44. So(e3, ShouldEqual, io.ErrUnexpectedEOF)
  45. So(o3[:rd3], ShouldResemble, []byte{7, 8, 9, 7, 8, 9})
  46. })
  47. Convey("数据长度比chunkSize的整数倍少小于chunkSize的数量,且不填充0", t, func() {
  48. input := []byte{
  49. 1, 2, 3, 4, 5, 6, 7, 8, 9,
  50. 1, 2, 3, 4, 5, 6, 7,
  51. }
  52. outputs := ChunkedSplit(bytes.NewReader(input), 3, 3)
  53. wg := sync.WaitGroup{}
  54. wg.Add(3)
  55. o1 := make([]byte, 10)
  56. var e1 error
  57. var rd1 int
  58. go func() {
  59. rd1, e1 = io.ReadFull(outputs[0], o1)
  60. wg.Done()
  61. }()
  62. o2 := make([]byte, 10)
  63. var e2 error
  64. var rd2 int
  65. go func() {
  66. rd2, e2 = io.ReadFull(outputs[1], o2)
  67. wg.Done()
  68. }()
  69. o3 := make([]byte, 10)
  70. var e3 error
  71. var rd3 int
  72. go func() {
  73. rd3, e3 = io.ReadFull(outputs[2], o3)
  74. wg.Done()
  75. }()
  76. wg.Wait()
  77. So(e1, ShouldEqual, io.ErrUnexpectedEOF)
  78. So(o1[:rd1], ShouldResemble, []byte{1, 2, 3, 1, 2, 3})
  79. So(e2, ShouldEqual, io.ErrUnexpectedEOF)
  80. So(o2[:rd2], ShouldResemble, []byte{4, 5, 6, 4, 5, 6})
  81. So(e3, ShouldEqual, io.ErrUnexpectedEOF)
  82. So(o3[:rd3], ShouldResemble, []byte{7, 8, 9, 7})
  83. })
  84. Convey("数据长度比chunkSize的整数倍少多于chunkSize的数量,且不填充0", t, func() {
  85. input := []byte{
  86. 1, 2, 3, 4, 5, 6, 7, 8, 9,
  87. 1, 2, 3, 4, 5,
  88. }
  89. outputs := ChunkedSplit(bytes.NewReader(input), 3, 3)
  90. wg := sync.WaitGroup{}
  91. wg.Add(3)
  92. o1 := make([]byte, 10)
  93. var e1 error
  94. var rd1 int
  95. go func() {
  96. rd1, e1 = io.ReadFull(outputs[0], o1)
  97. wg.Done()
  98. }()
  99. o2 := make([]byte, 10)
  100. var e2 error
  101. var rd2 int
  102. go func() {
  103. rd2, e2 = io.ReadFull(outputs[1], o2)
  104. wg.Done()
  105. }()
  106. o3 := make([]byte, 10)
  107. var e3 error
  108. var rd3 int
  109. go func() {
  110. rd3, e3 = io.ReadFull(outputs[2], o3)
  111. wg.Done()
  112. }()
  113. wg.Wait()
  114. So(e1, ShouldEqual, io.ErrUnexpectedEOF)
  115. So(o1[:rd1], ShouldResemble, []byte{1, 2, 3, 1, 2, 3})
  116. So(e2, ShouldEqual, io.ErrUnexpectedEOF)
  117. So(o2[:rd2], ShouldResemble, []byte{4, 5, 6, 4, 5})
  118. So(e3, ShouldEqual, io.ErrUnexpectedEOF)
  119. So(o3[:rd3], ShouldResemble, []byte{7, 8, 9})
  120. })
  121. Convey("数据长度是chunkSize的整数倍,且填充0", t, func() {
  122. input := []byte{
  123. 1, 2, 3, 4, 5, 6, 7, 8, 9,
  124. }
  125. outputs := ChunkedSplit(bytes.NewReader(input), 3, 3, ChunkedSplitOption{
  126. FillZeros: true,
  127. })
  128. wg := sync.WaitGroup{}
  129. wg.Add(3)
  130. o1 := make([]byte, 10)
  131. var e1 error
  132. var rd1 int
  133. go func() {
  134. rd1, e1 = io.ReadFull(outputs[0], o1)
  135. wg.Done()
  136. }()
  137. o2 := make([]byte, 10)
  138. var e2 error
  139. var rd2 int
  140. go func() {
  141. rd2, e2 = io.ReadFull(outputs[1], o2)
  142. wg.Done()
  143. }()
  144. o3 := make([]byte, 10)
  145. var e3 error
  146. var rd3 int
  147. go func() {
  148. rd3, e3 = io.ReadFull(outputs[2], o3)
  149. wg.Done()
  150. }()
  151. wg.Wait()
  152. So(e1, ShouldEqual, io.ErrUnexpectedEOF)
  153. So(o1[:rd1], ShouldResemble, []byte{1, 2, 3})
  154. So(e2, ShouldEqual, io.ErrUnexpectedEOF)
  155. So(o2[:rd2], ShouldResemble, []byte{4, 5, 6})
  156. So(e3, ShouldEqual, io.ErrUnexpectedEOF)
  157. So(o3[:rd3], ShouldResemble, []byte{7, 8, 9})
  158. })
  159. Convey("数据长度比chunkSize的整数倍少小于chunkSize的数量,但是填充0", t, func() {
  160. input := []byte{
  161. 1, 2, 3, 4, 5, 6, 7, 8, 9,
  162. 1, 2, 3, 4, 5, 6, 7,
  163. }
  164. outputs := ChunkedSplit(bytes.NewReader(input), 3, 3, ChunkedSplitOption{
  165. FillZeros: true,
  166. })
  167. wg := sync.WaitGroup{}
  168. wg.Add(3)
  169. o1 := make([]byte, 10)
  170. var e1 error
  171. var rd1 int
  172. go func() {
  173. rd1, e1 = io.ReadFull(outputs[0], o1)
  174. wg.Done()
  175. }()
  176. o2 := make([]byte, 10)
  177. var e2 error
  178. var rd2 int
  179. go func() {
  180. rd2, e2 = io.ReadFull(outputs[1], o2)
  181. wg.Done()
  182. }()
  183. o3 := make([]byte, 10)
  184. var e3 error
  185. var rd3 int
  186. go func() {
  187. rd3, e3 = io.ReadFull(outputs[2], o3)
  188. wg.Done()
  189. }()
  190. wg.Wait()
  191. So(e1, ShouldEqual, io.ErrUnexpectedEOF)
  192. So(o1[:rd1], ShouldResemble, []byte{1, 2, 3, 1, 2, 3})
  193. So(e2, ShouldEqual, io.ErrUnexpectedEOF)
  194. So(o2[:rd2], ShouldResemble, []byte{4, 5, 6, 4, 5, 6})
  195. So(e3, ShouldEqual, io.ErrUnexpectedEOF)
  196. So(o3[:rd3], ShouldResemble, []byte{7, 8, 9, 7, 0, 0})
  197. })
  198. Convey("数据长度比chunkSize的整数倍少多于chunkSize的数量,但是填充0", t, func() {
  199. input := []byte{
  200. 1, 2, 3, 4, 5, 6, 7, 8, 9,
  201. 1, 2,
  202. }
  203. outputs := ChunkedSplit(bytes.NewReader(input), 3, 3, ChunkedSplitOption{
  204. FillZeros: true,
  205. })
  206. wg := sync.WaitGroup{}
  207. wg.Add(3)
  208. o1 := make([]byte, 10)
  209. var e1 error
  210. var rd1 int
  211. go func() {
  212. rd1, e1 = io.ReadFull(outputs[0], o1)
  213. wg.Done()
  214. }()
  215. o2 := make([]byte, 10)
  216. var e2 error
  217. var rd2 int
  218. go func() {
  219. rd2, e2 = io.ReadFull(outputs[1], o2)
  220. wg.Done()
  221. }()
  222. o3 := make([]byte, 10)
  223. var e3 error
  224. var rd3 int
  225. go func() {
  226. rd3, e3 = io.ReadFull(outputs[2], o3)
  227. wg.Done()
  228. }()
  229. wg.Wait()
  230. So(e1, ShouldEqual, io.ErrUnexpectedEOF)
  231. So(o1[:rd1], ShouldResemble, []byte{1, 2, 3, 1, 2, 0})
  232. So(e2, ShouldEqual, io.ErrUnexpectedEOF)
  233. So(o2[:rd2], ShouldResemble, []byte{4, 5, 6, 0, 0, 0})
  234. So(e3, ShouldEqual, io.ErrUnexpectedEOF)
  235. So(o3[:rd3], ShouldResemble, []byte{7, 8, 9, 0, 0, 0})
  236. })
  237. }