|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 |
- package ec
-
- import (
- "bytes"
- "io"
- "sync"
- "testing"
-
- . "github.com/smartystreets/goconvey/convey"
- )
-
- func Test_EncodeReconstruct(t *testing.T) {
- Convey("编码后使用校验块重建数据", t, func() {
- rs, err := NewStreamRs(2, 3, 5)
- So(err, ShouldBeNil)
-
- outputs := rs.EncodeAll([]io.Reader{
- bytes.NewReader([]byte{1, 2, 3, 4, 5}),
- bytes.NewReader([]byte{6, 7, 8, 9, 10}),
- })
-
- var outputData = [][]byte{
- make([]byte, 5),
- make([]byte, 5),
- make([]byte, 5),
- }
-
- { // 编码所有块
- errs := make([]error, 3)
-
- wg := sync.WaitGroup{}
- for i := range outputs {
- idx := i
-
- wg.Add(1)
- go func() {
- defer wg.Done()
- _, err := io.ReadFull(outputs[idx], outputData[idx])
- errs[idx] = err
- }()
- }
-
- wg.Wait()
-
- for _, e := range errs {
- if e != io.EOF {
- So(e, ShouldBeNil)
- }
- }
-
- So(outputData[0], ShouldResemble, []byte{1, 2, 3, 4, 5})
- So(outputData[1], ShouldResemble, []byte{6, 7, 8, 9, 10})
- }
-
- { // 重建所有数据块
- recOutputs := rs.ReconstructData([]io.Reader{
- bytes.NewBuffer(outputData[1]),
- bytes.NewBuffer(outputData[2]),
- }, []int{1, 2})
-
- recOutputData := [][]byte{
- make([]byte, 5),
- make([]byte, 5),
- }
- errs := make([]error, 2)
-
- wg := sync.WaitGroup{}
- for i := range recOutputs {
- idx := i
-
- wg.Add(1)
- go func() {
- defer wg.Done()
- _, err := io.ReadFull(recOutputs[idx], recOutputData[idx])
- errs[idx] = err
- }()
- }
-
- wg.Wait()
-
- for _, e := range errs {
- if e != io.EOF {
- So(e, ShouldBeNil)
- }
- }
-
- So(recOutputData[0], ShouldResemble, []byte{1, 2, 3, 4, 5})
- So(recOutputData[1], ShouldResemble, []byte{6, 7, 8, 9, 10})
- }
-
- { // 重建指定的数据块
- recOutputs := rs.ReconstructSome([]io.Reader{
- bytes.NewBuffer(outputData[1]),
- bytes.NewBuffer(outputData[2]),
- }, []int{1, 2}, []int{0, 1})
-
- recOutputData := [][]byte{
- make([]byte, 5),
- make([]byte, 5),
- }
- errs := make([]error, 2)
-
- wg := sync.WaitGroup{}
- for i := range recOutputs {
- idx := i
-
- wg.Add(1)
- go func() {
- defer wg.Done()
- _, err := io.ReadFull(recOutputs[idx], recOutputData[idx])
- errs[idx] = err
- }()
- }
-
- wg.Wait()
-
- for _, e := range errs {
- if e != io.EOF {
- So(e, ShouldBeNil)
- }
- }
-
- So(recOutputData[0], ShouldResemble, []byte{1, 2, 3, 4, 5})
- So(recOutputData[1], ShouldResemble, []byte{6, 7, 8, 9, 10})
- }
-
- { // 重建指定的数据块
- recOutputs := rs.ReconstructSome([]io.Reader{
- bytes.NewBuffer(outputData[1]),
- bytes.NewBuffer(outputData[2]),
- }, []int{1, 2}, []int{0})
-
- recOutputData := [][]byte{
- make([]byte, 5),
- }
- errs := make([]error, 2)
-
- wg := sync.WaitGroup{}
- for i := range recOutputs {
- idx := i
-
- wg.Add(1)
- go func() {
- defer wg.Done()
- _, err := io.ReadFull(recOutputs[idx], recOutputData[idx])
- errs[idx] = err
- }()
- }
-
- wg.Wait()
-
- for _, e := range errs {
- if e != io.EOF {
- So(e, ShouldBeNil)
- }
- }
-
- So(recOutputData[0], ShouldResemble, []byte{1, 2, 3, 4, 5})
- }
-
- { // 重建指定的数据块
- recOutputs := rs.ReconstructSome([]io.Reader{
- bytes.NewBuffer(outputData[1]),
- bytes.NewBuffer(outputData[2]),
- }, []int{1, 2}, []int{1})
-
- recOutputData := [][]byte{
- make([]byte, 5),
- }
- errs := make([]error, 2)
-
- wg := sync.WaitGroup{}
- for i := range recOutputs {
- idx := i
-
- wg.Add(1)
- go func() {
- defer wg.Done()
- _, err := io.ReadFull(recOutputs[idx], recOutputData[idx])
- errs[idx] = err
- }()
- }
-
- wg.Wait()
-
- for _, e := range errs {
- if e != io.EOF {
- So(e, ShouldBeNil)
- }
- }
-
- So(recOutputData[0], ShouldResemble, []byte{6, 7, 8, 9, 10})
- }
-
- { // 单独产生校验块
- encOutputs := rs.Encode([]io.Reader{
- bytes.NewBuffer(outputData[0]),
- bytes.NewBuffer(outputData[1]),
- })
-
- encOutputData := [][]byte{
- make([]byte, 5),
- }
- errs := make([]error, 2)
-
- wg := sync.WaitGroup{}
- for i := range encOutputs {
- idx := i
-
- wg.Add(1)
- go func() {
- defer wg.Done()
- _, err := io.ReadFull(encOutputs[idx], encOutputData[idx])
- errs[idx] = err
- }()
- }
-
- wg.Wait()
-
- for _, e := range errs {
- if e != io.EOF {
- So(e, ShouldBeNil)
- }
- }
-
- So(encOutputData[0], ShouldResemble, outputData[2])
- }
-
- { // 使用ReconstructAny单独重建校验块
- encOutputs := rs.ReconstructAny([]io.Reader{
- bytes.NewBuffer(outputData[0]),
- bytes.NewBuffer(outputData[1]),
- }, []int{0, 1}, []int{2})
-
- encOutputData := [][]byte{
- make([]byte, 5),
- }
- errs := make([]error, 2)
-
- wg := sync.WaitGroup{}
- for i := range encOutputs {
- idx := i
-
- wg.Add(1)
- go func() {
- defer wg.Done()
- _, err := io.ReadFull(encOutputs[idx], encOutputData[idx])
- errs[idx] = err
- }()
- }
-
- wg.Wait()
-
- for _, e := range errs {
- if e != io.EOF {
- So(e, ShouldBeNil)
- }
- }
-
- So(encOutputData[0], ShouldResemble, outputData[2])
- }
- })
- }
|