1
18
19 package bufconn
20
21 import (
22 "fmt"
23 "io"
24 "net"
25 "reflect"
26 "testing"
27 "time"
28
29 "google.golang.org/grpc/internal/grpctest"
30 )
31
32 type s struct {
33 grpctest.Tester
34 }
35
36 func Test(t *testing.T) {
37 grpctest.RunSubTests(t, s{})
38 }
39
40 func testRW(r io.Reader, w io.Writer) error {
41 for i := 0; i < 20; i++ {
42 d := make([]byte, i)
43 for j := 0; j < i; j++ {
44 d[j] = byte(i - j)
45 }
46 var rn int
47 var rerr error
48 b := make([]byte, i)
49 done := make(chan struct{})
50 go func() {
51 for rn < len(b) && rerr == nil {
52 var x int
53 x, rerr = r.Read(b[rn:])
54 rn += x
55 }
56 close(done)
57 }()
58 wn, werr := w.Write(d)
59 if wn != i || werr != nil {
60 return fmt.Errorf("%v: w.Write(%v) = %v, %v; want %v, nil", i, d, wn, werr, i)
61 }
62 select {
63 case <-done:
64 case <-time.After(500 * time.Millisecond):
65 return fmt.Errorf("%v: r.Read never returned", i)
66 }
67 if rn != i || rerr != nil {
68 return fmt.Errorf("%v: r.Read = %v, %v; want %v, nil", i, rn, rerr, i)
69 }
70 if !reflect.DeepEqual(b, d) {
71 return fmt.Errorf("%v: r.Read read %v; want %v", i, b, d)
72 }
73 }
74 return nil
75 }
76
77 func (s) TestPipe(t *testing.T) {
78 p := newPipe(10)
79 if err := testRW(p, p); err != nil {
80 t.Fatalf(err.Error())
81 }
82 }
83
84 func (s) TestPipeClose(t *testing.T) {
85 p := newPipe(10)
86 p.Close()
87 if _, err := p.Write(nil); err != io.ErrClosedPipe {
88 t.Fatalf("p.Write = _, %v; want _, %v", err, io.ErrClosedPipe)
89 }
90 if _, err := p.Read(nil); err != io.ErrClosedPipe {
91 t.Fatalf("p.Read = _, %v; want _, %v", err, io.ErrClosedPipe)
92 }
93 }
94
95 func (s) TestConn(t *testing.T) {
96 p1, p2 := newPipe(10), newPipe(10)
97 c1, c2 := &conn{p1, p2}, &conn{p2, p1}
98
99 if err := testRW(c1, c2); err != nil {
100 t.Fatalf(err.Error())
101 }
102 if err := testRW(c2, c1); err != nil {
103 t.Fatalf(err.Error())
104 }
105 }
106
107 func (s) TestConnCloseWithData(t *testing.T) {
108 lis := Listen(7)
109 errChan := make(chan error, 1)
110 var lisConn net.Conn
111 go func() {
112 var err error
113 if lisConn, err = lis.Accept(); err != nil {
114 errChan <- err
115 }
116 close(errChan)
117 }()
118 dialConn, err := lis.Dial()
119 if err != nil {
120 t.Fatalf("Dial error: %v", err)
121 }
122 if err := <-errChan; err != nil {
123 t.Fatalf("Listen error: %v", err)
124 }
125
126
127 n, err := dialConn.Write([]byte("hello"))
128 if n != 5 || err != nil {
129 t.Fatalf("dialConn.Write([]byte{\"hello\"}) = %v, %v; want 5, <nil>", n, err)
130 }
131 n, err = lisConn.Write([]byte("hello"))
132 if n != 5 || err != nil {
133 t.Fatalf("lisConn.Write([]byte{\"hello\"}) = %v, %v; want 5, <nil>", n, err)
134 }
135
136
137 dialConn.Close()
138 if _, err := lisConn.Write([]byte("hello")); err != io.ErrClosedPipe {
139 t.Fatalf("lisConn.Write() = _, <nil>; want _, <non-nil>")
140 }
141 if _, err := dialConn.Write([]byte("hello")); err != io.ErrClosedPipe {
142 t.Fatalf("dialConn.Write() = _, <nil>; want _, <non-nil>")
143 }
144
145
146
147 buf := make([]byte, 6)
148 if _, err := dialConn.Read(buf); err != io.ErrClosedPipe {
149 t.Fatalf("dialConn.Read(buf) = %v, %v; want _, io.ErrClosedPipe", n, err)
150 }
151 n, err = lisConn.Read(buf)
152 if n != 5 || err != nil {
153 t.Fatalf("lisConn.Read(buf) = %v, %v; want 5, <nil>", n, err)
154 }
155 }
156
157 func (s) TestListener(t *testing.T) {
158 l := Listen(7)
159 var s net.Conn
160 var serr error
161 done := make(chan struct{})
162 go func() {
163 s, serr = l.Accept()
164 close(done)
165 }()
166 c, cerr := l.Dial()
167 <-done
168 if cerr != nil || serr != nil {
169 t.Fatalf("cerr = %v, serr = %v; want nil, nil", cerr, serr)
170 }
171 if err := testRW(c, s); err != nil {
172 t.Fatalf(err.Error())
173 }
174 if err := testRW(s, c); err != nil {
175 t.Fatalf(err.Error())
176 }
177 }
178
179 func (s) TestCloseWhileDialing(t *testing.T) {
180 l := Listen(7)
181 var c net.Conn
182 var err error
183 done := make(chan struct{})
184 go func() {
185 c, err = l.Dial()
186 close(done)
187 }()
188 l.Close()
189 <-done
190 if c != nil || err != errClosed {
191 t.Fatalf("c, err = %v, %v; want nil, %v", c, err, errClosed)
192 }
193 }
194
195 func (s) TestCloseWhileAccepting(t *testing.T) {
196 l := Listen(7)
197 var c net.Conn
198 var err error
199 done := make(chan struct{})
200 go func() {
201 c, err = l.Accept()
202 close(done)
203 }()
204 l.Close()
205 <-done
206 if c != nil || err != errClosed {
207 t.Fatalf("c, err = %v, %v; want nil, %v", c, err, errClosed)
208 }
209 }
210
211 func (s) TestDeadline(t *testing.T) {
212 sig := make(chan error, 2)
213 blockingWrite := func(conn net.Conn) {
214 _, err := conn.Write([]byte("0123456789"))
215 sig <- err
216 }
217
218 blockingRead := func(conn net.Conn) {
219 _, err := conn.Read(make([]byte, 10))
220 sig <- err
221 }
222
223 p1, p2 := newPipe(5), newPipe(5)
224 c1, c2 := &conn{p1, p1}, &conn{p2, p2}
225 defer c1.Close()
226 defer c2.Close()
227
228
229 c1.SetWriteDeadline(time.Now())
230
231 go blockingWrite(c1)
232 select {
233 case <-time.After(100 * time.Millisecond):
234 t.Fatalf("Write timeout timed out, c = %v", c1)
235 case err := <-sig:
236 if netErr, ok := err.(net.Error); ok {
237 if !netErr.Timeout() {
238 t.Fatalf("Write returned unexpected error, c = %v, err = %v", c1, netErr)
239 }
240 } else {
241 t.Fatalf("Write returned unexpected error, c = %v, err = %v", c1, err)
242 }
243 }
244
245 c2.SetReadDeadline(time.Now())
246
247 go blockingRead(c2)
248 select {
249 case <-time.After(100 * time.Millisecond):
250 t.Fatalf("Read timeout timed out, c = %v", c2)
251 case err := <-sig:
252 if netErr, ok := err.(net.Error); ok {
253 if !netErr.Timeout() {
254 t.Fatalf("Read returned unexpected error, c = %v, err = %v", c2, netErr)
255 }
256 } else {
257 t.Fatalf("Read returned unexpected error, c = %v, err = %v", c2, err)
258 }
259 }
260
261
262 c1.SetWriteDeadline(time.Time{})
263 c2.SetReadDeadline(time.Time{})
264
265 go blockingWrite(c1)
266 select {
267 case <-time.After(100 * time.Millisecond):
268 case err := <-sig:
269 t.Fatalf("Write returned before timeout, err = %v", err)
270 }
271
272 c1.SetWriteDeadline(time.Now())
273 select {
274 case <-time.After(100 * time.Millisecond):
275 t.Fatalf("Write timeout timed out, c = %v", c1)
276 case err := <-sig:
277 if netErr, ok := err.(net.Error); ok {
278 if !netErr.Timeout() {
279 t.Fatalf("Write returned unexpected error, c = %v, err = %v", c1, netErr)
280 }
281 } else {
282 t.Fatalf("Write returned unexpected error, c = %v, err = %v", c1, err)
283 }
284 }
285
286 go blockingRead(c2)
287 select {
288 case <-time.After(100 * time.Millisecond):
289 case err := <-sig:
290 t.Fatalf("Read returned before timeout, err = %v", err)
291 }
292
293 c2.SetReadDeadline(time.Now())
294 select {
295 case <-time.After(100 * time.Millisecond):
296 t.Fatalf("Read timeout timed out, c = %v", c2)
297 case err := <-sig:
298 if netErr, ok := err.(net.Error); ok {
299 if !netErr.Timeout() {
300 t.Fatalf("Read returned unexpected error, c = %v, err = %v", c2, netErr)
301 }
302 } else {
303 t.Fatalf("Read returned unexpected error, c = %v, err = %v", c2, err)
304 }
305 }
306
307
308 c1, c2 = &conn{p1, p2}, &conn{p2, p1}
309
310 c1.SetWriteDeadline(time.Now().Add(10 * time.Second))
311 c2.SetReadDeadline(time.Now().Add(10 * time.Second))
312
313
314 go blockingWrite(c1)
315 go blockingRead(c2)
316
317
318 for i := 0; i < 2; i++ {
319 select {
320 case <-time.After(100 * time.Millisecond):
321 t.Fatalf("Read/Write timed out, c1 = %v, c2 = %v", c1, c2)
322 case err := <-sig:
323 if err != nil {
324 t.Fatalf("Read/Write failed to complete, c1 = %v, c2 = %v, err = %v", c1, c2, err)
325 }
326 }
327 }
328 }
329
View as plain text