306 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			306 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?php | ||
|  | 
 | ||
|  | use IPTools\Network; | ||
|  | use IPTools\IP; | ||
|  | 
 | ||
|  | class NetworkTest extends \PHPUnit_Framework_TestCase | ||
|  | { | ||
|  |     public function testConstructor() | ||
|  |     { | ||
|  |         $ipv4 = new IP('127.0.0.1'); | ||
|  |         $ipv4Netmask = new IP('255.255.255.0'); | ||
|  | 
 | ||
|  |         $ipv6 = new IP('2001::'); | ||
|  |         $ipv6Netmask = new IP('ffff:ffff:ffff:ffff:ffff:ffff:ffff::'); | ||
|  | 
 | ||
|  |         $ipv4Network = new Network($ipv4, $ipv4Netmask); | ||
|  |         $ipv6Network = new Network($ipv6, $ipv6Netmask); | ||
|  | 
 | ||
|  |         $this->assertEquals('127.0.0.0/24', (string)$ipv4Network); | ||
|  |         $this->assertEquals('2001::/112', (string)$ipv6Network); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testProperties() | ||
|  |     { | ||
|  |         $network = Network::parse('127.0.0.1/24'); | ||
|  | 
 | ||
|  |         $network->ip = new IP('192.0.0.2'); | ||
|  | 
 | ||
|  |         $this->assertEquals('192.0.0.2', $network->ip); | ||
|  |         $this->assertEquals('192.0.0.0/24', (string)$network); | ||
|  |         $this->assertEquals('0.0.0.255', (string)$network->wildcard); | ||
|  |         $this->assertEquals('192.0.0.0', (string)$network->firstIP); | ||
|  |         $this->assertEquals('192.0.0.255', (string)$network->lastIP); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @dataProvider getTestParseData | ||
|  |      */ | ||
|  |     public function testParse($data, $expected) | ||
|  |     { | ||
|  |         $this->assertEquals($expected, (string)Network::parse($data)); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @expectedException Exception | ||
|  |      * @expectedExceptionMessage Invalid IP address format | ||
|  |      */ | ||
|  |     public function testParseWrongNetwork() | ||
|  |     { | ||
|  |         Network::parse('10.0.0.0/24 abc'); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @dataProvider getPrefixData | ||
|  |      */ | ||
|  |     public function testPrefix2Mask($prefix, $version, $mask) | ||
|  |     { | ||
|  |         $this->assertEquals($mask, Network::prefix2netmask($prefix, $version)); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @expectedException Exception | ||
|  |      * @expectedExceptionMessage Wrong IP version | ||
|  |      */ | ||
|  |     public function testPrefix2MaskWrongIPVersion() | ||
|  |     { | ||
|  |         Network::prefix2netmask('128', 'ip_version'); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @dataProvider getInvalidPrefixData | ||
|  |      * @expectedException Exception | ||
|  |      * @expectedExceptionMessage Invalid prefix length | ||
|  |      */ | ||
|  |     public function testPrefix2MaskInvalidPrefix($prefix, $version) | ||
|  |     { | ||
|  |         Network::prefix2netmask($prefix, $version); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @dataProvider getHostsData | ||
|  |      */ | ||
|  |     public function testHosts($data, $expected) | ||
|  |     { | ||
|  |         foreach(Network::parse($data)->getHosts as $ip) { | ||
|  |             $result[] = (string)$ip; | ||
|  |         } | ||
|  | 
 | ||
|  |         $this->assertEquals($expected, $result); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @dataProvider getExcludeData | ||
|  |      */ | ||
|  |     public function testExclude($data, $exclude, $expected) | ||
|  |     { | ||
|  |         $result = array(); | ||
|  | 
 | ||
|  |         foreach(Network::parse($data)->exclude($exclude) as $network) { | ||
|  |             $result[] = (string)$network; | ||
|  |         } | ||
|  | 
 | ||
|  |         $this->assertEquals($expected, $result); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @dataProvider getExcludeExceptionData | ||
|  |      * @expectedException Exception | ||
|  |      * @expectedExceptionMessage Exclude subnet not within target network | ||
|  |      */ | ||
|  |     public function testExcludeException($data, $exclude) | ||
|  |     { | ||
|  |         Network::parse($data)->exclude($exclude); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @dataProvider getMoveToData | ||
|  |      */ | ||
|  |     public function testMoveTo($network, $prefixLength, $expected) | ||
|  |     { | ||
|  |         $result = array(); | ||
|  | 
 | ||
|  |         foreach (Network::parse($network)->moveTo($prefixLength) as $network) { | ||
|  |             $result[] = (string)$network; | ||
|  |         } | ||
|  | 
 | ||
|  |         $this->assertEquals($expected, $result); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @dataProvider getMoveToExceptionData | ||
|  |      * @expectedException Exception | ||
|  |      * @expectedExceptionMessage Invalid prefix length | ||
|  |      */ | ||
|  |     public function testMoveToException($network, $prefixLength) | ||
|  |     { | ||
|  |         Network::parse($network)->moveTo($prefixLength); | ||
|  |     } | ||
|  | 
 | ||
|  |      /** | ||
|  |      * @dataProvider getTestIterationData | ||
|  |      */ | ||
|  |     public function testNetworkIteration($data, $expected) | ||
|  |     { | ||
|  |         foreach (Network::parse($data) as $key => $ip) { | ||
|  |            $result[] = (string)$ip; | ||
|  |         } | ||
|  | 
 | ||
|  |         $this->assertEquals($expected, $result); | ||
|  |     } | ||
|  | 
 | ||
|  |      /** | ||
|  |      * @dataProvider getTestCountData | ||
|  |      */ | ||
|  |     public function testCount($data, $expected) | ||
|  |     { | ||
|  |         $this->assertEquals($expected, count(Network::parse($data))); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function getTestParseData() | ||
|  |     { | ||
|  |         return array( | ||
|  |             array('192.168.0.54/24', '192.168.0.0/24'), | ||
|  |             array('2001::2001:2001/32', '2001::/32'), | ||
|  |             array('127.168.0.1 255.255.255.255', '127.168.0.1/32'), | ||
|  |             array('1234::1234', '1234::1234/128'), | ||
|  |         ); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function getPrefixData() | ||
|  |     { | ||
|  |         return array( | ||
|  |             array('24', IP::IP_V4, IP::parse('255.255.255.0')), | ||
|  |             array('32', IP::IP_V4, IP::parse('255.255.255.255')), | ||
|  |             array('64', IP::IP_V6, IP::parse('ffff:ffff:ffff:ffff::')), | ||
|  |             array('128', IP::IP_V6, IP::parse('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff')) | ||
|  |         ); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function getInvalidPrefixData() | ||
|  |     { | ||
|  |         return array( | ||
|  |             array('-1', IP::IP_V4), | ||
|  |             array('33', IP::IP_V4), | ||
|  |             array('prefix', IP::IP_V4), | ||
|  |             array('-1', IP::IP_V6), | ||
|  |             array('129', IP::IP_V6), | ||
|  |         ); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function getHostsData() | ||
|  |     { | ||
|  |         return array( | ||
|  |             array('192.0.2.0/29', | ||
|  |                 array( | ||
|  |                     '192.0.2.1', | ||
|  |                     '192.0.2.2', | ||
|  |                     '192.0.2.3', | ||
|  |                     '192.0.2.4', | ||
|  |                     '192.0.2.5', | ||
|  |                     '192.0.2.6', | ||
|  |                 ) | ||
|  |             ), | ||
|  |         ); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function getExcludeData() | ||
|  |     { | ||
|  |         return array( | ||
|  |             array('192.0.2.0/28', '192.0.2.1/32', | ||
|  |                 array( | ||
|  |                     '192.0.2.0/32', | ||
|  |                     '192.0.2.2/31', | ||
|  |                     '192.0.2.4/30', | ||
|  |                     '192.0.2.8/29', | ||
|  |                 ) | ||
|  |             ), | ||
|  |             array('192.0.2.2/32', '192.0.2.2/32', array()), | ||
|  |         ); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function getExcludeExceptionData() | ||
|  |     { | ||
|  |         return array( | ||
|  |             array('192.0.2.0/28', '192.0.3.0/24'), | ||
|  |             array('192.0.2.2/32', '192.0.2.3/32'), | ||
|  |         ); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function getMoveToData() | ||
|  |     { | ||
|  |         return array( | ||
|  |             array('192.168.0.0/22', '24', | ||
|  |                 array( | ||
|  |                     '192.168.0.0/24', | ||
|  |                     '192.168.1.0/24', | ||
|  |                     '192.168.2.0/24', | ||
|  |                     '192.168.3.0/24' | ||
|  |                 ) | ||
|  |             ), | ||
|  |             array('192.168.2.0/24', '25', | ||
|  |                 array( | ||
|  |                     '192.168.2.0/25', | ||
|  |                     '192.168.2.128/25' | ||
|  |                 ) | ||
|  |             ), | ||
|  |             array('192.168.2.0/30', '32', | ||
|  |                 array( | ||
|  |                     '192.168.2.0/32', | ||
|  |                     '192.168.2.1/32', | ||
|  |                     '192.168.2.2/32', | ||
|  |                     '192.168.2.3/32' | ||
|  |                 ) | ||
|  |             ), | ||
|  |         ); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function getMoveToExceptionData() | ||
|  |     { | ||
|  |         return array( | ||
|  |             array('192.168.0.0/22', '22'), | ||
|  |             array('192.168.0.0/22', '21'), | ||
|  |             array('192.168.0.0/22', '33'), | ||
|  |             array('192.168.0.0/22', 'prefixLength') | ||
|  |         ); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function getTestIterationData() | ||
|  |     { | ||
|  |         return array( | ||
|  |             array('192.168.2.0/29', | ||
|  |                 array( | ||
|  |                     '192.168.2.0', | ||
|  |                     '192.168.2.1', | ||
|  |                     '192.168.2.2', | ||
|  |                     '192.168.2.3', | ||
|  |                     '192.168.2.4', | ||
|  |                     '192.168.2.5', | ||
|  |                     '192.168.2.6', | ||
|  |                     '192.168.2.7', | ||
|  |                 ) | ||
|  |             ), | ||
|  |             array('2001:db8::/125', | ||
|  |                 array( | ||
|  |                     '2001:db8::', | ||
|  |                     '2001:db8::1', | ||
|  |                     '2001:db8::2', | ||
|  |                     '2001:db8::3', | ||
|  |                     '2001:db8::4', | ||
|  |                     '2001:db8::5', | ||
|  |                     '2001:db8::6', | ||
|  |                     '2001:db8::7', | ||
|  |                 ) | ||
|  |             ), | ||
|  |         ); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function getTestCountData() | ||
|  |     { | ||
|  |         return array( | ||
|  |             array('127.0.0.0/31', 2), | ||
|  |             array('2001:db8::/120', 256), | ||
|  |         ); | ||
|  |     } | ||
|  | } |