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 3.1 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package io
  2. import (
  3. "bytes"
  4. "io"
  5. "testing"
  6. . "github.com/smartystreets/goconvey/convey"
  7. )
  8. func Test_Join(t *testing.T) {
  9. Convey("连接多个流", t, func() {
  10. str := Join([]io.Reader{
  11. bytes.NewReader([]byte{1, 2, 3}),
  12. bytes.NewReader([]byte{4}),
  13. bytes.NewReader([]byte{5, 6, 7, 8}),
  14. })
  15. buf := make([]byte, 9)
  16. rd, err := io.ReadFull(str, buf)
  17. So(err, ShouldEqual, io.ErrUnexpectedEOF)
  18. So(buf[:rd], ShouldResemble, []byte{1, 2, 3, 4, 5, 6, 7, 8})
  19. })
  20. Convey("分块式连接多个流,每个流长度相等", t, func() {
  21. str := ChunkedJoin([]io.Reader{
  22. bytes.NewReader([]byte{1, 2, 3}),
  23. bytes.NewReader([]byte{4, 5, 6}),
  24. bytes.NewReader([]byte{7, 8, 9}),
  25. }, 3)
  26. buf := make([]byte, 10)
  27. rd, err := io.ReadFull(str, buf)
  28. So(err, ShouldEqual, io.ErrUnexpectedEOF)
  29. So(buf[:rd], ShouldResemble, []byte{1, 2, 3, 4, 5, 6, 7, 8, 9})
  30. })
  31. Convey("分块式连接多个流,流长度不相等,但都是chunkSize的整数倍", t, func() {
  32. str := ChunkedJoin([]io.Reader{
  33. bytes.NewReader([]byte{1, 2, 3}),
  34. bytes.NewReader([]byte{4, 5, 6, 7, 8, 9, 10, 11, 12}),
  35. bytes.NewReader([]byte{}),
  36. bytes.NewReader([]byte{13, 14, 15}),
  37. }, 3)
  38. buf := make([]byte, 100)
  39. rd, err := io.ReadFull(str, buf)
  40. So(err, ShouldEqual, io.ErrUnexpectedEOF)
  41. So(buf[:rd], ShouldResemble, []byte{1, 2, 3, 4, 5, 6, 13, 14, 15, 7, 8, 9, 10, 11, 12})
  42. })
  43. Convey("分块式连接多个流,流长度不相等,且不一定是chunkSize的整数倍", t, func() {
  44. str := ChunkedJoin([]io.Reader{
  45. bytes.NewReader([]byte{1, 2, 3}),
  46. bytes.NewReader([]byte{4, 5, 6, 7, 8}),
  47. bytes.NewReader([]byte{9}),
  48. }, 3)
  49. buf := make([]byte, 10)
  50. rd, err := io.ReadFull(str, buf)
  51. So(err, ShouldEqual, io.ErrUnexpectedEOF)
  52. So(buf[:rd], ShouldResemble, []byte{1, 2, 3, 4, 5, 6, 9, 7, 8})
  53. })
  54. }
  55. func Test_Length(t *testing.T) {
  56. Convey("非强制,长度刚好", t, func() {
  57. str := Length(bytes.NewReader([]byte{1, 2, 3}), 3)
  58. buf := make([]byte, 9)
  59. rd, err := io.ReadFull(str, buf)
  60. So(err, ShouldEqual, io.ErrUnexpectedEOF)
  61. So(buf[:rd], ShouldResemble, []byte{1, 2, 3})
  62. })
  63. Convey("非强制,长度小于设定", t, func() {
  64. str := Length(bytes.NewReader([]byte{1, 2}), 3)
  65. buf := make([]byte, 2)
  66. rd, err := io.ReadFull(str, buf)
  67. if err == nil {
  68. var rd2 int
  69. rd2, err = io.ReadFull(str, buf)
  70. So(rd2, ShouldEqual, 0)
  71. }
  72. So(err, ShouldEqual, io.EOF)
  73. So(buf[:rd], ShouldResemble, []byte{1, 2})
  74. })
  75. Convey("非强制,长度大于设定", t, func() {
  76. str := Length(bytes.NewReader([]byte{1, 2, 3, 4}), 3)
  77. buf := make([]byte, 3)
  78. rd, err := io.ReadFull(str, buf)
  79. if err == nil {
  80. var rd2 int
  81. rd2, err = io.ReadFull(str, buf)
  82. So(rd2, ShouldEqual, 0)
  83. }
  84. So(err, ShouldEqual, io.EOF)
  85. So(buf[:rd], ShouldResemble, []byte{1, 2, 3})
  86. })
  87. Convey("强制,长度小于设定", t, func() {
  88. str := MustLength(bytes.NewReader([]byte{1, 2}), 3)
  89. buf := make([]byte, 2)
  90. _, err := io.ReadFull(str, buf)
  91. if err == nil {
  92. _, err = io.ReadFull(str, buf)
  93. }
  94. So(err, ShouldEqual, io.ErrUnexpectedEOF)
  95. })
  96. }