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