Module:IP/testcases
Appearance
![]() | This is the test cases page for the module Module:IP. Results of the test cases. |
-- Unit tests for [[Module:IP]]. Click talk page to run tests.
-- Unit test module setup
local ScribuntoUnit = require('Module:ScribuntoUnit')
local suite = ScribuntoUnit:new()
-- Target module setup
local IP = require('Module:IP')
local IPAddress = IP.IPAddress
local Subnet = IP.Subnet
-- Constants
local IP_ADDRESS_CLASS = 'IPAddress'
local IP_ADDRESS_OBJECT = 'ipAddress'
local SUBNET_CLASS = 'Subnet'
local SUBNET_OBJECT = 'subnet'
-------------------------------------------------------------------------------
-- Helper methods
-------------------------------------------------------------------------------
function suite:assertError(message, plain, ...)
local success, ret = pcall(...)
self:assertFalse(success)
self:assertStringContains(message, ret, plain)
end
function suite:assertSelfParameterError(class, objName, method, ...)
local message = string.format(
'invalid %s object. Did you call %s with a dot instead of a colon, i.e. %s.%s() instead of %s:%s()?',
class, method, objName, method, objName, method
)
self:assertError(message, true, ...)
end
function suite:assertTypeError(argIdx, funcName, expected, received, ...)
local message = string.format(
"bad argument #%d to '%s' (%s expected, got %s)",
argIdx, funcName, expected, received
)
self:assertError(message, true, ...)
end
function suite:assertObjectError(argIdx, funcName, className, ...)
local message = string.format(
"bad argument #%d to '%s' (not a valid %s object)",
argIdx, funcName, className
)
self:assertError(message, true, ...)
end
-------------------------------------------------------------------------------
-- IPAddress tests
-------------------------------------------------------------------------------
function suite:testIPConstructor()
self:assertTrue(type(IPAddress.new('1.2.3.4')) == 'table')
end
function suite:testIPConstructorErrors()
self:assertTypeError(
1, 'IPAddress.new', 'string', 'boolean',
function ()
IPAddress.new(true)
end
)
self:assertTypeError(
1, 'IPAddress.new', 'string', 'number',
function ()
IPAddress.new(7)
end
)
self:assertTypeError(
1, 'IPAddress.new', 'string', 'nil',
function ()
IPAddress.new()
end
)
self:assertError(
"'foo' is an invalid IP address",
true,
function ()
IPAddress.new('foo')
end
)
end
function suite:testIPEquals()
self:assertTrue(IPAddress.new('1.2.3.4') == IPAddress.new('1.2.3.4'))
self:assertFalse(IPAddress.new('1.2.3.5') == IPAddress.new('1.2.3.4'))
end
function suite:testIPLessThan()
self:assertFalse(IPAddress.new('1.2.3.4') < IPAddress.new('1.2.3.4'))
self:assertFalse(IPAddress.new('1.2.3.5') < IPAddress.new('1.2.3.4'))
self:assertTrue(IPAddress.new('1.2.3.3') < IPAddress.new('1.2.3.4'))
end
function suite:testIPLessThanOrEqualTo()
self:assertTrue(IPAddress.new('1.2.3.4') <= IPAddress.new('1.2.3.4'))
self:assertFalse(IPAddress.new('1.2.3.5') <= IPAddress.new('1.2.3.4'))
self:assertTrue(IPAddress.new('1.2.3.3') <= IPAddress.new('1.2.3.4'))
end
function suite:testIPToString()
self:assertEquals('1.2.3.4', tostring(IPAddress.new('1.2.3.4')))
end
function suite:testConcatIP()
self:assertEquals(
'1.2.3.45.6.7.8',
IPAddress.new('1.2.3.4') .. IPAddress.new('5.6.7.8')
)
self:assertEquals('1.2.3.4foo', IPAddress.new('1.2.3.4') .. 'foo')
end
function suite:testGetIP()
self:assertEquals('1.2.3.4', IPAddress.new('1.2.3.4'):getIP())
end
function suite:testGetIPErrors()
self:assertSelfParameterError(
IP_ADDRESS_CLASS, IP_ADDRESS_OBJECT, 'getIP',
function ()
IPAddress.new('1.2.3.4').getIP()
end
)
end
function suite:testGetVersion()
self:assertEquals('IPv4', IPAddress.new('1.2.3.4'):getVersion())
self:assertEquals('IPv6', IPAddress.new('2001:db8::ff00:12:3456'):getVersion())
end
function suite:testGetVersionErrors()
self:assertSelfParameterError(
IP_ADDRESS_CLASS, IP_ADDRESS_OBJECT, 'getVersion',
function ()
IPAddress.new('1.2.3.4').getVersion()
end
)
end
function suite:testIsIPv4()
self:assertTrue(IPAddress.new('1.2.3.4'):isIPv4())
self:assertFalse(IPAddress.new('2001:db8::ff00:12:3456'):isIPv4())
end
function suite:testIsIPv4Errors()
self:assertSelfParameterError(
IP_ADDRESS_CLASS, IP_ADDRESS_OBJECT, 'isIPv4',
function ()
IPAddress.new('1.2.3.4').isIPv4()
end
)
end
function suite:testIsIPv6()
self:assertTrue(IPAddress.new('2001:db8::ff00:12:3456'):isIPv6())
self:assertFalse(IPAddress.new('1.2.3.4'):isIPv6())
end
function suite:testIsIPv6Errors()
self:assertSelfParameterError(
IP_ADDRESS_CLASS, IP_ADDRESS_OBJECT, 'isIPv6',
function ()
IPAddress.new('1.2.3.4').isIPv6()
end
)
end
function suite:testIsInSubnet()
self:assertTrue(IPAddress.new('1.2.3.4'):isInSubnet(Subnet.new('1.2.3.0/24')))
self:assertFalse(IPAddress.new('1.2.3.4'):isInSubnet(Subnet.new('1.2.4.0/24')))
end
function suite:testIsInSubnetFromString()
self:assertTrue(IPAddress.new('1.2.3.4'):isInSubnet('1.2.3.0/24'))
self:assertFalse(IPAddress.new('1.2.3.4'):isInSubnet('1.2.4.0/24'))
end
function suite:testIsInSubnetErrors()
self:assertSelfParameterError(
IP_ADDRESS_CLASS, IP_ADDRESS_OBJECT, 'isInSubnet',
function ()
IPAddress.new('1.2.3.4').isInSubnet()
end
)
self:assertTypeError(
1, 'isInSubnet', 'string or table', 'boolean',
function ()
IPAddress.new('1.2.3.4'):isInSubnet(false)
end
)
self:assertTypeError(
1, 'isInSubnet', 'string or table', 'nil',
function ()
IPAddress.new('1.2.3.4'):isInSubnet()
end
)
self:assertObjectError(
1, 'isInSubnet', 'Subnet',
function ()
IPAddress.new('1.2.3.4'):isInSubnet{foo = 'bar'}
end
)
end
function suite:testGetSubnet()
self:assertEquals(
'1.2.3.0/24',
IPAddress.new('1.2.3.4'):getSubnet(24):getCIDR()
)
self:assertEquals(
'1.2.3.128/25',
IPAddress.new('1.2.3.130'):getSubnet(25):getCIDR()
)
end
function suite:testGetSubnetErrors()
self:assertSelfParameterError(
IP_ADDRESS_CLASS, IP_ADDRESS_OBJECT, 'getSubnet',
function ()
IPAddress.new('1.2.3.4').getSubnet(24)
end
)
self:assertTypeError(
1, 'getSubnet', 'number', 'boolean',
function ()
IPAddress.new('1.2.3.4'):getSubnet(false)
end
)
self:assertTypeError(
1, 'getSubnet', 'number', 'nil',
function ()
IPAddress.new('1.2.3.4'):getSubnet()
end
)
end
function suite:testGetNextIP()
self:assertEquals('1.2.3.5', tostring(IPAddress.new('1.2.3.4'):getNextIP()))
self:assertEquals(
IPAddress.new('2001:db8::ff00:12:3457'),
IPAddress.new('2001:db8::ff00:12:3456'):getNextIP()
)
end
function suite:testGetNextIPWraparound()
self:assertEquals(
IPAddress.new('0.0.0.0'),
IPAddress.new('255.255.255.255'):getNextIP()
)
self:assertEquals(
'::',
tostring(IPAddress.new('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'):getNextIP())
)
end
function suite:testGetNextIPErrors()
self:assertSelfParameterError(
IP_ADDRESS_CLASS, IP_ADDRESS_OBJECT, 'getNextIP',
function ()
IPAddress.new('1.2.3.4').getNextIP()
end
)
end
function suite:testGetPreviousIP()
self:assertEquals(
IPAddress.new('1.2.3.3'),
IPAddress.new('1.2.3.4'):getPreviousIP()
)
self:assertEquals(
IPAddress.new('2001:db8::ff00:12:3455'),
IPAddress.new('2001:db8::ff00:12:3456'):getPreviousIP()
)
end
function suite:testGetPreviousIPWraparound()
self:assertEquals(
IPAddress.new('255.255.255.255'),
IPAddress.new('0.0.0.0'):getPreviousIP()
)
self:assertEquals(
IPAddress.new('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'),
IPAddress.new('::'):getPreviousIP()
)
end
function suite:testGetPreviousIPErrors()
self:assertSelfParameterError(
IP_ADDRESS_CLASS, IP_ADDRESS_OBJECT, 'getPreviousIP',
function ()
IPAddress.new('1.2.3.4').getPreviousIP()
end
)
end
-------------------------------------------------------------------------------
-- Subnet tests
-------------------------------------------------------------------------------
function suite:testValidCIDRs()
local function assertValidCIDR(cidr)
self:assertTrue(type(Subnet.new(cidr)) == 'table')
end
assertValidCIDR('1.2.3.0/24')
assertValidCIDR('0.0.0.0/0')
assertValidCIDR('0.0.0.0/32')
assertValidCIDR('255.255.255.255/32')
end
function suite:testInvalidCIDRs()
local function assertInvalidCIDR(cidr)
self:assertError(
string.format("'%s' is an invalid CIDR string", cidr),
true,
function ()
Subnet.new(cidr)
end
)
end
assertInvalidCIDR('foo')
assertInvalidCIDR('1.2.3.4')
assertInvalidCIDR('0.0.0.0/33')
assertInvalidCIDR('256.0.0.0/24')
assertInvalidCIDR('1.2.3.4/24')
assertInvalidCIDR('1.2.3.0/16')
assertInvalidCIDR('2001:db8::ff00:12:3456')
assertInvalidCIDR('2001:db8::ff00:12:0/foo')
assertInvalidCIDR('2001:db8::ff00:12:0/129')
assertInvalidCIDR('gggg:db8::ff00:12:0/122')
assertInvalidCIDR('2001:db8::ff00:12:3456/122')
assertInvalidCIDR('2001:db8::ff00:12:0/106')
end
function suite:testSubnetConstructorErrors()
self:assertTypeError(
1, 'Subnet.new', 'string', 'boolean',
function ()
Subnet.new(true)
end
)
self:assertTypeError(
1, 'Subnet.new', 'string', 'number',
function ()
Subnet.new(7)
end
)
self:assertTypeError(
1, 'Subnet.new', 'string', 'nil',
function ()
Subnet.new()
end
)
end
function suite:testSubnetGetPrefix()
self:assertEquals(
IPAddress.new('1.2.3.0'),
Subnet.new('1.2.3.0/24'):getPrefix()
)
end
function suite:testSubnetGetHighestIP()
self:assertEquals(
IPAddress.new('1.2.3.255'),
Subnet.new('1.2.3.0/24'):getHighestIP()
)
end
function suite:testGetHighestIPFromGetSubnet()
self:assertEquals(
IPAddress.new('1.2.3.255'),
IPAddress.new('1.2.3.4'):getSubnet(24):getHighestIP()
)
end
function suite:testSubnetGetBitLength()
self:assertEquals(24, Subnet.new('1.2.3.0/24'):getBitLength())
end
function suite:testSubnetGetBitLength()
self:assertEquals('1.2.3.0/24', Subnet.new('1.2.3.0/24'):getCIDR())
end
function suite:testSubnetGetVersion()
self:assertEquals('IPv4', Subnet.new('1.2.3.0/24'):getVersion())
self:assertEquals('IPv6', Subnet.new('2001:db8::ff00:0:0/96'):getVersion())
end
function suite:testSubnetIsIPv4()
self:assertTrue(Subnet.new('1.2.3.0/24'):isIPv4())
self:assertFalse(Subnet.new('2001:db8::ff00:0:0/96'):isIPv4())
end
function suite:testSubnetIsIPv6()
self:assertTrue(Subnet.new('2001:db8::ff00:0:0/96'):isIPv6())
self:assertFalse(Subnet.new('1.2.3.0/24'):isIPv6())
end
function suite:testSubnetContainsIP()
self:assertTrue(
Subnet.new('1.2.3.0/24'):containsIP(IPAddress.new('1.2.3.4'))
)
self:assertFalse(
Subnet.new('1.2.3.0/24'):containsIP(IPAddress.new('1.2.4.4'))
)
end
function suite:testOverlapsSubnet()
self:assertTrue(
Subnet.new('1.2.0.0/16'):overlapsSubnet(Subnet.new('1.2.3.0/24'))
)
self:assertFalse(
Subnet.new('1.2.0.0/16'):overlapsSubnet(Subnet.new('1.3.3.0/24'))
)
end
function suite:testWalkSubnet()
do
local ips = {}
for ip in Subnet.new('1.2.3.0/30'):walk() do
ips[#ips + 1] = tostring(ip)
end
self:assertEquals(
'1.2.3.0 1.2.3.1 1.2.3.2 1.2.3.3',
table.concat(ips, ' ')
)
end
do
local ips = {}
for ip in Subnet.new('2001:db8::ff00:0:0/126'):walk() do
ips[#ips + 1] = tostring(ip)
end
self:assertEquals(
'2001:db8::ff00:0:0 2001:db8::ff00:0:1 2001:db8::ff00:0:2 2001:db8::ff00:0:3',
table.concat(ips, ' ')
)
end
end
return suite