Albert Strasheim | e480b81 | 2011-03-25 14:42:25 -0400 | [diff] [blame] | 1 | // Copyright 2011 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 | |
| 5 | package net |
| 6 | |
| 7 | import ( |
| 8 | "os" |
| 9 | "reflect" |
Mikio Hara | 195ccd5 | 2012-03-06 10:07:08 +0900 | [diff] [blame] | 10 | "runtime" |
Albert Strasheim | e480b81 | 2011-03-25 14:42:25 -0400 | [diff] [blame] | 11 | "testing" |
| 12 | ) |
| 13 | |
| 14 | type listenerFile interface { |
| 15 | Listener |
Russ Cox | eb69292 | 2011-11-01 22:05:34 -0400 | [diff] [blame] | 16 | File() (f *os.File, err error) |
Albert Strasheim | e480b81 | 2011-03-25 14:42:25 -0400 | [diff] [blame] | 17 | } |
| 18 | |
| 19 | type packetConnFile interface { |
| 20 | PacketConn |
Russ Cox | eb69292 | 2011-11-01 22:05:34 -0400 | [diff] [blame] | 21 | File() (f *os.File, err error) |
Albert Strasheim | e480b81 | 2011-03-25 14:42:25 -0400 | [diff] [blame] | 22 | } |
| 23 | |
| 24 | type connFile interface { |
| 25 | Conn |
Russ Cox | eb69292 | 2011-11-01 22:05:34 -0400 | [diff] [blame] | 26 | File() (f *os.File, err error) |
Albert Strasheim | e480b81 | 2011-03-25 14:42:25 -0400 | [diff] [blame] | 27 | } |
| 28 | |
| 29 | func testFileListener(t *testing.T, net, laddr string) { |
Albert Strasheim | e480b81 | 2011-03-25 14:42:25 -0400 | [diff] [blame] | 30 | l, err := Listen(net, laddr) |
| 31 | if err != nil { |
Mikio Hara | f77e10f | 2015-05-01 12:38:42 +0900 | [diff] [blame] | 32 | t.Fatal(err) |
Albert Strasheim | e480b81 | 2011-03-25 14:42:25 -0400 | [diff] [blame] | 33 | } |
| 34 | defer l.Close() |
| 35 | lf := l.(listenerFile) |
| 36 | f, err := lf.File() |
| 37 | if err != nil { |
Mikio Hara | f77e10f | 2015-05-01 12:38:42 +0900 | [diff] [blame] | 38 | t.Fatal(err) |
Albert Strasheim | e480b81 | 2011-03-25 14:42:25 -0400 | [diff] [blame] | 39 | } |
| 40 | c, err := FileListener(f) |
| 41 | if err != nil { |
Mikio Hara | f77e10f | 2015-05-01 12:38:42 +0900 | [diff] [blame] | 42 | t.Fatal(err) |
Albert Strasheim | e480b81 | 2011-03-25 14:42:25 -0400 | [diff] [blame] | 43 | } |
| 44 | if !reflect.DeepEqual(l.Addr(), c.Addr()) { |
Mikio Hara | f77e10f | 2015-05-01 12:38:42 +0900 | [diff] [blame] | 45 | t.Fatalf("got %#v; want%#v", l.Addr(), c.Addr()) |
Albert Strasheim | e480b81 | 2011-03-25 14:42:25 -0400 | [diff] [blame] | 46 | } |
| 47 | if err := c.Close(); err != nil { |
Mikio Hara | f77e10f | 2015-05-01 12:38:42 +0900 | [diff] [blame] | 48 | t.Fatal(err) |
Albert Strasheim | e480b81 | 2011-03-25 14:42:25 -0400 | [diff] [blame] | 49 | } |
| 50 | if err := f.Close(); err != nil { |
Mikio Hara | f77e10f | 2015-05-01 12:38:42 +0900 | [diff] [blame] | 51 | t.Fatal(err) |
Albert Strasheim | e480b81 | 2011-03-25 14:42:25 -0400 | [diff] [blame] | 52 | } |
| 53 | } |
| 54 | |
Mikio Hara | d4e1383 | 2012-03-06 09:43:45 +0900 | [diff] [blame] | 55 | var fileListenerTests = []struct { |
| 56 | net string |
| 57 | laddr string |
Mikio Hara | d4e1383 | 2012-03-06 09:43:45 +0900 | [diff] [blame] | 58 | }{ |
Mikio Hara | 7b2b45e | 2015-03-26 23:26:45 +0900 | [diff] [blame] | 59 | {net: "tcp", laddr: ":0"}, |
| 60 | {net: "tcp", laddr: "0.0.0.0:0"}, |
| 61 | {net: "tcp", laddr: "[::ffff:0.0.0.0]:0"}, |
| 62 | {net: "tcp", laddr: "[::]:0"}, |
Mikio Hara | d4e1383 | 2012-03-06 09:43:45 +0900 | [diff] [blame] | 63 | |
Mikio Hara | 7b2b45e | 2015-03-26 23:26:45 +0900 | [diff] [blame] | 64 | {net: "tcp", laddr: "127.0.0.1:0"}, |
| 65 | {net: "tcp", laddr: "[::ffff:127.0.0.1]:0"}, |
| 66 | {net: "tcp", laddr: "[::1]:0"}, |
Mikio Hara | d4e1383 | 2012-03-06 09:43:45 +0900 | [diff] [blame] | 67 | |
Mikio Hara | 7b2b45e | 2015-03-26 23:26:45 +0900 | [diff] [blame] | 68 | {net: "tcp4", laddr: ":0"}, |
| 69 | {net: "tcp4", laddr: "0.0.0.0:0"}, |
| 70 | {net: "tcp4", laddr: "[::ffff:0.0.0.0]:0"}, |
Mikio Hara | d4e1383 | 2012-03-06 09:43:45 +0900 | [diff] [blame] | 71 | |
Mikio Hara | 7b2b45e | 2015-03-26 23:26:45 +0900 | [diff] [blame] | 72 | {net: "tcp4", laddr: "127.0.0.1:0"}, |
| 73 | {net: "tcp4", laddr: "[::ffff:127.0.0.1]:0"}, |
Mikio Hara | d4e1383 | 2012-03-06 09:43:45 +0900 | [diff] [blame] | 74 | |
Mikio Hara | 7b2b45e | 2015-03-26 23:26:45 +0900 | [diff] [blame] | 75 | {net: "tcp6", laddr: ":0"}, |
| 76 | {net: "tcp6", laddr: "[::]:0"}, |
Mikio Hara | d4e1383 | 2012-03-06 09:43:45 +0900 | [diff] [blame] | 77 | |
Mikio Hara | 7b2b45e | 2015-03-26 23:26:45 +0900 | [diff] [blame] | 78 | {net: "tcp6", laddr: "[::1]:0"}, |
Mikio Hara | d4e1383 | 2012-03-06 09:43:45 +0900 | [diff] [blame] | 79 | |
Mikio Hara | 7b2b45e | 2015-03-26 23:26:45 +0900 | [diff] [blame] | 80 | {net: "unix", laddr: "@gotest/net"}, |
| 81 | {net: "unixpacket", laddr: "@gotest/net"}, |
Mikio Hara | d4e1383 | 2012-03-06 09:43:45 +0900 | [diff] [blame] | 82 | } |
| 83 | |
Albert Strasheim | e480b81 | 2011-03-25 14:42:25 -0400 | [diff] [blame] | 84 | func TestFileListener(t *testing.T) { |
Mikio Hara | 195ccd5 | 2012-03-06 10:07:08 +0900 | [diff] [blame] | 85 | switch runtime.GOOS { |
Mikio Hara | 484cc67 | 2014-09-18 19:17:55 +0900 | [diff] [blame] | 86 | case "nacl", "windows": |
Mikio Hara | f77e10f | 2015-05-01 12:38:42 +0900 | [diff] [blame] | 87 | t.Skipf("not supported on %s", runtime.GOOS) |
Mikio Hara | 195ccd5 | 2012-03-06 10:07:08 +0900 | [diff] [blame] | 88 | } |
| 89 | |
Mikio Hara | d4e1383 | 2012-03-06 09:43:45 +0900 | [diff] [blame] | 90 | for _, tt := range fileListenerTests { |
Mikio Hara | 7b2b45e | 2015-03-26 23:26:45 +0900 | [diff] [blame] | 91 | if !testableListenArgs(tt.net, tt.laddr, "") { |
Mikio Hara | f77e10f | 2015-05-01 12:38:42 +0900 | [diff] [blame] | 92 | t.Logf("skipping %s test", tt.net+" "+tt.laddr) |
Mikio Hara | d4e1383 | 2012-03-06 09:43:45 +0900 | [diff] [blame] | 93 | continue |
| 94 | } |
| 95 | testFileListener(t, tt.net, tt.laddr) |
Albert Strasheim | e480b81 | 2011-03-25 14:42:25 -0400 | [diff] [blame] | 96 | } |
| 97 | } |
| 98 | |
Albert Strasheim | 51057bda3 | 2011-10-12 13:36:45 -0400 | [diff] [blame] | 99 | func testFilePacketConn(t *testing.T, pcf packetConnFile, listen bool) { |
Albert Strasheim | e480b81 | 2011-03-25 14:42:25 -0400 | [diff] [blame] | 100 | f, err := pcf.File() |
| 101 | if err != nil { |
Mikio Hara | f77e10f | 2015-05-01 12:38:42 +0900 | [diff] [blame] | 102 | t.Fatal(err) |
Albert Strasheim | e480b81 | 2011-03-25 14:42:25 -0400 | [diff] [blame] | 103 | } |
| 104 | c, err := FilePacketConn(f) |
| 105 | if err != nil { |
Mikio Hara | f77e10f | 2015-05-01 12:38:42 +0900 | [diff] [blame] | 106 | t.Fatal(err) |
Albert Strasheim | e480b81 | 2011-03-25 14:42:25 -0400 | [diff] [blame] | 107 | } |
| 108 | if !reflect.DeepEqual(pcf.LocalAddr(), c.LocalAddr()) { |
Mikio Hara | f77e10f | 2015-05-01 12:38:42 +0900 | [diff] [blame] | 109 | t.Fatalf("got %#v; want %#v", pcf.LocalAddr(), c.LocalAddr()) |
Albert Strasheim | e480b81 | 2011-03-25 14:42:25 -0400 | [diff] [blame] | 110 | } |
Albert Strasheim | 51057bda3 | 2011-10-12 13:36:45 -0400 | [diff] [blame] | 111 | if listen { |
| 112 | if _, err := c.WriteTo([]byte{}, c.LocalAddr()); err != nil { |
Mikio Hara | f77e10f | 2015-05-01 12:38:42 +0900 | [diff] [blame] | 113 | t.Fatal(err) |
Albert Strasheim | 51057bda3 | 2011-10-12 13:36:45 -0400 | [diff] [blame] | 114 | } |
| 115 | } |
Albert Strasheim | e480b81 | 2011-03-25 14:42:25 -0400 | [diff] [blame] | 116 | if err := c.Close(); err != nil { |
Mikio Hara | f77e10f | 2015-05-01 12:38:42 +0900 | [diff] [blame] | 117 | t.Fatal(err) |
Albert Strasheim | e480b81 | 2011-03-25 14:42:25 -0400 | [diff] [blame] | 118 | } |
| 119 | if err := f.Close(); err != nil { |
Mikio Hara | f77e10f | 2015-05-01 12:38:42 +0900 | [diff] [blame] | 120 | t.Fatal(err) |
Albert Strasheim | e480b81 | 2011-03-25 14:42:25 -0400 | [diff] [blame] | 121 | } |
| 122 | } |
| 123 | |
| 124 | func testFilePacketConnListen(t *testing.T, net, laddr string) { |
| 125 | l, err := ListenPacket(net, laddr) |
| 126 | if err != nil { |
Mikio Hara | f77e10f | 2015-05-01 12:38:42 +0900 | [diff] [blame] | 127 | t.Fatal(err) |
Albert Strasheim | e480b81 | 2011-03-25 14:42:25 -0400 | [diff] [blame] | 128 | } |
Albert Strasheim | 51057bda3 | 2011-10-12 13:36:45 -0400 | [diff] [blame] | 129 | testFilePacketConn(t, l.(packetConnFile), true) |
Albert Strasheim | e480b81 | 2011-03-25 14:42:25 -0400 | [diff] [blame] | 130 | if err := l.Close(); err != nil { |
Mikio Hara | f77e10f | 2015-05-01 12:38:42 +0900 | [diff] [blame] | 131 | t.Fatal(err) |
Albert Strasheim | e480b81 | 2011-03-25 14:42:25 -0400 | [diff] [blame] | 132 | } |
| 133 | } |
| 134 | |
| 135 | func testFilePacketConnDial(t *testing.T, net, raddr string) { |
Russ Cox | 98828f0 | 2011-03-28 23:39:39 -0400 | [diff] [blame] | 136 | c, err := Dial(net, raddr) |
Albert Strasheim | e480b81 | 2011-03-25 14:42:25 -0400 | [diff] [blame] | 137 | if err != nil { |
Mikio Hara | f77e10f | 2015-05-01 12:38:42 +0900 | [diff] [blame] | 138 | t.Fatal(err) |
Albert Strasheim | e480b81 | 2011-03-25 14:42:25 -0400 | [diff] [blame] | 139 | } |
Albert Strasheim | 51057bda3 | 2011-10-12 13:36:45 -0400 | [diff] [blame] | 140 | testFilePacketConn(t, c.(packetConnFile), false) |
Albert Strasheim | e480b81 | 2011-03-25 14:42:25 -0400 | [diff] [blame] | 141 | if err := c.Close(); err != nil { |
Mikio Hara | f77e10f | 2015-05-01 12:38:42 +0900 | [diff] [blame] | 142 | t.Fatal(err) |
Albert Strasheim | e480b81 | 2011-03-25 14:42:25 -0400 | [diff] [blame] | 143 | } |
| 144 | } |
| 145 | |
Mikio Hara | d4e1383 | 2012-03-06 09:43:45 +0900 | [diff] [blame] | 146 | var filePacketConnTests = []struct { |
Mikio Hara | 7b2b45e | 2015-03-26 23:26:45 +0900 | [diff] [blame] | 147 | net string |
| 148 | addr string |
Mikio Hara | d4e1383 | 2012-03-06 09:43:45 +0900 | [diff] [blame] | 149 | }{ |
Mikio Hara | 7b2b45e | 2015-03-26 23:26:45 +0900 | [diff] [blame] | 150 | {net: "udp", addr: "127.0.0.1:0"}, |
| 151 | {net: "udp", addr: "[::ffff:127.0.0.1]:0"}, |
| 152 | {net: "udp", addr: "[::1]:0"}, |
Mikio Hara | d4e1383 | 2012-03-06 09:43:45 +0900 | [diff] [blame] | 153 | |
Mikio Hara | 7b2b45e | 2015-03-26 23:26:45 +0900 | [diff] [blame] | 154 | {net: "udp4", addr: "127.0.0.1:0"}, |
| 155 | {net: "udp4", addr: "[::ffff:127.0.0.1]:0"}, |
Mikio Hara | d4e1383 | 2012-03-06 09:43:45 +0900 | [diff] [blame] | 156 | |
Mikio Hara | 7b2b45e | 2015-03-26 23:26:45 +0900 | [diff] [blame] | 157 | {net: "udp6", addr: "[::1]:0"}, |
Mikio Hara | d4e1383 | 2012-03-06 09:43:45 +0900 | [diff] [blame] | 158 | |
Ainar Garipov | 7f9f70e | 2015-06-11 16:49:38 +0300 | [diff] [blame] | 159 | // TODO(mikioh,bradfitz): reenable once 10730 is fixed |
Brad Fitzpatrick | f97f876 | 2015-05-06 19:25:04 -0700 | [diff] [blame] | 160 | // {net: "ip4:icmp", addr: "127.0.0.1"}, |
Mikio Hara | c88a671 | 2014-01-28 03:18:27 -0800 | [diff] [blame] | 161 | |
Mikio Hara | 7b2b45e | 2015-03-26 23:26:45 +0900 | [diff] [blame] | 162 | {net: "unixgram", addr: "@gotest3/net"}, |
Mikio Hara | d4e1383 | 2012-03-06 09:43:45 +0900 | [diff] [blame] | 163 | } |
| 164 | |
Albert Strasheim | e480b81 | 2011-03-25 14:42:25 -0400 | [diff] [blame] | 165 | func TestFilePacketConn(t *testing.T) { |
Mikio Hara | 195ccd5 | 2012-03-06 10:07:08 +0900 | [diff] [blame] | 166 | switch runtime.GOOS { |
Mikio Hara | 1b13517 | 2014-02-26 10:20:49 +0900 | [diff] [blame] | 167 | case "nacl", "plan9", "windows": |
Mikio Hara | f77e10f | 2015-05-01 12:38:42 +0900 | [diff] [blame] | 168 | t.Skipf("not supported on %s", runtime.GOOS) |
Mikio Hara | 195ccd5 | 2012-03-06 10:07:08 +0900 | [diff] [blame] | 169 | } |
| 170 | |
Mikio Hara | d4e1383 | 2012-03-06 09:43:45 +0900 | [diff] [blame] | 171 | for _, tt := range filePacketConnTests { |
Mikio Hara | 7b2b45e | 2015-03-26 23:26:45 +0900 | [diff] [blame] | 172 | if !testableListenArgs(tt.net, tt.addr, "") { |
Mikio Hara | f77e10f | 2015-05-01 12:38:42 +0900 | [diff] [blame] | 173 | t.Logf("skipping %s test", tt.net+" "+tt.addr) |
Mikio Hara | d4e1383 | 2012-03-06 09:43:45 +0900 | [diff] [blame] | 174 | continue |
| 175 | } |
Mikio Hara | c88a671 | 2014-01-28 03:18:27 -0800 | [diff] [blame] | 176 | if os.Getuid() != 0 && tt.net == "ip4:icmp" { |
| 177 | t.Log("skipping test; must be root") |
| 178 | continue |
| 179 | } |
Mikio Hara | d4e1383 | 2012-03-06 09:43:45 +0900 | [diff] [blame] | 180 | testFilePacketConnListen(t, tt.net, tt.addr) |
Mikio Hara | 7b2b45e | 2015-03-26 23:26:45 +0900 | [diff] [blame] | 181 | switch tt.net { |
| 182 | case "udp", "udp4", "udp6": |
| 183 | host, _, err := SplitHostPort(tt.addr) |
| 184 | if err != nil { |
| 185 | t.Error(err) |
| 186 | continue |
Mikio Hara | d4e1383 | 2012-03-06 09:43:45 +0900 | [diff] [blame] | 187 | } |
Mikio Hara | 7b2b45e | 2015-03-26 23:26:45 +0900 | [diff] [blame] | 188 | testFilePacketConnDial(t, tt.net, JoinHostPort(host, "12345")) |
| 189 | case "ip4:icmp": |
| 190 | testFilePacketConnDial(t, tt.net, tt.addr) |
Mikio Hara | d4e1383 | 2012-03-06 09:43:45 +0900 | [diff] [blame] | 191 | } |
Albert Strasheim | e480b81 | 2011-03-25 14:42:25 -0400 | [diff] [blame] | 192 | } |
| 193 | } |