[ruby/ipaddr] Support zone identifiers in IPv6 addresses

These are supported by Ruby's socket library if the operating system
supports zone indentifiers, so they should be supported by ipaddr.
See RFCs 4007 and 6874 for additional information.

Implements Ruby Feature #10911

09a6408fb2
This commit is contained in:
Jeremy Evans 2020-07-13 09:36:06 -07:00 committed by Hiroshi SHIBATA
parent 74ed881e10
commit bd6e1a0f08
No known key found for this signature in database
GPG key ID: F9CF13417264FAC2
2 changed files with 67 additions and 5 deletions

View file

@ -43,6 +43,17 @@ class TC_IPAddr < Test::Unit::TestCase
assert_equal("3ffe:0505:0002:0000:0000:0000:0000:0000", a.to_string)
assert_equal(Socket::AF_INET6, a.family)
assert_equal(48, a.prefix)
assert_nil(a.zone_id)
a = IPAddr.new("fe80::1%ab0")
assert_equal("fe80::1%ab0", a.to_s)
assert_equal("fe80:0000:0000:0000:0000:0000:0000:0001%ab0", a.to_string)
assert_equal(Socket::AF_INET6, a.family)
assert_equal(false, a.ipv4?)
assert_equal(true, a.ipv6?)
assert_equal("#<IPAddr: IPv6:fe80:0000:0000:0000:0000:0000:0000:0001%ab0/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff>", a.inspect)
assert_equal(128, a.prefix)
assert_equal('%ab0', a.zone_id)
a = IPAddr.new("0.0.0.0")
assert_equal("0.0.0.0", a.to_s)
@ -87,7 +98,8 @@ class TC_IPAddr < Test::Unit::TestCase
assert_raise(IPAddr::InvalidAddressError) { IPAddr.new("192.168.0.256") }
assert_raise(IPAddr::InvalidAddressError) { IPAddr.new("192.168.0.011") }
assert_raise(IPAddr::InvalidAddressError) { IPAddr.new("fe80::1%fxp0") }
assert_raise(IPAddr::InvalidAddressError) { IPAddr.new("fe80::1%") }
assert_raise(IPAddr::InvalidAddressError) { IPAddr.new("fe80::1%]") }
assert_raise(IPAddr::InvalidAddressError) { IPAddr.new("[192.168.1.2]/120") }
assert_raise(IPAddr::InvalidAddressError) { IPAddr.new("[2001:200:300::]\nINVALID") }
assert_raise(IPAddr::InvalidAddressError) { IPAddr.new("192.168.0.1/32\nINVALID") }
@ -231,6 +243,18 @@ class TC_IPAddr < Test::Unit::TestCase
a = IPAddr.new("192.168.1.2/24")
assert_equal(a.netmask, "255.255.255.0")
end
def test_zone_id
a = IPAddr.new("192.168.1.2")
assert_raise(IPAddr::InvalidAddressError) { a.zone_id = '%ab0' }
assert_raise(IPAddr::InvalidAddressError) { a.zone_id }
a = IPAddr.new("1:2:3:4:5:6:7:8")
a.zone_id = '%ab0'
assert_equal('%ab0', a.zone_id)
assert_equal("1:2:3:4:5:6:7:8%ab0", a.to_s)
assert_raise(IPAddr::InvalidAddressError) { a.zone_id = '%' }
end
end
class TC_Operator < Test::Unit::TestCase