unicast_posix_test.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470
  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. // +build !plan9
  5. package net
  6. import (
  7. "runtime"
  8. "syscall"
  9. "testing"
  10. )
  11. var listenerTests = []struct {
  12. net string
  13. laddr string
  14. ipv6 bool // test with underlying AF_INET6 socket
  15. wildcard bool // test with wildcard address
  16. }{
  17. {net: "tcp", laddr: "", wildcard: true},
  18. {net: "tcp", laddr: "0.0.0.0", wildcard: true},
  19. {net: "tcp", laddr: "[::ffff:0.0.0.0]", wildcard: true},
  20. {net: "tcp", laddr: "[::]", ipv6: true, wildcard: true},
  21. {net: "tcp", laddr: "127.0.0.1"},
  22. {net: "tcp", laddr: "[::ffff:127.0.0.1]"},
  23. {net: "tcp", laddr: "[::1]", ipv6: true},
  24. {net: "tcp4", laddr: "", wildcard: true},
  25. {net: "tcp4", laddr: "0.0.0.0", wildcard: true},
  26. {net: "tcp4", laddr: "[::ffff:0.0.0.0]", wildcard: true},
  27. {net: "tcp4", laddr: "127.0.0.1"},
  28. {net: "tcp4", laddr: "[::ffff:127.0.0.1]"},
  29. {net: "tcp6", laddr: "", ipv6: true, wildcard: true},
  30. {net: "tcp6", laddr: "[::]", ipv6: true, wildcard: true},
  31. {net: "tcp6", laddr: "[::1]", ipv6: true},
  32. }
  33. // TestTCPListener tests both single and double listen to a test
  34. // listener with same address family, same listening address and
  35. // same port.
  36. func TestTCPListener(t *testing.T) {
  37. switch runtime.GOOS {
  38. case "plan9":
  39. t.Skipf("skipping test on %q", runtime.GOOS)
  40. }
  41. for _, tt := range listenerTests {
  42. if tt.wildcard && (testing.Short() || !*testExternal) {
  43. continue
  44. }
  45. if tt.ipv6 && !supportsIPv6 {
  46. continue
  47. }
  48. l1, port := usableListenPort(t, tt.net, tt.laddr)
  49. checkFirstListener(t, tt.net, tt.laddr+":"+port, l1)
  50. l2, err := Listen(tt.net, tt.laddr+":"+port)
  51. checkSecondListener(t, tt.net, tt.laddr+":"+port, err, l2)
  52. l1.Close()
  53. }
  54. }
  55. // TestUDPListener tests both single and double listen to a test
  56. // listener with same address family, same listening address and
  57. // same port.
  58. func TestUDPListener(t *testing.T) {
  59. switch runtime.GOOS {
  60. case "plan9":
  61. t.Skipf("skipping test on %q", runtime.GOOS)
  62. }
  63. toudpnet := func(net string) string {
  64. switch net {
  65. case "tcp":
  66. return "udp"
  67. case "tcp4":
  68. return "udp4"
  69. case "tcp6":
  70. return "udp6"
  71. }
  72. return "<nil>"
  73. }
  74. for _, tt := range listenerTests {
  75. if tt.wildcard && (testing.Short() || !*testExternal) {
  76. continue
  77. }
  78. if tt.ipv6 && !supportsIPv6 {
  79. continue
  80. }
  81. tt.net = toudpnet(tt.net)
  82. l1, port := usableListenPacketPort(t, tt.net, tt.laddr)
  83. checkFirstListener(t, tt.net, tt.laddr+":"+port, l1)
  84. l2, err := ListenPacket(tt.net, tt.laddr+":"+port)
  85. checkSecondListener(t, tt.net, tt.laddr+":"+port, err, l2)
  86. l1.Close()
  87. }
  88. }
  89. var dualStackListenerTests = []struct {
  90. net1 string // first listener
  91. laddr1 string
  92. net2 string // second listener
  93. laddr2 string
  94. wildcard bool // test with wildcard address
  95. xerr error // expected error value, nil or other
  96. }{
  97. // Test cases and expected results for the attemping 2nd listen on the same port
  98. // 1st listen 2nd listen darwin freebsd linux openbsd
  99. // ------------------------------------------------------------------------------------
  100. // "tcp" "" "tcp" "" - - - -
  101. // "tcp" "" "tcp" "0.0.0.0" - - - -
  102. // "tcp" "0.0.0.0" "tcp" "" - - - -
  103. // ------------------------------------------------------------------------------------
  104. // "tcp" "" "tcp" "[::]" - - - ok
  105. // "tcp" "[::]" "tcp" "" - - - ok
  106. // "tcp" "0.0.0.0" "tcp" "[::]" - - - ok
  107. // "tcp" "[::]" "tcp" "0.0.0.0" - - - ok
  108. // "tcp" "[::ffff:0.0.0.0]" "tcp" "[::]" - - - ok
  109. // "tcp" "[::]" "tcp" "[::ffff:0.0.0.0]" - - - ok
  110. // ------------------------------------------------------------------------------------
  111. // "tcp4" "" "tcp6" "" ok ok ok ok
  112. // "tcp6" "" "tcp4" "" ok ok ok ok
  113. // "tcp4" "0.0.0.0" "tcp6" "[::]" ok ok ok ok
  114. // "tcp6" "[::]" "tcp4" "0.0.0.0" ok ok ok ok
  115. // ------------------------------------------------------------------------------------
  116. // "tcp" "127.0.0.1" "tcp" "[::1]" ok ok ok ok
  117. // "tcp" "[::1]" "tcp" "127.0.0.1" ok ok ok ok
  118. // "tcp4" "127.0.0.1" "tcp6" "[::1]" ok ok ok ok
  119. // "tcp6" "[::1]" "tcp4" "127.0.0.1" ok ok ok ok
  120. //
  121. // Platform default configurations:
  122. // darwin, kernel version 11.3.0
  123. // net.inet6.ip6.v6only=0 (overridable by sysctl or IPV6_V6ONLY option)
  124. // freebsd, kernel version 8.2
  125. // net.inet6.ip6.v6only=1 (overridable by sysctl or IPV6_V6ONLY option)
  126. // linux, kernel version 3.0.0
  127. // net.ipv6.bindv6only=0 (overridable by sysctl or IPV6_V6ONLY option)
  128. // openbsd, kernel version 5.0
  129. // net.inet6.ip6.v6only=1 (overriding is prohibited)
  130. {net1: "tcp", laddr1: "", net2: "tcp", laddr2: "", wildcard: true, xerr: syscall.EADDRINUSE},
  131. {net1: "tcp", laddr1: "", net2: "tcp", laddr2: "0.0.0.0", wildcard: true, xerr: syscall.EADDRINUSE},
  132. {net1: "tcp", laddr1: "0.0.0.0", net2: "tcp", laddr2: "", wildcard: true, xerr: syscall.EADDRINUSE},
  133. {net1: "tcp", laddr1: "", net2: "tcp", laddr2: "[::]", wildcard: true, xerr: syscall.EADDRINUSE},
  134. {net1: "tcp", laddr1: "[::]", net2: "tcp", laddr2: "", wildcard: true, xerr: syscall.EADDRINUSE},
  135. {net1: "tcp", laddr1: "0.0.0.0", net2: "tcp", laddr2: "[::]", wildcard: true, xerr: syscall.EADDRINUSE},
  136. {net1: "tcp", laddr1: "[::]", net2: "tcp", laddr2: "0.0.0.0", wildcard: true, xerr: syscall.EADDRINUSE},
  137. {net1: "tcp", laddr1: "[::ffff:0.0.0.0]", net2: "tcp", laddr2: "[::]", wildcard: true, xerr: syscall.EADDRINUSE},
  138. {net1: "tcp", laddr1: "[::]", net2: "tcp", laddr2: "[::ffff:0.0.0.0]", wildcard: true, xerr: syscall.EADDRINUSE},
  139. {net1: "tcp4", laddr1: "", net2: "tcp6", laddr2: "", wildcard: true},
  140. {net1: "tcp6", laddr1: "", net2: "tcp4", laddr2: "", wildcard: true},
  141. {net1: "tcp4", laddr1: "0.0.0.0", net2: "tcp6", laddr2: "[::]", wildcard: true},
  142. {net1: "tcp6", laddr1: "[::]", net2: "tcp4", laddr2: "0.0.0.0", wildcard: true},
  143. {net1: "tcp", laddr1: "127.0.0.1", net2: "tcp", laddr2: "[::1]"},
  144. {net1: "tcp", laddr1: "[::1]", net2: "tcp", laddr2: "127.0.0.1"},
  145. {net1: "tcp4", laddr1: "127.0.0.1", net2: "tcp6", laddr2: "[::1]"},
  146. {net1: "tcp6", laddr1: "[::1]", net2: "tcp4", laddr2: "127.0.0.1"},
  147. }
  148. // TestDualStackTCPListener tests both single and double listen
  149. // to a test listener with various address families, different
  150. // listening address and same port.
  151. func TestDualStackTCPListener(t *testing.T) {
  152. if testing.Short() {
  153. t.Skip("skipping in -short mode, see issue 5001")
  154. }
  155. switch runtime.GOOS {
  156. case "plan9":
  157. t.Skipf("skipping test on %q", runtime.GOOS)
  158. }
  159. if !supportsIPv6 {
  160. t.Skip("ipv6 is not supported")
  161. }
  162. for _, tt := range dualStackListenerTests {
  163. if tt.wildcard && !*testExternal {
  164. continue
  165. }
  166. switch runtime.GOOS {
  167. case "openbsd":
  168. if tt.wildcard && differentWildcardAddr(tt.laddr1, tt.laddr2) {
  169. tt.xerr = nil
  170. }
  171. }
  172. l1, port := usableListenPort(t, tt.net1, tt.laddr1)
  173. laddr := tt.laddr1 + ":" + port
  174. checkFirstListener(t, tt.net1, laddr, l1)
  175. laddr = tt.laddr2 + ":" + port
  176. l2, err := Listen(tt.net2, laddr)
  177. checkDualStackSecondListener(t, tt.net2, laddr, tt.xerr, err, l2)
  178. l1.Close()
  179. }
  180. }
  181. // TestDualStackUDPListener tests both single and double listen
  182. // to a test listener with various address families, differnet
  183. // listening address and same port.
  184. func TestDualStackUDPListener(t *testing.T) {
  185. if testing.Short() {
  186. t.Skip("skipping in -short mode, see issue 5001")
  187. }
  188. switch runtime.GOOS {
  189. case "plan9":
  190. t.Skipf("skipping test on %q", runtime.GOOS)
  191. }
  192. if !supportsIPv6 {
  193. t.Skip("ipv6 is not supported")
  194. }
  195. toudpnet := func(net string) string {
  196. switch net {
  197. case "tcp":
  198. return "udp"
  199. case "tcp4":
  200. return "udp4"
  201. case "tcp6":
  202. return "udp6"
  203. }
  204. return "<nil>"
  205. }
  206. for _, tt := range dualStackListenerTests {
  207. if tt.wildcard && (testing.Short() || !*testExternal) {
  208. continue
  209. }
  210. tt.net1 = toudpnet(tt.net1)
  211. tt.net2 = toudpnet(tt.net2)
  212. switch runtime.GOOS {
  213. case "openbsd":
  214. if tt.wildcard && differentWildcardAddr(tt.laddr1, tt.laddr2) {
  215. tt.xerr = nil
  216. }
  217. }
  218. l1, port := usableListenPacketPort(t, tt.net1, tt.laddr1)
  219. laddr := tt.laddr1 + ":" + port
  220. checkFirstListener(t, tt.net1, laddr, l1)
  221. laddr = tt.laddr2 + ":" + port
  222. l2, err := ListenPacket(tt.net2, laddr)
  223. checkDualStackSecondListener(t, tt.net2, laddr, tt.xerr, err, l2)
  224. l1.Close()
  225. }
  226. }
  227. func usableListenPort(t *testing.T, net, laddr string) (l Listener, port string) {
  228. var nladdr string
  229. var err error
  230. switch net {
  231. default:
  232. panic("usableListenPort net=" + net)
  233. case "tcp", "tcp4", "tcp6":
  234. l, err = Listen(net, laddr+":0")
  235. if err != nil {
  236. t.Fatalf("Probe Listen(%q, %q) failed: %v", net, laddr, err)
  237. }
  238. nladdr = l.(*TCPListener).Addr().String()
  239. }
  240. _, port, err = SplitHostPort(nladdr)
  241. if err != nil {
  242. t.Fatalf("SplitHostPort failed: %v", err)
  243. }
  244. return l, port
  245. }
  246. func usableListenPacketPort(t *testing.T, net, laddr string) (l PacketConn, port string) {
  247. var nladdr string
  248. var err error
  249. switch net {
  250. default:
  251. panic("usableListenPacketPort net=" + net)
  252. case "udp", "udp4", "udp6":
  253. l, err = ListenPacket(net, laddr+":0")
  254. if err != nil {
  255. t.Fatalf("Probe ListenPacket(%q, %q) failed: %v", net, laddr, err)
  256. }
  257. nladdr = l.(*UDPConn).LocalAddr().String()
  258. }
  259. _, port, err = SplitHostPort(nladdr)
  260. if err != nil {
  261. t.Fatalf("SplitHostPort failed: %v", err)
  262. }
  263. return l, port
  264. }
  265. func differentWildcardAddr(i, j string) bool {
  266. if (i == "" || i == "0.0.0.0" || i == "::ffff:0.0.0.0") && (j == "" || j == "0.0.0.0" || j == "::ffff:0.0.0.0") {
  267. return false
  268. }
  269. if i == "[::]" && j == "[::]" {
  270. return false
  271. }
  272. return true
  273. }
  274. func checkFirstListener(t *testing.T, net, laddr string, l interface{}) {
  275. switch net {
  276. case "tcp":
  277. fd := l.(*TCPListener).fd
  278. checkDualStackAddrFamily(t, net, laddr, fd)
  279. case "tcp4":
  280. fd := l.(*TCPListener).fd
  281. if fd.family != syscall.AF_INET {
  282. t.Fatalf("First Listen(%q, %q) returns address family %v, expected %v", net, laddr, fd.family, syscall.AF_INET)
  283. }
  284. case "tcp6":
  285. fd := l.(*TCPListener).fd
  286. if fd.family != syscall.AF_INET6 {
  287. t.Fatalf("First Listen(%q, %q) returns address family %v, expected %v", net, laddr, fd.family, syscall.AF_INET6)
  288. }
  289. case "udp":
  290. fd := l.(*UDPConn).fd
  291. checkDualStackAddrFamily(t, net, laddr, fd)
  292. case "udp4":
  293. fd := l.(*UDPConn).fd
  294. if fd.family != syscall.AF_INET {
  295. t.Fatalf("First ListenPacket(%q, %q) returns address family %v, expected %v", net, laddr, fd.family, syscall.AF_INET)
  296. }
  297. case "udp6":
  298. fd := l.(*UDPConn).fd
  299. if fd.family != syscall.AF_INET6 {
  300. t.Fatalf("First ListenPacket(%q, %q) returns address family %v, expected %v", net, laddr, fd.family, syscall.AF_INET6)
  301. }
  302. default:
  303. t.Fatalf("Unexpected network: %q", net)
  304. }
  305. }
  306. func checkSecondListener(t *testing.T, net, laddr string, err error, l interface{}) {
  307. switch net {
  308. case "tcp", "tcp4", "tcp6":
  309. if err == nil {
  310. l.(*TCPListener).Close()
  311. t.Fatalf("Second Listen(%q, %q) should fail", net, laddr)
  312. }
  313. case "udp", "udp4", "udp6":
  314. if err == nil {
  315. l.(*UDPConn).Close()
  316. t.Fatalf("Second ListenPacket(%q, %q) should fail", net, laddr)
  317. }
  318. default:
  319. t.Fatalf("Unexpected network: %q", net)
  320. }
  321. }
  322. func checkDualStackSecondListener(t *testing.T, net, laddr string, xerr, err error, l interface{}) {
  323. switch net {
  324. case "tcp", "tcp4", "tcp6":
  325. if xerr == nil && err != nil || xerr != nil && err == nil {
  326. t.Fatalf("Second Listen(%q, %q) returns %v, expected %v", net, laddr, err, xerr)
  327. }
  328. if err == nil {
  329. l.(*TCPListener).Close()
  330. }
  331. case "udp", "udp4", "udp6":
  332. if xerr == nil && err != nil || xerr != nil && err == nil {
  333. t.Fatalf("Second ListenPacket(%q, %q) returns %v, expected %v", net, laddr, err, xerr)
  334. }
  335. if err == nil {
  336. l.(*UDPConn).Close()
  337. }
  338. default:
  339. t.Fatalf("Unexpected network: %q", net)
  340. }
  341. }
  342. func checkDualStackAddrFamily(t *testing.T, net, laddr string, fd *netFD) {
  343. switch a := fd.laddr.(type) {
  344. case *TCPAddr:
  345. // If a node under test supports both IPv6 capability
  346. // and IPv6 IPv4-mapping capability, we can assume
  347. // that the node listens on a wildcard address with an
  348. // AF_INET6 socket.
  349. if supportsIPv4map && fd.laddr.(*TCPAddr).isWildcard() {
  350. if fd.family != syscall.AF_INET6 {
  351. t.Fatalf("Listen(%q, %q) returns address family %v, expected %v", net, laddr, fd.family, syscall.AF_INET6)
  352. }
  353. } else {
  354. if fd.family != a.family() {
  355. t.Fatalf("Listen(%q, %q) returns address family %v, expected %v", net, laddr, fd.family, a.family())
  356. }
  357. }
  358. case *UDPAddr:
  359. // If a node under test supports both IPv6 capability
  360. // and IPv6 IPv4-mapping capability, we can assume
  361. // that the node listens on a wildcard address with an
  362. // AF_INET6 socket.
  363. if supportsIPv4map && fd.laddr.(*UDPAddr).isWildcard() {
  364. if fd.family != syscall.AF_INET6 {
  365. t.Fatalf("ListenPacket(%q, %q) returns address family %v, expected %v", net, laddr, fd.family, syscall.AF_INET6)
  366. }
  367. } else {
  368. if fd.family != a.family() {
  369. t.Fatalf("ListenPacket(%q, %q) returns address family %v, expected %v", net, laddr, fd.family, a.family())
  370. }
  371. }
  372. default:
  373. t.Fatalf("Unexpected protocol address type: %T", a)
  374. }
  375. }
  376. var prohibitionaryDialArgTests = []struct {
  377. net string
  378. addr string
  379. }{
  380. {"tcp6", "127.0.0.1"},
  381. {"tcp6", "[::ffff:127.0.0.1]"},
  382. }
  383. func TestProhibitionaryDialArgs(t *testing.T) {
  384. switch runtime.GOOS {
  385. case "plan9":
  386. t.Skipf("skipping test on %q", runtime.GOOS)
  387. }
  388. // This test requires both IPv6 and IPv6 IPv4-mapping functionality.
  389. if !supportsIPv4map || testing.Short() || !*testExternal {
  390. return
  391. }
  392. l, port := usableListenPort(t, "tcp", "[::]")
  393. defer l.Close()
  394. for _, tt := range prohibitionaryDialArgTests {
  395. c, err := Dial(tt.net, tt.addr+":"+port)
  396. if err == nil {
  397. c.Close()
  398. t.Fatalf("Dial(%q, %q) should fail", tt.net, tt.addr)
  399. }
  400. }
  401. }
  402. func TestWildWildcardListener(t *testing.T) {
  403. switch runtime.GOOS {
  404. case "plan9":
  405. t.Skipf("skipping test on %q", runtime.GOOS)
  406. }
  407. if testing.Short() || !*testExternal {
  408. t.Skip("skipping test to avoid external network")
  409. }
  410. defer func() {
  411. if p := recover(); p != nil {
  412. t.Fatalf("Listen, ListenPacket or protocol-specific Listen panicked: %v", p)
  413. }
  414. }()
  415. if ln, err := Listen("tcp", ""); err == nil {
  416. ln.Close()
  417. }
  418. if ln, err := ListenPacket("udp", ""); err == nil {
  419. ln.Close()
  420. }
  421. if ln, err := ListenTCP("tcp", nil); err == nil {
  422. ln.Close()
  423. }
  424. if ln, err := ListenUDP("udp", nil); err == nil {
  425. ln.Close()
  426. }
  427. if ln, err := ListenIP("ip:icmp", nil); err == nil {
  428. ln.Close()
  429. }
  430. }