Skip to content

Commit

Permalink
Fix queries over TCP, add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
kelunik committed Jun 29, 2017
1 parent 1a1427c commit f9f0c6c
Show file tree
Hide file tree
Showing 5 changed files with 107 additions and 1 deletion.
5 changes: 5 additions & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -56,5 +56,10 @@
"files": [
"lib/functions.php"
]
},
"autoload-dev": {
"psr-4": {
"Amp\\Dns\\Test\\": "test"
}
}
}
2 changes: 1 addition & 1 deletion lib/Internal/TcpSocket.php
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ protected function receive(): Promise {
if ($this->queue->isEmpty()) {
return call(function () {
do {
$chunk = $this->read();
$chunk = yield $this->read();

if ($chunk === null) {
$this->isAlive = false;
Expand Down
31 changes: 31 additions & 0 deletions test/SocketTest.php
Original file line number Diff line number Diff line change
@@ -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 changes: 52 additions & 0 deletions test/TcpSocketTest.php
Original file line number Diff line number Diff line change
@@ -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 changes: 18 additions & 0 deletions test/UdpSocketTest.php
Original file line number Diff line number Diff line change
@@ -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"));
}
}

0 comments on commit f9f0c6c

Please sign in to comment.