123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- <?php
- namespace React\Tests\Dns\Resolver;
- use React\Dns\Resolver\Resolver;
- use React\Dns\Query\Query;
- use React\Dns\Model\Message;
- use React\Dns\Model\Record;
- use React\Promise;
- use React\Tests\Dns\TestCase;
- use React\Dns\RecordNotFoundException;
- class ResolverTest extends TestCase
- {
- /** @test */
- public function resolveShouldQueryARecords()
- {
- $executor = $this->createExecutorMock();
- $executor
- ->expects($this->once())
- ->method('query')
- ->with($this->isInstanceOf('React\Dns\Query\Query'))
- ->will($this->returnCallback(function ($query) {
- $response = new Message();
- $response->qr = true;
- $response->questions[] = new Query($query->name, $query->type, $query->class);
- $response->answers[] = new Record($query->name, $query->type, $query->class, 3600, '178.79.169.131');
- return Promise\resolve($response);
- }));
- $resolver = new Resolver($executor);
- $resolver->resolve('igor.io')->then($this->expectCallableOnceWith('178.79.169.131'));
- }
- /** @test */
- public function resolveAllShouldQueryGivenRecords()
- {
- $executor = $this->createExecutorMock();
- $executor
- ->expects($this->once())
- ->method('query')
- ->with($this->isInstanceOf('React\Dns\Query\Query'))
- ->will($this->returnCallback(function ($query) {
- $response = new Message();
- $response->qr = true;
- $response->questions[] = new Query($query->name, $query->type, $query->class);
- $response->answers[] = new Record($query->name, $query->type, $query->class, 3600, '::1');
- return Promise\resolve($response);
- }));
- $resolver = new Resolver($executor);
- $resolver->resolveAll('reactphp.org', Message::TYPE_AAAA)->then($this->expectCallableOnceWith(array('::1')));
- }
- /** @test */
- public function resolveAllShouldIgnoreRecordsWithOtherTypes()
- {
- $executor = $this->createExecutorMock();
- $executor
- ->expects($this->once())
- ->method('query')
- ->with($this->isInstanceOf('React\Dns\Query\Query'))
- ->will($this->returnCallback(function ($query) {
- $response = new Message();
- $response->qr = true;
- $response->questions[] = new Query($query->name, $query->type, $query->class);
- $response->answers[] = new Record($query->name, Message::TYPE_TXT, $query->class, 3600, array('ignored'));
- $response->answers[] = new Record($query->name, $query->type, $query->class, 3600, '::1');
- return Promise\resolve($response);
- }));
- $resolver = new Resolver($executor);
- $resolver->resolveAll('reactphp.org', Message::TYPE_AAAA)->then($this->expectCallableOnceWith(array('::1')));
- }
- /** @test */
- public function resolveAllShouldReturnMultipleValuesForAlias()
- {
- $executor = $this->createExecutorMock();
- $executor
- ->expects($this->once())
- ->method('query')
- ->with($this->isInstanceOf('React\Dns\Query\Query'))
- ->will($this->returnCallback(function ($query) {
- $response = new Message();
- $response->qr = true;
- $response->questions[] = new Query($query->name, $query->type, $query->class);
- $response->answers[] = new Record($query->name, Message::TYPE_CNAME, $query->class, 3600, 'example.com');
- $response->answers[] = new Record('example.com', $query->type, $query->class, 3600, '::1');
- $response->answers[] = new Record('example.com', $query->type, $query->class, 3600, '::2');
- return Promise\resolve($response);
- }));
- $resolver = new Resolver($executor);
- $resolver->resolveAll('reactphp.org', Message::TYPE_AAAA)->then(
- $this->expectCallableOnceWith($this->equalTo(array('::1', '::2')))
- );
- }
- /** @test */
- public function resolveShouldQueryARecordsAndIgnoreCase()
- {
- $executor = $this->createExecutorMock();
- $executor
- ->expects($this->once())
- ->method('query')
- ->with($this->isInstanceOf('React\Dns\Query\Query'))
- ->will($this->returnCallback(function ($query) {
- $response = new Message();
- $response->qr = true;
- $response->questions[] = new Query('Blog.wyrihaximus.net', $query->type, $query->class);
- $response->answers[] = new Record('Blog.wyrihaximus.net', $query->type, $query->class, 3600, '178.79.169.131');
- return Promise\resolve($response);
- }));
- $resolver = new Resolver($executor);
- $resolver->resolve('blog.wyrihaximus.net')->then($this->expectCallableOnceWith('178.79.169.131'));
- }
- /** @test */
- public function resolveShouldFilterByName()
- {
- $executor = $this->createExecutorMock();
- $executor
- ->expects($this->once())
- ->method('query')
- ->with($this->isInstanceOf('React\Dns\Query\Query'))
- ->will($this->returnCallback(function ($query) {
- $response = new Message();
- $response->qr = true;
- $response->questions[] = new Query($query->name, $query->type, $query->class);
- $response->answers[] = new Record('foo.bar', $query->type, $query->class, 3600, '178.79.169.131');
- return Promise\resolve($response);
- }));
- $errback = $this->expectCallableOnceWith($this->isInstanceOf('React\Dns\RecordNotFoundException'));
- $resolver = new Resolver($executor);
- $resolver->resolve('igor.io')->then($this->expectCallableNever(), $errback);
- }
- /**
- * @test
- */
- public function resolveWithNoAnswersShouldCallErrbackIfGiven()
- {
- $executor = $this->createExecutorMock();
- $executor
- ->expects($this->once())
- ->method('query')
- ->with($this->isInstanceOf('React\Dns\Query\Query'))
- ->will($this->returnCallback(function ($query) {
- $response = new Message();
- $response->qr = true;
- $response->questions[] = new Query($query->name, $query->type, $query->class);
- return Promise\resolve($response);
- }));
- $errback = $this->expectCallableOnceWith($this->callback(function ($param) {
- return ($param instanceof RecordNotFoundException && $param->getCode() === 0 && $param->getMessage() === 'DNS query for igor.io (A) did not return a valid answer (NOERROR / NODATA)');
- }));
- $resolver = new Resolver($executor);
- $resolver->resolve('igor.io')->then($this->expectCallableNever(), $errback);
- }
- public function provideRcodeErrors()
- {
- return array(
- array(
- Message::RCODE_FORMAT_ERROR,
- 'DNS query for example.com (A) returned an error response (Format Error)',
- ),
- array(
- Message::RCODE_SERVER_FAILURE,
- 'DNS query for example.com (A) returned an error response (Server Failure)',
- ),
- array(
- Message::RCODE_NAME_ERROR,
- 'DNS query for example.com (A) returned an error response (Non-Existent Domain / NXDOMAIN)'
- ),
- array(
- Message::RCODE_NOT_IMPLEMENTED,
- 'DNS query for example.com (A) returned an error response (Not Implemented)'
- ),
- array(
- Message::RCODE_REFUSED,
- 'DNS query for example.com (A) returned an error response (Refused)'
- ),
- array(
- 99,
- 'DNS query for example.com (A) returned an error response (Unknown error response code 99)'
- )
- );
- }
- /**
- * @test
- * @dataProvider provideRcodeErrors
- */
- public function resolveWithRcodeErrorShouldCallErrbackIfGiven($code, $expectedMessage)
- {
- $executor = $this->createExecutorMock();
- $executor
- ->expects($this->once())
- ->method('query')
- ->with($this->isInstanceOf('React\Dns\Query\Query'))
- ->will($this->returnCallback(function ($query) use ($code) {
- $response = new Message();
- $response->qr = true;
- $response->rcode = $code;
- $response->questions[] = new Query($query->name, $query->type, $query->class);
- return Promise\resolve($response);
- }));
- $errback = $this->expectCallableOnceWith($this->callback(function ($param) use ($code, $expectedMessage) {
- return ($param instanceof RecordNotFoundException && $param->getCode() === $code && $param->getMessage() === $expectedMessage);
- }));
- $resolver = new Resolver($executor);
- $resolver->resolve('example.com')->then($this->expectCallableNever(), $errback);
- }
- private function createExecutorMock()
- {
- return $this->getMockBuilder('React\Dns\Query\ExecutorInterface')->getMock();
- }
- }
|