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.
14 func TestResolveUDPAddr(t
*testing
.T
) {
15 for _
, tt
:= range resolveTCPAddrTests
{
16 net
:= strings
.Replace(tt
.net
, "tcp", "udp", -1)
17 addr
, err
:= ResolveUDPAddr(net
, tt
.litAddrOrName
)
19 t
.Fatalf("ResolveUDPAddr(%q, %q) failed: %v", net
, tt
.litAddrOrName
, err
)
21 if !reflect
.DeepEqual(addr
, (*UDPAddr
)(tt
.addr
)) {
22 t
.Fatalf("ResolveUDPAddr(%q, %q) = %#v, want %#v", net
, tt
.litAddrOrName
, addr
, tt
.addr
)
26 addr1
, err
:= ResolveUDPAddr(net
, str
)
28 t
.Fatalf("ResolveUDPAddr(%q, %q) [from %q]: %v", net
, str
, tt
.litAddrOrName
, err
)
30 if !reflect
.DeepEqual(addr1
, addr
) {
31 t
.Fatalf("ResolveUDPAddr(%q, %q) [from %q] = %#v, want %#v", net
, str
, tt
.litAddrOrName
, addr1
, addr
)
37 func TestWriteToUDP(t
*testing
.T
) {
40 t
.Skipf("skipping test on %q", runtime
.GOOS
)
43 l
, err
:= ListenPacket("udp", "127.0.0.1:0")
45 t
.Fatalf("Listen failed: %v", err
)
49 testWriteToConn(t
, l
.LocalAddr().String())
50 testWriteToPacketConn(t
, l
.LocalAddr().String())
53 func testWriteToConn(t
*testing
.T
, raddr
string) {
54 c
, err
:= Dial("udp", raddr
)
56 t
.Fatalf("Dial failed: %v", err
)
60 ra
, err
:= ResolveUDPAddr("udp", raddr
)
62 t
.Fatalf("ResolveUDPAddr failed: %v", err
)
65 _
, err
= c
.(*UDPConn
).WriteToUDP([]byte("Connection-oriented mode socket"), ra
)
67 t
.Fatal("WriteToUDP should fail")
69 if err
!= nil && err
.(*OpError
).Err
!= ErrWriteToConnected
{
70 t
.Fatalf("WriteToUDP should fail as ErrWriteToConnected: %v", err
)
73 _
, err
= c
.(*UDPConn
).WriteTo([]byte("Connection-oriented mode socket"), ra
)
75 t
.Fatal("WriteTo should fail")
77 if err
!= nil && err
.(*OpError
).Err
!= ErrWriteToConnected
{
78 t
.Fatalf("WriteTo should fail as ErrWriteToConnected: %v", err
)
81 _
, err
= c
.Write([]byte("Connection-oriented mode socket"))
83 t
.Fatalf("Write failed: %v", err
)
87 func testWriteToPacketConn(t
*testing
.T
, raddr
string) {
88 c
, err
:= ListenPacket("udp", "127.0.0.1:0")
90 t
.Fatalf("ListenPacket failed: %v", err
)
94 ra
, err
:= ResolveUDPAddr("udp", raddr
)
96 t
.Fatalf("ResolveUDPAddr failed: %v", err
)
99 _
, err
= c
.(*UDPConn
).WriteToUDP([]byte("Connection-less mode socket"), ra
)
101 t
.Fatalf("WriteToUDP failed: %v", err
)
104 _
, err
= c
.WriteTo([]byte("Connection-less mode socket"), ra
)
106 t
.Fatalf("WriteTo failed: %v", err
)
109 _
, err
= c
.(*UDPConn
).Write([]byte("Connection-less mode socket"))
111 t
.Fatal("Write should fail")
115 var udpConnLocalNameTests
= []struct {
119 {"udp4", &UDPAddr
{IP
: IPv4(127, 0, 0, 1)}},
120 {"udp4", &UDPAddr
{}},
124 func TestUDPConnLocalName(t
*testing
.T
) {
125 if testing
.Short() ||
!*testExternal
{
126 t
.Skip("skipping test to avoid external network")
129 for _
, tt
:= range udpConnLocalNameTests
{
130 c
, err
:= ListenUDP(tt
.net
, tt
.laddr
)
132 t
.Fatalf("ListenUDP failed: %v", err
)
136 if a
, ok
:= la
.(*UDPAddr
); !ok || a
.Port
== 0 {
137 t
.Fatalf("got %v; expected a proper address with non-zero port number", la
)
142 func TestUDPConnLocalAndRemoteNames(t
*testing
.T
) {
143 for _
, laddr
:= range []string{"", "127.0.0.1:0"} {
144 c1
, err
:= ListenPacket("udp", "127.0.0.1:0")
146 t
.Fatalf("ListenUDP failed: %v", err
)
153 if la
, err
= ResolveUDPAddr("udp", laddr
); err
!= nil {
154 t
.Fatalf("ResolveUDPAddr failed: %v", err
)
157 c2
, err
:= DialUDP("udp", la
, c1
.LocalAddr().(*UDPAddr
))
159 t
.Fatalf("DialUDP failed: %v", err
)
163 var connAddrs
= [4]struct {
167 {c1
.LocalAddr(), true},
168 {c1
.(*UDPConn
).RemoteAddr(), false},
169 {c2
.LocalAddr(), true},
170 {c2
.RemoteAddr(), true},
172 for _
, ca
:= range connAddrs
{
173 if a
, ok
:= ca
.got
.(*UDPAddr
); ok
!= ca
.ok || ok
&& a
.Port
== 0 {
174 t
.Fatalf("got %v; expected a proper address with non-zero port number", ca
.got
)
180 func TestIPv6LinkLocalUnicastUDP(t
*testing
.T
) {
181 if testing
.Short() ||
!*testExternal
{
182 t
.Skip("skipping test to avoid external network")
185 t
.Skip("ipv6 is not supported")
187 ifi
:= loopbackInterface()
189 t
.Skip("loopback interface not found")
191 laddr
:= ipv6LinkLocalUnicastAddr(ifi
)
193 t
.Skip("ipv6 unicast address on loopback not found")
201 {"udp", "[" + laddr
+ "%" + ifi
.Name
+ "]:0", false},
202 {"udp6", "[" + laddr
+ "%" + ifi
.Name
+ "]:0", false},
204 // The first udp test fails on DragonFly - see issue 7473.
205 if runtime
.GOOS
== "dragonfly" {
208 switch runtime
.GOOS
{
209 case "darwin", "dragonfly", "freebsd", "openbsd", "netbsd":
210 tests
= append(tests
, []test
{
211 {"udp", "[localhost%" + ifi
.Name
+ "]:0", true},
212 {"udp6", "[localhost%" + ifi
.Name
+ "]:0", true},
215 tests
= append(tests
, []test
{
216 {"udp", "[ip6-localhost%" + ifi
.Name
+ "]:0", true},
217 {"udp6", "[ip6-localhost%" + ifi
.Name
+ "]:0", true},
220 for _
, tt
:= range tests
{
221 c1
, err
:= ListenPacket(tt
.net
, tt
.addr
)
223 // It might return "LookupHost returned no
224 // suitable address" error on some platforms.
225 t
.Logf("ListenPacket failed: %v", err
)
229 if la
, ok
:= c1
.LocalAddr().(*UDPAddr
); !ok ||
!tt
.nameLookup
&& la
.Zone
== "" {
230 t
.Fatalf("got %v; expected a proper address with zone identifier", la
)
233 c2
, err
:= Dial(tt
.net
, c1
.LocalAddr().String())
235 t
.Fatalf("Dial failed: %v", err
)
238 if la
, ok
:= c2
.LocalAddr().(*UDPAddr
); !ok ||
!tt
.nameLookup
&& la
.Zone
== "" {
239 t
.Fatalf("got %v; expected a proper address with zone identifier", la
)
241 if ra
, ok
:= c2
.RemoteAddr().(*UDPAddr
); !ok ||
!tt
.nameLookup
&& ra
.Zone
== "" {
242 t
.Fatalf("got %v; expected a proper address with zone identifier", ra
)
245 if _
, err
:= c2
.Write([]byte("UDP OVER IPV6 LINKLOCAL TEST")); err
!= nil {
246 t
.Fatalf("Conn.Write failed: %v", err
)
248 b
:= make([]byte, 32)
249 if _
, from
, err
:= c1
.ReadFrom(b
); err
!= nil {
250 t
.Fatalf("PacketConn.ReadFrom failed: %v", err
)
252 if ra
, ok
:= from
.(*UDPAddr
); !ok ||
!tt
.nameLookup
&& ra
.Zone
== "" {
253 t
.Fatalf("got %v; expected a proper address with zone identifier", ra
)