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.

io_test.go 4.4 kB

1 year ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. package io2
  2. import (
  3. "bytes"
  4. "io"
  5. "sync"
  6. "testing"
  7. . "github.com/smartystreets/goconvey/convey"
  8. )
  9. func Test_Join(t *testing.T) {
  10. Convey("连接多个流", t, func() {
  11. str := Join([]io.Reader{
  12. bytes.NewReader([]byte{1, 2, 3}),
  13. bytes.NewReader([]byte{4}),
  14. bytes.NewReader([]byte{5, 6, 7, 8}),
  15. })
  16. buf := make([]byte, 9)
  17. rd, err := io.ReadFull(str, buf)
  18. So(err, ShouldEqual, io.ErrUnexpectedEOF)
  19. So(buf[:rd], ShouldResemble, []byte{1, 2, 3, 4, 5, 6, 7, 8})
  20. })
  21. Convey("分块式连接多个流,每个流长度相等", t, func() {
  22. str := ChunkedJoin([]io.Reader{
  23. bytes.NewReader([]byte{1, 2, 3}),
  24. bytes.NewReader([]byte{4, 5, 6}),
  25. bytes.NewReader([]byte{7, 8, 9}),
  26. }, 3)
  27. buf := make([]byte, 10)
  28. rd, err := io.ReadFull(str, buf)
  29. So(err, ShouldEqual, io.ErrUnexpectedEOF)
  30. So(buf[:rd], ShouldResemble, []byte{1, 2, 3, 4, 5, 6, 7, 8, 9})
  31. })
  32. Convey("分块式连接多个流,流长度不相等,但都是chunkSize的整数倍", t, func() {
  33. str := ChunkedJoin([]io.Reader{
  34. bytes.NewReader([]byte{1, 2, 3}),
  35. bytes.NewReader([]byte{4, 5, 6, 7, 8, 9, 10, 11, 12}),
  36. bytes.NewReader([]byte{}),
  37. bytes.NewReader([]byte{13, 14, 15}),
  38. }, 3)
  39. buf := make([]byte, 100)
  40. rd, err := io.ReadFull(str, buf)
  41. So(err, ShouldEqual, io.ErrUnexpectedEOF)
  42. So(buf[:rd], ShouldResemble, []byte{1, 2, 3, 4, 5, 6, 13, 14, 15, 7, 8, 9, 10, 11, 12})
  43. })
  44. Convey("分块式连接多个流,流长度不相等,且不一定是chunkSize的整数倍", t, func() {
  45. str := ChunkedJoin([]io.Reader{
  46. bytes.NewReader([]byte{1, 2, 3}),
  47. bytes.NewReader([]byte{4, 5, 6, 7, 8}),
  48. bytes.NewReader([]byte{9}),
  49. }, 3)
  50. buf := make([]byte, 10)
  51. rd, err := io.ReadFull(str, buf)
  52. So(err, ShouldEqual, io.ErrUnexpectedEOF)
  53. So(buf[:rd], ShouldResemble, []byte{1, 2, 3, 4, 5, 6, 9, 7, 8})
  54. })
  55. }
  56. func Test_Length(t *testing.T) {
  57. Convey("非强制,长度刚好", t, func() {
  58. str := Length(bytes.NewReader([]byte{1, 2, 3}), 3)
  59. buf := make([]byte, 9)
  60. rd, err := io.ReadFull(str, buf)
  61. So(err, ShouldEqual, io.ErrUnexpectedEOF)
  62. So(buf[:rd], ShouldResemble, []byte{1, 2, 3})
  63. })
  64. Convey("非强制,长度小于设定", t, func() {
  65. str := Length(bytes.NewReader([]byte{1, 2}), 3)
  66. buf := make([]byte, 2)
  67. rd, err := io.ReadFull(str, buf)
  68. if err == nil {
  69. var rd2 int
  70. rd2, err = io.ReadFull(str, buf)
  71. So(rd2, ShouldEqual, 0)
  72. }
  73. So(err, ShouldEqual, io.EOF)
  74. So(buf[:rd], ShouldResemble, []byte{1, 2})
  75. })
  76. Convey("非强制,长度大于设定", t, func() {
  77. str := Length(bytes.NewReader([]byte{1, 2, 3, 4}), 3)
  78. buf := make([]byte, 3)
  79. rd, err := io.ReadFull(str, buf)
  80. if err == nil {
  81. var rd2 int
  82. rd2, err = io.ReadFull(str, buf)
  83. So(rd2, ShouldEqual, 0)
  84. }
  85. So(err, ShouldEqual, io.EOF)
  86. So(buf[:rd], ShouldResemble, []byte{1, 2, 3})
  87. })
  88. Convey("强制,长度小于设定", t, func() {
  89. str := MustLength(bytes.NewReader([]byte{1, 2}), 3)
  90. buf := make([]byte, 2)
  91. _, err := io.ReadFull(str, buf)
  92. if err == nil {
  93. _, err = io.ReadFull(str, buf)
  94. }
  95. So(err, ShouldEqual, io.ErrUnexpectedEOF)
  96. })
  97. }
  98. func Test_Clone(t *testing.T) {
  99. Convey("所有输出流都会被读取完", t, func() {
  100. data := []byte{1, 2, 3, 4, 5}
  101. str := bytes.NewReader(data)
  102. cloneds := Clone(str, 3)
  103. reads := make([][]byte, 3)
  104. errs := make([]error, 3)
  105. wg := sync.WaitGroup{}
  106. wg.Add(3)
  107. go func() {
  108. reads[0], errs[0] = io.ReadAll(cloneds[0])
  109. wg.Done()
  110. }()
  111. go func() {
  112. reads[1], errs[1] = io.ReadAll(cloneds[1])
  113. wg.Done()
  114. }()
  115. go func() {
  116. reads[2], errs[2] = io.ReadAll(cloneds[2])
  117. wg.Done()
  118. }()
  119. wg.Wait()
  120. So(reads, ShouldResemble, [][]byte{data, data, data})
  121. So(errs, ShouldResemble, []error{nil, nil, nil})
  122. })
  123. Convey("其中一个流读到一半就停止读取", t, func() {
  124. data := []byte{1, 2, 3, 4, 5}
  125. str := bytes.NewReader(data)
  126. cloneds := Clone(str, 3)
  127. reads := make([][]byte, 3)
  128. errs := make([]error, 3)
  129. wg := sync.WaitGroup{}
  130. wg.Add(3)
  131. go func() {
  132. reads[0], errs[0] = io.ReadAll(cloneds[0])
  133. wg.Done()
  134. }()
  135. go func() {
  136. buf := make([]byte, 3)
  137. _, errs[1] = io.ReadFull(cloneds[1], buf)
  138. reads[1] = buf
  139. cloneds[1].Close()
  140. wg.Done()
  141. }()
  142. go func() {
  143. reads[2], errs[2] = io.ReadAll(cloneds[2])
  144. wg.Done()
  145. }()
  146. wg.Wait()
  147. So(reads, ShouldResemble, [][]byte{data, {1, 2, 3}, data})
  148. So(errs, ShouldResemble, []error{nil, nil, nil})
  149. })
  150. }