-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy pathasync_reader_test.go
More file actions
121 lines (102 loc) · 2.2 KB
/
async_reader_test.go
File metadata and controls
121 lines (102 loc) · 2.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package main
import (
"bytes"
"context"
"errors"
"io"
"math/rand"
"testing"
"github.com/stretchr/testify/require"
)
func TestAsyncReaderReadsAll(t *testing.T) {
const maxSize = 64 * 1024
buffer := make([]byte, maxSize)
n, err := rand.Read(buffer)
require.NoError(t, err)
require.Equal(t, n, maxSize)
tests := []struct {
name string
size int
bufferSize int
}{
{
name: "64k 32 byte buffer",
size: maxSize,
bufferSize: 32,
},
{
name: "64k 1 byte buffer",
size: maxSize,
bufferSize: 1,
},
{
name: "64k 16K byte buffer",
size: maxSize,
bufferSize: 16 * 1024,
},
{
name: "buffer larger than data",
size: 128,
bufferSize: 1024,
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
ctx := context.Background()
testBuffer := buffer[:test.size]
rd, err := AsyncReaderFromReader(bytes.NewReader(testBuffer), test.bufferSize)
require.NoError(t, err)
ctx = rd.Start(ctx)
read := make([]byte, 0, test.size)
for {
newlyRead, err := rd.Read(ctx)
if err == io.EOF {
break
}
require.NoError(t, err)
read = append(read, newlyRead...)
}
require.Equal(t, read, testBuffer)
require.NoError(t, ctx.Err())
require.True(t, rd.IsClosed())
})
}
}
type ErroringReader struct {
io.Reader
err error
errAfterNReads int
reads int
}
func (er *ErroringReader) Read(bytes []byte) (int, error) {
if er.reads < er.errAfterNReads {
er.reads++
return er.Reader.Read(bytes)
}
return 0, er.err
}
func TestReadError(t *testing.T) {
const size = 16 * 1024
const readSize = 32
const errAfterNReads = 4
buffer := make([]byte, size)
n, err := rand.Read(buffer)
require.NoError(t, err)
require.Equal(t, n, size)
expectedErr := errors.New("test error")
er := &ErroringReader{
Reader: bytes.NewReader(buffer),
err: expectedErr,
errAfterNReads: errAfterNReads,
}
rd, err := AsyncReaderFromReader(er, 32)
require.NoError(t, err)
ctx := rd.Start(context.Background())
for i := 0; i < errAfterNReads; i++ {
_, err = rd.Read(ctx)
if err != nil {
break
}
}
require.Equal(t, err, expectedErr)
}