Chris@0: Chris@0: * Chris@0: * For the full copyright and license information, please view the LICENSE Chris@0: * file that was distributed with this source code. Chris@0: */ Chris@0: Chris@0: namespace Symfony\Bridge\PhpUnit; Chris@0: Chris@0: /** Chris@0: * @author Nicolas Grekas Chris@0: */ Chris@0: class DnsMock Chris@0: { Chris@0: private static $hosts = array(); Chris@0: private static $dnsTypes = array( Chris@0: 'A' => DNS_A, Chris@0: 'MX' => DNS_MX, Chris@0: 'NS' => DNS_NS, Chris@0: 'SOA' => DNS_SOA, Chris@0: 'PTR' => DNS_PTR, Chris@0: 'CNAME' => DNS_CNAME, Chris@0: 'AAAA' => DNS_AAAA, Chris@0: 'A6' => DNS_A6, Chris@0: 'SRV' => DNS_SRV, Chris@0: 'NAPTR' => DNS_NAPTR, Chris@0: 'TXT' => DNS_TXT, Chris@0: 'HINFO' => DNS_HINFO, Chris@0: ); Chris@0: Chris@0: /** Chris@0: * Configures the mock values for DNS queries. Chris@0: * Chris@0: * @param array $hosts Mocked hosts as keys, arrays of DNS records as returned by dns_get_record() as values Chris@0: */ Chris@0: public static function withMockedHosts(array $hosts) Chris@0: { Chris@0: self::$hosts = $hosts; Chris@0: } Chris@0: Chris@0: public static function checkdnsrr($hostname, $type = 'MX') Chris@0: { Chris@0: if (!self::$hosts) { Chris@0: return \checkdnsrr($hostname, $type); Chris@0: } Chris@0: if (isset(self::$hosts[$hostname])) { Chris@0: $type = strtoupper($type); Chris@0: Chris@0: foreach (self::$hosts[$hostname] as $record) { Chris@0: if ($record['type'] === $type) { Chris@0: return true; Chris@0: } Chris@0: if ('ANY' === $type && isset(self::$dnsTypes[$record['type']]) && 'HINFO' !== $record['type']) { Chris@0: return true; Chris@0: } Chris@0: } Chris@0: } Chris@0: Chris@0: return false; Chris@0: } Chris@0: Chris@0: public static function getmxrr($hostname, &$mxhosts, &$weight = null) Chris@0: { Chris@0: if (!self::$hosts) { Chris@0: return \getmxrr($hostname, $mxhosts, $weight); Chris@0: } Chris@0: $mxhosts = $weight = array(); Chris@0: Chris@0: if (isset(self::$hosts[$hostname])) { Chris@0: foreach (self::$hosts[$hostname] as $record) { Chris@0: if ('MX' === $record['type']) { Chris@0: $mxhosts[] = $record['host']; Chris@0: $weight[] = $record['pri']; Chris@0: } Chris@0: } Chris@0: } Chris@0: Chris@0: return (bool) $mxhosts; Chris@0: } Chris@0: Chris@0: public static function gethostbyaddr($ipAddress) Chris@0: { Chris@0: if (!self::$hosts) { Chris@0: return \gethostbyaddr($ipAddress); Chris@0: } Chris@0: foreach (self::$hosts as $hostname => $records) { Chris@0: foreach ($records as $record) { Chris@0: if ('A' === $record['type'] && $ipAddress === $record['ip']) { Chris@0: return $hostname; Chris@0: } Chris@0: if ('AAAA' === $record['type'] && $ipAddress === $record['ipv6']) { Chris@0: return $hostname; Chris@0: } Chris@0: } Chris@0: } Chris@0: Chris@0: return $ipAddress; Chris@0: } Chris@0: Chris@0: public static function gethostbyname($hostname) Chris@0: { Chris@0: if (!self::$hosts) { Chris@0: return \gethostbyname($hostname); Chris@0: } Chris@0: if (isset(self::$hosts[$hostname])) { Chris@0: foreach (self::$hosts[$hostname] as $record) { Chris@0: if ('A' === $record['type']) { Chris@0: return $record['ip']; Chris@0: } Chris@0: } Chris@0: } Chris@0: Chris@0: return $hostname; Chris@0: } Chris@0: Chris@0: public static function gethostbynamel($hostname) Chris@0: { Chris@0: if (!self::$hosts) { Chris@0: return \gethostbynamel($hostname); Chris@0: } Chris@0: $ips = false; Chris@0: Chris@0: if (isset(self::$hosts[$hostname])) { Chris@0: $ips = array(); Chris@0: Chris@0: foreach (self::$hosts[$hostname] as $record) { Chris@0: if ('A' === $record['type']) { Chris@0: $ips[] = $record['ip']; Chris@0: } Chris@0: } Chris@0: } Chris@0: Chris@0: return $ips; Chris@0: } Chris@0: Chris@0: public static function dns_get_record($hostname, $type = DNS_ANY, &$authns = null, &$addtl = null, $raw = false) Chris@0: { Chris@0: if (!self::$hosts) { Chris@0: return \dns_get_record($hostname, $type, $authns, $addtl, $raw); Chris@0: } Chris@0: Chris@0: $records = false; Chris@0: Chris@0: if (isset(self::$hosts[$hostname])) { Chris@0: if (DNS_ANY === $type) { Chris@0: $type = DNS_ALL; Chris@0: } Chris@0: $records = array(); Chris@0: Chris@0: foreach (self::$hosts[$hostname] as $record) { Chris@0: if (isset(self::$dnsTypes[$record['type']]) && (self::$dnsTypes[$record['type']] & $type)) { Chris@0: $records[] = array_merge(array('host' => $hostname, 'class' => 'IN', 'ttl' => 1, 'type' => $record['type']), $record); Chris@0: } Chris@0: } Chris@0: } Chris@0: Chris@0: return $records; Chris@0: } Chris@0: Chris@0: public static function register($class) Chris@0: { Chris@17: $self = \get_called_class(); Chris@0: Chris@0: $mockedNs = array(substr($class, 0, strrpos($class, '\\'))); Chris@0: if (0 < strpos($class, '\\Tests\\')) { Chris@0: $ns = str_replace('\\Tests\\', '\\', $class); Chris@0: $mockedNs[] = substr($ns, 0, strrpos($ns, '\\')); Chris@0: } elseif (0 === strpos($class, 'Tests\\')) { Chris@0: $mockedNs[] = substr($class, 6, strrpos($class, '\\') - 6); Chris@0: } Chris@0: foreach ($mockedNs as $ns) { Chris@17: if (\function_exists($ns.'\checkdnsrr')) { Chris@0: continue; Chris@0: } Chris@0: eval(<<