1 // Copyright 2012 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.
5 // This file implements API tests across platforms and will never have a build
17 var connTests
= []struct {
21 {"tcp", "127.0.0.1:0"},
22 {"unix", testUnixAddr()},
23 {"unixpacket", testUnixAddr()},
26 // someTimeout is used just to test that net.Conn implementations
27 // don't explode when their SetFooDeadline methods are called.
28 // It isn't actually used for testing timeouts.
29 const someTimeout
= 10 * time
.Second
31 func TestConnAndListener(t
*testing
.T
) {
32 for _
, tt
:= range connTests
{
36 case "nacl", "plan9", "windows":
41 case "darwin", "nacl", "openbsd", "plan9", "windows":
43 case "freebsd": // FreeBSD 8 doesn't support unixpacket
48 ln
, err
:= Listen(tt
.net
, tt
.addr
)
50 t
.Fatalf("Listen failed: %v", err
)
52 defer func(ln Listener
, net
, addr
string) {
55 case "unix", "unixpacket":
58 }(ln
, tt
.net
, tt
.addr
)
59 if ln
.Addr().Network() != tt
.net
{
60 t
.Fatalf("got %v; expected %v", ln
.Addr().Network(), tt
.net
)
63 done
:= make(chan int)
64 go transponder(t
, ln
, done
)
66 c
, err
:= Dial(tt
.net
, ln
.Addr().String())
68 t
.Fatalf("Dial failed: %v", err
)
71 if c
.LocalAddr().Network() != tt
.net || c
.LocalAddr().Network() != tt
.net
{
72 t
.Fatalf("got %v->%v; expected %v->%v", c
.LocalAddr().Network(), c
.RemoteAddr().Network(), tt
.net
, tt
.net
)
74 c
.SetDeadline(time
.Now().Add(someTimeout
))
75 c
.SetReadDeadline(time
.Now().Add(someTimeout
))
76 c
.SetWriteDeadline(time
.Now().Add(someTimeout
))
78 if _
, err
:= c
.Write([]byte("CONN TEST")); err
!= nil {
79 t
.Fatalf("Conn.Write failed: %v", err
)
81 rb
:= make([]byte, 128)
82 if _
, err
:= c
.Read(rb
); err
!= nil {
83 t
.Fatalf("Conn.Read failed: %v", err
)
90 func transponder(t
*testing
.T
, ln Listener
, done
chan<- int) {
91 defer func() { done
<- 1 }()
93 switch ln
:= ln
.(type) {
95 ln
.SetDeadline(time
.Now().Add(someTimeout
))
97 ln
.SetDeadline(time
.Now().Add(someTimeout
))
101 t
.Errorf("Listener.Accept failed: %v", err
)
105 network
:= ln
.Addr().Network()
106 if c
.LocalAddr().Network() != network || c
.LocalAddr().Network() != network
{
107 t
.Errorf("got %v->%v; expected %v->%v", c
.LocalAddr().Network(), c
.RemoteAddr().Network(), network
, network
)
110 c
.SetDeadline(time
.Now().Add(someTimeout
))
111 c
.SetReadDeadline(time
.Now().Add(someTimeout
))
112 c
.SetWriteDeadline(time
.Now().Add(someTimeout
))
114 b
:= make([]byte, 128)
117 t
.Errorf("Conn.Read failed: %v", err
)
120 if _
, err
:= c
.Write(b
[:n
]); err
!= nil {
121 t
.Errorf("Conn.Write failed: %v", err
)