Skip to content

Commit 4646633

Browse files
committed
Unify error messages for Executor to always include original query name
1 parent dbf4fcd commit 4646633

3 files changed

Lines changed: 19 additions & 52 deletions

File tree

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
"react/stream": "^1.0 || ^0.7 || ^0.6 || ^0.5 || ^0.4.5"
1414
},
1515
"require-dev": {
16+
"clue/block-react": "^1.2",
1617
"phpunit/phpunit": "^5.0 || ^4.8.10"
1718
},
1819
"autoload": {

src/Query/Executor.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public function doQuery($nameserver, $transport, $queryData, $name)
5959
// we only support UDP right now
6060
if ($transport !== 'udp') {
6161
return Promise\reject(new \RuntimeException(
62-
'Only UDP transport supported in this version'
62+
'DNS query for ' . $name . ' failed: Requested transport "' . $transport . '" not available, only UDP is supported in this version'
6363
));
6464
}
6565

@@ -71,7 +71,7 @@ public function doQuery($nameserver, $transport, $queryData, $name)
7171
try {
7272
$conn = $this->createConnection($nameserver, $transport);
7373
} catch (\Exception $e) {
74-
return Promise\reject(new \RuntimeException('Unable to connect to DNS server: ' . $e->getMessage(), 0, $e));
74+
return Promise\reject(new \RuntimeException('DNS query for ' . $name . ' failed: Unable to connect to DNS server: ' . $e->getMessage(), 0, $e));
7575
}
7676

7777
$deferred = new Deferred(function ($resolve, $reject) use (&$timer, $loop, &$conn, $name) {
@@ -91,7 +91,7 @@ public function doQuery($nameserver, $transport, $queryData, $name)
9191
});
9292
}
9393

94-
$conn->on('data', function ($data) use ($conn, $parser, $deferred, $timer, $loop) {
94+
$conn->on('data', function ($data) use ($conn, $parser, $deferred, $timer, $loop, $name) {
9595
$conn->end();
9696
if ($timer !== null) {
9797
$loop->cancelTimer($timer);
@@ -105,7 +105,7 @@ public function doQuery($nameserver, $transport, $queryData, $name)
105105
}
106106

107107
if ($response->header->isTruncated()) {
108-
$deferred->reject(new \RuntimeException('The server returned a truncated result for the UDP query, retrying via TCP is currently not supported'));
108+
$deferred->reject(new \RuntimeException('DNS query for ' . $name . ' failed: The server returned a truncated result for a UDP query, but retrying via TCP is currently not supported'));
109109
return;
110110
}
111111

tests/Query/ExecutorTest.php

Lines changed: 14 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace React\Tests\Dns\Query;
44

5+
use Clue\React\Block;
56
use React\Dns\Query\Executor;
67
use React\Dns\Query\Query;
78
use React\Dns\Model\Message;
@@ -51,10 +52,8 @@ public function resolveShouldRejectIfRequestIsLargerThan512Bytes()
5152
$query = new Query(str_repeat('a', 512).'.igor.io', Message::TYPE_A, Message::CLASS_IN, 1345656451);
5253
$promise = $this->executor->query('8.8.8.8:53', $query);
5354

54-
$promise->then(
55-
null,
56-
$this->expectCallableOnce()
57-
);
55+
$this->setExpectedException('RuntimeException', 'DNS query for ' . $query->name . ' failed: Requested transport "tcp" not available, only UDP is supported in this version');
56+
Block\await($promise, $this->loop);
5857
}
5958

6059
/** @test */
@@ -81,17 +80,8 @@ public function resolveShouldCloseConnectionWhenCancelled()
8180

8281
$promise->cancel();
8382

84-
$errorback = $this->createCallableMock();
85-
$errorback
86-
->expects($this->once())
87-
->method('__invoke')
88-
->with($this->logicalAnd(
89-
$this->isInstanceOf('React\Dns\Query\CancellationException'),
90-
$this->attribute($this->equalTo('DNS query for igor.io has been cancelled'), 'message')
91-
)
92-
);
93-
94-
$promise->then($this->expectCallableNever(), $errorback);
83+
$this->setExpectedException('React\Dns\Query\CancellationException', 'DNS query for igor.io has been cancelled');
84+
Block\await($promise, $this->loop);
9585
}
9686

9787
/** @test */
@@ -108,16 +98,8 @@ public function resolveShouldNotStartOrCancelTimerWhenCancelledWithTimeoutIsNull
10898

10999
$promise->cancel();
110100

111-
$errorback = $this->createCallableMock();
112-
$errorback
113-
->expects($this->once())
114-
->method('__invoke')
115-
->with($this->logicalAnd(
116-
$this->isInstanceOf('React\Dns\Query\CancellationException'),
117-
$this->attribute($this->equalTo('DNS query for igor.io has been cancelled'), 'message')
118-
));
119-
120-
$promise->then($this->expectCallableNever(), $errorback);
101+
$this->setExpectedException('React\Dns\Query\CancellationException', 'DNS query for igor.io has been cancelled');
102+
Block\await($promise, $this->loop);
121103
}
122104

123105
/** @test */
@@ -162,21 +144,13 @@ public function resolveShouldFailIfUdpThrow()
162144
->expects($this->once())
163145
->method('createConnection')
164146
->with('8.8.8.8:53', 'udp')
165-
->will($this->throwException(new \Exception()));
147+
->will($this->throwException(new \Exception('Nope')));
166148

167149
$query = new Query('igor.io', Message::TYPE_A, Message::CLASS_IN, 1345656451);
168150
$promise = $this->executor->query('8.8.8.8:53', $query);
169151

170-
$mock = $this->createCallableMock();
171-
$mock
172-
->expects($this->once())
173-
->method('__invoke')
174-
->with($this->callback(function($e) {
175-
return $e instanceof \RuntimeException &&
176-
strpos($e->getMessage(), 'Unable to connect to DNS server') === 0;
177-
}));
178-
179-
$promise->then($this->expectCallableNever(), $mock);
152+
$this->setExpectedException('RuntimeException', 'DNS query for igor.io failed: Unable to connect to DNS server: Nope');
153+
Block\await($promise, $this->loop);
180154
}
181155

182156
/** @test */
@@ -238,22 +212,14 @@ public function resolveShouldCloseConnectionOnTimeout()
238212
return $timer;
239213
}));
240214

241-
$callback = $this->expectCallableNever();
242-
243-
$errorback = $this->createCallableMock();
244-
$errorback
245-
->expects($this->once())
246-
->method('__invoke')
247-
->with($this->logicalAnd(
248-
$this->isInstanceOf('React\Dns\Query\TimeoutException'),
249-
$this->attribute($this->equalTo('DNS query for igor.io timed out'), 'message')
250-
));
251-
252215
$query = new Query('igor.io', Message::TYPE_A, Message::CLASS_IN, 1345656451);
253-
$this->executor->query('8.8.8.8:53', $query)->then($callback, $errorback);
216+
$promise = $this->executor->query('8.8.8.8:53', $query);
254217

255218
$this->assertNotNull($timerCallback);
256219
$timerCallback();
220+
221+
$this->setExpectedException('React\Dns\Query\TimeoutException', 'DNS query for igor.io timed out');
222+
Block\await($promise, $this->loop);
257223
}
258224

259225
private function returnStandardResponse()

0 commit comments

Comments
 (0)