1 // Copyright 2011 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.
14 type listenerFile
interface {
16 File() (f
*os
.File
, err error
)
19 type packetConnFile
interface {
21 File() (f
*os
.File
, err error
)
24 type connFile
interface {
26 File() (f
*os
.File
, err error
)
29 func testFileListener(t
*testing
.T
, net
, laddr
string) {
31 case "tcp", "tcp4", "tcp6":
32 laddr
+= ":0" // any available port
34 l
, err
:= Listen(net
, laddr
)
36 t
.Fatalf("Listen failed: %v", err
)
39 lf
:= l
.(listenerFile
)
42 t
.Fatalf("File failed: %v", err
)
44 c
, err
:= FileListener(f
)
46 t
.Fatalf("FileListener failed: %v", err
)
48 if !reflect
.DeepEqual(l
.Addr(), c
.Addr()) {
49 t
.Fatalf("Addrs not equal: %#v != %#v", l
.Addr(), c
.Addr())
51 if err
:= c
.Close(); err
!= nil {
52 t
.Fatalf("Close failed: %v", err
)
54 if err
:= f
.Close(); err
!= nil {
55 t
.Fatalf("Close failed: %v", err
)
59 var fileListenerTests
= []struct {
62 ipv6
bool // test with underlying AF_INET6 socket
63 linux
bool // test with abstract unix domain socket, a Linux-ism
65 {net
: "tcp", laddr
: ""},
66 {net
: "tcp", laddr
: "0.0.0.0"},
67 {net
: "tcp", laddr
: "[::ffff:0.0.0.0]"},
68 {net
: "tcp", laddr
: "[::]", ipv6
: true},
70 {net
: "tcp", laddr
: "127.0.0.1"},
71 {net
: "tcp", laddr
: "[::ffff:127.0.0.1]"},
72 {net
: "tcp", laddr
: "[::1]", ipv6
: true},
74 {net
: "tcp4", laddr
: ""},
75 {net
: "tcp4", laddr
: "0.0.0.0"},
76 {net
: "tcp4", laddr
: "[::ffff:0.0.0.0]"},
78 {net
: "tcp4", laddr
: "127.0.0.1"},
79 {net
: "tcp4", laddr
: "[::ffff:127.0.0.1]"},
81 {net
: "tcp6", laddr
: "", ipv6
: true},
82 {net
: "tcp6", laddr
: "[::]", ipv6
: true},
84 {net
: "tcp6", laddr
: "[::1]", ipv6
: true},
86 {net
: "unix", laddr
: "@gotest/net", linux
: true},
87 {net
: "unixpacket", laddr
: "@gotest/net", linux
: true},
90 func TestFileListener(t
*testing
.T
) {
92 case "nacl", "windows":
93 t
.Skipf("skipping test on %q", runtime
.GOOS
)
96 for _
, tt
:= range fileListenerTests
{
97 if skipServerTest(tt
.net
, "unix", tt
.laddr
, tt
.ipv6
, false, tt
.linux
) {
100 if skipServerTest(tt
.net
, "unixpacket", tt
.laddr
, tt
.ipv6
, false, tt
.linux
) {
103 testFileListener(t
, tt
.net
, tt
.laddr
)
107 func testFilePacketConn(t
*testing
.T
, pcf packetConnFile
, listen
bool) {
110 t
.Fatalf("File failed: %v", err
)
112 c
, err
:= FilePacketConn(f
)
114 t
.Fatalf("FilePacketConn failed: %v", err
)
116 if !reflect
.DeepEqual(pcf
.LocalAddr(), c
.LocalAddr()) {
117 t
.Fatalf("LocalAddrs not equal: %#v != %#v", pcf
.LocalAddr(), c
.LocalAddr())
120 if _
, err
:= c
.WriteTo([]byte{}, c
.LocalAddr()); err
!= nil {
121 t
.Fatalf("WriteTo failed: %v", err
)
124 if err
:= c
.Close(); err
!= nil {
125 t
.Fatalf("Close failed: %v", err
)
127 if err
:= f
.Close(); err
!= nil {
128 t
.Fatalf("Close failed: %v", err
)
132 func testFilePacketConnListen(t
*testing
.T
, net
, laddr
string) {
134 case "udp", "udp4", "udp6":
135 laddr
+= ":0" // any available port
137 l
, err
:= ListenPacket(net
, laddr
)
139 t
.Fatalf("ListenPacket failed: %v", err
)
141 testFilePacketConn(t
, l
.(packetConnFile
), true)
142 if err
:= l
.Close(); err
!= nil {
143 t
.Fatalf("Close failed: %v", err
)
147 func testFilePacketConnDial(t
*testing
.T
, net
, raddr
string) {
149 case "udp", "udp4", "udp6":
152 c
, err
:= Dial(net
, raddr
)
154 t
.Fatalf("Dial failed: %v", err
)
156 testFilePacketConn(t
, c
.(packetConnFile
), false)
157 if err
:= c
.Close(); err
!= nil {
158 t
.Fatalf("Close failed: %v", err
)
162 var filePacketConnTests
= []struct {
165 ipv6
bool // test with underlying AF_INET6 socket
166 linux
bool // test with abstract unix domain socket, a Linux-ism
168 {net
: "udp", addr
: "127.0.0.1"},
169 {net
: "udp", addr
: "[::ffff:127.0.0.1]"},
170 {net
: "udp", addr
: "[::1]", ipv6
: true},
172 {net
: "udp4", addr
: "127.0.0.1"},
173 {net
: "udp4", addr
: "[::ffff:127.0.0.1]"},
175 {net
: "udp6", addr
: "[::1]", ipv6
: true},
177 {net
: "ip4:icmp", addr
: "127.0.0.1"},
179 {net
: "unixgram", addr
: "@gotest3/net", linux
: true},
182 func TestFilePacketConn(t
*testing
.T
) {
183 switch runtime
.GOOS
{
184 case "nacl", "plan9", "windows":
185 t
.Skipf("skipping test on %q", runtime
.GOOS
)
188 for _
, tt
:= range filePacketConnTests
{
189 if skipServerTest(tt
.net
, "unixgram", tt
.addr
, tt
.ipv6
, false, tt
.linux
) {
192 if os
.Getuid() != 0 && tt
.net
== "ip4:icmp" {
193 t
.Log("skipping test; must be root")
196 testFilePacketConnListen(t
, tt
.net
, tt
.addr
)
198 case "", "0.0.0.0", "[::ffff:0.0.0.0]", "[::]":
200 if tt
.net
!= "unixgram" {
201 testFilePacketConnDial(t
, tt
.net
, tt
.addr
)