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),
							 | 
						||
| 
								 | 
							
								        );
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |