classifier = new IpAddressClassifier(); } public static function publicIpAddressData(): array { return [ ['8.8.8.8'], ['8.8.4.4'], ['2001:4860:4860::8888'], ['2001:4860:4860::8844'], ]; } #[\PHPUnit\Framework\Attributes\DataProvider('publicIpAddressData')] public function testPublicAddress(string $ip): void { $isLocal = $this->classifier->isLocalAddress($ip); self::assertFalse($isLocal); } public static function localIpAddressData(): array { return [ ['127.0.0.1'], ['127.0.0.13'], // all 127.0.0.0/8 network is loopback address ['192.168.0.1'], ['fe80::200:5aee:feaa:20a2'], ['fe80::1fc4:15d8:78db:2319%enp4s0'], // v6 zone ID ['0:0:0:0:0:ffff:10.0.0.1'], ['0:0:0:0:0:ffff:127.0.0.0'], ['10.0.0.1'], ['::'], ['::1'], ['100.100.100.200'], ['192.0.0.1'], ['64:ff9b::a9fe:a9fe'], // NAT64 of 169.254.169.254 ['64:ff9b:1::a9fe:a9fe'], // rfc8215 ['::ffff:127.0.0.1'], ['2130706433'], ['0177.0.0.1'], ['169.254.169.254'], ]; } #[\PHPUnit\Framework\Attributes\DataProvider('localIpAddressData')] public function testLocalAddress(string $ip): void { $isLocal = $this->classifier->isLocalAddress($ip); self::assertTrue($isLocal); } public static function mappedAddresses(): array { return [ ['64:ff9b::a9fe:a9fe', '169.254.169.254'], ['::ffff:7f00:1', '127.0.0.1'], ['::127.0.0.1', '127.0.0.1'], ['::7f00:1', '127.0.0.1'], ['2001:0000:4136:e378:8000:63bf:3fff:fdd2', '192.0.2.45'], ['2001:4860:4860::8888', null], ]; } #[\PHPUnit\Framework\Attributes\DataProvider('mappedAddresses')] public function testMappedAddresses(string $ipv6, ?string $ipv4): void { $mapped = $this->classifier->getMappedIpv4(IPv6::parseString($ipv6)); if ($ipv4 === null) { self::assertEquals(null, $mapped); } else { self::assertEquals(IPv4::parseString($ipv4), $mapped); } } }