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.
14 // The full stack test cases for IPConn have been moved to the
16 // golang.org/x/net/ipv4
17 // golang.org/x/net/ipv6
18 // golang.org/x/net/icmp
20 type resolveIPAddrTest
struct {
27 var resolveIPAddrTests
= []resolveIPAddrTest
{
28 {"ip", "127.0.0.1", &IPAddr
{IP
: IPv4(127, 0, 0, 1)}, nil},
29 {"ip4", "127.0.0.1", &IPAddr
{IP
: IPv4(127, 0, 0, 1)}, nil},
30 {"ip4:icmp", "127.0.0.1", &IPAddr
{IP
: IPv4(127, 0, 0, 1)}, nil},
32 {"ip", "::1", &IPAddr
{IP
: ParseIP("::1")}, nil},
33 {"ip6", "::1", &IPAddr
{IP
: ParseIP("::1")}, nil},
34 {"ip6:ipv6-icmp", "::1", &IPAddr
{IP
: ParseIP("::1")}, nil},
35 {"ip6:IPv6-ICMP", "::1", &IPAddr
{IP
: ParseIP("::1")}, nil},
37 {"ip", "::1%en0", &IPAddr
{IP
: ParseIP("::1"), Zone
: "en0"}, nil},
38 {"ip6", "::1%911", &IPAddr
{IP
: ParseIP("::1"), Zone
: "911"}, nil},
40 {"", "127.0.0.1", &IPAddr
{IP
: IPv4(127, 0, 0, 1)}, nil}, // Go 1.0 behavior
41 {"", "::1", &IPAddr
{IP
: ParseIP("::1")}, nil}, // Go 1.0 behavior
43 {"ip4:icmp", "", &IPAddr
{}, nil},
45 {"l2tp", "127.0.0.1", nil, UnknownNetworkError("l2tp")},
46 {"l2tp:gre", "127.0.0.1", nil, UnknownNetworkError("l2tp:gre")},
47 {"tcp", "1.2.3.4:123", nil, UnknownNetworkError("tcp")},
49 {"ip4", "2001:db8::1", nil, &AddrError
{Err
: errNoSuitableAddress
.Error(), Addr
: "2001:db8::1"}},
50 {"ip4:icmp", "2001:db8::1", nil, &AddrError
{Err
: errNoSuitableAddress
.Error(), Addr
: "2001:db8::1"}},
51 {"ip6", "127.0.0.1", nil, &AddrError
{Err
: errNoSuitableAddress
.Error(), Addr
: "127.0.0.1"}},
52 {"ip6", "::ffff:127.0.0.1", nil, &AddrError
{Err
: errNoSuitableAddress
.Error(), Addr
: "::ffff:127.0.0.1"}},
53 {"ip6:ipv6-icmp", "127.0.0.1", nil, &AddrError
{Err
: errNoSuitableAddress
.Error(), Addr
: "127.0.0.1"}},
54 {"ip6:ipv6-icmp", "::ffff:127.0.0.1", nil, &AddrError
{Err
: errNoSuitableAddress
.Error(), Addr
: "::ffff:127.0.0.1"}},
57 func TestResolveIPAddr(t
*testing
.T
) {
58 if !testableNetwork("ip+nopriv") {
59 t
.Skip("ip+nopriv test")
62 origTestHookLookupIP
:= testHookLookupIP
63 defer func() { testHookLookupIP
= origTestHookLookupIP
}()
64 testHookLookupIP
= lookupLocalhost
66 for _
, tt
:= range resolveIPAddrTests
{
67 addr
, err
:= ResolveIPAddr(tt
.network
, tt
.litAddrOrName
)
68 if !reflect
.DeepEqual(addr
, tt
.addr
) ||
!reflect
.DeepEqual(err
, tt
.err
) {
69 t
.Errorf("ResolveIPAddr(%q, %q) = %#v, %v, want %#v, %v", tt
.network
, tt
.litAddrOrName
, addr
, err
, tt
.addr
, tt
.err
)
73 addr2
, err
:= ResolveIPAddr(addr
.Network(), addr
.String())
74 if !reflect
.DeepEqual(addr2
, tt
.addr
) || err
!= tt
.err
{
75 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
)
81 var ipConnLocalNameTests
= []struct {
85 {"ip4:icmp", &IPAddr
{IP
: IPv4(127, 0, 0, 1)}},
86 {"ip4:icmp", &IPAddr
{}},
90 func TestIPConnLocalName(t
*testing
.T
) {
91 for _
, tt
:= range ipConnLocalNameTests
{
92 if !testableNetwork(tt
.net
) {
93 t
.Logf("skipping %s test", tt
.net
)
96 c
, err
:= ListenIP(tt
.net
, tt
.laddr
)
101 if la
:= c
.LocalAddr(); la
== nil {
102 t
.Fatal("should not fail")
107 func TestIPConnRemoteName(t
*testing
.T
) {
108 if !testableNetwork("ip:tcp") {
109 t
.Skip("ip:tcp test")
112 raddr
:= &IPAddr
{IP
: IPv4(127, 0, 0, 1).To4()}
113 c
, err
:= DialIP("ip:tcp", &IPAddr
{IP
: IPv4(127, 0, 0, 1)}, raddr
)
118 if !reflect
.DeepEqual(raddr
, c
.RemoteAddr()) {
119 t
.Fatalf("got %#v; want %#v", c
.RemoteAddr(), raddr
)
123 func TestDialListenIPArgs(t
*testing
.T
) {
130 argLists
: [][2]string{
132 {"ip:", "127.0.0.1"},
133 {"ip::", "127.0.0.1"},
137 {"ip4", "127.0.0.1"},
138 {"ip4:", "127.0.0.1"},
139 {"ip4::", "127.0.0.1"},
147 if testableNetwork("ip") {
148 priv
:= test
{shouldFail
: false}
149 for _
, tt
:= range []struct {
150 network
, address
string
153 {"ip4:47", "127.0.0.1", [2]string{"ip4:47", "127.0.0.1"}},
154 {"ip6:47", "::1", [2]string{"ip6:47", "::1"}},
156 c
, err
:= ListenPacket(tt
.network
, tt
.address
)
161 priv
.argLists
= append(priv
.argLists
, tt
.args
)
163 if len(priv
.argLists
) > 0 {
164 tests
= append(tests
, priv
)
168 for _
, tt
:= range tests
{
169 for _
, args
:= range tt
.argLists
{
170 _
, err
:= Dial(args
[0], args
[1])
171 if tt
.shouldFail
!= (err
!= nil) {
172 t
.Errorf("Dial(%q, %q) = %v; want (err != nil) is %t", args
[0], args
[1], err
, tt
.shouldFail
)
174 _
, err
= ListenPacket(args
[0], args
[1])
175 if tt
.shouldFail
!= (err
!= nil) {
176 t
.Errorf("ListenPacket(%q, %q) = %v; want (err != nil) is %t", args
[0], args
[1], err
, tt
.shouldFail
)
178 a
, err
:= ResolveIPAddr("ip", args
[1])
180 t
.Errorf("ResolveIPAddr(\"ip\", %q) = %v", args
[1], err
)
183 _
, err
= DialIP(args
[0], nil, a
)
184 if tt
.shouldFail
!= (err
!= nil) {
185 t
.Errorf("DialIP(%q, %v) = %v; want (err != nil) is %t", args
[0], a
, err
, tt
.shouldFail
)
187 _
, err
= ListenIP(args
[0], a
)
188 if tt
.shouldFail
!= (err
!= nil) {
189 t
.Errorf("ListenIP(%q, %v) = %v; want (err != nil) is %t", args
[0], a
, err
, tt
.shouldFail
)