88use React \Dns \Model \Record ;
99use React \Promise ;
1010use React \Tests \Dns \TestCase ;
11+ use React \Dns \RecordNotFoundException ;
1112
1213class ResolverTest extends TestCase
1314{
@@ -76,8 +77,10 @@ public function resolveShouldFilterByName()
7677 $ resolver ->resolve ('igor.io ' )->then ($ this ->expectCallableNever (), $ errback );
7778 }
7879
79- /** @test */
80- public function resolveWithNoAnswersShouldThrowException ()
80+ /**
81+ * @test
82+ */
83+ public function resolveWithNoAnswersShouldCallErrbackIfGiven ()
8184 {
8285 $ executor = $ this ->createExecutorMock ();
8386 $ executor
@@ -92,34 +95,70 @@ public function resolveWithNoAnswersShouldThrowException()
9295 return Promise \resolve ($ response );
9396 }));
9497
95- $ errback = $ this ->expectCallableOnceWith ($ this ->isInstanceOf ('React\Dns\RecordNotFoundException ' ));
98+ $ errback = $ this ->expectCallableOnceWith ($ this ->callback (function ($ param ) {
99+ return ($ param instanceof RecordNotFoundException && $ param ->getCode () === 0 && $ param ->getMessage () === 'DNS query for igor.io did not return a valid answer (NOERROR / NODATA) ' );
100+ }));
96101
97102 $ resolver = new Resolver ('8.8.8.8:53 ' , $ executor );
98103 $ resolver ->resolve ('igor.io ' )->then ($ this ->expectCallableNever (), $ errback );
99104 }
100105
106+ public function provideRcodeErrors ()
107+ {
108+ return array (
109+ array (
110+ Message::RCODE_FORMAT_ERROR ,
111+ 'DNS query for example.com returned an error response (Format Error) ' ,
112+ ),
113+ array (
114+ Message::RCODE_SERVER_FAILURE ,
115+ 'DNS query for example.com returned an error response (Server Failure) ' ,
116+ ),
117+ array (
118+ Message::RCODE_NAME_ERROR ,
119+ 'DNS query for example.com returned an error response (Non-Existent Domain / NXDOMAIN) '
120+ ),
121+ array (
122+ Message::RCODE_NOT_IMPLEMENTED ,
123+ 'DNS query for example.com returned an error response (Not Implemented) '
124+ ),
125+ array (
126+ Message::RCODE_REFUSED ,
127+ 'DNS query for example.com returned an error response (Refused) '
128+ ),
129+ array (
130+ 99 ,
131+ 'DNS query for example.com returned an error response (Unknown error response code 99) '
132+ )
133+ );
134+ }
135+
101136 /**
102137 * @test
138+ * @dataProvider provideRcodeErrors
103139 */
104- public function resolveWithNoAnswersShouldCallErrbackIfGiven ( )
140+ public function resolveWithRcodeErrorShouldCallErrbackIfGiven ( $ code , $ expectedMessage )
105141 {
106142 $ executor = $ this ->createExecutorMock ();
107143 $ executor
108144 ->expects ($ this ->once ())
109145 ->method ('query ' )
110146 ->with ($ this ->anything (), $ this ->isInstanceOf ('React\Dns\Query\Query ' ))
111- ->will ($ this ->returnCallback (function ($ nameserver , $ query ) {
147+ ->will ($ this ->returnCallback (function ($ nameserver , $ query ) use ( $ code ) {
112148 $ response = new Message ();
113149 $ response ->header ->set ('qr ' , 1 );
150+ $ response ->header ->set ('rcode ' , $ code );
114151 $ response ->questions [] = new Record ($ query ->name , $ query ->type , $ query ->class );
115152
116153 return Promise \resolve ($ response );
117154 }));
118155
119- $ errback = $ this ->expectCallableOnceWith ($ this ->isInstanceOf ('React\Dns\RecordNotFoundException ' ));
156+ $ errback = $ this ->expectCallableOnceWith ($ this ->callback (function ($ param ) use ($ code , $ expectedMessage ) {
157+ return ($ param instanceof RecordNotFoundException && $ param ->getCode () === $ code && $ param ->getMessage () === $ expectedMessage );
158+ }));
120159
121160 $ resolver = new Resolver ('8.8.8.8:53 ' , $ executor );
122- $ resolver ->resolve ('igor.io ' )->then ($ this ->expectCallableNever (), $ errback );
161+ $ resolver ->resolve ('example.com ' )->then ($ this ->expectCallableNever (), $ errback );
123162 }
124163
125164 private function createExecutorMock ()
0 commit comments