1
0
mirror of https://github.com/danog/dns.git synced 2024-12-02 17:38:05 +01:00
dns/test/IntegrationTest.php

215 lines
7.0 KiB
PHP
Raw Normal View History

<?php
2014-09-24 19:31:27 +02:00
namespace Amp\Dns\Test;
2014-09-23 22:47:55 +02:00
use Amp\Cache\NullCache;
use Amp\Dns;
use Amp\Dns\DnsException;
use Amp\Dns\Record;
use Amp\Dns\UnixConfigLoader;
use Amp\Dns\WindowsConfigLoader;
use Amp\Loop;
2017-06-17 10:49:54 +02:00
use Amp\PHPUnit\TestCase;
use Amp\Success;
use PHPUnit\Framework\MockObject\MockObject;
2019-01-25 02:27:47 +01:00
class IntegrationTest extends TestCase
{
/**
2017-06-23 13:14:51 +02:00
* @param string $hostname
* @group internet
2017-01-25 16:25:41 +01:00
* @dataProvider provideHostnames
*/
2019-01-25 02:27:47 +01:00
public function testResolve($hostname)
{
Loop::run(function () use ($hostname) {
$result = yield Dns\resolve($hostname);
/** @var Record $record */
$record = $result[0];
$inAddr = @\inet_pton($record->getValue());
2017-01-25 16:25:41 +01:00
$this->assertNotFalse(
$inAddr,
"Server name {$hostname} did not resolve to a valid IP address"
2017-01-25 16:25:41 +01:00
);
});
2017-01-25 16:25:41 +01:00
}
2015-08-02 04:18:44 +02:00
2017-06-23 18:43:04 +02:00
/**
* @group internet
*/
2019-01-25 02:27:47 +01:00
public function testWorksAfterConfigReload()
{
2017-06-23 18:43:04 +02:00
Loop::run(function () {
yield Dns\query("google.com", Record::A);
$this->assertNull(yield Dns\resolver()->reloadConfig());
$this->assertInternalType("array", yield Dns\query("example.com", Record::A));
});
}
2019-01-25 02:27:47 +01:00
public function testResolveIPv4only()
{
Loop::run(function () {
$records = yield Dns\resolve("google.com", Record::A);
/** @var Record $record */
foreach ($records as $record) {
$this->assertSame(Record::A, $record->getType());
$inAddr = @\inet_pton($record->getValue());
$this->assertNotFalse(
$inAddr,
"Server name google.com did not resolve to a valid IP address"
);
}
});
}
2019-01-25 02:27:47 +01:00
public function testResolveIPv6only()
{
Loop::run(function () {
$records = yield Dns\resolve("google.com", Record::AAAA);
/** @var Record $record */
foreach ($records as $record) {
$this->assertSame(Record::AAAA, $record->getType());
$inAddr = @\inet_pton($record->getValue());
$this->assertNotFalse(
$inAddr,
"Server name google.com did not resolve to a valid IP address"
);
}
});
}
public function testResolveUsingSearchList()
{
Loop::run(function () {
$configLoader = \stripos(PHP_OS, "win") === 0
? new WindowsConfigLoader()
: new UnixConfigLoader();
/** @var Dns\Config $config */
$config = yield $configLoader->loadConfig();
$config = $config->withSearchList(['kelunik.com']);
$config = $config->withNdots(1);
/** @var Dns\ConfigLoader|MockObject $configLoader */
$configLoader = $this->createMock(Dns\ConfigLoader::class);
$configLoader->expects($this->once())
->method('loadConfig')
->willReturn(new Success($config));
Dns\resolver(new Dns\Rfc1035StubResolver(null, $configLoader));
$result = yield Dns\resolve('blog');
/** @var Record $record */
$record = $result[0];
$inAddr = @\inet_pton($record->getValue());
$this->assertNotFalse(
$inAddr,
"Server name blog.kelunik.com did not resolve to a valid IP address"
);
$result = yield Dns\query('blog.kelunik.com', Dns\Record::A);
/** @var Record $record */
$record = $result[0];
$this->assertSame($inAddr, @\inet_pton($record->getValue()));
});
}
public function testFailResolveRootedDomainWhenSearchListDefined()
{
Loop::run(function () {
$configLoader = \stripos(PHP_OS, "win") === 0
? new WindowsConfigLoader()
: new UnixConfigLoader();
/** @var Dns\Config $config */
$config = yield $configLoader->loadConfig();
$config = $config->withSearchList(['kelunik.com']);
$config = $config->withNdots(1);
/** @var Dns\ConfigLoader|MockObject $configLoader */
$configLoader = $this->createMock(Dns\ConfigLoader::class);
$configLoader->expects($this->once())
->method('loadConfig')
->willReturn(new Success($config));
Dns\resolver(new Dns\Rfc1035StubResolver(null, $configLoader));
$this->expectException(DnsException::class);
yield Dns\resolve('blog.');
});
}
public function testResolveWithRotateList()
{
Loop::run(function () {
/** @var Dns\ConfigLoader|MockObject $configLoader */
$configLoader = $this->createMock(Dns\ConfigLoader::class);
$config = new Dns\Config([
'208.67.222.220:53', // Opendns, US
'195.243.214.4:53', // Deutche Telecom AG, DE
]);
$config = $config->withRotationEnabled(true);
$configLoader->expects($this->once())
->method('loadConfig')
->willReturn(new Success($config));
$resolver = new Dns\Rfc1035StubResolver(new NullCache(), $configLoader);
/** @var Record $record1 */
list($record1) = yield $resolver->query('facebook.com', Dns\Record::A);
/** @var Record $record2 */
list($record2) = yield $resolver->query('facebook.com', Dns\Record::A);
$this->assertNotSame($record1->getValue(), $record2->getValue());
});
}
2019-01-25 02:27:47 +01:00
public function testPtrLookup()
{
2017-06-13 19:28:06 +02:00
Loop::run(function () {
$result = yield Dns\query("8.8.4.4", Record::PTR);
/** @var Record $record */
$record = $result[0];
2019-07-08 22:27:40 +02:00
$this->assertSame("dns.google", $record->getValue());
2017-06-23 18:26:42 +02:00
$this->assertNotNull($record->getTtl());
$this->assertSame(Record::PTR, $record->getType());
2017-02-05 14:58:22 +01:00
});
}
/**
* Test that two concurrent requests to the same resource share the same request and do not result in two requests
* being sent.
*/
2019-01-25 02:27:47 +01:00
public function testRequestSharing()
{
Loop::run(function () {
$promise1 = Dns\query("example.com", Record::A);
$promise2 = Dns\query("example.com", Record::A);
$this->assertSame($promise1, $promise2);
$this->assertSame(yield $promise1, yield $promise2);
});
}
2019-01-25 02:27:47 +01:00
public function provideHostnames()
{
2017-01-25 16:25:41 +01:00
return [
["google.com"],
["github.com"],
["stackoverflow.com"],
2017-06-23 13:16:55 +02:00
["blog.kelunik.com"], /* that's a CNAME to GH pages */
2017-01-25 16:25:41 +01:00
["localhost"],
["192.168.0.1"],
["::1"],
["dns.google."], /* that's rooted domain name - cannot use searchList */
2017-01-25 16:25:41 +01:00
];
}
2019-01-25 02:27:47 +01:00
public function provideServers()
{
2017-01-25 16:25:41 +01:00
return [
["8.8.8.8"],
["8.8.8.8:53"],
];
}
}