Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 /*
|
Chris@0
|
4 * This file is part of the Symfony package.
|
Chris@0
|
5 *
|
Chris@0
|
6 * (c) Fabien Potencier <fabien@symfony.com>
|
Chris@0
|
7 *
|
Chris@0
|
8 * For the full copyright and license information, please view the LICENSE
|
Chris@0
|
9 * file that was distributed with this source code.
|
Chris@0
|
10 */
|
Chris@0
|
11
|
Chris@0
|
12 namespace Symfony\Bridge\PhpUnit;
|
Chris@0
|
13
|
Chris@0
|
14 /**
|
Chris@0
|
15 * @author Nicolas Grekas <p@tchwork.com>
|
Chris@0
|
16 */
|
Chris@0
|
17 class DnsMock
|
Chris@0
|
18 {
|
Chris@0
|
19 private static $hosts = array();
|
Chris@0
|
20 private static $dnsTypes = array(
|
Chris@0
|
21 'A' => DNS_A,
|
Chris@0
|
22 'MX' => DNS_MX,
|
Chris@0
|
23 'NS' => DNS_NS,
|
Chris@0
|
24 'SOA' => DNS_SOA,
|
Chris@0
|
25 'PTR' => DNS_PTR,
|
Chris@0
|
26 'CNAME' => DNS_CNAME,
|
Chris@0
|
27 'AAAA' => DNS_AAAA,
|
Chris@0
|
28 'A6' => DNS_A6,
|
Chris@0
|
29 'SRV' => DNS_SRV,
|
Chris@0
|
30 'NAPTR' => DNS_NAPTR,
|
Chris@0
|
31 'TXT' => DNS_TXT,
|
Chris@0
|
32 'HINFO' => DNS_HINFO,
|
Chris@0
|
33 );
|
Chris@0
|
34
|
Chris@0
|
35 /**
|
Chris@0
|
36 * Configures the mock values for DNS queries.
|
Chris@0
|
37 *
|
Chris@0
|
38 * @param array $hosts Mocked hosts as keys, arrays of DNS records as returned by dns_get_record() as values
|
Chris@0
|
39 */
|
Chris@0
|
40 public static function withMockedHosts(array $hosts)
|
Chris@0
|
41 {
|
Chris@0
|
42 self::$hosts = $hosts;
|
Chris@0
|
43 }
|
Chris@0
|
44
|
Chris@0
|
45 public static function checkdnsrr($hostname, $type = 'MX')
|
Chris@0
|
46 {
|
Chris@0
|
47 if (!self::$hosts) {
|
Chris@0
|
48 return \checkdnsrr($hostname, $type);
|
Chris@0
|
49 }
|
Chris@0
|
50 if (isset(self::$hosts[$hostname])) {
|
Chris@0
|
51 $type = strtoupper($type);
|
Chris@0
|
52
|
Chris@0
|
53 foreach (self::$hosts[$hostname] as $record) {
|
Chris@0
|
54 if ($record['type'] === $type) {
|
Chris@0
|
55 return true;
|
Chris@0
|
56 }
|
Chris@0
|
57 if ('ANY' === $type && isset(self::$dnsTypes[$record['type']]) && 'HINFO' !== $record['type']) {
|
Chris@0
|
58 return true;
|
Chris@0
|
59 }
|
Chris@0
|
60 }
|
Chris@0
|
61 }
|
Chris@0
|
62
|
Chris@0
|
63 return false;
|
Chris@0
|
64 }
|
Chris@0
|
65
|
Chris@0
|
66 public static function getmxrr($hostname, &$mxhosts, &$weight = null)
|
Chris@0
|
67 {
|
Chris@0
|
68 if (!self::$hosts) {
|
Chris@0
|
69 return \getmxrr($hostname, $mxhosts, $weight);
|
Chris@0
|
70 }
|
Chris@0
|
71 $mxhosts = $weight = array();
|
Chris@0
|
72
|
Chris@0
|
73 if (isset(self::$hosts[$hostname])) {
|
Chris@0
|
74 foreach (self::$hosts[$hostname] as $record) {
|
Chris@0
|
75 if ('MX' === $record['type']) {
|
Chris@0
|
76 $mxhosts[] = $record['host'];
|
Chris@0
|
77 $weight[] = $record['pri'];
|
Chris@0
|
78 }
|
Chris@0
|
79 }
|
Chris@0
|
80 }
|
Chris@0
|
81
|
Chris@0
|
82 return (bool) $mxhosts;
|
Chris@0
|
83 }
|
Chris@0
|
84
|
Chris@0
|
85 public static function gethostbyaddr($ipAddress)
|
Chris@0
|
86 {
|
Chris@0
|
87 if (!self::$hosts) {
|
Chris@0
|
88 return \gethostbyaddr($ipAddress);
|
Chris@0
|
89 }
|
Chris@0
|
90 foreach (self::$hosts as $hostname => $records) {
|
Chris@0
|
91 foreach ($records as $record) {
|
Chris@0
|
92 if ('A' === $record['type'] && $ipAddress === $record['ip']) {
|
Chris@0
|
93 return $hostname;
|
Chris@0
|
94 }
|
Chris@0
|
95 if ('AAAA' === $record['type'] && $ipAddress === $record['ipv6']) {
|
Chris@0
|
96 return $hostname;
|
Chris@0
|
97 }
|
Chris@0
|
98 }
|
Chris@0
|
99 }
|
Chris@0
|
100
|
Chris@0
|
101 return $ipAddress;
|
Chris@0
|
102 }
|
Chris@0
|
103
|
Chris@0
|
104 public static function gethostbyname($hostname)
|
Chris@0
|
105 {
|
Chris@0
|
106 if (!self::$hosts) {
|
Chris@0
|
107 return \gethostbyname($hostname);
|
Chris@0
|
108 }
|
Chris@0
|
109 if (isset(self::$hosts[$hostname])) {
|
Chris@0
|
110 foreach (self::$hosts[$hostname] as $record) {
|
Chris@0
|
111 if ('A' === $record['type']) {
|
Chris@0
|
112 return $record['ip'];
|
Chris@0
|
113 }
|
Chris@0
|
114 }
|
Chris@0
|
115 }
|
Chris@0
|
116
|
Chris@0
|
117 return $hostname;
|
Chris@0
|
118 }
|
Chris@0
|
119
|
Chris@0
|
120 public static function gethostbynamel($hostname)
|
Chris@0
|
121 {
|
Chris@0
|
122 if (!self::$hosts) {
|
Chris@0
|
123 return \gethostbynamel($hostname);
|
Chris@0
|
124 }
|
Chris@0
|
125 $ips = false;
|
Chris@0
|
126
|
Chris@0
|
127 if (isset(self::$hosts[$hostname])) {
|
Chris@0
|
128 $ips = array();
|
Chris@0
|
129
|
Chris@0
|
130 foreach (self::$hosts[$hostname] as $record) {
|
Chris@0
|
131 if ('A' === $record['type']) {
|
Chris@0
|
132 $ips[] = $record['ip'];
|
Chris@0
|
133 }
|
Chris@0
|
134 }
|
Chris@0
|
135 }
|
Chris@0
|
136
|
Chris@0
|
137 return $ips;
|
Chris@0
|
138 }
|
Chris@0
|
139
|
Chris@0
|
140 public static function dns_get_record($hostname, $type = DNS_ANY, &$authns = null, &$addtl = null, $raw = false)
|
Chris@0
|
141 {
|
Chris@0
|
142 if (!self::$hosts) {
|
Chris@0
|
143 return \dns_get_record($hostname, $type, $authns, $addtl, $raw);
|
Chris@0
|
144 }
|
Chris@0
|
145
|
Chris@0
|
146 $records = false;
|
Chris@0
|
147
|
Chris@0
|
148 if (isset(self::$hosts[$hostname])) {
|
Chris@0
|
149 if (DNS_ANY === $type) {
|
Chris@0
|
150 $type = DNS_ALL;
|
Chris@0
|
151 }
|
Chris@0
|
152 $records = array();
|
Chris@0
|
153
|
Chris@0
|
154 foreach (self::$hosts[$hostname] as $record) {
|
Chris@0
|
155 if (isset(self::$dnsTypes[$record['type']]) && (self::$dnsTypes[$record['type']] & $type)) {
|
Chris@0
|
156 $records[] = array_merge(array('host' => $hostname, 'class' => 'IN', 'ttl' => 1, 'type' => $record['type']), $record);
|
Chris@0
|
157 }
|
Chris@0
|
158 }
|
Chris@0
|
159 }
|
Chris@0
|
160
|
Chris@0
|
161 return $records;
|
Chris@0
|
162 }
|
Chris@0
|
163
|
Chris@0
|
164 public static function register($class)
|
Chris@0
|
165 {
|
Chris@17
|
166 $self = \get_called_class();
|
Chris@0
|
167
|
Chris@0
|
168 $mockedNs = array(substr($class, 0, strrpos($class, '\\')));
|
Chris@0
|
169 if (0 < strpos($class, '\\Tests\\')) {
|
Chris@0
|
170 $ns = str_replace('\\Tests\\', '\\', $class);
|
Chris@0
|
171 $mockedNs[] = substr($ns, 0, strrpos($ns, '\\'));
|
Chris@0
|
172 } elseif (0 === strpos($class, 'Tests\\')) {
|
Chris@0
|
173 $mockedNs[] = substr($class, 6, strrpos($class, '\\') - 6);
|
Chris@0
|
174 }
|
Chris@0
|
175 foreach ($mockedNs as $ns) {
|
Chris@17
|
176 if (\function_exists($ns.'\checkdnsrr')) {
|
Chris@0
|
177 continue;
|
Chris@0
|
178 }
|
Chris@0
|
179 eval(<<<EOPHP
|
Chris@0
|
180 namespace $ns;
|
Chris@0
|
181
|
Chris@0
|
182 function checkdnsrr(\$host, \$type = 'MX')
|
Chris@0
|
183 {
|
Chris@0
|
184 return \\$self::checkdnsrr(\$host, \$type);
|
Chris@0
|
185 }
|
Chris@0
|
186
|
Chris@0
|
187 function dns_check_record(\$host, \$type = 'MX')
|
Chris@0
|
188 {
|
Chris@0
|
189 return \\$self::checkdnsrr(\$host, \$type);
|
Chris@0
|
190 }
|
Chris@0
|
191
|
Chris@0
|
192 function getmxrr(\$hostname, &\$mxhosts, &\$weight = null)
|
Chris@0
|
193 {
|
Chris@0
|
194 return \\$self::getmxrr(\$hostname, \$mxhosts, \$weight);
|
Chris@0
|
195 }
|
Chris@0
|
196
|
Chris@0
|
197 function dns_get_mx(\$hostname, &\$mxhosts, &\$weight = null)
|
Chris@0
|
198 {
|
Chris@0
|
199 return \\$self::getmxrr(\$hostname, \$mxhosts, \$weight);
|
Chris@0
|
200 }
|
Chris@0
|
201
|
Chris@0
|
202 function gethostbyaddr(\$ipAddress)
|
Chris@0
|
203 {
|
Chris@0
|
204 return \\$self::gethostbyaddr(\$ipAddress);
|
Chris@0
|
205 }
|
Chris@0
|
206
|
Chris@0
|
207 function gethostbyname(\$hostname)
|
Chris@0
|
208 {
|
Chris@0
|
209 return \\$self::gethostbyname(\$hostname);
|
Chris@0
|
210 }
|
Chris@0
|
211
|
Chris@0
|
212 function gethostbynamel(\$hostname)
|
Chris@0
|
213 {
|
Chris@0
|
214 return \\$self::gethostbynamel(\$hostname);
|
Chris@0
|
215 }
|
Chris@0
|
216
|
Chris@0
|
217 function dns_get_record(\$hostname, \$type = DNS_ANY, &\$authns = null, &\$addtl = null, \$raw = false)
|
Chris@0
|
218 {
|
Chris@0
|
219 return \\$self::dns_get_record(\$hostname, \$type, \$authns, \$addtl, \$raw);
|
Chris@0
|
220 }
|
Chris@0
|
221
|
Chris@0
|
222 EOPHP
|
Chris@0
|
223 );
|
Chris@0
|
224 }
|
Chris@0
|
225 }
|
Chris@0
|
226 }
|