1 // Copyright 2009 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.
12 // The full stack test cases for IPConn have been moved to the
14 // golang.org/x/net/ipv4
15 // golang.org/x/net/ipv6
16 // golang.org/x/net/icmp
18 type resolveIPAddrTest
struct {
25 var resolveIPAddrTests
= []resolveIPAddrTest
{
26 {"ip", "127.0.0.1", &IPAddr
{IP
: IPv4(127, 0, 0, 1)}, nil},
27 {"ip4", "127.0.0.1", &IPAddr
{IP
: IPv4(127, 0, 0, 1)}, nil},
28 {"ip4:icmp", "127.0.0.1", &IPAddr
{IP
: IPv4(127, 0, 0, 1)}, nil},
30 {"ip", "::1", &IPAddr
{IP
: ParseIP("::1")}, nil},
31 {"ip6", "::1", &IPAddr
{IP
: ParseIP("::1")}, nil},
32 {"ip6:ipv6-icmp", "::1", &IPAddr
{IP
: ParseIP("::1")}, nil},
33 {"ip6:IPv6-ICMP", "::1", &IPAddr
{IP
: ParseIP("::1")}, nil},
35 {"ip", "::1%en0", &IPAddr
{IP
: ParseIP("::1"), Zone
: "en0"}, nil},
36 {"ip6", "::1%911", &IPAddr
{IP
: ParseIP("::1"), Zone
: "911"}, nil},
38 {"", "127.0.0.1", &IPAddr
{IP
: IPv4(127, 0, 0, 1)}, nil}, // Go 1.0 behavior
39 {"", "::1", &IPAddr
{IP
: ParseIP("::1")}, nil}, // Go 1.0 behavior
41 {"ip4:icmp", "", &IPAddr
{}, nil},
43 {"l2tp", "127.0.0.1", nil, UnknownNetworkError("l2tp")},
44 {"l2tp:gre", "127.0.0.1", nil, UnknownNetworkError("l2tp:gre")},
45 {"tcp", "1.2.3.4:123", nil, UnknownNetworkError("tcp")},
47 {"ip4", "2001:db8::1", nil, &AddrError
{Err
: errNoSuitableAddress
.Error(), Addr
: "2001:db8::1"}},
48 {"ip4:icmp", "2001:db8::1", nil, &AddrError
{Err
: errNoSuitableAddress
.Error(), Addr
: "2001:db8::1"}},
49 {"ip6", "127.0.0.1", nil, &AddrError
{Err
: errNoSuitableAddress
.Error(), Addr
: "127.0.0.1"}},
50 {"ip6", "::ffff:127.0.0.1", nil, &AddrError
{Err
: errNoSuitableAddress
.Error(), Addr
: "::ffff:127.0.0.1"}},
51 {"ip6:ipv6-icmp", "127.0.0.1", nil, &AddrError
{Err
: errNoSuitableAddress
.Error(), Addr
: "127.0.0.1"}},
52 {"ip6:ipv6-icmp", "::ffff:127.0.0.1", nil, &AddrError
{Err
: errNoSuitableAddress
.Error(), Addr
: "::ffff:127.0.0.1"}},
55 func TestResolveIPAddr(t
*testing
.T
) {
56 if !testableNetwork("ip+nopriv") {
57 t
.Skip("ip+nopriv test")
60 origTestHookLookupIP
:= testHookLookupIP
61 defer func() { testHookLookupIP
= origTestHookLookupIP
}()
62 testHookLookupIP
= lookupLocalhost
64 for _
, tt
:= range resolveIPAddrTests
{
65 addr
, err
:= ResolveIPAddr(tt
.network
, tt
.litAddrOrName
)
66 if !reflect
.DeepEqual(addr
, tt
.addr
) ||
!reflect
.DeepEqual(err
, tt
.err
) {
67 t
.Errorf("ResolveIPAddr(%q, %q) = %#v, %v, want %#v, %v", tt
.network
, tt
.litAddrOrName
, addr
, err
, tt
.addr
, tt
.err
)
71 addr2
, err
:= ResolveIPAddr(addr
.Network(), addr
.String())
72 if !reflect
.DeepEqual(addr2
, tt
.addr
) || err
!= tt
.err
{
73 t
.Errorf("(%q, %q): ResolveIPAddr(%q, %q) = %#v, %v, want %#v, %v", tt
.network
, tt
.litAddrOrName
, addr
.Network(), addr
.String(), addr2
, err
, tt
.addr
, tt
.err
)
79 var ipConnLocalNameTests
= []struct {
83 {"ip4:icmp", &IPAddr
{IP
: IPv4(127, 0, 0, 1)}},
84 {"ip4:icmp", &IPAddr
{}},
88 func TestIPConnLocalName(t
*testing
.T
) {
89 for _
, tt
:= range ipConnLocalNameTests
{
90 if !testableNetwork(tt
.net
) {
91 t
.Logf("skipping %s test", tt
.net
)
94 c
, err
:= ListenIP(tt
.net
, tt
.laddr
)
99 if la
:= c
.LocalAddr(); la
== nil {
100 t
.Fatal("should not fail")
105 func TestIPConnRemoteName(t
*testing
.T
) {
106 if !testableNetwork("ip:tcp") {
107 t
.Skip("ip:tcp test")
110 raddr
:= &IPAddr
{IP
: IPv4(127, 0, 0, 1).To4()}
111 c
, err
:= DialIP("ip:tcp", &IPAddr
{IP
: IPv4(127, 0, 0, 1)}, raddr
)
116 if !reflect
.DeepEqual(raddr
, c
.RemoteAddr()) {
117 t
.Fatalf("got %#v; want %#v", c
.RemoteAddr(), raddr
)
121 func TestDialListenIPArgs(t
*testing
.T
) {
128 argLists
: [][2]string{
130 {"ip:", "127.0.0.1"},
131 {"ip::", "127.0.0.1"},
135 {"ip4", "127.0.0.1"},
136 {"ip4:", "127.0.0.1"},
137 {"ip4::", "127.0.0.1"},
145 if testableNetwork("ip") {
146 priv
:= test
{shouldFail
: false}
147 for _
, tt
:= range []struct {
148 network
, address
string
151 {"ip4:47", "127.0.0.1", [2]string{"ip4:47", "127.0.0.1"}},
152 {"ip6:47", "::1", [2]string{"ip6:47", "::1"}},
154 c
, err
:= ListenPacket(tt
.network
, tt
.address
)
159 priv
.argLists
= append(priv
.argLists
, tt
.args
)
161 if len(priv
.argLists
) > 0 {
162 tests
= append(tests
, priv
)
166 for _
, tt
:= range tests
{
167 for _
, args
:= range tt
.argLists
{
168 _
, err
:= Dial(args
[0], args
[1])
169 if tt
.shouldFail
!= (err
!= nil) {
170 t
.Errorf("Dial(%q, %q) = %v; want (err != nil) is %t", args
[0], args
[1], err
, tt
.shouldFail
)
172 _
, err
= ListenPacket(args
[0], args
[1])
173 if tt
.shouldFail
!= (err
!= nil) {
174 t
.Errorf("ListenPacket(%q, %q) = %v; want (err != nil) is %t", args
[0], args
[1], err
, tt
.shouldFail
)
176 a
, err
:= ResolveIPAddr("ip", args
[1])
178 t
.Errorf("ResolveIPAddr(\"ip\", %q) = %v", args
[1], err
)
181 _
, err
= DialIP(args
[0], nil, a
)
182 if tt
.shouldFail
!= (err
!= nil) {
183 t
.Errorf("DialIP(%q, %v) = %v; want (err != nil) is %t", args
[0], a
, err
, tt
.shouldFail
)
185 _
, err
= ListenIP(args
[0], a
)
186 if tt
.shouldFail
!= (err
!= nil) {
187 t
.Errorf("ListenIP(%q, %v) = %v; want (err != nil) is %t", args
[0], a
, err
, tt
.shouldFail
)