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 ...@@ -102,21 +102,63 @@ module IPAddress
self.kind_of? IPAddress::IPv6 self.kind_of? IPAddress::IPv6
end 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, # Checks if the given string is a valid IP address,
# either IPv4 or IPv6 # either IPv4 or IPv6
# #
# Example: # Example:
# #
# IPAddress::valid? "2002::1" # IPAddress::valid_ip? "2002::1"
# #=> true # #=> true
# #
# IPAddress::valid? "10.0.0.256" # IPAddress::valid_ip? "10.0.0.256"
# #=> false # #=> false
# #
def self.valid?(addr) def self.valid_ip?(addr)
valid_ipv4?(addr) || valid_ipv6?(addr) valid_ipv4?(addr) || valid_ipv6?(addr)
end 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 # Checks if the given string is a valid IPv4 address
......
...@@ -59,6 +59,13 @@ class IPAddressTest < Minitest::Test ...@@ -59,6 +59,13 @@ class IPAddressTest < Minitest::Test
end end
def test_module_method_valid? 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.1")
assert_equal true, IPAddress::valid?("10.0.0.0") assert_equal true, IPAddress::valid?("10.0.0.0")
assert_equal true, IPAddress::valid?("2002::1") assert_equal true, IPAddress::valid?("2002::1")
...@@ -69,14 +76,24 @@ class IPAddressTest < Minitest::Test ...@@ -69,14 +76,24 @@ class IPAddressTest < Minitest::Test
assert_equal false, IPAddress::valid?("10.0") assert_equal false, IPAddress::valid?("10.0")
assert_equal false, IPAddress::valid?("2002:::1") assert_equal false, IPAddress::valid?("2002:::1")
assert_equal false, IPAddress::valid?("2002:516:2:200") assert_equal false, IPAddress::valid?("2002:516:2:200")
end 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 true, IPAddress::valid_ipv4_netmask?("255.255.255.0")
assert_equal false, IPAddress::valid_ipv4_netmask?("10.0.0.1") assert_equal false, IPAddress::valid_ipv4_netmask?("10.0.0.1")
end 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 end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment