LEFT | RIGHT |
1 // Copyright 2009 The Go Authors. All rights reserved. | 1 // Copyright 2009 The Go Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style | 2 // Use of this source code is governed by a BSD-style |
3 // license that can be found in the LICENSE file. | 3 // license that can be found in the LICENSE file. |
4 | 4 |
5 package net | 5 package net |
6 | 6 |
7 import ( | 7 import ( |
8 "bytes" | 8 "bytes" |
9 "errors" | 9 "errors" |
10 "fmt" | 10 "fmt" |
11 "os" | 11 "os" |
12 "reflect" | 12 "reflect" |
| 13 "runtime" |
13 "testing" | 14 "testing" |
14 "time" | 15 "time" |
15 ) | 16 ) |
16 | 17 |
17 type resolveIPAddrTest struct { | 18 type resolveIPAddrTest struct { |
18 net string | 19 net string |
19 litAddr string | 20 litAddr string |
20 addr *IPAddr | 21 addr *IPAddr |
21 err error | 22 err error |
22 } | 23 } |
23 | 24 |
24 var resolveIPAddrTests = []resolveIPAddrTest{ | 25 var resolveIPAddrTests = []resolveIPAddrTest{ |
25 {"ip", "127.0.0.1", &IPAddr{IP: IPv4(127, 0, 0, 1)}, nil}, | 26 {"ip", "127.0.0.1", &IPAddr{IP: IPv4(127, 0, 0, 1)}, nil}, |
26 {"ip4", "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}, |
27 {"ip4:icmp", "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}, |
28 | 29 |
29 {"ip", "::1", &IPAddr{IP: ParseIP("::1")}, nil}, | 30 {"ip", "::1", &IPAddr{IP: ParseIP("::1")}, nil}, |
30 {"ip6", "::1", &IPAddr{IP: ParseIP("::1")}, nil}, | 31 {"ip6", "::1", &IPAddr{IP: ParseIP("::1")}, nil}, |
31 {"ip6:ipv6-icmp", "::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}, |
32 | 34 |
33 {"ip", "::1%en0", &IPAddr{IP: ParseIP("::1"), Zone: "en0"}, nil}, | 35 {"ip", "::1%en0", &IPAddr{IP: ParseIP("::1"), Zone: "en0"}, nil}, |
34 {"ip6", "::1%911", &IPAddr{IP: ParseIP("::1"), Zone: "911"}, nil}, | 36 {"ip6", "::1%911", &IPAddr{IP: ParseIP("::1"), Zone: "911"}, nil}, |
35 | 37 |
36 {"", "127.0.0.1", &IPAddr{IP: IPv4(127, 0, 0, 1)}, nil}, // Go 1.0 behav
ior | 38 {"", "127.0.0.1", &IPAddr{IP: IPv4(127, 0, 0, 1)}, nil}, // Go 1.0 behav
ior |
37 {"", "::1", &IPAddr{IP: ParseIP("::1")}, nil}, // Go 1.0 behav
ior | 39 {"", "::1", &IPAddr{IP: ParseIP("::1")}, nil}, // Go 1.0 behav
ior |
38 | 40 |
39 {"l2tp", "127.0.0.1", nil, UnknownNetworkError("l2tp")}, | 41 {"l2tp", "127.0.0.1", nil, UnknownNetworkError("l2tp")}, |
40 {"l2tp:gre", "127.0.0.1", nil, UnknownNetworkError("l2tp:gre")}, | 42 {"l2tp:gre", "127.0.0.1", nil, UnknownNetworkError("l2tp:gre")}, |
41 {"tcp", "1.2.3.4:123", nil, UnknownNetworkError("tcp")}, | 43 {"tcp", "1.2.3.4:123", nil, UnknownNetworkError("tcp")}, |
42 } | 44 } |
43 | 45 |
44 func init() { | 46 func init() { |
45 if ifi := loopbackInterface(); ifi != nil { | 47 if ifi := loopbackInterface(); ifi != nil { |
46 index := fmt.Sprintf("%v", ifi.Index) | 48 index := fmt.Sprintf("%v", ifi.Index) |
47 resolveIPAddrTests = append(resolveIPAddrTests, []resolveIPAddrT
est{ | 49 resolveIPAddrTests = append(resolveIPAddrTests, []resolveIPAddrT
est{ |
48 {"ip6", "fe80::1%" + ifi.Name, &IPAddr{IP: ParseIP("fe80
::1"), Zone: zoneToString(ifi.Index)}, nil}, | 50 {"ip6", "fe80::1%" + ifi.Name, &IPAddr{IP: ParseIP("fe80
::1"), Zone: zoneToString(ifi.Index)}, nil}, |
49 {"ip6", "fe80::1%" + index, &IPAddr{IP: ParseIP("fe80::1
"), Zone: index}, nil}, | 51 {"ip6", "fe80::1%" + index, &IPAddr{IP: ParseIP("fe80::1
"), Zone: index}, nil}, |
50 }...) | 52 }...) |
51 } | 53 } |
52 } | 54 } |
53 | 55 |
54 func TestResolveIPAddr(t *testing.T) { | 56 func TestResolveIPAddr(t *testing.T) { |
55 for _, tt := range resolveIPAddrTests { | 57 for _, tt := range resolveIPAddrTests { |
56 addr, err := ResolveIPAddr(tt.net, tt.litAddr) | 58 addr, err := ResolveIPAddr(tt.net, tt.litAddr) |
57 if err != tt.err { | 59 if err != tt.err { |
58 » » » condFatalf(t, "ResolveIPAddr(%v, %v) failed: %v", tt.net
, tt.litAddr, err) | 60 » » » t.Fatalf("ResolveIPAddr(%v, %v) failed: %v", tt.net, tt.
litAddr, err) |
59 } else if !reflect.DeepEqual(addr, tt.addr) { | 61 } else if !reflect.DeepEqual(addr, tt.addr) { |
60 t.Fatalf("got %#v; expected %#v", addr, tt.addr) | 62 t.Fatalf("got %#v; expected %#v", addr, tt.addr) |
61 } | 63 } |
62 } | 64 } |
63 } | 65 } |
64 | 66 |
65 var icmpEchoTests = []struct { | 67 var icmpEchoTests = []struct { |
66 net string | 68 net string |
67 laddr string | 69 laddr string |
68 raddr string | 70 raddr string |
69 }{ | 71 }{ |
70 {"ip4:icmp", "0.0.0.0", "127.0.0.1"}, | 72 {"ip4:icmp", "0.0.0.0", "127.0.0.1"}, |
71 {"ip6:ipv6-icmp", "::", "::1"}, | 73 {"ip6:ipv6-icmp", "::", "::1"}, |
72 } | 74 } |
73 | 75 |
74 func TestConnICMPEcho(t *testing.T) { | 76 func TestConnICMPEcho(t *testing.T) { |
75 » if os.Getuid() != 0 { | 77 » switch runtime.GOOS { |
76 » » t.Skip("skipping test; must be root") | 78 » case "plan9": |
| 79 » » t.Skipf("skipping test on %q", runtime.GOOS) |
| 80 » case "windows": |
| 81 » default: |
| 82 » » if os.Getuid() != 0 { |
| 83 » » » t.Skip("skipping test; must be root") |
| 84 » » } |
77 } | 85 } |
78 | 86 |
79 for i, tt := range icmpEchoTests { | 87 for i, tt := range icmpEchoTests { |
80 net, _, err := parseNetwork(tt.net) | 88 net, _, err := parseNetwork(tt.net) |
81 if err != nil { | 89 if err != nil { |
82 t.Fatalf("parseNetwork failed: %v", err) | 90 t.Fatalf("parseNetwork failed: %v", err) |
83 } | 91 } |
84 if net == "ip6" && !supportsIPv6 { | 92 if net == "ip6" && !supportsIPv6 { |
85 continue | 93 continue |
86 } | 94 } |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
133 if p.ID != xid || p.Seq != xseq { | 141 if p.ID != xid || p.Seq != xseq { |
134 t.Fatalf("got id=%v, seqnum=%v; expected id=%v,
seqnum=%v", p.ID, p.Seq, xid, xseq) | 142 t.Fatalf("got id=%v, seqnum=%v; expected id=%v,
seqnum=%v", p.ID, p.Seq, xid, xseq) |
135 } | 143 } |
136 default: | 144 default: |
137 t.Fatalf("got type=%v, code=%v; expected type=%v, code=%
v", m.Type, m.Code, typ, 0) | 145 t.Fatalf("got type=%v, code=%v; expected type=%v, code=%
v", m.Type, m.Code, typ, 0) |
138 } | 146 } |
139 } | 147 } |
140 } | 148 } |
141 | 149 |
142 func TestPacketConnICMPEcho(t *testing.T) { | 150 func TestPacketConnICMPEcho(t *testing.T) { |
143 » if os.Getuid() != 0 { | 151 » switch runtime.GOOS { |
144 » » t.Skip("skipping test; must be root") | 152 » case "plan9": |
| 153 » » t.Skipf("skipping test on %q", runtime.GOOS) |
| 154 » case "windows": |
| 155 » default: |
| 156 » » if os.Getuid() != 0 { |
| 157 » » » t.Skip("skipping test; must be root") |
| 158 » » } |
145 } | 159 } |
146 | 160 |
147 for i, tt := range icmpEchoTests { | 161 for i, tt := range icmpEchoTests { |
148 net, _, err := parseNetwork(tt.net) | 162 net, _, err := parseNetwork(tt.net) |
149 if err != nil { | 163 if err != nil { |
150 t.Fatalf("parseNetwork failed: %v", err) | 164 t.Fatalf("parseNetwork failed: %v", err) |
151 } | 165 } |
152 if net == "ip6" && !supportsIPv6 { | 166 if net == "ip6" && !supportsIPv6 { |
153 continue | 167 continue |
154 } | 168 } |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
332 var ipConnLocalNameTests = []struct { | 346 var ipConnLocalNameTests = []struct { |
333 net string | 347 net string |
334 laddr *IPAddr | 348 laddr *IPAddr |
335 }{ | 349 }{ |
336 {"ip4:icmp", &IPAddr{IP: IPv4(127, 0, 0, 1)}}, | 350 {"ip4:icmp", &IPAddr{IP: IPv4(127, 0, 0, 1)}}, |
337 {"ip4:icmp", &IPAddr{}}, | 351 {"ip4:icmp", &IPAddr{}}, |
338 {"ip4:icmp", nil}, | 352 {"ip4:icmp", nil}, |
339 } | 353 } |
340 | 354 |
341 func TestIPConnLocalName(t *testing.T) { | 355 func TestIPConnLocalName(t *testing.T) { |
342 » if os.Getuid() != 0 { | 356 » switch runtime.GOOS { |
343 » » t.Skip("skipping test; must be root") | 357 » case "plan9", "windows": |
| 358 » » t.Skipf("skipping test on %q", runtime.GOOS) |
| 359 » default: |
| 360 » » if os.Getuid() != 0 { |
| 361 » » » t.Skip("skipping test; must be root") |
| 362 » » } |
344 } | 363 } |
345 | 364 |
346 for _, tt := range ipConnLocalNameTests { | 365 for _, tt := range ipConnLocalNameTests { |
347 c, err := ListenIP(tt.net, tt.laddr) | 366 c, err := ListenIP(tt.net, tt.laddr) |
348 if err != nil { | 367 if err != nil { |
349 t.Fatalf("ListenIP failed: %v", err) | 368 t.Fatalf("ListenIP failed: %v", err) |
350 } | 369 } |
351 defer c.Close() | 370 defer c.Close() |
352 if la := c.LocalAddr(); la == nil { | 371 if la := c.LocalAddr(); la == nil { |
353 t.Fatal("IPConn.LocalAddr failed") | 372 t.Fatal("IPConn.LocalAddr failed") |
354 } | 373 } |
355 } | 374 } |
356 } | 375 } |
357 | 376 |
358 func TestIPConnRemoteName(t *testing.T) { | 377 func TestIPConnRemoteName(t *testing.T) { |
359 » if os.Getuid() != 0 { | 378 » switch runtime.GOOS { |
360 » » t.Skip("skipping test; must be root") | 379 » case "plan9", "windows": |
| 380 » » t.Skipf("skipping test on %q", runtime.GOOS) |
| 381 » default: |
| 382 » » if os.Getuid() != 0 { |
| 383 » » » t.Skip("skipping test; must be root") |
| 384 » » } |
361 } | 385 } |
362 | 386 |
363 raddr := &IPAddr{IP: IPv4(127, 0, 0, 10).To4()} | 387 raddr := &IPAddr{IP: IPv4(127, 0, 0, 10).To4()} |
364 c, err := DialIP("ip:tcp", &IPAddr{IP: IPv4(127, 0, 0, 1)}, raddr) | 388 c, err := DialIP("ip:tcp", &IPAddr{IP: IPv4(127, 0, 0, 1)}, raddr) |
365 if err != nil { | 389 if err != nil { |
366 t.Fatalf("DialIP failed: %v", err) | 390 t.Fatalf("DialIP failed: %v", err) |
367 } | 391 } |
368 defer c.Close() | 392 defer c.Close() |
369 if !reflect.DeepEqual(raddr, c.RemoteAddr()) { | 393 if !reflect.DeepEqual(raddr, c.RemoteAddr()) { |
370 t.Fatalf("got %#v, expected %#v", c.RemoteAddr(), raddr) | 394 t.Fatalf("got %#v, expected %#v", c.RemoteAddr(), raddr) |
371 } | 395 } |
372 } | 396 } |
LEFT | RIGHT |