Skip to content
Snippets Groups Projects
Commit 81e192ec authored by Paulius Dambravičius's avatar Paulius Dambravičius Committed by Romain Tartière
Browse files

Add IPv4 subnet validation

parent 9bdfb364
Branches
No related tags found
No related merge requests found
......@@ -102,21 +102,63 @@ module IPAddress
self.kind_of? IPAddress::IPv6
end
#
# Checks if the given string is either a valid IP, either a valid IPv4 subnet
#
# Example:
#
# IPAddress::valid? "10.0.0.0/24"
# #=> true
#
# IPAddress::valid? "2002::1"
# #=> true
#
# IPAddress::valid? "10.0.0.256"
# #=> false
#
# IPAddress::valid? "10.0.0.0/999"
# #=> false
#
def self.valid?(addr)
valid_ip?(addr) || valid_ipv4_subnet?(addr)
end
#
# Checks if the given string is a valid IP address,
# either IPv4 or IPv6
#
# Example:
#
# IPAddress::valid? "2002::1"
# IPAddress::valid_ip? "2002::1"
# #=> true
#
# IPAddress::valid? "10.0.0.256"
# IPAddress::valid_ip? "10.0.0.256"
# #=> false
#
def self.valid?(addr)
def self.valid_ip?(addr)
valid_ipv4?(addr) || valid_ipv6?(addr)
end
#
# Checks if the given string is a valid IPv4 subnet
#
# Example:
#
# IPAdress::valid_ipv4_subnet? "10.0.0.0/24"
# #=> true
#
# IPAdress::valid_ipv4_subnet? "10.0.0.0/255.255.255.0"
# #=> true
#
# IPAdress::valid_ipv4_subnet? "10.0.0.0/64"
# #=> false
#
def self.valid_ipv4_subnet?(addr)
ip, netmask = addr.split("/")
valid_ipv4?(ip) && (!(netmask =~ /\A([12]?\d|3[0-2])\z/).nil? || valid_ipv4_netmask?(netmask))
end
#
# Checks if the given string is a valid IPv4 address
......
......@@ -59,6 +59,13 @@ class IPAddressTest < Minitest::Test
end
def test_module_method_valid?
assert_equal true, IPAddress::valid?("10.0.0.0/24")
assert_equal true, IPAddress::valid?("10.0.0.0/255.255.255.0")
assert_equal false, IPAddress::valid?("10.0.0.0/64")
assert_equal false, IPAddress::valid?("10.0.0.0/255.255.255.256")
end
def test_module_method_valid_ip?
assert_equal true, IPAddress::valid?("10.0.0.1")
assert_equal true, IPAddress::valid?("10.0.0.0")
assert_equal true, IPAddress::valid?("2002::1")
......@@ -69,14 +76,24 @@ class IPAddressTest < Minitest::Test
assert_equal false, IPAddress::valid?("10.0")
assert_equal false, IPAddress::valid?("2002:::1")
assert_equal false, IPAddress::valid?("2002:516:2:200")
end
def test_module_method_valid_ipv4_netmark?
def test_module_method_valid_ipv4_netmask?
assert_equal true, IPAddress::valid_ipv4_netmask?("255.255.255.0")
assert_equal false, IPAddress::valid_ipv4_netmask?("10.0.0.1")
end
def test_module_method_valid_ipv4_subnet?
assert_equal true, IPAddress::valid_ipv4_subnet?("10.0.0.0/255.255.255.0")
assert_equal true, IPAddress::valid_ipv4_subnet?("10.0.0.0/0")
assert_equal true, IPAddress::valid_ipv4_subnet?("10.0.0.0/32")
assert_equal false, IPAddress::valid_ipv4_subnet?("10.0.0.0/ABC")
assert_equal false, IPAddress::valid_ipv4_subnet?("10.0.0.1")
assert_equal false, IPAddress::valid_ipv4_subnet?("10.0.0.0/33")
assert_equal false, IPAddress::valid_ipv4_subnet?("10.0.0.256/24")
assert_equal false, IPAddress::valid_ipv4_subnet?("10.0.0.0/255.255.255.256")
end
end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment