@@ -2,9 +2,11 @@ package msgio
2
2
3
3
import (
4
4
"bytes"
5
+ "errors"
5
6
"fmt"
6
7
"io"
7
8
"math/rand"
9
+ str "strings"
8
10
"sync"
9
11
"testing"
10
12
"time"
@@ -47,6 +49,45 @@ func TestWriteClose(t *testing.T) {
47
49
SubtestWriteClose (t , writer , reader )
48
50
}
49
51
52
+ type testIoReadWriter struct {
53
+ io.Reader
54
+ io.Writer
55
+ }
56
+
57
+ func TestReadWriterClose (t * testing.T ) {
58
+ r , w := io .Pipe ()
59
+ var rw ReadWriteCloser
60
+ rw = NewReadWriter (testIoReadWriter {r , w })
61
+ SubtestReaderWriterClose (t , rw )
62
+ }
63
+
64
+ func TestReadWriterCombine (t * testing.T ) {
65
+ r , w := io .Pipe ()
66
+ writer := NewWriter (w )
67
+ reader := NewReader (r )
68
+ rw := Combine (writer , reader )
69
+ rw .Close ()
70
+ }
71
+
72
+ func TestMultiError (t * testing.T ) {
73
+ emptyError := multiErr ([]error {})
74
+ if emptyError .Error () != "no errors" {
75
+ t .Fatal ("Expected no errors" )
76
+ }
77
+
78
+ twoErrors := multiErr ([]error {errors .New ("one" ), errors .New ("two" )})
79
+ if eStr := twoErrors .Error (); ! str .Contains (eStr , "one" ) && ! str .Contains (eStr , "two" ) {
80
+ t .Fatal ("Expected error messages not included" )
81
+ }
82
+ }
83
+
84
+ func TestShortBufferError (t * testing.T ) {
85
+ buf := bytes .NewBuffer (nil )
86
+ writer := NewWriter (buf )
87
+ reader := NewReader (buf )
88
+ SubtestReadShortBuffer (t , writer , reader )
89
+ }
90
+
50
91
func SubtestReadWrite (t * testing.T , writer WriteCloser , reader ReadCloser ) {
51
92
msgs := [1000 ][]byte {}
52
93
@@ -240,7 +281,47 @@ func SubtestWriteClose(t *testing.T, writer WriteCloser, reader ReadCloser) {
240
281
}()
241
282
n , err := writer .Write (buf [:])
242
283
if n != 0 || err == nil {
243
- t .Error ("expected to read nothing" )
284
+ t .Error ("expected to write nothing" )
244
285
}
245
286
<- done
246
287
}
288
+
289
+ func SubtestReaderWriterClose (t * testing.T , rw ReadWriteCloser ) {
290
+ buf := [10 ]byte {}
291
+ done := make (chan struct {})
292
+ go func () {
293
+ defer close (done )
294
+ time .Sleep (10 * time .Millisecond )
295
+ buf := [10 ]byte {}
296
+ rw .Read (buf [:])
297
+ rw .Close ()
298
+ }()
299
+ n , err := rw .Write (buf [:])
300
+ if n != 10 || err != nil {
301
+ t .Error ("Expected to write 10 bytes" )
302
+ }
303
+ <- done
304
+ }
305
+
306
+ func SubtestReadShortBuffer (t * testing.T , writer WriteCloser , reader ReadCloser ) {
307
+ defer reader .Close ()
308
+ shortReadBuf := [1 ]byte {}
309
+ done := make (chan struct {})
310
+
311
+ go func () {
312
+ defer writer .Close ()
313
+ defer close (done )
314
+ time .Sleep (10 * time .Millisecond )
315
+ largeWriteBuf := [10 ]byte {}
316
+ writer .Write (largeWriteBuf [:])
317
+ }()
318
+ <- done
319
+ n , _ := reader .NextMsgLen ()
320
+ if n != 10 {
321
+ t .Fatal ("Expected next message to have length of 10" )
322
+ }
323
+ _ , err := reader .Read (shortReadBuf [:])
324
+ if err != io .ErrShortBuffer {
325
+ t .Fatal ("Expected short buffer error" )
326
+ }
327
+ }
0 commit comments