blob: 192540f6699a257e702d1dfe8148c751765a2d88 [file] [log] [blame]
Russ Cox83348f92008-12-18 15:42:39 -08001// 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.
4
5package net
6
7import (
Russ Cox83348f92008-12-18 15:42:39 -08008 "flag";
9 "io";
Russ Coxd3a412a2009-06-29 15:24:23 -070010 "strings";
Russ Cox0d339922009-05-07 10:31:48 -070011 "syscall";
Russ Cox83348f92008-12-18 15:42:39 -080012 "testing";
13)
14
15// If an IPv6 tunnel is running (see go/stubl), we can try dialing a real IPv6 address.
Rob Pikec45d2a72009-01-09 13:42:46 -080016var ipv6 = flag.Bool("ipv6", false, "assume ipv6 tunnel is present")
Russ Cox83348f92008-12-18 15:42:39 -080017
Rob Pike55d13cf2009-02-15 19:58:00 -080018// fd is already connected to the destination, port 80.
19// Run an HTTP request to fetch the appropriate page.
Russ Coxb04ac102009-08-12 13:19:17 -070020func fetchGoogle(t *testing.T, fd Conn, network, addr string) {
Russ Coxd3a412a2009-06-29 15:24:23 -070021 req := strings.Bytes("GET /intl/en/privacy.html HTTP/1.0\r\nHost: www.google.com\r\n\r\n");
Russ Coxc93da7c72009-03-05 15:48:12 -080022 n, err := fd.Write(req);
Russ Cox83348f92008-12-18 15:42:39 -080023
Russ Cox55645042009-01-06 15:19:02 -080024 buf := make([]byte, 1000);
Russ Cox64684cc2009-06-22 13:26:13 -070025 n, err = io.ReadFull(fd, buf);
Russ Cox83348f92008-12-18 15:42:39 -080026
27 if n < 1000 {
Russ Coxc93da7c72009-03-05 15:48:12 -080028 t.Errorf("fetchGoogle: short HTTP read from %s %s - %v", network, addr, err);
Robert Griesemer5d377052009-11-04 23:16:46 -080029 return;
Russ Cox83348f92008-12-18 15:42:39 -080030 }
31}
32
Rob Pike1a91b9a2009-01-16 11:36:44 -080033func doDial(t *testing.T, network, addr string) {
Russ Coxb04ac102009-08-12 13:19:17 -070034 fd, err := Dial(network, "", addr);
Russ Cox83348f92008-12-18 15:42:39 -080035 if err != nil {
Russ Coxb04ac102009-08-12 13:19:17 -070036 t.Errorf("Dial(%q, %q, %q) = _, %v", network, "", addr, err);
Robert Griesemer5d377052009-11-04 23:16:46 -080037 return;
Russ Cox83348f92008-12-18 15:42:39 -080038 }
Rob Pike1a91b9a2009-01-16 11:36:44 -080039 fetchGoogle(t, fd, network, addr);
Robert Griesemer5d377052009-11-04 23:16:46 -080040 fd.Close();
Russ Cox83348f92008-12-18 15:42:39 -080041}
42
Robert Griesemer5d377052009-11-04 23:16:46 -080043var googleaddrs = []string{
Russ Cox83348f92008-12-18 15:42:39 -080044 "74.125.19.99:80",
45 "www.google.com:80",
46 "74.125.19.99:http",
47 "www.google.com:http",
48 "074.125.019.099:0080",
49 "[::ffff:74.125.19.99]:80",
50 "[::ffff:4a7d:1363]:80",
51 "[0:0:0:0:0000:ffff:74.125.19.99]:80",
52 "[0:0:0:0:000000:ffff:74.125.19.99]:80",
53 "[0:0:0:0:0:ffff::74.125.19.99]:80",
Robert Griesemer5d377052009-11-04 23:16:46 -080054 "[2001:4860:0:2001::68]:80" // ipv6.google.com; removed if ipv6 flag not set
55 ,
Russ Coxbe2edb52009-03-03 08:39:12 -080056}
Russ Cox83348f92008-12-18 15:42:39 -080057
Russ Cox839a6842009-01-20 14:40:40 -080058func TestDialGoogle(t *testing.T) {
Russ Cox83348f92008-12-18 15:42:39 -080059 // If no ipv6 tunnel, don't try the last address.
Rob Pikec45d2a72009-01-09 13:42:46 -080060 if !*ipv6 {
Robert Griesemer40621d52009-11-09 12:07:39 -080061 googleaddrs[len(googleaddrs)-1] = ""
Russ Cox83348f92008-12-18 15:42:39 -080062 }
63
64 for i := 0; i < len(googleaddrs); i++ {
65 addr := googleaddrs[i];
66 if addr == "" {
Robert Griesemer40621d52009-11-09 12:07:39 -080067 continue
Russ Cox83348f92008-12-18 15:42:39 -080068 }
69 t.Logf("-- %s --", addr);
Rob Pike1a91b9a2009-01-16 11:36:44 -080070 doDial(t, "tcp", addr);
Russ Cox83348f92008-12-18 15:42:39 -080071 if addr[0] != '[' {
Rob Pike1a91b9a2009-01-16 11:36:44 -080072 doDial(t, "tcp4", addr);
Russ Cox0d339922009-05-07 10:31:48 -070073
74 if !preferIPv4 {
75 // make sure preferIPv4 flag works.
76 preferIPv4 = true;
77 syscall.SocketDisableIPv6 = true;
78 doDial(t, "tcp4", addr);
Russ Cox0d339922009-05-07 10:31:48 -070079 syscall.SocketDisableIPv6 = false;
80 preferIPv4 = false;
81 }
Russ Cox83348f92008-12-18 15:42:39 -080082 }
Russ Coxb4a8b352009-11-10 17:47:38 -080083
84 // Only run tcp6 if the kernel will take it.
85 if kernelSupportsIPv6() {
86 doDial(t, "tcp6", addr)
87 }
Russ Cox83348f92008-12-18 15:42:39 -080088 }
89}