Left: | ||
Right: |
LEFT | RIGHT |
---|---|
1 // Copyright 2012 The Go Authors. All rights reserved. | 1 // Copyright 2012 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_test | 5 // This file implements API tests across platforms and will never have a build |
6 // tag. | |
7 | |
8 package net | |
6 | 9 |
7 import ( | 10 import ( |
8 "net" | |
9 "os" | 11 "os" |
10 "runtime" | 12 "runtime" |
11 "strings" | 13 "strings" |
12 "testing" | 14 "testing" |
13 "time" | 15 "time" |
14 ) | 16 ) |
15 | 17 |
16 var packetConnTests = []struct { | 18 var packetConnTests = []struct { |
17 net string | 19 net string |
18 addr1 string | 20 addr1 string |
19 addr2 string | 21 addr2 string |
20 }{ | 22 }{ |
21 {"udp", "127.0.0.1:0", "127.0.0.1:0"}, | 23 {"udp", "127.0.0.1:0", "127.0.0.1:0"}, |
22 {"ip:icmp", "127.0.0.1", "127.0.0.1"}, | 24 {"ip:icmp", "127.0.0.1", "127.0.0.1"}, |
23 {"unixgram", testUnixAddr(), testUnixAddr()}, | 25 {"unixgram", testUnixAddr(), testUnixAddr()}, |
24 } | 26 } |
25 | 27 |
26 func TestPacketConn(t *testing.T) { | 28 func TestPacketConn(t *testing.T) { |
27 » closer := func(c net.PacketConn, net, addr1, addr2 string) { | 29 » closer := func(c PacketConn, net, addr1, addr2 string) { |
28 c.Close() | 30 c.Close() |
29 switch net { | 31 switch net { |
30 case "unixgram": | 32 case "unixgram": |
31 os.Remove(addr1) | 33 os.Remove(addr1) |
32 os.Remove(addr2) | 34 os.Remove(addr2) |
33 } | 35 } |
34 } | 36 } |
35 | 37 |
36 » for _, tt := range packetConnTests { | 38 » for i, tt := range packetConnTests { |
37 var wb []byte | 39 var wb []byte |
38 netstr := strings.Split(tt.net, ":") | 40 netstr := strings.Split(tt.net, ":") |
39 switch netstr[0] { | 41 switch netstr[0] { |
40 case "udp": | 42 case "udp": |
41 wb = []byte("UDP PACKETCONN TEST") | 43 wb = []byte("UDP PACKETCONN TEST") |
42 case "ip": | 44 case "ip": |
43 switch runtime.GOOS { | 45 switch runtime.GOOS { |
44 case "plan9": | 46 case "plan9": |
45 continue | 47 continue |
46 } | 48 } |
47 if os.Getuid() != 0 { | 49 if os.Getuid() != 0 { |
48 continue | 50 continue |
49 } | 51 } |
50 » » » id := os.Getpid() & 0xffff | 52 » » » var err error |
51 » » » wb = newICMPEchoRequest(id, 1, 128, []byte("IP PACKETCON N TEST")) | 53 » » » wb, err = (&icmpMessage{ |
54 » » » » Type: icmpv4EchoRequest, Code: 0, | |
55 » » » » Body: &icmpEcho{ | |
56 » » » » » ID: os.Getpid() & 0xffff, Seq: i + 1, | |
57 » » » » » Data: []byte("IP PACKETCONN TEST"), | |
58 » » » » }, | |
59 » » » }).Marshal() | |
60 » » » if err != nil { | |
61 » » » » t.Fatalf("icmpMessage.Marshal failed: %v", err) | |
62 » » » } | |
52 case "unixgram": | 63 case "unixgram": |
53 switch runtime.GOOS { | 64 switch runtime.GOOS { |
54 case "plan9", "windows": | 65 case "plan9", "windows": |
55 continue | 66 continue |
56 } | 67 } |
57 wb = []byte("UNIXGRAM PACKETCONN TEST") | 68 wb = []byte("UNIXGRAM PACKETCONN TEST") |
58 default: | 69 default: |
59 continue | 70 continue |
60 } | 71 } |
61 | 72 |
62 » » c1, err := net.ListenPacket(tt.net, tt.addr1) | 73 » » c1, err := ListenPacket(tt.net, tt.addr1) |
63 if err != nil { | 74 if err != nil { |
64 » » » t.Fatalf("net.ListenPacket failed: %v", err) | 75 » » » t.Fatalf("ListenPacket failed: %v", err) |
65 } | 76 } |
77 defer closer(c1, netstr[0], tt.addr1, tt.addr2) | |
66 c1.LocalAddr() | 78 c1.LocalAddr() |
67 c1.SetDeadline(time.Now().Add(100 * time.Millisecond)) | 79 c1.SetDeadline(time.Now().Add(100 * time.Millisecond)) |
68 c1.SetReadDeadline(time.Now().Add(100 * time.Millisecond)) | 80 c1.SetReadDeadline(time.Now().Add(100 * time.Millisecond)) |
69 c1.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)) | 81 c1.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)) |
70 defer closer(c1, netstr[0], tt.addr1, tt.addr2) | |
71 | 82 |
72 » » c2, err := net.ListenPacket(tt.net, tt.addr2) | 83 » » c2, err := ListenPacket(tt.net, tt.addr2) |
73 if err != nil { | 84 if err != nil { |
74 » » » t.Fatalf("net.ListenPacket failed: %v", err) | 85 » » » t.Fatalf("ListenPacket failed: %v", err) |
75 } | 86 } |
87 defer closer(c2, netstr[0], tt.addr1, tt.addr2) | |
76 c2.LocalAddr() | 88 c2.LocalAddr() |
77 c2.SetDeadline(time.Now().Add(100 * time.Millisecond)) | 89 c2.SetDeadline(time.Now().Add(100 * time.Millisecond)) |
78 c2.SetReadDeadline(time.Now().Add(100 * time.Millisecond)) | 90 c2.SetReadDeadline(time.Now().Add(100 * time.Millisecond)) |
79 c2.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)) | 91 c2.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)) |
80 defer closer(c2, netstr[0], tt.addr1, tt.addr2) | |
81 | 92 |
82 if _, err := c1.WriteTo(wb, c2.LocalAddr()); err != nil { | 93 if _, err := c1.WriteTo(wb, c2.LocalAddr()); err != nil { |
83 » » » t.Fatalf("net.PacketConn.WriteTo failed: %v", err) | 94 » » » t.Fatalf("PacketConn.WriteTo failed: %v", err) |
84 } | 95 } |
85 rb2 := make([]byte, 128) | 96 rb2 := make([]byte, 128) |
86 if _, _, err := c2.ReadFrom(rb2); err != nil { | 97 if _, _, err := c2.ReadFrom(rb2); err != nil { |
87 » » » t.Fatalf("net.PacketConn.ReadFrom failed: %v", err) | 98 » » » t.Fatalf("PacketConn.ReadFrom failed: %v", err) |
88 } | 99 } |
89 if _, err := c2.WriteTo(wb, c1.LocalAddr()); err != nil { | 100 if _, err := c2.WriteTo(wb, c1.LocalAddr()); err != nil { |
90 » » » t.Fatalf("net.PacketConn.WriteTo failed: %v", err) | 101 » » » t.Fatalf("PacketConn.WriteTo failed: %v", err) |
91 } | 102 } |
92 rb1 := make([]byte, 128) | 103 rb1 := make([]byte, 128) |
93 if _, _, err := c1.ReadFrom(rb1); err != nil { | 104 if _, _, err := c1.ReadFrom(rb1); err != nil { |
94 » » » t.Fatalf("net.PacketConn.ReadFrom failed: %v", err) | 105 » » » t.Fatalf("PacketConn.ReadFrom failed: %v", err) |
95 } | 106 } |
96 } | 107 } |
97 } | 108 } |
98 | 109 |
99 func TestConnAndPacketConn(t *testing.T) { | 110 func TestConnAndPacketConn(t *testing.T) { |
100 » closer := func(c net.PacketConn, net, addr1, addr2 string) { | 111 » closer := func(c PacketConn, net, addr1, addr2 string) { |
101 c.Close() | 112 c.Close() |
102 switch net { | 113 switch net { |
103 case "unixgram": | 114 case "unixgram": |
104 os.Remove(addr1) | 115 os.Remove(addr1) |
105 os.Remove(addr2) | 116 os.Remove(addr2) |
106 } | 117 } |
107 } | 118 } |
108 | 119 |
109 » for _, tt := range packetConnTests { | 120 » for i, tt := range packetConnTests { |
110 var wb []byte | 121 var wb []byte |
111 netstr := strings.Split(tt.net, ":") | 122 netstr := strings.Split(tt.net, ":") |
112 switch netstr[0] { | 123 switch netstr[0] { |
113 case "udp": | 124 case "udp": |
114 wb = []byte("UDP PACKETCONN TEST") | 125 wb = []byte("UDP PACKETCONN TEST") |
115 case "ip": | 126 case "ip": |
116 switch runtime.GOOS { | 127 switch runtime.GOOS { |
117 case "plan9": | 128 case "plan9": |
118 continue | 129 continue |
119 } | 130 } |
120 if os.Getuid() != 0 { | 131 if os.Getuid() != 0 { |
121 continue | 132 continue |
122 } | 133 } |
123 » » » id := os.Getpid() & 0xffff | 134 » » » var err error |
124 » » » wb = newICMPEchoRequest(id, 1, 128, []byte("IP PACKETCON N TEST")) | 135 » » » wb, err = (&icmpMessage{ |
136 » » » » Type: icmpv4EchoRequest, Code: 0, | |
137 » » » » Body: &icmpEcho{ | |
138 » » » » » ID: os.Getpid() & 0xffff, Seq: i + 1, | |
139 » » » » » Data: []byte("IP PACKETCONN TEST"), | |
140 » » » » }, | |
141 » » » }).Marshal() | |
142 » » » if err != nil { | |
143 » » » » t.Fatalf("icmpMessage.Marshal failed: %v", err) | |
144 » » » } | |
125 case "unixgram": | 145 case "unixgram": |
126 wb = []byte("UNIXGRAM PACKETCONN TEST") | 146 wb = []byte("UNIXGRAM PACKETCONN TEST") |
127 default: | 147 default: |
128 continue | 148 continue |
129 } | 149 } |
130 | 150 |
131 » » c1, err := net.ListenPacket(tt.net, tt.addr1) | 151 » » c1, err := ListenPacket(tt.net, tt.addr1) |
132 if err != nil { | 152 if err != nil { |
133 » » » t.Fatalf("net.ListenPacket failed: %v", err) | 153 » » » t.Fatalf("ListenPacket failed: %v", err) |
134 } | 154 } |
155 defer closer(c1, netstr[0], tt.addr1, tt.addr2) | |
135 c1.LocalAddr() | 156 c1.LocalAddr() |
136 c1.SetDeadline(time.Now().Add(100 * time.Millisecond)) | 157 c1.SetDeadline(time.Now().Add(100 * time.Millisecond)) |
137 c1.SetReadDeadline(time.Now().Add(100 * time.Millisecond)) | 158 c1.SetReadDeadline(time.Now().Add(100 * time.Millisecond)) |
138 c1.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)) | 159 c1.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)) |
139 defer closer(c1, netstr[0], tt.addr1, tt.addr2) | |
dave_cheney.net
2013/02/19 02:02:57
see previous comment
mikio
2013/03/03 07:00:04
Done.
| |
140 | 160 |
141 » » c2, err := net.Dial(tt.net, c1.LocalAddr().String()) | 161 » » c2, err := Dial(tt.net, c1.LocalAddr().String()) |
142 if err != nil { | 162 if err != nil { |
143 » » » t.Fatalf("net.Dial failed: %v", err) | 163 » » » t.Fatalf("Dial failed: %v", err) |
144 } | 164 } |
165 defer c2.Close() | |
145 c2.LocalAddr() | 166 c2.LocalAddr() |
146 c2.RemoteAddr() | 167 c2.RemoteAddr() |
147 c2.SetDeadline(time.Now().Add(100 * time.Millisecond)) | 168 c2.SetDeadline(time.Now().Add(100 * time.Millisecond)) |
148 c2.SetReadDeadline(time.Now().Add(100 * time.Millisecond)) | 169 c2.SetReadDeadline(time.Now().Add(100 * time.Millisecond)) |
149 c2.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)) | 170 c2.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)) |
150 defer c2.Close() | |
dave_cheney.net
2013/02/19 02:02:57
same
| |
151 | 171 |
152 if _, err := c2.Write(wb); err != nil { | 172 if _, err := c2.Write(wb); err != nil { |
153 » » » t.Fatalf("net.Conn.Write failed: %v", err) | 173 » » » t.Fatalf("Conn.Write failed: %v", err) |
154 } | 174 } |
155 rb1 := make([]byte, 128) | 175 rb1 := make([]byte, 128) |
156 if _, _, err := c1.ReadFrom(rb1); err != nil { | 176 if _, _, err := c1.ReadFrom(rb1); err != nil { |
157 » » » t.Fatalf("net.PacetConn.ReadFrom failed: %v", err) | 177 » » » t.Fatalf("PacetConn.ReadFrom failed: %v", err) |
158 } | 178 } |
159 » » var dst net.Addr | 179 » » var dst Addr |
160 switch netstr[0] { | 180 switch netstr[0] { |
161 case "ip": | 181 case "ip": |
162 » » » dst = &net.IPAddr{IP: net.IPv4(127, 0, 0, 1)} | 182 » » » dst = &IPAddr{IP: IPv4(127, 0, 0, 1)} |
163 case "unixgram": | 183 case "unixgram": |
164 continue | 184 continue |
165 default: | 185 default: |
166 dst = c2.LocalAddr() | 186 dst = c2.LocalAddr() |
167 } | 187 } |
168 if _, err := c1.WriteTo(wb, dst); err != nil { | 188 if _, err := c1.WriteTo(wb, dst); err != nil { |
169 » » » t.Fatalf("net.PacketConn.WriteTo failed: %v", err) | 189 » » » t.Fatalf("PacketConn.WriteTo failed: %v", err) |
170 } | 190 } |
171 rb2 := make([]byte, 128) | 191 rb2 := make([]byte, 128) |
172 if _, err := c2.Read(rb2); err != nil { | 192 if _, err := c2.Read(rb2); err != nil { |
173 » » » t.Fatalf("net.Conn.Read failed: %v", err) | 193 » » » t.Fatalf("Conn.Read failed: %v", err) |
174 } | 194 } |
175 } | 195 } |
176 } | 196 } |
LEFT | RIGHT |