mirror of
https://github.com/danog/dns.git
synced 2024-11-26 20:14:51 +01:00
Fix queries over TCP, add tests
This commit is contained in:
parent
1a1427ce10
commit
f9f0c6cdc8
@ -56,5 +56,10 @@
|
||||
"files": [
|
||||
"lib/functions.php"
|
||||
]
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"Amp\\Dns\\Test\\": "test"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -94,7 +94,7 @@ class TcpSocket extends Socket {
|
||||
if ($this->queue->isEmpty()) {
|
||||
return call(function () {
|
||||
do {
|
||||
$chunk = $this->read();
|
||||
$chunk = yield $this->read();
|
||||
|
||||
if ($chunk === null) {
|
||||
$this->isAlive = false;
|
||||
|
31
test/SocketTest.php
Normal file
31
test/SocketTest.php
Normal file
@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
namespace Amp\Dns\Test;
|
||||
|
||||
use Amp\Dns;
|
||||
use Amp\Loop;
|
||||
use Amp\PHPUnit\TestCase;
|
||||
use Amp\Promise;
|
||||
use LibDNS\Messages\Message;
|
||||
use LibDNS\Messages\MessageTypes;
|
||||
use LibDNS\Records\QuestionFactory;
|
||||
|
||||
abstract class SocketTest extends TestCase {
|
||||
abstract protected function connect(): Promise;
|
||||
|
||||
public function testAsk() {
|
||||
Loop::run(function () {
|
||||
$question = (new QuestionFactory)->create(Dns\Record::A);
|
||||
$question->setName("google.com");
|
||||
|
||||
/** @var Dns\Internal\Socket $socket */
|
||||
$socket = yield $this->connect();
|
||||
|
||||
/** @var Message $result */
|
||||
$result = yield $socket->ask($question, 5000);
|
||||
|
||||
$this->assertInstanceOf(Message::class, $result);
|
||||
$this->assertSame(MessageTypes::RESPONSE, $result->getType());
|
||||
});
|
||||
}
|
||||
}
|
52
test/TcpSocketTest.php
Normal file
52
test/TcpSocketTest.php
Normal file
@ -0,0 +1,52 @@
|
||||
<?php
|
||||
|
||||
namespace Amp\Dns\Test;
|
||||
|
||||
use Amp\Delayed;
|
||||
use Amp\Dns;
|
||||
use Amp\Loop;
|
||||
use Amp\Promise;
|
||||
use LibDNS\Messages\Message;
|
||||
use LibDNS\Messages\MessageTypes;
|
||||
use LibDNS\Records\QuestionFactory;
|
||||
use function Amp\Promise\wait;
|
||||
|
||||
class TcpSocketTest extends SocketTest {
|
||||
protected function connect(): Promise {
|
||||
return Dns\Internal\TcpSocket::connect("tcp://8.8.8.8:53");
|
||||
}
|
||||
|
||||
public function testTimeout() {
|
||||
$this->expectException(Dns\TimeoutException::class);
|
||||
wait(Dns\Internal\TcpSocket::connect("tcp://8.8.8.8:53", 0));
|
||||
}
|
||||
|
||||
public function testInvalidUri() {
|
||||
$this->expectException(Dns\ResolutionException::class);
|
||||
wait(Dns\Internal\TcpSocket::connect("tcp://8.8.8.8"));
|
||||
}
|
||||
|
||||
public function testAfterConnectionTimedOut() {
|
||||
Loop::run(function () {
|
||||
$question = (new QuestionFactory)->create(Dns\Record::A);
|
||||
$question->setName("google.com");
|
||||
|
||||
/** @var Dns\Internal\Socket $socket */
|
||||
$socket = yield $this->connect();
|
||||
|
||||
/** @var Message $result */
|
||||
$result = yield $socket->ask($question, 3000);
|
||||
|
||||
$this->assertInstanceOf(Message::class, $result);
|
||||
$this->assertSame(MessageTypes::RESPONSE, $result->getType());
|
||||
|
||||
// Google's DNS times out really fast
|
||||
yield new Delayed(3000);
|
||||
|
||||
$this->expectException(Dns\ResolutionException::class);
|
||||
$this->expectExceptionMessage("Reading from the server failed");
|
||||
|
||||
yield $socket->ask($question, 3000);
|
||||
});
|
||||
}
|
||||
}
|
18
test/UdpSocketTest.php
Normal file
18
test/UdpSocketTest.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
namespace Amp\Dns\Test;
|
||||
|
||||
use Amp\Dns;
|
||||
use Amp\Promise;
|
||||
use function Amp\Promise\wait;
|
||||
|
||||
class UdpSocketTest extends SocketTest {
|
||||
protected function connect(): Promise {
|
||||
return Dns\Internal\UdpSocket::connect("udp://8.8.8.8:53");
|
||||
}
|
||||
|
||||
public function testInvalidUri() {
|
||||
$this->expectException(Dns\ResolutionException::class);
|
||||
wait(Dns\Internal\UdpSocket::connect("udp://8.8.8.8"));
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user