115 lines
1.9 KiB
Go
115 lines
1.9 KiB
Go
package multireader
|
|
|
|
import (
|
|
"bytes"
|
|
"math/rand"
|
|
"sync"
|
|
"testing"
|
|
)
|
|
|
|
func TestMultiRead(t *testing.T) {
|
|
t.Run("positive", func(t *testing.T) {
|
|
_ = NewMultiReader(64)
|
|
})
|
|
t.Run("zero", func(t *testing.T) {
|
|
_ = NewMultiReader(0)
|
|
})
|
|
t.Run("negative", func(t *testing.T) {
|
|
_ = NewMultiReader(-64)
|
|
})
|
|
}
|
|
|
|
func TestReadWrite(t *testing.T) {
|
|
var (
|
|
src []byte
|
|
dst1 []byte
|
|
dst2 []byte
|
|
dst3 []byte
|
|
wg *sync.WaitGroup
|
|
)
|
|
|
|
src = make([]byte, 20480)
|
|
dst1 = make([]byte, 20480)
|
|
dst2 = make([]byte, 20480)
|
|
dst3 = make([]byte, 20480)
|
|
|
|
n, err := rand.Read(src)
|
|
if n < len(src) || err != nil {
|
|
t.Fatalf("cannot initiate test data: %d; %v", n, err)
|
|
}
|
|
|
|
m := NewMultiReader(512)
|
|
r1 := m.NewReader()
|
|
r2 := m.NewReader()
|
|
r3 := m.NewReader()
|
|
wg = &sync.WaitGroup{}
|
|
|
|
writeFunc := func(t *testing.T, m *MultiReader, data []byte, wg *sync.WaitGroup) {
|
|
var (
|
|
n int
|
|
dl int
|
|
r int
|
|
)
|
|
defer wg.Done()
|
|
|
|
for n < len(data) {
|
|
dl = rand.Intn(512)
|
|
if n+512+dl > len(data) {
|
|
r, _ = m.Write(data[n:])
|
|
} else {
|
|
r, _ = m.Write(data[n : n+512+dl])
|
|
}
|
|
n += r
|
|
}
|
|
_ = m.Close()
|
|
}
|
|
wg.Add(1)
|
|
go writeFunc(t, m, src, wg)
|
|
|
|
readFunc := func(t *testing.T, r *Reader, data []byte, wg *sync.WaitGroup) {
|
|
var (
|
|
offset int
|
|
n int
|
|
err error
|
|
)
|
|
defer wg.Done()
|
|
|
|
offset = 0
|
|
for {
|
|
if offset+1024 < len(data) {
|
|
n, err = r.Read(data[offset : offset+1024])
|
|
if err != nil {
|
|
t.Logf("reader got error: %v", err)
|
|
break
|
|
}
|
|
} else {
|
|
n, err = r.Read(data[offset:])
|
|
if err != nil {
|
|
t.Logf("reader got error: %v", err)
|
|
break
|
|
}
|
|
|
|
}
|
|
offset += n
|
|
}
|
|
}
|
|
|
|
wg.Add(1)
|
|
go readFunc(t, r1, dst1, wg)
|
|
wg.Add(1)
|
|
go readFunc(t, r2, dst2, wg)
|
|
wg.Add(1)
|
|
go readFunc(t, r3, dst3, wg)
|
|
|
|
wg.Wait()
|
|
if !bytes.Equal(src, dst1) {
|
|
t.Error("src and dst1 mismatch")
|
|
}
|
|
if !bytes.Equal(src, dst2) {
|
|
t.Error("src and dst2 mismatch")
|
|
}
|
|
if !bytes.Equal(src, dst3) {
|
|
t.Error("src and dst3 mismatch")
|
|
}
|
|
}
|