|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298 |
- package io
-
- import (
- "bytes"
- "io"
- "sync"
- "testing"
-
- . "github.com/smartystreets/goconvey/convey"
- )
-
- func Test_RoundRobin(t *testing.T) {
- Convey("数据长度为chunkSize的整数倍", t, func() {
- input := []byte{
- 1, 2, 3, 4, 5, 6, 7, 8, 9,
- 1, 2, 3, 4, 5, 6, 7, 8, 9,
- }
-
- outputs := ChunkedSplit(bytes.NewReader(input), 3, 3)
-
- wg := sync.WaitGroup{}
- wg.Add(3)
-
- o1 := make([]byte, 10)
- var e1 error
- var rd1 int
- go func() {
- rd1, e1 = io.ReadFull(outputs[0], o1)
- wg.Done()
- }()
-
- o2 := make([]byte, 10)
- var e2 error
- var rd2 int
- go func() {
- rd2, e2 = io.ReadFull(outputs[1], o2)
- wg.Done()
- }()
-
- o3 := make([]byte, 10)
- var e3 error
- var rd3 int
- go func() {
- rd3, e3 = io.ReadFull(outputs[2], o3)
- wg.Done()
- }()
-
- wg.Wait()
-
- So(e1, ShouldEqual, io.ErrUnexpectedEOF)
- So(o1[:rd1], ShouldResemble, []byte{1, 2, 3, 1, 2, 3})
-
- So(e2, ShouldEqual, io.ErrUnexpectedEOF)
- So(o2[:rd2], ShouldResemble, []byte{4, 5, 6, 4, 5, 6})
-
- So(e3, ShouldEqual, io.ErrUnexpectedEOF)
- So(o3[:rd3], ShouldResemble, []byte{7, 8, 9, 7, 8, 9})
- })
-
- Convey("数据长度比chunkSize的整数倍少小于chunkSize的数量,且不填充0", t, func() {
- input := []byte{
- 1, 2, 3, 4, 5, 6, 7, 8, 9,
- 1, 2, 3, 4, 5, 6, 7,
- }
-
- outputs := ChunkedSplit(bytes.NewReader(input), 3, 3)
-
- wg := sync.WaitGroup{}
- wg.Add(3)
-
- o1 := make([]byte, 10)
- var e1 error
- var rd1 int
- go func() {
- rd1, e1 = io.ReadFull(outputs[0], o1)
- wg.Done()
- }()
-
- o2 := make([]byte, 10)
- var e2 error
- var rd2 int
- go func() {
- rd2, e2 = io.ReadFull(outputs[1], o2)
- wg.Done()
- }()
-
- o3 := make([]byte, 10)
- var e3 error
- var rd3 int
- go func() {
- rd3, e3 = io.ReadFull(outputs[2], o3)
- wg.Done()
- }()
-
- wg.Wait()
-
- So(e1, ShouldEqual, io.ErrUnexpectedEOF)
- So(o1[:rd1], ShouldResemble, []byte{1, 2, 3, 1, 2, 3})
-
- So(e2, ShouldEqual, io.ErrUnexpectedEOF)
- So(o2[:rd2], ShouldResemble, []byte{4, 5, 6, 4, 5, 6})
-
- So(e3, ShouldEqual, io.ErrUnexpectedEOF)
- So(o3[:rd3], ShouldResemble, []byte{7, 8, 9, 7})
- })
-
- Convey("数据长度比chunkSize的整数倍少多于chunkSize的数量,且不填充0", t, func() {
- input := []byte{
- 1, 2, 3, 4, 5, 6, 7, 8, 9,
- 1, 2, 3, 4, 5,
- }
-
- outputs := ChunkedSplit(bytes.NewReader(input), 3, 3)
-
- wg := sync.WaitGroup{}
- wg.Add(3)
-
- o1 := make([]byte, 10)
- var e1 error
- var rd1 int
- go func() {
- rd1, e1 = io.ReadFull(outputs[0], o1)
- wg.Done()
- }()
-
- o2 := make([]byte, 10)
- var e2 error
- var rd2 int
- go func() {
- rd2, e2 = io.ReadFull(outputs[1], o2)
- wg.Done()
- }()
-
- o3 := make([]byte, 10)
- var e3 error
- var rd3 int
- go func() {
- rd3, e3 = io.ReadFull(outputs[2], o3)
- wg.Done()
- }()
-
- wg.Wait()
-
- So(e1, ShouldEqual, io.ErrUnexpectedEOF)
- So(o1[:rd1], ShouldResemble, []byte{1, 2, 3, 1, 2, 3})
-
- So(e2, ShouldEqual, io.ErrUnexpectedEOF)
- So(o2[:rd2], ShouldResemble, []byte{4, 5, 6, 4, 5})
-
- So(e3, ShouldEqual, io.ErrUnexpectedEOF)
- So(o3[:rd3], ShouldResemble, []byte{7, 8, 9})
- })
-
- Convey("数据长度是chunkSize的整数倍,且填充0", t, func() {
- input := []byte{
- 1, 2, 3, 4, 5, 6, 7, 8, 9,
- }
-
- outputs := ChunkedSplit(bytes.NewReader(input), 3, 3, ChunkedSplitOption{
- FillZeros: true,
- })
-
- wg := sync.WaitGroup{}
- wg.Add(3)
-
- o1 := make([]byte, 10)
- var e1 error
- var rd1 int
- go func() {
- rd1, e1 = io.ReadFull(outputs[0], o1)
- wg.Done()
- }()
-
- o2 := make([]byte, 10)
- var e2 error
- var rd2 int
- go func() {
- rd2, e2 = io.ReadFull(outputs[1], o2)
- wg.Done()
- }()
-
- o3 := make([]byte, 10)
- var e3 error
- var rd3 int
- go func() {
- rd3, e3 = io.ReadFull(outputs[2], o3)
- wg.Done()
- }()
-
- wg.Wait()
-
- So(e1, ShouldEqual, io.ErrUnexpectedEOF)
- So(o1[:rd1], ShouldResemble, []byte{1, 2, 3})
-
- So(e2, ShouldEqual, io.ErrUnexpectedEOF)
- So(o2[:rd2], ShouldResemble, []byte{4, 5, 6})
-
- So(e3, ShouldEqual, io.ErrUnexpectedEOF)
- So(o3[:rd3], ShouldResemble, []byte{7, 8, 9})
- })
-
- Convey("数据长度比chunkSize的整数倍少小于chunkSize的数量,但是填充0", t, func() {
- input := []byte{
- 1, 2, 3, 4, 5, 6, 7, 8, 9,
- 1, 2, 3, 4, 5, 6, 7,
- }
-
- outputs := ChunkedSplit(bytes.NewReader(input), 3, 3, ChunkedSplitOption{
- FillZeros: true,
- })
- wg := sync.WaitGroup{}
- wg.Add(3)
-
- o1 := make([]byte, 10)
- var e1 error
- var rd1 int
- go func() {
- rd1, e1 = io.ReadFull(outputs[0], o1)
- wg.Done()
- }()
-
- o2 := make([]byte, 10)
- var e2 error
- var rd2 int
- go func() {
- rd2, e2 = io.ReadFull(outputs[1], o2)
- wg.Done()
- }()
-
- o3 := make([]byte, 10)
- var e3 error
- var rd3 int
- go func() {
- rd3, e3 = io.ReadFull(outputs[2], o3)
- wg.Done()
- }()
-
- wg.Wait()
-
- So(e1, ShouldEqual, io.ErrUnexpectedEOF)
- So(o1[:rd1], ShouldResemble, []byte{1, 2, 3, 1, 2, 3})
-
- So(e2, ShouldEqual, io.ErrUnexpectedEOF)
- So(o2[:rd2], ShouldResemble, []byte{4, 5, 6, 4, 5, 6})
-
- So(e3, ShouldEqual, io.ErrUnexpectedEOF)
- So(o3[:rd3], ShouldResemble, []byte{7, 8, 9, 7, 0, 0})
- })
-
- Convey("数据长度比chunkSize的整数倍少多于chunkSize的数量,但是填充0", t, func() {
- input := []byte{
- 1, 2, 3, 4, 5, 6, 7, 8, 9,
- 1, 2,
- }
-
- outputs := ChunkedSplit(bytes.NewReader(input), 3, 3, ChunkedSplitOption{
- FillZeros: true,
- })
-
- wg := sync.WaitGroup{}
- wg.Add(3)
-
- o1 := make([]byte, 10)
- var e1 error
- var rd1 int
- go func() {
- rd1, e1 = io.ReadFull(outputs[0], o1)
- wg.Done()
- }()
-
- o2 := make([]byte, 10)
- var e2 error
- var rd2 int
- go func() {
- rd2, e2 = io.ReadFull(outputs[1], o2)
- wg.Done()
- }()
-
- o3 := make([]byte, 10)
- var e3 error
- var rd3 int
- go func() {
- rd3, e3 = io.ReadFull(outputs[2], o3)
- wg.Done()
- }()
-
- wg.Wait()
-
- So(e1, ShouldEqual, io.ErrUnexpectedEOF)
- So(o1[:rd1], ShouldResemble, []byte{1, 2, 3, 1, 2, 0})
-
- So(e2, ShouldEqual, io.ErrUnexpectedEOF)
- So(o2[:rd2], ShouldResemble, []byte{4, 5, 6, 0, 0, 0})
-
- So(e3, ShouldEqual, io.ErrUnexpectedEOF)
- So(o3[:rd3], ShouldResemble, []byte{7, 8, 9, 0, 0, 0})
- })
- }
|