PageRenderTime 52ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/projects/jruby-1.7.3/test/externals/ruby1.9/socket/test_addrinfo.rb

https://gitlab.com/essere.lab.public/qualitas.class-corpus
Ruby | 619 lines | 557 code | 53 blank | 9 comment | 85 complexity | ef9037e2380e888e5b421aeadd308c2c MD5 | raw file
  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, sender_addr = 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. begin
  147. s2.connect_nonblock(ai)
  148. rescue Errno::EISCONN
  149. end
  150. end
  151. s3, sender_addr = s1.accept
  152. s2.send("test-socket-connect-nonblock", 0)
  153. assert_equal("test-socket-connect-nonblock", s3.recv(100))
  154. ensure
  155. s1.close if s1 && !s1.closed?
  156. s2.close if s2 && !s2.closed?
  157. s3.close if s3 && !s3.closed?
  158. end
  159. def test_socket_getnameinfo
  160. ai = Addrinfo.udp("127.0.0.1", 8888)
  161. assert_equal(["127.0.0.1", "8888"], Socket.getnameinfo(ai, Socket::NI_NUMERICHOST|Socket::NI_NUMERICSERV))
  162. end
  163. def test_basicsocket_local_address
  164. s1 = Socket.new(:INET, :DGRAM, 0)
  165. s1.bind(Socket.sockaddr_in(0, "127.0.0.1"))
  166. e = Socket.unpack_sockaddr_in(s1.getsockname)
  167. a = Socket.unpack_sockaddr_in(s1.local_address.to_sockaddr)
  168. assert_equal(e, a)
  169. assert_equal(Socket::AF_INET, s1.local_address.afamily)
  170. assert_equal(Socket::PF_INET, s1.local_address.pfamily)
  171. assert_equal(Socket::SOCK_DGRAM, s1.local_address.socktype)
  172. ensure
  173. s1.close if s1 && !s1.closed?
  174. end
  175. def test_basicsocket_remote_address
  176. s1 = TCPServer.new("127.0.0.1", 0)
  177. s2 = Socket.new(:INET, :STREAM, 0)
  178. s2.connect(s1.getsockname)
  179. s3, _ = s1.accept
  180. e = Socket.unpack_sockaddr_in(s2.getsockname)
  181. a = Socket.unpack_sockaddr_in(s3.remote_address.to_sockaddr)
  182. assert_equal(e, a)
  183. assert_equal(Socket::AF_INET, s3.remote_address.afamily)
  184. assert_equal(Socket::PF_INET, s3.remote_address.pfamily)
  185. assert_equal(Socket::SOCK_STREAM, s3.remote_address.socktype)
  186. ensure
  187. s1.close if s1 && !s1.closed?
  188. s2.close if s2 && !s2.closed?
  189. s3.close if s3 && !s3.closed?
  190. end
  191. def test_socket_accept
  192. serv = Socket.new(:INET, :STREAM, 0)
  193. serv.bind(Socket.sockaddr_in(0, "127.0.0.1"))
  194. serv.listen(5)
  195. c = Socket.new(:INET, :STREAM, 0)
  196. c.connect(serv.local_address)
  197. ret = serv.accept
  198. s, ai = ret
  199. assert_kind_of(Array, ret)
  200. assert_equal(2, ret.length)
  201. assert_kind_of(Addrinfo, ai)
  202. e = Socket.unpack_sockaddr_in(c.getsockname)
  203. a = Socket.unpack_sockaddr_in(ai.to_sockaddr)
  204. assert_equal(e, a)
  205. ensure
  206. serv.close if serv && !serv.closed?
  207. s.close if s && !s.closed?
  208. c.close if c && !c.closed?
  209. end
  210. def test_socket_accept_nonblock
  211. serv = Socket.new(:INET, :STREAM, 0)
  212. serv.bind(Socket.sockaddr_in(0, "127.0.0.1"))
  213. serv.listen(5)
  214. c = Socket.new(:INET, :STREAM, 0)
  215. c.connect(serv.local_address)
  216. begin
  217. ret = serv.accept_nonblock
  218. rescue IO::WaitReadable, Errno::EINTR
  219. IO.select([serv])
  220. retry
  221. end
  222. s, ai = ret
  223. assert_kind_of(Array, ret)
  224. assert_equal(2, ret.length)
  225. assert_kind_of(Addrinfo, ai)
  226. e = Socket.unpack_sockaddr_in(c.getsockname)
  227. a = Socket.unpack_sockaddr_in(ai.to_sockaddr)
  228. assert_equal(e, a)
  229. ensure
  230. serv.close if serv && !serv.closed?
  231. s.close if s && !s.closed?
  232. c.close if c && !c.closed?
  233. end
  234. def test_socket_sysaccept
  235. serv = Socket.new(:INET, :STREAM, 0)
  236. serv.bind(Socket.sockaddr_in(0, "127.0.0.1"))
  237. serv.listen(5)
  238. c = Socket.new(:INET, :STREAM, 0)
  239. c.connect(serv.local_address)
  240. ret = serv.sysaccept
  241. fd, ai = ret
  242. s = IO.new(fd)
  243. assert_kind_of(Array, ret)
  244. assert_equal(2, ret.length)
  245. assert_kind_of(Addrinfo, ai)
  246. e = Socket.unpack_sockaddr_in(c.getsockname)
  247. a = Socket.unpack_sockaddr_in(ai.to_sockaddr)
  248. assert_equal(e, a)
  249. ensure
  250. serv.close if serv && !serv.closed?
  251. s.close if s && !s.closed?
  252. c.close if c && !c.closed?
  253. end
  254. def test_socket_recvfrom
  255. s1 = Socket.new(:INET, :DGRAM, 0)
  256. s1.bind(Socket.sockaddr_in(0, "127.0.0.1"))
  257. s2 = Socket.new(:INET, :DGRAM, 0)
  258. s2.bind(Socket.sockaddr_in(0, "127.0.0.1"))
  259. s2.send("test-socket-recvfrom", 0, s1.getsockname)
  260. data, ai = s1.recvfrom(100)
  261. assert_equal("test-socket-recvfrom", data)
  262. assert_kind_of(Addrinfo, ai)
  263. e = Socket.unpack_sockaddr_in(s2.getsockname)
  264. a = Socket.unpack_sockaddr_in(ai.to_sockaddr)
  265. assert_equal(e, a)
  266. ensure
  267. s1.close if s1 && !s1.closed?
  268. s2.close if s2 && !s2.closed?
  269. end
  270. def test_socket_recvfrom_nonblock
  271. s1 = Socket.new(:INET, :DGRAM, 0)
  272. s1.bind(Socket.sockaddr_in(0, "127.0.0.1"))
  273. s2 = Socket.new(:INET, :DGRAM, 0)
  274. s2.bind(Socket.sockaddr_in(0, "127.0.0.1"))
  275. s2.send("test-socket-recvfrom", 0, s1.getsockname)
  276. begin
  277. data, ai = s1.recvfrom_nonblock(100)
  278. rescue IO::WaitReadable
  279. IO.select([s1])
  280. retry
  281. end
  282. assert_equal("test-socket-recvfrom", data)
  283. assert_kind_of(Addrinfo, ai)
  284. e = Socket.unpack_sockaddr_in(s2.getsockname)
  285. a = Socket.unpack_sockaddr_in(ai.to_sockaddr)
  286. assert_equal(e, a)
  287. ensure
  288. s1.close if s1 && !s1.closed?
  289. s2.close if s2 && !s2.closed?
  290. end
  291. def test_family_addrinfo
  292. ai = Addrinfo.tcp("0.0.0.0", 4649).family_addrinfo("127.0.0.1", 80)
  293. assert_equal(["127.0.0.1", 80], ai.ip_unpack)
  294. assert_equal(Socket::SOCK_STREAM, ai.socktype)
  295. return unless Addrinfo.respond_to?(:unix)
  296. ai = Addrinfo.unix("/testdir/sock").family_addrinfo("/testdir/sock2")
  297. assert_equal("/testdir/sock2", ai.unix_path)
  298. assert_equal(Socket::SOCK_STREAM, ai.socktype)
  299. assert_raise(SocketError) { Addrinfo.tcp("0.0.0.0", 4649).family_addrinfo("::1", 80) }
  300. end
  301. def random_port
  302. # IANA suggests dynamic port for 49152 to 65535
  303. # http://www.iana.org/assignments/port-numbers
  304. 49152 + rand(65535-49152+1)
  305. end
  306. def errors_addrinuse
  307. [Errno::EADDRINUSE]
  308. end
  309. def test_connect_from
  310. TCPServer.open("0.0.0.0", 0) {|serv|
  311. serv_ai = Addrinfo.new(serv.getsockname, :INET, :STREAM)
  312. serv_ai = tcp_unspecified_to_loopback(serv_ai)
  313. port = random_port
  314. begin
  315. serv_ai.connect_from("0.0.0.0", port) {|s1|
  316. s2 = serv.accept
  317. begin
  318. assert_equal(port, s2.remote_address.ip_port)
  319. ensure
  320. s2.close
  321. end
  322. }
  323. rescue *errors_addrinuse
  324. # not test failure
  325. end
  326. }
  327. end
  328. def test_connect_to
  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. client_ai = Addrinfo.tcp("0.0.0.0", port)
  334. begin
  335. client_ai.connect_to(*serv_ai.ip_unpack) {|s1|
  336. s2 = serv.accept
  337. begin
  338. assert_equal(port, s2.remote_address.ip_port)
  339. ensure
  340. s2.close
  341. end
  342. }
  343. rescue *errors_addrinuse
  344. # not test failure
  345. end
  346. }
  347. end
  348. def test_connect
  349. TCPServer.open("0.0.0.0", 0) {|serv|
  350. serv_ai = Addrinfo.new(serv.getsockname, :INET, :STREAM)
  351. serv_ai = tcp_unspecified_to_loopback(serv_ai)
  352. begin
  353. serv_ai.connect {|s1|
  354. s2 = serv.accept
  355. begin
  356. assert_equal(s1.local_address.ip_unpack, s2.remote_address.ip_unpack)
  357. assert_equal(s2.local_address.ip_unpack, s1.remote_address.ip_unpack)
  358. ensure
  359. s2.close
  360. end
  361. }
  362. rescue *errors_addrinuse
  363. # not test failure
  364. end
  365. }
  366. end
  367. def test_bind
  368. port = random_port
  369. client_ai = Addrinfo.tcp("0.0.0.0", port)
  370. begin
  371. client_ai.bind {|s|
  372. assert_equal(port, s.local_address.ip_port)
  373. }
  374. rescue *errors_addrinuse
  375. # not test failure
  376. end
  377. end
  378. def test_listen
  379. port = random_port
  380. client_ai = Addrinfo.tcp("0.0.0.0", port)
  381. begin
  382. client_ai.listen {|serv|
  383. assert_equal(port, serv.local_address.ip_port)
  384. serv_addr, serv_port = serv.local_address.ip_unpack
  385. case serv_addr
  386. when "0.0.0.0" then serv_addr = "127.0.0.1"
  387. end
  388. TCPSocket.open(serv_addr, serv_port) {|s1|
  389. s2, addr = serv.accept
  390. begin
  391. assert_equal(s1.local_address.ip_unpack, addr.ip_unpack)
  392. ensure
  393. s2.close
  394. end
  395. }
  396. }
  397. rescue *errors_addrinuse
  398. # not test failure
  399. end
  400. end
  401. def test_s_foreach
  402. Addrinfo.foreach(nil, 80, nil, :STREAM) {|ai|
  403. assert_kind_of(Addrinfo, ai)
  404. }
  405. end
  406. def test_marshal
  407. ai1 = Addrinfo.tcp("127.0.0.1", 80)
  408. ai2 = Marshal.load(Marshal.dump(ai1))
  409. assert_equal(ai1.afamily, ai2.afamily)
  410. assert_equal(ai1.ip_unpack, ai2.ip_unpack)
  411. assert_equal(ai1.pfamily, ai2.pfamily)
  412. assert_equal(ai1.socktype, ai2.socktype)
  413. assert_equal(ai1.protocol, ai2.protocol)
  414. assert_equal(ai1.canonname, ai2.canonname)
  415. end
  416. if Socket.const_defined?("AF_INET6") && Socket::AF_INET6.is_a?(Integer)
  417. def test_addrinfo_new_inet6
  418. ai = Addrinfo.new(["AF_INET6", 42304, "ip6-localhost", "::1"])
  419. assert_equal([42304, "::1"], Socket.unpack_sockaddr_in(ai))
  420. assert_equal(Socket::AF_INET6, ai.afamily)
  421. assert_equal(Socket::PF_INET6, ai.pfamily)
  422. assert_equal(0, ai.socktype)
  423. assert_equal(0, ai.protocol)
  424. end
  425. def test_addrinfo_ip_unpack_inet6
  426. ai = Addrinfo.tcp("::1", 80)
  427. assert_equal(["::1", 80], ai.ip_unpack)
  428. assert_equal("::1", ai.ip_address)
  429. assert_equal(80, ai.ip_port)
  430. end
  431. def test_addrinfo_inspect_sockaddr_inet6
  432. ai = Addrinfo.tcp("::1", 80)
  433. assert_equal("[::1]:80", ai.inspect_sockaddr)
  434. end
  435. def test_marshal_inet6
  436. ai1 = Addrinfo.tcp("::1", 80)
  437. ai2 = Marshal.load(Marshal.dump(ai1))
  438. assert_equal(ai1.afamily, ai2.afamily)
  439. assert_equal(ai1.ip_unpack, ai2.ip_unpack)
  440. assert_equal(ai1.pfamily, ai2.pfamily)
  441. assert_equal(ai1.socktype, ai2.socktype)
  442. assert_equal(ai1.protocol, ai2.protocol)
  443. assert_equal(ai1.canonname, ai2.canonname)
  444. end
  445. def ipv6(str)
  446. Addrinfo.getaddrinfo(str, nil, :INET6, :DGRAM).fetch(0)
  447. end
  448. def test_ipv6_address_predicates
  449. list = [
  450. [:ipv6_unspecified?, "::"],
  451. [:ipv6_loopback?, "::1"],
  452. [:ipv6_v4compat?, "::0.0.0.2", "::255.255.255.255"],
  453. [:ipv6_v4mapped?, "::ffff:0.0.0.0", "::ffff:255.255.255.255"],
  454. [:ipv6_linklocal?, "fe80::", "febf::"],
  455. [:ipv6_sitelocal?, "fec0::", "feef::"],
  456. [:ipv6_multicast?, "ff00::", "ffff::"]
  457. ]
  458. mlist = [
  459. [:ipv6_mc_nodelocal?, "ff01::", "ff11::"],
  460. [:ipv6_mc_linklocal?, "ff02::", "ff12::"],
  461. [:ipv6_mc_sitelocal?, "ff05::", "ff15::"],
  462. [:ipv6_mc_orglocal?, "ff08::", "ff18::"],
  463. [:ipv6_mc_global?, "ff0e::", "ff1e::"]
  464. ]
  465. list.each {|meth, *addrs|
  466. addrs.each {|addr|
  467. addr_exp = "Addrinfo.getaddrinfo(#{addr.inspect}, nil, :INET6, :DGRAM).fetch(0)"
  468. if meth == :ipv6_v4compat? || meth == :ipv6_v4mapped?
  469. # MacOS X returns IPv4 address for ::ffff:1.2.3.4 and ::1.2.3.4.
  470. # Solaris returns IPv4 address for ::ffff:1.2.3.4.
  471. ai = ipv6(addr)
  472. assert(ai.ipv4? || ai.send(meth), "ai=#{addr_exp}; ai.ipv4? || .#{meth}")
  473. else
  474. assert(ipv6(addr).send(meth), "#{addr_exp}.#{meth}")
  475. assert_equal(addr, ipv6(addr).ip_address)
  476. end
  477. list.each {|meth2,|
  478. next if meth == meth2
  479. assert(!ipv6(addr).send(meth2), "!#{addr_exp}.#{meth2}")
  480. }
  481. }
  482. }
  483. mlist.each {|meth, *addrs|
  484. addrs.each {|addr|
  485. addr_exp = "Addrinfo.getaddrinfo(#{addr.inspect}, nil, :INET6, :DGRAM).fetch(0)"
  486. assert(ipv6(addr).send(meth), "#{addr_exp}.#{meth}")
  487. assert(ipv6(addr).ipv6_multicast?, "#{addr_exp}.ipv6_multicast?")
  488. mlist.each {|meth2,|
  489. next if meth == meth2
  490. assert(!ipv6(addr).send(meth2), "!#{addr_exp}.#{meth2}")
  491. }
  492. list.each {|meth2,|
  493. next if :ipv6_multicast? == meth2
  494. assert(!ipv6(addr).send(meth2), "!#{addr_exp}.#{meth2}")
  495. }
  496. }
  497. }
  498. end
  499. def test_ipv6_to_ipv4
  500. ai = Addrinfo.ip("::192.0.2.3")
  501. ai = ai.ipv6_to_ipv4 if !ai.ipv4?
  502. assert(ai.ipv4?)
  503. assert_equal("192.0.2.3", ai.ip_address)
  504. ai = Addrinfo.ip("::ffff:192.0.2.3")
  505. ai = ai.ipv6_to_ipv4 if !ai.ipv4?
  506. assert(ai.ipv4?)
  507. assert_equal("192.0.2.3", ai.ip_address)
  508. assert_nil(Addrinfo.ip("::1").ipv6_to_ipv4)
  509. assert_nil(Addrinfo.ip("192.0.2.3").ipv6_to_ipv4)
  510. if HAS_UNIXSOCKET
  511. assert_nil(Addrinfo.unix("/testdir/sock").ipv6_to_ipv4)
  512. end
  513. end
  514. end
  515. if HAS_UNIXSOCKET
  516. def test_addrinfo_unix
  517. ai = Addrinfo.unix("/testdir/sock")
  518. assert_equal("/testdir/sock", Socket.unpack_sockaddr_un(ai))
  519. assert_equal(Socket::AF_UNIX, ai.afamily)
  520. assert_equal(Socket::PF_UNIX, ai.pfamily)
  521. assert_equal(Socket::SOCK_STREAM, ai.socktype)
  522. assert_equal(0, ai.protocol)
  523. end
  524. def test_addrinfo_unix_dgram
  525. ai = Addrinfo.unix("/testdir/sock", :DGRAM)
  526. assert_equal("/testdir/sock", Socket.unpack_sockaddr_un(ai))
  527. assert_equal(Socket::AF_UNIX, ai.afamily)
  528. assert_equal(Socket::PF_UNIX, ai.pfamily)
  529. assert_equal(Socket::SOCK_DGRAM, ai.socktype)
  530. assert_equal(0, ai.protocol)
  531. end
  532. def test_addrinfo_unix_path
  533. ai = Addrinfo.unix("/testdir/sock1")
  534. assert_equal("/testdir/sock1", ai.unix_path)
  535. end
  536. def test_addrinfo_inspect_sockaddr_unix
  537. ai = Addrinfo.unix("/testdir/test_addrinfo_inspect_sockaddr_unix")
  538. assert_equal("/testdir/test_addrinfo_inspect_sockaddr_unix", ai.inspect_sockaddr)
  539. end
  540. def test_addrinfo_new_unix
  541. ai = Addrinfo.new(["AF_UNIX", "/testdir/sock"])
  542. assert_equal("/testdir/sock", Socket.unpack_sockaddr_un(ai))
  543. assert_equal(Socket::AF_UNIX, ai.afamily)
  544. assert_equal(Socket::PF_UNIX, ai.pfamily)
  545. assert_equal(Socket::SOCK_STREAM, ai.socktype) # UNIXSocket/UNIXServer is SOCK_STREAM only.
  546. assert_equal(0, ai.protocol)
  547. end
  548. def test_addrinfo_predicates_unix
  549. unix_ai = Addrinfo.new(Socket.sockaddr_un("/testdir/sososo"))
  550. assert(!unix_ai.ip?)
  551. assert(!unix_ai.ipv4?)
  552. assert(!unix_ai.ipv6?)
  553. assert(unix_ai.unix?)
  554. end
  555. def test_marshal_unix
  556. ai1 = Addrinfo.unix("/testdir/sock")
  557. ai2 = Marshal.load(Marshal.dump(ai1))
  558. assert_equal(ai1.afamily, ai2.afamily)
  559. assert_equal(ai1.unix_path, ai2.unix_path)
  560. assert_equal(ai1.pfamily, ai2.pfamily)
  561. assert_equal(ai1.socktype, ai2.socktype)
  562. assert_equal(ai1.protocol, ai2.protocol)
  563. assert_equal(ai1.canonname, ai2.canonname)
  564. end
  565. end
  566. end