PageRenderTime 49ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/multisketchup/ruby-1.8.0-win32-lib/lib/ruby/1.8/ipaddr.rb

http://multisketchup.googlecode.com/
Ruby | 700 lines | 533 code | 79 blank | 88 comment | 73 complexity | 4ccc93a487ba0315af1f3755dd778cf8 MD5 | raw file
  1. #
  2. # ipaddr.rb - A class to manipulate an IP address
  3. #
  4. # Copyright (c) 2002 Hajimu UMEMOTO <ume@mahoroba.org>.
  5. # All rights reserved.
  6. #
  7. # You can redistribute and/or modify it under the same terms as Ruby.
  8. #
  9. # $Id: ipaddr.rb,v 1.2 2003/04/24 06:08:32 nobu Exp $
  10. #--
  11. # TODO:
  12. # - scope_id support
  13. #++
  14. #
  15. #== Example
  16. #
  17. # require 'ipaddr'
  18. #
  19. # ipaddr1 = IPAddr.new "3ffe:505:2::1"
  20. #
  21. # p ipaddr1 #=> #<IPAddr: IPv6:3ffe:0505:0002:0000:0000:0000:0000:0001/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff>
  22. #
  23. # p ipaddr1.to_s #=> "3ffe:505:2::1"
  24. #
  25. # ipaddr2 = ipaddr1.mask(48) #=> #<IPAddr: IPv6:3ffe:0505:0002:0000:0000:0000:0000:0000/ffff:ffff:ffff:0000:0000:0000:0000:0000>
  26. #
  27. # p ipaddr2.to_s #=> "3ffe:505:2::"
  28. #
  29. # ipaddr3 = IPAddr.new "192.168.2.0/24"
  30. #
  31. # p ipaddr3 #=> #<IPAddr: IPv4:192.168.2.0/255.255.255.0>
  32. require 'socket'
  33. # IPAddr provides a set of methods to manipulate an IP address. Both
  34. # IPv4 and IPv6 are supported.
  35. class IPAddr
  36. IN4MASK = 0xffffffff
  37. IN6MASK = 0xffffffffffffffffffffffffffffffff
  38. IN6FORMAT = (["%.4x"] * 8).join(':')
  39. # Returns the address family of this IP address.
  40. attr :family
  41. # Creates a new ipaddr containing the given network byte ordered
  42. # string form of an IP address.
  43. def IPAddr::new_ntoh(addr)
  44. return IPAddr.new(IPAddr::ntop(addr))
  45. end
  46. # Convert a network byte ordered string form of an IP address into
  47. # human readable form.
  48. def IPAddr::ntop(addr)
  49. case addr.size
  50. when 4
  51. s = addr.unpack('C4').join('.')
  52. when 16
  53. s = IN6FORMAT % addr.unpack('n8')
  54. else
  55. raise ArgumentError, "unsupported address family"
  56. end
  57. return s
  58. end
  59. # Returns a new ipaddr built by bitwise AND.
  60. def &(other)
  61. return self.clone.set(@addr & other.to_i)
  62. end
  63. # Returns a new ipaddr built by bitwise OR.
  64. def |(other)
  65. return self.clone.set(@addr | other.to_i)
  66. end
  67. # Returns a new ipaddr built by bitwise right-shift.
  68. def >>(num)
  69. return self.clone.set(@addr >> num)
  70. end
  71. # Returns a new ipaddr built by bitwise left shift.
  72. def <<(num)
  73. return self.clone.set(addr_mask(@addr << num))
  74. end
  75. # Returns a new ipaddr built by bitwise negation.
  76. def ~
  77. return self.clone.set(addr_mask(~@addr))
  78. end
  79. # Returns true if two ipaddr are equal.
  80. def ==(other)
  81. if other.kind_of?(IPAddr) && @family != other.family
  82. return false
  83. end
  84. return (@addr == other.to_i)
  85. end
  86. # Returns a new ipaddr built by masking IP address with the given
  87. # prefixlen/netmask. (e.g. 8, 64, "255.255.255.0", etc.)
  88. def mask(prefixlen)
  89. return self.clone.mask!(prefixlen)
  90. end
  91. # Returns true if the given ipaddr is in the range.
  92. #
  93. # e.g.:
  94. # require 'ipaddr'
  95. # net1 = IPAddr.new("192.168.2.0/24")
  96. # p net1.include?(IPAddr.new("192.168.2.0")) #=> true
  97. # p net1.include?(IPAddr.new("192.168.2.255")) #=> true
  98. # p net1.include?(IPAddr.new("192.168.3.0")) #=> false
  99. def include?(other)
  100. if ipv4_mapped?
  101. if (@mask_addr >> 32) != 0xffffffffffffffffffffffff
  102. return false
  103. end
  104. mask_addr = (@mask_addr & IN4MASK)
  105. addr = (@addr & IN4MASK)
  106. family = Socket::AF_INET
  107. else
  108. mask_addr = @mask_addr
  109. addr = @addr
  110. family = @family
  111. end
  112. if other.kind_of?(IPAddr)
  113. if other.ipv4_mapped?
  114. other_addr = (other.to_i & IN4MASK)
  115. other_family = Socket::AF_INET
  116. else
  117. other_addr = other.to_i
  118. other_family = other.family
  119. end
  120. else # Not IPAddr - assume integer in same family as us
  121. other_addr = other.to_i
  122. other_family = family
  123. end
  124. if family != other_family
  125. return false
  126. end
  127. return ((addr & mask_addr) == (other_addr & mask_addr))
  128. end
  129. alias === include?
  130. # Returns the integer representation of the ipaddr.
  131. def to_i
  132. return @addr
  133. end
  134. # Returns a string containing the IP address representation.
  135. def to_s
  136. return IPSocket.getaddress(to_string)
  137. end
  138. # Returns a string containing the IP address representation in
  139. # canonical form.
  140. def to_string
  141. return _to_string(@addr)
  142. end
  143. # Returns a network byte ordered string form of the IP address.
  144. def hton
  145. case @family
  146. when Socket::AF_INET
  147. return [@addr].pack('N')
  148. when Socket::AF_INET6
  149. return (0..7).map { |i|
  150. (@addr >> (112 - 16 * i)) & 0xffff
  151. }.pack('n8')
  152. else
  153. raise "unsupported address family"
  154. end
  155. end
  156. # Returns true if the ipaddr is an IPv4 address.
  157. def ipv4?
  158. return @family == Socket::AF_INET
  159. end
  160. # Returns true if the ipaddr is an IPv6 address.
  161. def ipv6?
  162. return @family == Socket::AF_INET6
  163. end
  164. # Returns true if the ipaddr is an IPv4-mapped IPv6 address.
  165. def ipv4_mapped?
  166. return ipv6? && (@addr >> 32) == 0xffff
  167. end
  168. # Returns true if the ipaddr is an IPv4-compatible IPv6 address.
  169. def ipv4_compat?
  170. if !ipv6? || (@addr >> 32) != 0
  171. return false
  172. end
  173. a = (@addr & IN4MASK)
  174. return a != 0 && a != 1
  175. end
  176. # Returns a new ipaddr built by converting the native IPv4 address
  177. # into an IPv4-mapped IPv6 address.
  178. def ipv4_mapped
  179. if !ipv4?
  180. raise ArgumentError, "not an IPv4 address"
  181. end
  182. return self.clone.set(@addr | 0xffff00000000, Socket::AF_INET6)
  183. end
  184. # Returns a new ipaddr built by converting the native IPv4 address
  185. # into an IPv4-compatible IPv6 address.
  186. def ipv4_compat
  187. if !ipv4?
  188. raise ArgumentError, "not an IPv4 address"
  189. end
  190. return self.clone.set(@addr, Socket::AF_INET6)
  191. end
  192. # Returns a new ipaddr built by converting the IPv6 address into a
  193. # native IPv4 address. If the IP address is not an IPv4-mapped or
  194. # IPv4-compatible IPv6 address, returns self.
  195. def native
  196. if !ipv4_mapped? && !ipv4_compat?
  197. return self
  198. end
  199. return self.clone.set(@addr & IN4MASK, Socket::AF_INET)
  200. end
  201. # Returns a string for DNS reverse lookup. It returns a string in
  202. # RFC3172 form for an IPv6 address.
  203. def reverse
  204. case @family
  205. when Socket::AF_INET
  206. return _reverse + ".in-addr.arpa"
  207. when Socket::AF_INET6
  208. return ip6_arpa
  209. else
  210. raise "unsupported address family"
  211. end
  212. end
  213. # Returns a string for DNS reverse lookup compatible with RFC3172.
  214. def ip6_arpa
  215. if !ipv6?
  216. raise ArgumentError, "not an IPv6 address"
  217. end
  218. return _reverse + ".ip6.arpa"
  219. end
  220. # Returns a string for DNS reverse lookup compatible with RFC1886.
  221. def ip6_int
  222. if !ipv6?
  223. raise ArgumentError, "not an IPv6 address"
  224. end
  225. return _reverse + ".ip6.int"
  226. end
  227. # Returns a string containing a human-readable representation of the
  228. # ipaddr. ("#<IPAddr: family:address/mask>")
  229. def inspect
  230. case @family
  231. when Socket::AF_INET
  232. af = "IPv4"
  233. when Socket::AF_INET6
  234. af = "IPv6"
  235. else
  236. raise "unsupported address family"
  237. end
  238. return sprintf("#<%s: %s:%s/%s>", self.class.name,
  239. af, _to_string(@addr), _to_string(@mask_addr))
  240. end
  241. protected
  242. def set(addr, *family)
  243. case family[0] ? family[0] : @family
  244. when Socket::AF_INET
  245. if addr < 0 || addr > IN4MASK
  246. raise ArgumentError, "invalid address"
  247. end
  248. when Socket::AF_INET6
  249. if addr < 0 || addr > IN6MASK
  250. raise ArgumentError, "invalid address"
  251. end
  252. else
  253. raise ArgumentError, "unsupported address family"
  254. end
  255. @addr = addr
  256. if family[0]
  257. @family = family[0]
  258. end
  259. return self
  260. end
  261. def mask!(mask)
  262. if mask.kind_of?(String)
  263. if mask =~ /^\d+$/
  264. prefixlen = mask.to_i
  265. else
  266. m = IPAddr.new(mask)
  267. if m.family != @family
  268. raise ArgumentError, "address family is not same"
  269. end
  270. @mask_addr = m.to_i
  271. @addr &= @mask_addr
  272. return self
  273. end
  274. else
  275. prefixlen = mask
  276. end
  277. case @family
  278. when Socket::AF_INET
  279. if prefixlen < 0 || prefixlen > 32
  280. raise ArgumentError, "invalid length"
  281. end
  282. masklen = 32 - prefixlen
  283. @mask_addr = ((IN4MASK >> masklen) << masklen)
  284. when Socket::AF_INET6
  285. if prefixlen < 0 || prefixlen > 128
  286. raise ArgumentError, "invalid length"
  287. end
  288. masklen = 128 - prefixlen
  289. @mask_addr = ((IN6MASK >> masklen) << masklen)
  290. else
  291. raise "unsupported address family"
  292. end
  293. @addr = ((@addr >> masklen) << masklen)
  294. return self
  295. end
  296. private
  297. # Creates a new ipaddr containing the given human readable form of
  298. # an IP address. It also accepts `address/prefixlen' and
  299. # `address/mask'. When prefixlen or mask is specified, it returns a
  300. # masked ipaddr. IPv6 address may beenclosed with `[' and `]'.
  301. #
  302. # Although an address family is determined automatically from a
  303. # specified address, you can specify an address family explicitly by
  304. # the optional second argument.
  305. def initialize(addr = '::', family = Socket::AF_UNSPEC)
  306. if !addr.kind_of?(String)
  307. if family != Socket::AF_INET6 && family != Socket::AF_INET
  308. raise ArgumentError, "unsupported address family"
  309. end
  310. set(addr, family)
  311. @mask_addr = (family == Socket::AF_INET) ? IN4MASK : IN6MASK
  312. return
  313. end
  314. prefix, prefixlen = addr.split('/')
  315. if prefix =~ /^\[(.*)\]$/i
  316. prefix = $1
  317. family = Socket::AF_INET6
  318. end
  319. # It seems AI_NUMERICHOST doesn't do the job.
  320. #Socket.getaddrinfo(left, nil, Socket::AF_INET6, Socket::SOCK_STREAM, nil,
  321. # Socket::AI_NUMERICHOST)
  322. begin
  323. IPSocket.getaddress(prefix) # test if address is vaild
  324. rescue
  325. raise ArgumentError, "invalid address"
  326. end
  327. @addr = @family = nil
  328. if family == Socket::AF_UNSPEC || family == Socket::AF_INET
  329. @addr = in_addr(prefix)
  330. if @addr
  331. @family = Socket::AF_INET
  332. end
  333. end
  334. if !@addr && (family == Socket::AF_UNSPEC || family == Socket::AF_INET6)
  335. @addr = in6_addr(prefix)
  336. @family = Socket::AF_INET6
  337. end
  338. if family != Socket::AF_UNSPEC && @family != family
  339. raise ArgumentError, "address family unmatch"
  340. end
  341. if prefixlen
  342. mask!(prefixlen)
  343. else
  344. @mask_addr = (family == Socket::AF_INET) ? IN4MASK : IN6MASK
  345. end
  346. end
  347. def in_addr(addr)
  348. if addr =~ /^\d+\.\d+\.\d+\.\d+$/
  349. n = 0
  350. addr.split('.').each { |i|
  351. n <<= 8
  352. n += i.to_i
  353. }
  354. return n
  355. end
  356. return nil
  357. end
  358. def in6_addr(left)
  359. case left
  360. when /^::ffff:(\d+\.\d+\.\d+\.\d+)$/i
  361. return in_addr($1) + 0xffff00000000
  362. when /^::(\d+\.\d+\.\d+\.\d+)$/i
  363. return in_addr($1)
  364. when /[^0-9a-f:]/i
  365. raise ArgumentError, "invalid address"
  366. when /^(.*)::(.*)$/
  367. left, right = $1, $2
  368. else
  369. right = ''
  370. end
  371. l = left.split(':')
  372. r = right.split(':')
  373. rest = 8 - l.size - r.size
  374. if rest < 0
  375. return nil
  376. end
  377. a = [l, Array.new(rest, '0'), r].flatten!
  378. n = 0
  379. a.each { |i|
  380. n <<= 16
  381. n += i.hex
  382. }
  383. return n
  384. end
  385. def addr_mask(addr)
  386. case @family
  387. when Socket::AF_INET
  388. addr &= IN4MASK
  389. when Socket::AF_INET6
  390. addr &= IN6MASK
  391. else
  392. raise "unsupported address family"
  393. end
  394. return addr
  395. end
  396. def _reverse
  397. case @family
  398. when Socket::AF_INET
  399. return (0..3).map { |i|
  400. (@addr >> (8 * i)) & 0xff
  401. }.join('.')
  402. when Socket::AF_INET6
  403. return ("%.32x" % @addr).reverse!.gsub!(/.(?!$)/, '\&.')
  404. else
  405. raise "unsupported address family"
  406. end
  407. end
  408. def _to_string(addr)
  409. case @family
  410. when Socket::AF_INET
  411. return (0..3).map { |i|
  412. (addr >> (24 - 8 * i)) & 0xff
  413. }.join('.')
  414. when Socket::AF_INET6
  415. return (("%.32x" % addr).gsub!(/.{4}(?!$)/, '\&:'))
  416. else
  417. raise "unsupported address family"
  418. end
  419. end
  420. end
  421. if $0 == __FILE__
  422. eval DATA.read, nil, $0, __LINE__+4
  423. end
  424. __END__
  425. require 'test/unit'
  426. require 'test/unit/ui/console/testrunner'
  427. class TC_IPAddr < Test::Unit::TestCase
  428. def test_s_new
  429. assert_nothing_raised {
  430. IPAddr.new("3FFE:505:ffff::/48")
  431. IPAddr.new("0:0:0:1::")
  432. IPAddr.new("2001:200:300::/48")
  433. }
  434. a = IPAddr.new
  435. assert_equal("::", a.to_s)
  436. assert_equal("0000:0000:0000:0000:0000:0000:0000:0000", a.to_string)
  437. assert_equal(Socket::AF_INET6, a.family)
  438. a = IPAddr.new("0123:4567:89ab:cdef:0ABC:DEF0:1234:5678")
  439. assert_equal("123:4567:89ab:cdef:abc:def0:1234:5678", a.to_s)
  440. assert_equal("0123:4567:89ab:cdef:0abc:def0:1234:5678", a.to_string)
  441. assert_equal(Socket::AF_INET6, a.family)
  442. a = IPAddr.new("3ffe:505:2::/48")
  443. assert_equal("3ffe:505:2::", a.to_s)
  444. assert_equal("3ffe:0505:0002:0000:0000:0000:0000:0000", a.to_string)
  445. assert_equal(Socket::AF_INET6, a.family)
  446. assert_equal(false, a.ipv4?)
  447. assert_equal(true, a.ipv6?)
  448. assert_equal("#<IPAddr: IPv6:3ffe:0505:0002:0000:0000:0000:0000:0000/ffff:ffff:ffff:0000:0000:0000:0000:0000>", a.inspect)
  449. a = IPAddr.new("3ffe:505:2::/ffff:ffff:ffff::")
  450. assert_equal("3ffe:505:2::", a.to_s)
  451. assert_equal("3ffe:0505:0002:0000:0000:0000:0000:0000", a.to_string)
  452. assert_equal(Socket::AF_INET6, a.family)
  453. a = IPAddr.new("0.0.0.0")
  454. assert_equal("0.0.0.0", a.to_s)
  455. assert_equal("0.0.0.0", a.to_string)
  456. assert_equal(Socket::AF_INET, a.family)
  457. a = IPAddr.new("192.168.1.2")
  458. assert_equal("192.168.1.2", a.to_s)
  459. assert_equal("192.168.1.2", a.to_string)
  460. assert_equal(Socket::AF_INET, a.family)
  461. assert_equal(true, a.ipv4?)
  462. assert_equal(false, a.ipv6?)
  463. a = IPAddr.new("192.168.1.2/24")
  464. assert_equal("192.168.1.0", a.to_s)
  465. assert_equal("192.168.1.0", a.to_string)
  466. assert_equal(Socket::AF_INET, a.family)
  467. assert_equal("#<IPAddr: IPv4:192.168.1.0/255.255.255.0>", a.inspect)
  468. a = IPAddr.new("192.168.1.2/255.255.255.0")
  469. assert_equal("192.168.1.0", a.to_s)
  470. assert_equal("192.168.1.0", a.to_string)
  471. assert_equal(Socket::AF_INET, a.family)
  472. assert_equal("0:0:0:1::", IPAddr.new("0:0:0:1::").to_s)
  473. assert_equal("2001:200:300::", IPAddr.new("2001:200:300::/48").to_s)
  474. assert_equal("2001:200:300::", IPAddr.new("[2001:200:300::]/48").to_s)
  475. [
  476. ["fe80::1%fxp0"],
  477. ["::1/255.255.255.0"],
  478. ["::1:192.168.1.2/120"],
  479. [IPAddr.new("::1").to_i],
  480. ["::ffff:192.168.1.2/120", Socket::AF_INET],
  481. ["[192.168.1.2]/120"],
  482. ].each { |args|
  483. assert_raises(ArgumentError) {
  484. IPAddr.new(*args)
  485. }
  486. }
  487. end
  488. def test_s_new_ntoh
  489. addr = ''
  490. IPAddr.new("1234:5678:9abc:def0:1234:5678:9abc:def0").hton.each_byte { |c|
  491. addr += sprintf("%02x", c)
  492. }
  493. assert_equal("123456789abcdef0123456789abcdef0", addr)
  494. addr = ''
  495. IPAddr.new("123.45.67.89").hton.each_byte { |c|
  496. addr += sprintf("%02x", c)
  497. }
  498. assert_equal(sprintf("%02x%02x%02x%02x", 123, 45, 67, 89), addr)
  499. a = IPAddr.new("3ffe:505:2::")
  500. assert_equal("3ffe:505:2::", IPAddr.new_ntoh(a.hton).to_s)
  501. a = IPAddr.new("192.168.2.1")
  502. assert_equal("192.168.2.1", IPAddr.new_ntoh(a.hton).to_s)
  503. end
  504. def test_ipv4_compat
  505. a = IPAddr.new("::192.168.1.2")
  506. assert_equal("::192.168.1.2", a.to_s)
  507. assert_equal("0000:0000:0000:0000:0000:0000:c0a8:0102", a.to_string)
  508. assert_equal(Socket::AF_INET6, a.family)
  509. assert_equal(true, a.ipv4_compat?)
  510. b = a.native
  511. assert_equal("192.168.1.2", b.to_s)
  512. assert_equal(Socket::AF_INET, b.family)
  513. assert_equal(false, b.ipv4_compat?)
  514. a = IPAddr.new("192.168.1.2")
  515. b = a.ipv4_compat
  516. assert_equal("::192.168.1.2", b.to_s)
  517. assert_equal(Socket::AF_INET6, b.family)
  518. end
  519. def test_ipv4_mapped
  520. a = IPAddr.new("::ffff:192.168.1.2")
  521. assert_equal("::ffff:192.168.1.2", a.to_s)
  522. assert_equal("0000:0000:0000:0000:0000:ffff:c0a8:0102", a.to_string)
  523. assert_equal(Socket::AF_INET6, a.family)
  524. assert_equal(true, a.ipv4_mapped?)
  525. b = a.native
  526. assert_equal("192.168.1.2", b.to_s)
  527. assert_equal(Socket::AF_INET, b.family)
  528. assert_equal(false, b.ipv4_mapped?)
  529. a = IPAddr.new("192.168.1.2")
  530. b = a.ipv4_mapped
  531. assert_equal("::ffff:192.168.1.2", b.to_s)
  532. assert_equal(Socket::AF_INET6, b.family)
  533. end
  534. def test_reverse
  535. assert_equal("f.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0.5.0.5.0.e.f.f.3.ip6.arpa", IPAddr.new("3ffe:505:2::f").reverse)
  536. assert_equal("1.2.168.192.in-addr.arpa", IPAddr.new("192.168.2.1").reverse)
  537. end
  538. def test_ip6_arpa
  539. assert_equal("f.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0.5.0.5.0.e.f.f.3.ip6.arpa", IPAddr.new("3ffe:505:2::f").ip6_arpa)
  540. assert_raises(ArgumentError) {
  541. IPAddr.new("192.168.2.1").ip6_arpa
  542. }
  543. end
  544. def test_ip6_int
  545. assert_equal("f.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0.5.0.5.0.e.f.f.3.ip6.int", IPAddr.new("3ffe:505:2::f").ip6_int)
  546. assert_raises(ArgumentError) {
  547. IPAddr.new("192.168.2.1").ip6_int
  548. }
  549. end
  550. end
  551. class TC_Operator < Test::Unit::TestCase
  552. IN6MASK32 = "ffff:ffff::"
  553. IN6MASK128 = "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"
  554. def setup
  555. @in6_addr_any = IPAddr.new()
  556. @a = IPAddr.new("3ffe:505:2::/48")
  557. @b = IPAddr.new("0:0:0:1::")
  558. @c = IPAddr.new(IN6MASK32)
  559. end
  560. alias set_up setup
  561. def test_or
  562. assert_equal("3ffe:505:2:1::", (@a | @b).to_s)
  563. a = @a
  564. a |= @b
  565. assert_equal("3ffe:505:2:1::", a.to_s)
  566. assert_equal("3ffe:505:2::", @a.to_s)
  567. assert_equal("3ffe:505:2:1::",
  568. (@a | 0x00000000000000010000000000000000).to_s)
  569. end
  570. def test_and
  571. assert_equal("3ffe:505::", (@a & @c).to_s)
  572. a = @a
  573. a &= @c
  574. assert_equal("3ffe:505::", a.to_s)
  575. assert_equal("3ffe:505:2::", @a.to_s)
  576. assert_equal("3ffe:505::", (@a & 0xffffffff000000000000000000000000).to_s)
  577. end
  578. def test_shift_right
  579. assert_equal("0:3ffe:505:2::", (@a >> 16).to_s)
  580. a = @a
  581. a >>= 16
  582. assert_equal("0:3ffe:505:2::", a.to_s)
  583. assert_equal("3ffe:505:2::", @a.to_s)
  584. end
  585. def test_shift_left
  586. assert_equal("505:2::", (@a << 16).to_s)
  587. a = @a
  588. a <<= 16
  589. assert_equal("505:2::", a.to_s)
  590. assert_equal("3ffe:505:2::", @a.to_s)
  591. end
  592. def test_carrot
  593. a = ~@in6_addr_any
  594. assert_equal(IN6MASK128, a.to_s)
  595. assert_equal("::", @in6_addr_any.to_s)
  596. end
  597. def test_equal
  598. assert_equal(true, @a == IPAddr.new("3ffe:505:2::"))
  599. assert_equal(false, @a == IPAddr.new("3ffe:505:3::"))
  600. assert_equal(true, @a != IPAddr.new("3ffe:505:3::"))
  601. assert_equal(false, @a != IPAddr.new("3ffe:505:2::"))
  602. end
  603. def test_mask
  604. a = @a.mask(32)
  605. assert_equal("3ffe:505::", a.to_s)
  606. assert_equal("3ffe:505:2::", @a.to_s)
  607. end
  608. def test_include?
  609. assert_equal(true, @a.include?(IPAddr.new("3ffe:505:2::")))
  610. assert_equal(true, @a.include?(IPAddr.new("3ffe:505:2::1")))
  611. assert_equal(false, @a.include?(IPAddr.new("3ffe:505:3::")))
  612. net1 = IPAddr.new("192.168.2.0/24")
  613. assert_equal(true, net1.include?(IPAddr.new("192.168.2.0")))
  614. assert_equal(true, net1.include?(IPAddr.new("192.168.2.255")))
  615. assert_equal(false, net1.include?(IPAddr.new("192.168.3.0")))
  616. # test with integer parameter
  617. int = (192 << 24) + (168 << 16) + (2 << 8) + 13
  618. assert_equal(true, net1.include?(int))
  619. assert_equal(false, net1.include?(int+255))
  620. end
  621. end