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(<<