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.
17 func TestResolveGoogle(t
*testing
.T
) {
18 testenv
.MustHaveExternalNetwork(t
)
20 if !supportsIPv4() ||
!supportsIPv6() ||
!*testIPv4 ||
!*testIPv6
{
21 t
.Skip("both IPv4 and IPv6 are required")
24 for _
, network
:= range []string{"tcp", "tcp4", "tcp6"} {
25 addr
, err
:= ResolveTCPAddr(network
, "www.google.com:http")
31 case network
== "tcp" && addr
.IP
.To4() == nil:
33 case network
== "tcp4" && addr
.IP
.To4() == nil:
34 t
.Errorf("got %v; want an IPv4 address on %s", addr
, network
)
35 case network
== "tcp6" && (addr
.IP
.To16() == nil || addr
.IP
.To4() != nil):
36 t
.Errorf("got %v; want an IPv6 address on %s", addr
, network
)
41 var dialGoogleTests
= []struct {
42 dial
func(string, string) (Conn
, error
)
43 unreachableNetwork
string
48 dial
: (&Dialer
{DualStack
: true}).Dial
,
49 networks
: []string{"tcp", "tcp4", "tcp6"},
50 addrs
: []string{"www.google.com:http"},
54 unreachableNetwork
: "tcp6",
55 networks
: []string{"tcp", "tcp4"},
59 unreachableNetwork
: "tcp4",
60 networks
: []string{"tcp", "tcp6"},
64 func TestDialGoogle(t
*testing
.T
) {
65 testenv
.MustHaveExternalNetwork(t
)
67 if !supportsIPv4() ||
!supportsIPv6() ||
!*testIPv4 ||
!*testIPv6
{
68 t
.Skip("both IPv4 and IPv6 are required")
72 dialGoogleTests
[1].addrs
, dialGoogleTests
[2].addrs
, err
= googleLiteralAddrs()
76 for _
, tt
:= range dialGoogleTests
{
77 for _
, network
:= range tt
.networks
{
78 disableSocketConnect(tt
.unreachableNetwork
)
79 for _
, addr
:= range tt
.addrs
{
80 if err
:= fetchGoogle(tt
.dial
, network
, addr
); err
!= nil {
90 literalAddrs4
= [...]string{
94 "www.google.com:http",
95 "%03d.%03d.%03d.%03d:0080",
96 "[::ffff:%d.%d.%d.%d]:80",
97 "[::ffff:%02x%02x:%02x%02x]:80",
98 "[0:0:0:0:0000:ffff:%d.%d.%d.%d]:80",
99 "[0:0:0:0:000000:ffff:%d.%d.%d.%d]:80",
100 "[0:0:0:0::ffff:%d.%d.%d.%d]:80",
102 literalAddrs6
= [...]string{
103 "[%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x]:80",
104 "ipv6.google.com:80",
105 "[%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x]:http",
106 "ipv6.google.com:http",
110 func googleLiteralAddrs() (lits4
, lits6
[]string, err error
) {
111 ips
, err
:= LookupIP("www.google.com")
119 for _
, ip
:= range ips
{
120 if ip4
== nil && ip
.To4() != nil {
123 if ip6
== nil && ip
.To16() != nil && ip
.To4() == nil {
126 if ip4
!= nil && ip6
!= nil {
131 for i
, lit4
:= range literalAddrs4
{
132 if strings
.Contains(lit4
, "%") {
133 literalAddrs4
[i
] = fmt
.Sprintf(lit4
, ip4
[0], ip4
[1], ip4
[2], ip4
[3])
136 lits4
= literalAddrs4
[:]
139 for i
, lit6
:= range literalAddrs6
{
140 if strings
.Contains(lit6
, "%") {
141 literalAddrs6
[i
] = fmt
.Sprintf(lit6
, ip6
[0], ip6
[1], ip6
[2], ip6
[3], ip6
[4], ip6
[5], ip6
[6], ip6
[7], ip6
[8], ip6
[9], ip6
[10], ip6
[11], ip6
[12], ip6
[13], ip6
[14], ip6
[15])
144 lits6
= literalAddrs6
[:]
149 func fetchGoogle(dial
func(string, string) (Conn
, error
), network
, address
string) error
{
150 c
, err
:= dial(network
, address
)
155 req
:= []byte("GET /robots.txt HTTP/1.0\r\nHost: www.google.com\r\n\r\n")
156 if _
, err
:= c
.Write(req
); err
!= nil {
159 b
:= make([]byte, 1000)
160 n
, err
:= io
.ReadFull(c
, b
)
165 return fmt
.Errorf("short read from %s:%s->%s", network
, c
.RemoteAddr(), c
.LocalAddr())