PageRenderTime 45ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/test/socket/test_addrinfo.rb

https://github.com/dtran65/ruby
Ruby | 640 lines | 576 code | 54 blank | 10 comment | 85 complexity | a7973b17d7cd54a7f14b587ffb197b13 MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause, AGPL-3.0, 0BSD, Unlicense
  1. begin
  2. require "socket"
  3. rescue LoadError
  4. end
  5. require "test/unit"
  6. class TestSocketAddrinfo < Test::Unit::TestCase
  7. HAS_UNIXSOCKET = defined?(UNIXSocket) && /cygwin/ !~ RUBY_PLATFORM
  8. def tcp_unspecified_to_loopback(addrinfo)
  9. if addrinfo.ipv4? && addrinfo.ip_address == "0.0.0.0"
  10. Addrinfo.tcp("127.0.0.1", addrinfo.ip_port)
  11. elsif addrinfo.ipv6? && addrinfo.ipv6_unspecified?
  12. Addrinfo.tcp("::1", addrinfo.ip_port)
  13. elsif addrinfo.ipv6? && (ai = addrinfo.ipv6_to_ipv4) && ai.ip_address == "0.0.0.0"
  14. Addrinfo.tcp("127.0.0.1", addrinfo.ip_port)
  15. else
  16. addrinfo
  17. end
  18. end
  19. def test_addrinfo_ip
  20. ai = Addrinfo.ip("127.0.0.1")
  21. assert_equal([0, "127.0.0.1"], Socket.unpack_sockaddr_in(ai))
  22. assert_equal(Socket::AF_INET, ai.afamily)
  23. assert_equal(Socket::PF_INET, ai.pfamily)
  24. assert_equal(0, ai.socktype)
  25. assert_equal(0, ai.protocol)
  26. end
  27. def test_addrinfo_tcp
  28. ai = Addrinfo.tcp("127.0.0.1", 80)
  29. assert_equal([80, "127.0.0.1"], Socket.unpack_sockaddr_in(ai))
  30. assert_equal(Socket::AF_INET, ai.afamily)
  31. assert_equal(Socket::PF_INET, ai.pfamily)
  32. assert_equal(Socket::SOCK_STREAM, ai.socktype)
  33. assert_include([0, Socket::IPPROTO_TCP], ai.protocol)
  34. end
  35. def test_addrinfo_udp
  36. ai = Addrinfo.udp("127.0.0.1", 80)
  37. assert_equal([80, "127.0.0.1"], Socket.unpack_sockaddr_in(ai))
  38. assert_equal(Socket::AF_INET, ai.afamily)
  39. assert_equal(Socket::PF_INET, ai.pfamily)
  40. assert_equal(Socket::SOCK_DGRAM, ai.socktype)
  41. assert_include([0, Socket::IPPROTO_UDP], ai.protocol)
  42. end
  43. def test_addrinfo_ip_unpack
  44. ai = Addrinfo.tcp("127.0.0.1", 80)
  45. assert_equal(["127.0.0.1", 80], ai.ip_unpack)
  46. assert_equal("127.0.0.1", ai.ip_address)
  47. assert_equal(80, ai.ip_port)
  48. end
  49. def test_addrinfo_inspect_sockaddr
  50. ai = Addrinfo.tcp("127.0.0.1", 80)
  51. assert_equal("127.0.0.1:80", ai.inspect_sockaddr)
  52. end
  53. def test_addrinfo_new_inet
  54. ai = Addrinfo.new(["AF_INET", 46102, "localhost.localdomain", "127.0.0.2"])
  55. assert_equal([46102, "127.0.0.2"], Socket.unpack_sockaddr_in(ai))
  56. assert_equal(Socket::AF_INET, ai.afamily)
  57. assert_equal(Socket::PF_INET, ai.pfamily)
  58. assert_equal(0, ai.socktype)
  59. assert_equal(0, ai.protocol)
  60. end
  61. def test_addrinfo_predicates
  62. ipv4_ai = Addrinfo.new(Socket.sockaddr_in(80, "192.168.0.1"))
  63. assert(ipv4_ai.ip?)
  64. assert(ipv4_ai.ipv4?)
  65. assert(!ipv4_ai.ipv6?)
  66. assert(!ipv4_ai.unix?)
  67. end
  68. def test_ipv4_address_predicates
  69. list = [
  70. [:ipv4_private?, "10.0.0.0", "10.255.255.255",
  71. "172.16.0.0", "172.31.255.255",
  72. "192.168.0.0", "192.168.255.255"],
  73. [:ipv4_loopback?, "127.0.0.1", "127.0.0.0", "127.255.255.255"],
  74. [:ipv4_multicast?, "224.0.0.0", "224.255.255.255"]
  75. ]
  76. list.each {|meth, *addrs|
  77. addrs.each {|addr|
  78. assert(Addrinfo.ip(addr).send(meth), "Addrinfo.ip(#{addr.inspect}).#{meth}")
  79. list.each {|meth2,|
  80. next if meth == meth2
  81. assert(!Addrinfo.ip(addr).send(meth2), "!Addrinfo.ip(#{addr.inspect}).#{meth2}")
  82. }
  83. }
  84. }
  85. end
  86. def test_basicsocket_send
  87. s1 = Socket.new(:INET, :DGRAM, 0)
  88. s1.bind(Socket.sockaddr_in(0, "127.0.0.1"))
  89. sa = s1.getsockname
  90. ai = Addrinfo.new(sa)
  91. s2 = Socket.new(:INET, :DGRAM, 0)
  92. s2.send("test-basicsocket-send", 0, ai)
  93. assert_equal("test-basicsocket-send", s1.recv(100))
  94. ensure
  95. s1.close if s1 && !s1.closed?
  96. s2.close if s2 && !s2.closed?
  97. end
  98. def test_udpsocket_send
  99. s1 = UDPSocket.new
  100. s1.bind("127.0.0.1", 0)
  101. ai = Addrinfo.new(s1.getsockname)
  102. s2 = UDPSocket.new
  103. s2.send("test-udp-send", 0, ai)
  104. assert_equal("test-udp-send", s1.recv(100))
  105. ensure
  106. s1.close if s1 && !s1.closed?
  107. s2.close if s2 && !s2.closed?
  108. end
  109. def test_socket_bind
  110. s1 = Socket.new(:INET, :DGRAM, 0)
  111. sa = Socket.sockaddr_in(0, "127.0.0.1")
  112. ai = Addrinfo.new(sa)
  113. s1.bind(ai)
  114. s2 = UDPSocket.new
  115. s2.send("test-socket-bind", 0, s1.getsockname)
  116. assert_equal("test-socket-bind", s1.recv(100))
  117. ensure
  118. s1.close if s1 && !s1.closed?
  119. s2.close if s2 && !s2.closed?
  120. end
  121. def test_socket_connect
  122. s1 = Socket.new(:INET, :STREAM, 0)
  123. s1.bind(Socket.sockaddr_in(0, "127.0.0.1"))
  124. s1.listen(5)
  125. ai = Addrinfo.new(s1.getsockname)
  126. s2 = Socket.new(:INET, :STREAM, 0)
  127. s2.connect(ai)
  128. s3, _ = s1.accept
  129. s2.send("test-socket-connect", 0)
  130. assert_equal("test-socket-connect", s3.recv(100))
  131. ensure
  132. s1.close if s1 && !s1.closed?
  133. s2.close if s2 && !s2.closed?
  134. s3.close if s3 && !s3.closed?
  135. end
  136. def test_socket_connect_nonblock
  137. s1 = Socket.new(:INET, :STREAM, 0)
  138. s1.bind(Socket.sockaddr_in(0, "127.0.0.1"))
  139. s1.listen(5)
  140. ai = Addrinfo.new(s1.getsockname)
  141. s2 = Socket.new(:INET, :STREAM, 0)
  142. begin
  143. s2.connect_nonblock(ai)
  144. rescue IO::WaitWritable
  145. IO.select(nil, [s2])
  146. r = s2.getsockopt(Socket::SOL_SOCKET, Socket::SO_ERROR)
  147. assert_equal(0, r.int, "NOERROR is expected but #{r.inspect}")
  148. begin
  149. s2.connect_nonblock(ai)
  150. rescue Errno::EISCONN
  151. end
  152. end
  153. s3, _ = s1.accept
  154. s2.send("test-socket-connect-nonblock", 0)
  155. assert_equal("test-socket-connect-nonblock", s3.recv(100))
  156. ensure
  157. s1.close if s1 && !s1.closed?
  158. s2.close if s2 && !s2.closed?
  159. s3.close if s3 && !s3.closed?
  160. end
  161. def test_socket_getnameinfo
  162. ai = Addrinfo.udp("127.0.0.1", 8888)
  163. assert_equal(["127.0.0.1", "8888"], Socket.getnameinfo(ai, Socket::NI_NUMERICHOST|Socket::NI_NUMERICSERV))
  164. end
  165. def test_basicsocket_local_address
  166. s1 = Socket.new(:INET, :DGRAM, 0)
  167. s1.bind(Socket.sockaddr_in(0, "127.0.0.1"))
  168. e = Socket.unpack_sockaddr_in(s1.getsockname)
  169. a = Socket.unpack_sockaddr_in(s1.local_address.to_sockaddr)
  170. assert_equal(e, a)
  171. assert_equal(Socket::AF_INET, s1.local_address.afamily)
  172. assert_equal(Socket::PF_INET, s1.local_address.pfamily)
  173. assert_equal(Socket::SOCK_DGRAM, s1.local_address.socktype)
  174. ensure
  175. s1.close if s1 && !s1.closed?
  176. end
  177. def test_basicsocket_remote_address
  178. s1 = TCPServer.new("127.0.0.1", 0)
  179. s2 = Socket.new(:INET, :STREAM, 0)
  180. s2.connect(s1.getsockname)
  181. s3, _ = s1.accept
  182. e = Socket.unpack_sockaddr_in(s2.getsockname)
  183. a = Socket.unpack_sockaddr_in(s3.remote_address.to_sockaddr)
  184. assert_equal(e, a)
  185. assert_equal(Socket::AF_INET, s3.remote_address.afamily)
  186. assert_equal(Socket::PF_INET, s3.remote_address.pfamily)
  187. assert_equal(Socket::SOCK_STREAM, s3.remote_address.socktype)
  188. ensure
  189. s1.close if s1 && !s1.closed?
  190. s2.close if s2 && !s2.closed?
  191. s3.close if s3 && !s3.closed?
  192. end
  193. def test_socket_accept
  194. serv = Socket.new(:INET, :STREAM, 0)
  195. serv.bind(Socket.sockaddr_in(0, "127.0.0.1"))
  196. serv.listen(5)
  197. c = Socket.new(:INET, :STREAM, 0)
  198. c.connect(serv.local_address)
  199. ret = serv.accept
  200. s, ai = ret
  201. assert_kind_of(Array, ret)
  202. assert_equal(2, ret.length)
  203. assert_kind_of(Addrinfo, ai)
  204. e = Socket.unpack_sockaddr_in(c.getsockname)
  205. a = Socket.unpack_sockaddr_in(ai.to_sockaddr)
  206. assert_equal(e, a)
  207. ensure
  208. serv.close if serv && !serv.closed?
  209. s.close if s && !s.closed?
  210. c.close if c && !c.closed?
  211. end
  212. def test_socket_accept_nonblock
  213. serv = Socket.new(:INET, :STREAM, 0)
  214. serv.bind(Socket.sockaddr_in(0, "127.0.0.1"))
  215. serv.listen(5)
  216. c = Socket.new(:INET, :STREAM, 0)
  217. c.connect(serv.local_address)
  218. begin
  219. ret = serv.accept_nonblock
  220. rescue IO::WaitReadable, Errno::EINTR
  221. IO.select([serv])
  222. retry
  223. end
  224. s, ai = ret
  225. assert_kind_of(Array, ret)
  226. assert_equal(2, ret.length)
  227. assert_kind_of(Addrinfo, ai)
  228. e = Socket.unpack_sockaddr_in(c.getsockname)
  229. a = Socket.unpack_sockaddr_in(ai.to_sockaddr)
  230. assert_equal(e, a)
  231. ensure
  232. serv.close if serv && !serv.closed?
  233. s.close if s && !s.closed?
  234. c.close if c && !c.closed?
  235. end
  236. def test_socket_sysaccept
  237. serv = Socket.new(:INET, :STREAM, 0)
  238. serv.bind(Socket.sockaddr_in(0, "127.0.0.1"))
  239. serv.listen(5)
  240. c = Socket.new(:INET, :STREAM, 0)
  241. c.connect(serv.local_address)
  242. ret = serv.sysaccept
  243. fd, ai = ret
  244. s = IO.new(fd)
  245. assert_kind_of(Array, ret)
  246. assert_equal(2, ret.length)
  247. assert_kind_of(Addrinfo, ai)
  248. e = Socket.unpack_sockaddr_in(c.getsockname)
  249. a = Socket.unpack_sockaddr_in(ai.to_sockaddr)
  250. assert_equal(e, a)
  251. ensure
  252. serv.close if serv && !serv.closed?
  253. s.close if s && !s.closed?
  254. c.close if c && !c.closed?
  255. end
  256. def test_socket_recvfrom
  257. s1 = Socket.new(:INET, :DGRAM, 0)
  258. s1.bind(Socket.sockaddr_in(0, "127.0.0.1"))
  259. s2 = Socket.new(:INET, :DGRAM, 0)
  260. s2.bind(Socket.sockaddr_in(0, "127.0.0.1"))
  261. s2.send("test-socket-recvfrom", 0, s1.getsockname)
  262. data, ai = s1.recvfrom(100)
  263. assert_equal("test-socket-recvfrom", data)
  264. assert_kind_of(Addrinfo, ai)
  265. e = Socket.unpack_sockaddr_in(s2.getsockname)
  266. a = Socket.unpack_sockaddr_in(ai.to_sockaddr)
  267. assert_equal(e, a)
  268. ensure
  269. s1.close if s1 && !s1.closed?
  270. s2.close if s2 && !s2.closed?
  271. end
  272. def test_socket_recvfrom_nonblock
  273. s1 = Socket.new(:INET, :DGRAM, 0)
  274. s1.bind(Socket.sockaddr_in(0, "127.0.0.1"))
  275. s2 = Socket.new(:INET, :DGRAM, 0)
  276. s2.bind(Socket.sockaddr_in(0, "127.0.0.1"))
  277. s2.send("test-socket-recvfrom", 0, s1.getsockname)
  278. begin
  279. data, ai = s1.recvfrom_nonblock(100)
  280. rescue IO::WaitReadable
  281. IO.select([s1])
  282. retry
  283. end
  284. assert_equal("test-socket-recvfrom", data)
  285. assert_kind_of(Addrinfo, ai)
  286. e = Socket.unpack_sockaddr_in(s2.getsockname)
  287. a = Socket.unpack_sockaddr_in(ai.to_sockaddr)
  288. assert_equal(e, a)
  289. ensure
  290. s1.close if s1 && !s1.closed?
  291. s2.close if s2 && !s2.closed?
  292. end
  293. def test_family_addrinfo
  294. ai = Addrinfo.tcp("0.0.0.0", 4649).family_addrinfo("127.0.0.1", 80)
  295. assert_equal(["127.0.0.1", 80], ai.ip_unpack)
  296. assert_equal(Socket::SOCK_STREAM, ai.socktype)
  297. return unless Addrinfo.respond_to?(:unix)
  298. ai = Addrinfo.unix("/testdir/sock").family_addrinfo("/testdir/sock2")
  299. assert_equal("/testdir/sock2", ai.unix_path)
  300. assert_equal(Socket::SOCK_STREAM, ai.socktype)
  301. assert_raise(SocketError) { Addrinfo.tcp("0.0.0.0", 4649).family_addrinfo("::1", 80) }
  302. end
  303. def random_port
  304. # IANA suggests dynamic port for 49152 to 65535
  305. # http://www.iana.org/assignments/port-numbers
  306. 49152 + rand(65535-49152+1)
  307. end
  308. def errors_addrinuse
  309. [Errno::EADDRINUSE]
  310. end
  311. def test_connect_from
  312. TCPServer.open("0.0.0.0", 0) {|serv|
  313. serv_ai = Addrinfo.new(serv.getsockname, :INET, :STREAM)
  314. serv_ai = tcp_unspecified_to_loopback(serv_ai)
  315. port = random_port
  316. begin
  317. serv_ai.connect_from("0.0.0.0", port) {|s1|
  318. s2 = serv.accept
  319. begin
  320. assert_equal(port, s2.remote_address.ip_port)
  321. ensure
  322. s2.close
  323. end
  324. }
  325. rescue *errors_addrinuse
  326. # not test failure
  327. end
  328. }
  329. TCPServer.open("0.0.0.0", 0) {|serv|
  330. serv_ai = Addrinfo.new(serv.getsockname, :INET, :STREAM)
  331. serv_ai = tcp_unspecified_to_loopback(serv_ai)
  332. port = random_port
  333. begin
  334. serv_ai.connect_from(Addrinfo.tcp("0.0.0.0", port)) {|s1|
  335. s2 = serv.accept
  336. begin
  337. assert_equal(port, s2.remote_address.ip_port)
  338. ensure
  339. s2.close
  340. end
  341. }
  342. rescue *errors_addrinuse
  343. # not test failure
  344. end
  345. }
  346. end
  347. def test_connect_to
  348. TCPServer.open("0.0.0.0", 0) {|serv|
  349. serv_ai = Addrinfo.new(serv.getsockname, :INET, :STREAM)
  350. serv_ai = tcp_unspecified_to_loopback(serv_ai)
  351. port = random_port
  352. client_ai = Addrinfo.tcp("0.0.0.0", port)
  353. begin
  354. client_ai.connect_to(*serv_ai.ip_unpack) {|s1|
  355. s2 = serv.accept
  356. begin
  357. assert_equal(port, s2.remote_address.ip_port)
  358. ensure
  359. s2.close
  360. end
  361. }
  362. rescue *errors_addrinuse
  363. # not test failure
  364. end
  365. }
  366. end
  367. def test_connect
  368. TCPServer.open("0.0.0.0", 0) {|serv|
  369. serv_ai = Addrinfo.new(serv.getsockname, :INET, :STREAM)
  370. serv_ai = tcp_unspecified_to_loopback(serv_ai)
  371. begin
  372. serv_ai.connect {|s1|
  373. s2 = serv.accept
  374. begin
  375. assert_equal(s1.local_address.ip_unpack, s2.remote_address.ip_unpack)
  376. assert_equal(s2.local_address.ip_unpack, s1.remote_address.ip_unpack)
  377. ensure
  378. s2.close
  379. end
  380. }
  381. rescue *errors_addrinuse
  382. # not test failure
  383. end
  384. }
  385. end
  386. def test_bind
  387. port = random_port
  388. client_ai = Addrinfo.tcp("0.0.0.0", port)
  389. begin
  390. client_ai.bind {|s|
  391. assert_equal(port, s.local_address.ip_port)
  392. }
  393. rescue *errors_addrinuse
  394. # not test failure
  395. end
  396. end
  397. def test_listen
  398. port = random_port
  399. client_ai = Addrinfo.tcp("0.0.0.0", port)
  400. begin
  401. client_ai.listen {|serv|
  402. assert_equal(port, serv.local_address.ip_port)
  403. serv_addr, serv_port = serv.local_address.ip_unpack
  404. case serv_addr
  405. when "0.0.0.0" then serv_addr = "127.0.0.1"
  406. end
  407. TCPSocket.open(serv_addr, serv_port) {|s1|
  408. s2, addr = serv.accept
  409. begin
  410. assert_equal(s1.local_address.ip_unpack, addr.ip_unpack)
  411. ensure
  412. s2.close
  413. end
  414. }
  415. }
  416. rescue *errors_addrinuse
  417. # not test failure
  418. end
  419. end
  420. def test_s_foreach
  421. Addrinfo.foreach(nil, 80, nil, :STREAM) {|ai|
  422. assert_kind_of(Addrinfo, ai)
  423. }
  424. end
  425. def test_marshal
  426. ai1 = Addrinfo.tcp("127.0.0.1", 80)
  427. ai2 = Marshal.load(Marshal.dump(ai1))
  428. assert_equal(ai1.afamily, ai2.afamily)
  429. assert_equal(ai1.ip_unpack, ai2.ip_unpack)
  430. assert_equal(ai1.pfamily, ai2.pfamily)
  431. assert_equal(ai1.socktype, ai2.socktype)
  432. assert_equal(ai1.protocol, ai2.protocol)
  433. assert_equal(ai1.canonname, ai2.canonname)
  434. end
  435. if Socket.const_defined?("AF_INET6") && Socket::AF_INET6.is_a?(Integer)
  436. def test_addrinfo_new_inet6
  437. ai = Addrinfo.new(["AF_INET6", 42304, "ip6-localhost", "::1"])
  438. assert_equal([42304, "::1"], Socket.unpack_sockaddr_in(ai))
  439. assert_equal(Socket::AF_INET6, ai.afamily)
  440. assert_equal(Socket::PF_INET6, ai.pfamily)
  441. assert_equal(0, ai.socktype)
  442. assert_equal(0, ai.protocol)
  443. end
  444. def test_addrinfo_ip_unpack_inet6
  445. ai = Addrinfo.tcp("::1", 80)
  446. assert_equal(["::1", 80], ai.ip_unpack)
  447. assert_equal("::1", ai.ip_address)
  448. assert_equal(80, ai.ip_port)
  449. end
  450. def test_addrinfo_inspect_sockaddr_inet6
  451. ai = Addrinfo.tcp("::1", 80)
  452. assert_equal("[::1]:80", ai.inspect_sockaddr)
  453. end
  454. def test_marshal_inet6
  455. ai1 = Addrinfo.tcp("::1", 80)
  456. ai2 = Marshal.load(Marshal.dump(ai1))
  457. assert_equal(ai1.afamily, ai2.afamily)
  458. assert_equal(ai1.ip_unpack, ai2.ip_unpack)
  459. assert_equal(ai1.pfamily, ai2.pfamily)
  460. assert_equal(ai1.socktype, ai2.socktype)
  461. assert_equal(ai1.protocol, ai2.protocol)
  462. assert_equal(ai1.canonname, ai2.canonname)
  463. end
  464. def ipv6(str)
  465. Addrinfo.getaddrinfo(str, nil, :INET6, :DGRAM).fetch(0)
  466. end
  467. def test_ipv6_address_predicates
  468. list = [
  469. [:ipv6_unspecified?, "::"],
  470. [:ipv6_loopback?, "::1"],
  471. [:ipv6_v4compat?, "::0.0.0.2", "::255.255.255.255"],
  472. [:ipv6_v4mapped?, "::ffff:0.0.0.0", "::ffff:255.255.255.255"],
  473. [:ipv6_linklocal?, "fe80::", "febf::"],
  474. [:ipv6_sitelocal?, "fec0::", "feef::"],
  475. [:ipv6_multicast?, "ff00::", "ffff::"],
  476. [:ipv6_unique_local?, "fc00::", "fd00::"],
  477. ]
  478. mlist = [
  479. [:ipv6_mc_nodelocal?, "ff01::", "ff11::"],
  480. [:ipv6_mc_linklocal?, "ff02::", "ff12::"],
  481. [:ipv6_mc_sitelocal?, "ff05::", "ff15::"],
  482. [:ipv6_mc_orglocal?, "ff08::", "ff18::"],
  483. [:ipv6_mc_global?, "ff0e::", "ff1e::"]
  484. ]
  485. list.each {|meth, *addrs|
  486. addrs.each {|addr|
  487. addr_exp = "Addrinfo.getaddrinfo(#{addr.inspect}, nil, :INET6, :DGRAM).fetch(0)"
  488. if meth == :ipv6_v4compat? || meth == :ipv6_v4mapped?
  489. # MacOS X returns IPv4 address for ::ffff:1.2.3.4 and ::1.2.3.4.
  490. # Solaris returns IPv4 address for ::ffff:1.2.3.4.
  491. ai = ipv6(addr)
  492. assert(ai.ipv4? || ai.send(meth), "ai=#{addr_exp}; ai.ipv4? || .#{meth}")
  493. else
  494. assert(ipv6(addr).send(meth), "#{addr_exp}.#{meth}")
  495. assert_equal(addr, ipv6(addr).ip_address)
  496. end
  497. list.each {|meth2,|
  498. next if meth == meth2
  499. assert(!ipv6(addr).send(meth2), "!#{addr_exp}.#{meth2}")
  500. }
  501. }
  502. }
  503. mlist.each {|meth, *addrs|
  504. addrs.each {|addr|
  505. addr_exp = "Addrinfo.getaddrinfo(#{addr.inspect}, nil, :INET6, :DGRAM).fetch(0)"
  506. assert(ipv6(addr).send(meth), "#{addr_exp}.#{meth}")
  507. assert(ipv6(addr).ipv6_multicast?, "#{addr_exp}.ipv6_multicast?")
  508. mlist.each {|meth2,|
  509. next if meth == meth2
  510. assert(!ipv6(addr).send(meth2), "!#{addr_exp}.#{meth2}")
  511. }
  512. list.each {|meth2,|
  513. next if :ipv6_multicast? == meth2
  514. assert(!ipv6(addr).send(meth2), "!#{addr_exp}.#{meth2}")
  515. }
  516. }
  517. }
  518. end
  519. def test_ipv6_to_ipv4
  520. ai = Addrinfo.ip("::192.0.2.3")
  521. ai = ai.ipv6_to_ipv4 if !ai.ipv4?
  522. assert(ai.ipv4?)
  523. assert_equal("192.0.2.3", ai.ip_address)
  524. ai = Addrinfo.ip("::ffff:192.0.2.3")
  525. ai = ai.ipv6_to_ipv4 if !ai.ipv4?
  526. assert(ai.ipv4?)
  527. assert_equal("192.0.2.3", ai.ip_address)
  528. assert_nil(Addrinfo.ip("::1").ipv6_to_ipv4)
  529. assert_nil(Addrinfo.ip("192.0.2.3").ipv6_to_ipv4)
  530. if HAS_UNIXSOCKET
  531. assert_nil(Addrinfo.unix("/testdir/sock").ipv6_to_ipv4)
  532. end
  533. end
  534. end
  535. if HAS_UNIXSOCKET
  536. def test_addrinfo_unix
  537. ai = Addrinfo.unix("/testdir/sock")
  538. assert_equal("/testdir/sock", Socket.unpack_sockaddr_un(ai))
  539. assert_equal(Socket::AF_UNIX, ai.afamily)
  540. assert_equal(Socket::PF_UNIX, ai.pfamily)
  541. assert_equal(Socket::SOCK_STREAM, ai.socktype)
  542. assert_equal(0, ai.protocol)
  543. end
  544. def test_addrinfo_unix_dgram
  545. ai = Addrinfo.unix("/testdir/sock", :DGRAM)
  546. assert_equal("/testdir/sock", Socket.unpack_sockaddr_un(ai))
  547. assert_equal(Socket::AF_UNIX, ai.afamily)
  548. assert_equal(Socket::PF_UNIX, ai.pfamily)
  549. assert_equal(Socket::SOCK_DGRAM, ai.socktype)
  550. assert_equal(0, ai.protocol)
  551. end
  552. def test_addrinfo_unix_path
  553. ai = Addrinfo.unix("/testdir/sock1")
  554. assert_equal("/testdir/sock1", ai.unix_path)
  555. end
  556. def test_addrinfo_inspect_sockaddr_unix
  557. ai = Addrinfo.unix("/testdir/test_addrinfo_inspect_sockaddr_unix")
  558. assert_equal("/testdir/test_addrinfo_inspect_sockaddr_unix", ai.inspect_sockaddr)
  559. end
  560. def test_addrinfo_new_unix
  561. ai = Addrinfo.new(["AF_UNIX", "/testdir/sock"])
  562. assert_equal("/testdir/sock", Socket.unpack_sockaddr_un(ai))
  563. assert_equal(Socket::AF_UNIX, ai.afamily)
  564. assert_equal(Socket::PF_UNIX, ai.pfamily)
  565. assert_equal(Socket::SOCK_STREAM, ai.socktype) # UNIXSocket/UNIXServer is SOCK_STREAM only.
  566. assert_equal(0, ai.protocol)
  567. end
  568. def test_addrinfo_predicates_unix
  569. unix_ai = Addrinfo.new(Socket.sockaddr_un("/testdir/sososo"))
  570. assert(!unix_ai.ip?)
  571. assert(!unix_ai.ipv4?)
  572. assert(!unix_ai.ipv6?)
  573. assert(unix_ai.unix?)
  574. end
  575. def test_marshal_unix
  576. ai1 = Addrinfo.unix("/testdir/sock")
  577. ai2 = Marshal.load(Marshal.dump(ai1))
  578. assert_equal(ai1.afamily, ai2.afamily)
  579. assert_equal(ai1.unix_path, ai2.unix_path)
  580. assert_equal(ai1.pfamily, ai2.pfamily)
  581. assert_equal(ai1.socktype, ai2.socktype)
  582. assert_equal(ai1.protocol, ai2.protocol)
  583. assert_equal(ai1.canonname, ai2.canonname)
  584. end
  585. end
  586. end