blob: 6e85362938860bd34dfe19b8a77ffa901f8bbfbd [file] [log] [blame]
Mikio Hara89b7c662015-04-13 23:45:00 +09001// Copyright 2015 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package net
6
7import (
8 "fmt"
Mikio Haraec114442015-04-16 23:10:56 +09009 "io"
Mikio Hara88511132015-04-18 16:53:55 +090010 "io/ioutil"
Mikio Hara89b7c662015-04-13 23:45:00 +090011 "net/internal/socktest"
12 "os"
13 "runtime"
14 "testing"
Mikio Hara4540e162015-04-17 14:35:54 +090015 "time"
Mikio Hara89b7c662015-04-13 23:45:00 +090016)
17
Mikio Hara89b7c662015-04-13 23:45:00 +090018func (e *OpError) isValid() error {
19 if e.Op == "" {
20 return fmt.Errorf("OpError.Op is empty: %v", e)
21 }
22 if e.Net == "" {
23 return fmt.Errorf("OpError.Net is empty: %v", e)
24 }
Mikio Haraafd2d2b2015-04-21 22:53:47 +090025 for _, addr := range []Addr{e.Source, e.Addr} {
Mikio Hara22829bd2015-05-30 07:33:16 +090026 switch addr := addr.(type) {
27 case nil:
28 case *TCPAddr:
29 if addr == nil {
30 return fmt.Errorf("OpError.Source or Addr is non-nil interface: %#v, %v", addr, e)
Mikio Haraafd2d2b2015-04-21 22:53:47 +090031 }
Mikio Hara22829bd2015-05-30 07:33:16 +090032 case *UDPAddr:
33 if addr == nil {
34 return fmt.Errorf("OpError.Source or Addr is non-nil interface: %#v, %v", addr, e)
35 }
36 case *IPAddr:
37 if addr == nil {
38 return fmt.Errorf("OpError.Source or Addr is non-nil interface: %#v, %v", addr, e)
39 }
40 case *IPNet:
41 if addr == nil {
42 return fmt.Errorf("OpError.Source or Addr is non-nil interface: %#v, %v", addr, e)
43 }
44 case *UnixAddr:
45 if addr == nil {
46 return fmt.Errorf("OpError.Source or Addr is non-nil interface: %#v, %v", addr, e)
47 }
48 case *pipeAddr:
49 if addr == nil {
50 return fmt.Errorf("OpError.Source or Addr is non-nil interface: %#v, %v", addr, e)
51 }
52 case fileAddr:
53 if addr == "" {
54 return fmt.Errorf("OpError.Source or Addr is empty: %#v, %v", addr, e)
55 }
56 default:
57 return fmt.Errorf("OpError.Source or Addr is unknown type: %T, %v", addr, e)
Mikio Hara88511132015-04-18 16:53:55 +090058 }
Mikio Hara89b7c662015-04-13 23:45:00 +090059 }
60 if e.Err == nil {
61 return fmt.Errorf("OpError.Err is empty: %v", e)
62 }
63 return nil
64}
65
66// parseDialError parses nestedErr and reports whether it is a valid
67// error value from Dial, Listen functions.
68// It returns nil when nestedErr is valid.
69func parseDialError(nestedErr error) error {
70 if nestedErr == nil {
71 return nil
72 }
73
74 switch err := nestedErr.(type) {
75 case *OpError:
76 if err := err.isValid(); err != nil {
77 return err
78 }
79 nestedErr = err.Err
80 goto second
81 }
82 return fmt.Errorf("unexpected type on 1st nested level: %T", nestedErr)
83
84second:
85 if isPlatformError(nestedErr) {
86 return nil
87 }
88 switch err := nestedErr.(type) {
Mikio Hara6d3a7e72015-04-17 17:56:58 +090089 case *AddrError, addrinfoErrno, *DNSError, InvalidAddrError, *ParseError, *timeoutError, UnknownNetworkError:
Mikio Hara89b7c662015-04-13 23:45:00 +090090 return nil
Mikio Hara89b7c662015-04-13 23:45:00 +090091 case *os.SyscallError:
92 nestedErr = err.Err
93 goto third
94 }
95 switch nestedErr {
96 case errClosing, errMissingAddress:
97 return nil
98 }
99 return fmt.Errorf("unexpected type on 2nd nested level: %T", nestedErr)
100
101third:
102 if isPlatformError(nestedErr) {
103 return nil
104 }
105 return fmt.Errorf("unexpected type on 3rd nested level: %T", nestedErr)
106}
107
108var dialErrorTests = []struct {
109 network, address string
110}{
111 {"foo", ""},
112 {"bar", "baz"},
113 {"datakit", "mh/astro/r70"},
114 {"tcp", ""},
115 {"tcp", "127.0.0.1:☺"},
116 {"tcp", "no-such-name:80"},
117 {"tcp", "mh/astro/r70:http"},
118
Mikio Harab50b21d2015-07-21 12:51:01 +0900119 {"tcp", JoinHostPort("127.0.0.1", "-1")},
120 {"tcp", JoinHostPort("127.0.0.1", "123456789")},
121 {"udp", JoinHostPort("127.0.0.1", "-1")},
122 {"udp", JoinHostPort("127.0.0.1", "123456789")},
Mikio Hara89b7c662015-04-13 23:45:00 +0900123 {"ip:icmp", "127.0.0.1"},
124
125 {"unix", "/path/to/somewhere"},
126 {"unixgram", "/path/to/somewhere"},
127 {"unixpacket", "/path/to/somewhere"},
128}
129
130func TestDialError(t *testing.T) {
131 switch runtime.GOOS {
132 case "plan9":
133 t.Skipf("%s does not have full support of socktest", runtime.GOOS)
134 }
135
136 origTestHookLookupIP := testHookLookupIP
137 defer func() { testHookLookupIP = origTestHookLookupIP }()
138 testHookLookupIP = func(fn func(string) ([]IPAddr, error), host string) ([]IPAddr, error) {
139 return nil, &DNSError{Err: "dial error test", Name: "name", Server: "server", IsTimeout: true}
140 }
141 sw.Set(socktest.FilterConnect, func(so *socktest.Status) (socktest.AfterFilter, error) {
142 return nil, errOpNotSupported
143 })
144 defer sw.Set(socktest.FilterConnect, nil)
145
146 d := Dialer{Timeout: someTimeout}
147 for i, tt := range dialErrorTests {
148 c, err := d.Dial(tt.network, tt.address)
149 if err == nil {
Mikio Harab50b21d2015-07-21 12:51:01 +0900150 t.Errorf("#%d: should fail; %s:%s->%s", i, c.LocalAddr().Network(), c.LocalAddr(), c.RemoteAddr())
Mikio Hara89b7c662015-04-13 23:45:00 +0900151 c.Close()
152 continue
153 }
Mikio Harab50b21d2015-07-21 12:51:01 +0900154 if tt.network == "tcp" || tt.network == "udp" {
155 nerr := err
156 if op, ok := nerr.(*OpError); ok {
157 nerr = op.Err
158 }
159 if sys, ok := nerr.(*os.SyscallError); ok {
160 nerr = sys.Err
161 }
162 if nerr == errOpNotSupported {
163 t.Errorf("#%d: should fail without %v; %s:%s->", i, nerr, tt.network, tt.address)
164 continue
165 }
166 }
Mikio Harad0f31002015-04-17 14:55:07 +0900167 if c != nil {
168 t.Errorf("Dial returned non-nil interface %T(%v) with err != nil", c, c)
169 }
Mikio Hara89b7c662015-04-13 23:45:00 +0900170 if err = parseDialError(err); err != nil {
171 t.Errorf("#%d: %v", i, err)
172 continue
173 }
174 }
175}
176
Mikio Hara22829bd2015-05-30 07:33:16 +0900177func TestProtocolDialError(t *testing.T) {
178 switch runtime.GOOS {
Mikio Hara515e53a2015-06-14 09:01:23 +0900179 case "nacl", "solaris":
Mikio Hara22829bd2015-05-30 07:33:16 +0900180 t.Skipf("not supported on %s", runtime.GOOS)
181 }
182
183 for _, network := range []string{"tcp", "udp", "ip:4294967296", "unix", "unixpacket", "unixgram"} {
184 var err error
185 switch network {
186 case "tcp":
187 _, err = DialTCP(network, nil, &TCPAddr{Port: 1 << 16})
188 case "udp":
189 _, err = DialUDP(network, nil, &UDPAddr{Port: 1 << 16})
190 case "ip:4294967296":
191 _, err = DialIP(network, nil, nil)
192 case "unix", "unixpacket", "unixgram":
193 _, err = DialUnix(network, nil, &UnixAddr{Name: "//"})
194 }
195 if err == nil {
196 t.Errorf("%s: should fail", network)
197 continue
198 }
199 if err = parseDialError(err); err != nil {
200 t.Errorf("%s: %v", network, err)
201 continue
202 }
203 }
204}
205
Mikio Hara89b7c662015-04-13 23:45:00 +0900206var listenErrorTests = []struct {
207 network, address string
208}{
209 {"foo", ""},
210 {"bar", "baz"},
211 {"datakit", "mh/astro/r70"},
212 {"tcp", "127.0.0.1:☺"},
213 {"tcp", "no-such-name:80"},
214 {"tcp", "mh/astro/r70:http"},
Mikio Harad0f31002015-04-17 14:55:07 +0900215
Mikio Harab50b21d2015-07-21 12:51:01 +0900216 {"tcp", JoinHostPort("127.0.0.1", "-1")},
217 {"tcp", JoinHostPort("127.0.0.1", "123456789")},
Mikio Harad0f31002015-04-17 14:55:07 +0900218
219 {"unix", "/path/to/somewhere"},
220 {"unixpacket", "/path/to/somewhere"},
Mikio Hara89b7c662015-04-13 23:45:00 +0900221}
222
223func TestListenError(t *testing.T) {
224 switch runtime.GOOS {
225 case "plan9":
226 t.Skipf("%s does not have full support of socktest", runtime.GOOS)
227 }
228
229 origTestHookLookupIP := testHookLookupIP
230 defer func() { testHookLookupIP = origTestHookLookupIP }()
231 testHookLookupIP = func(fn func(string) ([]IPAddr, error), host string) ([]IPAddr, error) {
232 return nil, &DNSError{Err: "listen error test", Name: "name", Server: "server", IsTimeout: true}
233 }
234 sw.Set(socktest.FilterListen, func(so *socktest.Status) (socktest.AfterFilter, error) {
235 return nil, errOpNotSupported
236 })
237 defer sw.Set(socktest.FilterListen, nil)
238
239 for i, tt := range listenErrorTests {
240 ln, err := Listen(tt.network, tt.address)
241 if err == nil {
Mikio Harab50b21d2015-07-21 12:51:01 +0900242 t.Errorf("#%d: should fail; %s:%s->", i, ln.Addr().Network(), ln.Addr())
Mikio Hara89b7c662015-04-13 23:45:00 +0900243 ln.Close()
244 continue
245 }
Mikio Harab50b21d2015-07-21 12:51:01 +0900246 if tt.network == "tcp" {
247 nerr := err
248 if op, ok := nerr.(*OpError); ok {
249 nerr = op.Err
250 }
251 if sys, ok := nerr.(*os.SyscallError); ok {
252 nerr = sys.Err
253 }
254 if nerr == errOpNotSupported {
255 t.Errorf("#%d: should fail without %v; %s:%s->", i, nerr, tt.network, tt.address)
256 continue
257 }
258 }
Mikio Harad0f31002015-04-17 14:55:07 +0900259 if ln != nil {
260 t.Errorf("Listen returned non-nil interface %T(%v) with err != nil", ln, ln)
261 }
262 if err = parseDialError(err); err != nil {
263 t.Errorf("#%d: %v", i, err)
264 continue
265 }
266 }
267}
268
269var listenPacketErrorTests = []struct {
270 network, address string
271}{
272 {"foo", ""},
273 {"bar", "baz"},
274 {"datakit", "mh/astro/r70"},
275 {"udp", "127.0.0.1:☺"},
276 {"udp", "no-such-name:80"},
277 {"udp", "mh/astro/r70:http"},
Mikio Harab50b21d2015-07-21 12:51:01 +0900278
279 {"udp", JoinHostPort("127.0.0.1", "-1")},
280 {"udp", JoinHostPort("127.0.0.1", "123456789")},
Mikio Harad0f31002015-04-17 14:55:07 +0900281}
282
283func TestListenPacketError(t *testing.T) {
284 switch runtime.GOOS {
285 case "plan9":
286 t.Skipf("%s does not have full support of socktest", runtime.GOOS)
287 }
288
289 origTestHookLookupIP := testHookLookupIP
290 defer func() { testHookLookupIP = origTestHookLookupIP }()
291 testHookLookupIP = func(fn func(string) ([]IPAddr, error), host string) ([]IPAddr, error) {
292 return nil, &DNSError{Err: "listen error test", Name: "name", Server: "server", IsTimeout: true}
293 }
294
295 for i, tt := range listenPacketErrorTests {
296 c, err := ListenPacket(tt.network, tt.address)
297 if err == nil {
Mikio Harab50b21d2015-07-21 12:51:01 +0900298 t.Errorf("#%d: should fail; %s:%s->", i, c.LocalAddr().Network(), c.LocalAddr())
Mikio Harad0f31002015-04-17 14:55:07 +0900299 c.Close()
300 continue
301 }
302 if c != nil {
303 t.Errorf("ListenPacket returned non-nil interface %T(%v) with err != nil", c, c)
304 }
Mikio Hara89b7c662015-04-13 23:45:00 +0900305 if err = parseDialError(err); err != nil {
306 t.Errorf("#%d: %v", i, err)
307 continue
308 }
309 }
310}
Mikio Haraec114442015-04-16 23:10:56 +0900311
Mikio Hara22829bd2015-05-30 07:33:16 +0900312func TestProtocolListenError(t *testing.T) {
313 switch runtime.GOOS {
314 case "nacl", "plan9":
315 t.Skipf("not supported on %s", runtime.GOOS)
316 }
317
318 for _, network := range []string{"tcp", "udp", "ip:4294967296", "unix", "unixpacket", "unixgram"} {
319 var err error
320 switch network {
321 case "tcp":
322 _, err = ListenTCP(network, &TCPAddr{Port: 1 << 16})
323 case "udp":
324 _, err = ListenUDP(network, &UDPAddr{Port: 1 << 16})
325 case "ip:4294967296":
326 _, err = ListenIP(network, nil)
327 case "unix", "unixpacket":
328 _, err = ListenUnix(network, &UnixAddr{Name: "//"})
329 case "unixgram":
330 _, err = ListenUnixgram(network, &UnixAddr{Name: "//"})
331 }
332 if err == nil {
333 t.Errorf("%s: should fail", network)
334 continue
335 }
336 if err = parseDialError(err); err != nil {
337 t.Errorf("%s: %v", network, err)
338 continue
339 }
340 }
341}
342
Mikio Haraec114442015-04-16 23:10:56 +0900343// parseReadError parses nestedErr and reports whether it is a valid
344// error value from Read functions.
345// It returns nil when nestedErr is valid.
346func parseReadError(nestedErr error) error {
347 if nestedErr == nil {
348 return nil
349 }
350
351 switch err := nestedErr.(type) {
352 case *OpError:
353 if err := err.isValid(); err != nil {
354 return err
355 }
356 nestedErr = err.Err
357 goto second
358 }
359 if nestedErr == io.EOF {
360 return nil
361 }
362 return fmt.Errorf("unexpected type on 1st nested level: %T", nestedErr)
363
364second:
365 if isPlatformError(nestedErr) {
366 return nil
367 }
368 switch err := nestedErr.(type) {
369 case *os.SyscallError:
370 nestedErr = err.Err
371 goto third
372 }
373 switch nestedErr {
374 case errClosing, errTimeout:
375 return nil
376 }
377 return fmt.Errorf("unexpected type on 2nd nested level: %T", nestedErr)
378
379third:
380 if isPlatformError(nestedErr) {
381 return nil
382 }
383 return fmt.Errorf("unexpected type on 3rd nested level: %T", nestedErr)
384}
Mikio Hara11b5f982015-04-16 11:26:44 +0900385
386// parseWriteError parses nestedErr and reports whether it is a valid
387// error value from Write functions.
388// It returns nil when nestedErr is valid.
389func parseWriteError(nestedErr error) error {
390 if nestedErr == nil {
391 return nil
392 }
393
394 switch err := nestedErr.(type) {
395 case *OpError:
396 if err := err.isValid(); err != nil {
397 return err
398 }
399 nestedErr = err.Err
400 goto second
401 }
402 return fmt.Errorf("unexpected type on 1st nested level: %T", nestedErr)
403
404second:
405 if isPlatformError(nestedErr) {
406 return nil
407 }
408 switch err := nestedErr.(type) {
Mikio Hara832c5732015-04-19 23:42:11 +0900409 case *AddrError, addrinfoErrno, *DNSError, InvalidAddrError, *ParseError, *timeoutError, UnknownNetworkError:
410 return nil
Mikio Hara11b5f982015-04-16 11:26:44 +0900411 case *os.SyscallError:
412 nestedErr = err.Err
413 goto third
414 }
415 switch nestedErr {
416 case errClosing, errTimeout, ErrWriteToConnected, io.ErrUnexpectedEOF:
417 return nil
418 }
419 return fmt.Errorf("unexpected type on 2nd nested level: %T", nestedErr)
420
421third:
422 if isPlatformError(nestedErr) {
423 return nil
424 }
425 return fmt.Errorf("unexpected type on 3rd nested level: %T", nestedErr)
426}
Mikio Hara310db632015-04-17 12:24:42 +0900427
428// parseCloseError parses nestedErr and reports whether it is a valid
429// error value from Close functions.
430// It returns nil when nestedErr is valid.
431func parseCloseError(nestedErr error) error {
432 if nestedErr == nil {
433 return nil
434 }
435
436 switch err := nestedErr.(type) {
437 case *OpError:
438 if err := err.isValid(); err != nil {
439 return err
440 }
441 nestedErr = err.Err
442 goto second
443 }
444 return fmt.Errorf("unexpected type on 1st nested level: %T", nestedErr)
445
446second:
447 if isPlatformError(nestedErr) {
448 return nil
449 }
450 switch err := nestedErr.(type) {
451 case *os.SyscallError:
452 nestedErr = err.Err
453 goto third
454 case *os.PathError: // for Plan 9
455 nestedErr = err.Err
456 goto third
457 }
458 switch nestedErr {
459 case errClosing:
460 return nil
461 }
462 return fmt.Errorf("unexpected type on 2nd nested level: %T", nestedErr)
463
464third:
465 if isPlatformError(nestedErr) {
466 return nil
467 }
468 return fmt.Errorf("unexpected type on 3rd nested level: %T", nestedErr)
469}
470
471func TestCloseError(t *testing.T) {
472 ln, err := newLocalListener("tcp")
473 if err != nil {
474 t.Fatal(err)
475 }
476 defer ln.Close()
477 c, err := Dial(ln.Addr().Network(), ln.Addr().String())
478 if err != nil {
479 t.Fatal(err)
480 }
481 defer c.Close()
482
483 for i := 0; i < 3; i++ {
484 err = c.(*TCPConn).CloseRead()
485 if perr := parseCloseError(err); perr != nil {
486 t.Errorf("#%d: %v", i, perr)
487 }
488 }
489 for i := 0; i < 3; i++ {
490 err = c.(*TCPConn).CloseWrite()
491 if perr := parseCloseError(err); perr != nil {
492 t.Errorf("#%d: %v", i, perr)
493 }
494 }
495 for i := 0; i < 3; i++ {
496 err = c.Close()
497 if perr := parseCloseError(err); perr != nil {
498 t.Errorf("#%d: %v", i, perr)
499 }
500 err = ln.Close()
501 if perr := parseCloseError(err); perr != nil {
502 t.Errorf("#%d: %v", i, perr)
503 }
504 }
505
506 pc, err := ListenPacket("udp", "127.0.0.1:0")
507 if err != nil {
508 t.Fatal(err)
509 }
510 defer pc.Close()
511
512 for i := 0; i < 3; i++ {
513 err = pc.Close()
514 if perr := parseCloseError(err); perr != nil {
515 t.Errorf("#%d: %v", i, perr)
516 }
517 }
518}
Mikio Hara4540e162015-04-17 14:35:54 +0900519
520// parseAcceptError parses nestedErr and reports whether it is a valid
521// error value from Accept functions.
522// It returns nil when nestedErr is valid.
523func parseAcceptError(nestedErr error) error {
524 if nestedErr == nil {
525 return nil
526 }
527
528 switch err := nestedErr.(type) {
529 case *OpError:
530 if err := err.isValid(); err != nil {
531 return err
532 }
533 nestedErr = err.Err
534 goto second
535 }
536 return fmt.Errorf("unexpected type on 1st nested level: %T", nestedErr)
537
538second:
539 if isPlatformError(nestedErr) {
540 return nil
541 }
542 switch err := nestedErr.(type) {
543 case *os.SyscallError:
544 nestedErr = err.Err
545 goto third
546 }
547 switch nestedErr {
548 case errClosing, errTimeout:
549 return nil
550 }
551 return fmt.Errorf("unexpected type on 2nd nested level: %T", nestedErr)
552
553third:
554 if isPlatformError(nestedErr) {
555 return nil
556 }
557 return fmt.Errorf("unexpected type on 3rd nested level: %T", nestedErr)
558}
559
560func TestAcceptError(t *testing.T) {
561 handler := func(ls *localServer, ln Listener) {
562 for {
563 ln.(*TCPListener).SetDeadline(time.Now().Add(5 * time.Millisecond))
564 c, err := ln.Accept()
565 if perr := parseAcceptError(err); perr != nil {
566 t.Error(perr)
567 }
568 if err != nil {
569 if c != nil {
570 t.Errorf("Accept returned non-nil interface %T(%v) with err != nil", c, c)
571 }
Mikio Hara98e05562015-04-28 21:17:46 +0900572 if nerr, ok := err.(Error); !ok || (!nerr.Timeout() && !nerr.Temporary()) {
Mikio Hara4540e162015-04-17 14:35:54 +0900573 return
574 }
575 continue
576 }
577 c.Close()
578 }
579 }
580 ls, err := newLocalServer("tcp")
581 if err != nil {
582 t.Fatal(err)
583 }
584 if err := ls.buildup(handler); err != nil {
585 ls.teardown()
586 t.Fatal(err)
587 }
588
589 time.Sleep(100 * time.Millisecond)
590 ls.teardown()
591}
Mikio Hara88511132015-04-18 16:53:55 +0900592
593// parseCommonError parses nestedErr and reports whether it is a valid
594// error value from miscellaneous functions.
595// It returns nil when nestedErr is valid.
596func parseCommonError(nestedErr error) error {
597 if nestedErr == nil {
598 return nil
599 }
600
601 switch err := nestedErr.(type) {
602 case *OpError:
603 if err := err.isValid(); err != nil {
604 return err
605 }
606 nestedErr = err.Err
607 goto second
608 }
609 return fmt.Errorf("unexpected type on 1st nested level: %T", nestedErr)
610
611second:
612 if isPlatformError(nestedErr) {
613 return nil
614 }
615 switch err := nestedErr.(type) {
616 case *os.SyscallError:
617 nestedErr = err.Err
618 goto third
619 case *os.LinkError:
620 nestedErr = err.Err
621 goto third
622 case *os.PathError:
623 nestedErr = err.Err
624 goto third
625 }
Mikio Hara98e05562015-04-28 21:17:46 +0900626 switch nestedErr {
627 case errClosing:
628 return nil
629 }
Mikio Hara88511132015-04-18 16:53:55 +0900630 return fmt.Errorf("unexpected type on 2nd nested level: %T", nestedErr)
631
632third:
633 if isPlatformError(nestedErr) {
634 return nil
635 }
636 return fmt.Errorf("unexpected type on 3rd nested level: %T", nestedErr)
637}
638
639func TestFileError(t *testing.T) {
640 switch runtime.GOOS {
641 case "windows":
Mikio Harab83b0112015-05-14 12:26:27 +0900642 t.Skipf("not supported on %s", runtime.GOOS)
Mikio Hara88511132015-04-18 16:53:55 +0900643 }
644
Mikio Hara76d67ea2015-05-06 10:41:01 +0900645 f, err := ioutil.TempFile("", "go-nettest")
Mikio Hara88511132015-04-18 16:53:55 +0900646 if err != nil {
647 t.Fatal(err)
648 }
Mikio Hara76d67ea2015-05-06 10:41:01 +0900649 defer os.Remove(f.Name())
Mikio Hara88511132015-04-18 16:53:55 +0900650 defer f.Close()
651
652 c, err := FileConn(f)
653 if err != nil {
654 if c != nil {
655 t.Errorf("FileConn returned non-nil interface %T(%v) with err != nil", c, c)
656 }
657 if perr := parseCommonError(err); perr != nil {
658 t.Error(perr)
659 }
660 } else {
661 c.Close()
662 t.Error("should fail")
663 }
664 ln, err := FileListener(f)
665 if err != nil {
666 if ln != nil {
667 t.Errorf("FileListener returned non-nil interface %T(%v) with err != nil", ln, ln)
668 }
669 if perr := parseCommonError(err); perr != nil {
670 t.Error(perr)
671 }
672 } else {
673 ln.Close()
674 t.Error("should fail")
675 }
676 pc, err := FilePacketConn(f)
677 if err != nil {
678 if pc != nil {
679 t.Errorf("FilePacketConn returned non-nil interface %T(%v) with err != nil", pc, pc)
680 }
681 if perr := parseCommonError(err); perr != nil {
682 t.Error(perr)
683 }
684 } else {
685 pc.Close()
686 t.Error("should fail")
687 }
688
689 ln, err = newLocalListener("tcp")
690 if err != nil {
691 t.Fatal(err)
692 }
693
694 for i := 0; i < 3; i++ {
695 f, err := ln.(*TCPListener).File()
696 if err != nil {
697 if perr := parseCommonError(err); perr != nil {
698 t.Error(perr)
699 }
700 } else {
701 f.Close()
702 }
703 ln.Close()
704 }
705}