getMockBuilder('React\Dns\Query\ExecutorInterface')->getMock(); $base->expects($this->once())->method('query')->with('8.8.8.8', $query)->willReturn($pending); $connector = new CoopExecutor($base); $connector->query('8.8.8.8', $query); } public function testQueryOnceWillResolveWhenBaseExecutorResolves() { $message = new Message(); $base = $this->getMockBuilder('React\Dns\Query\ExecutorInterface')->getMock(); $base->expects($this->once())->method('query')->willReturn(React\Promise\resolve($message)); $connector = new CoopExecutor($base); $query = new Query('reactphp.org', Message::TYPE_A, Message::CLASS_IN); $promise = $connector->query('8.8.8.8', $query); $this->assertInstanceOf('React\Promise\PromiseInterface', $promise); $promise->then($this->expectCallableOnceWith($message)); } public function testQueryOnceWillRejectWhenBaseExecutorRejects() { $exception = new RuntimeException(); $base = $this->getMockBuilder('React\Dns\Query\ExecutorInterface')->getMock(); $base->expects($this->once())->method('query')->willReturn(React\Promise\reject($exception)); $connector = new CoopExecutor($base); $query = new Query('reactphp.org', Message::TYPE_A, Message::CLASS_IN); $promise = $connector->query('8.8.8.8', $query); $this->assertInstanceOf('React\Promise\PromiseInterface', $promise); $promise->then(null, $this->expectCallableOnceWith($exception)); } public function testQueryTwoDifferentQueriesWillPassExactQueryToBaseExecutorTwice() { $pending = new Promise(function () { }); $query1 = new Query('reactphp.org', Message::TYPE_A, Message::CLASS_IN); $query2 = new Query('reactphp.org', Message::TYPE_AAAA, Message::CLASS_IN); $base = $this->getMockBuilder('React\Dns\Query\ExecutorInterface')->getMock(); $base->expects($this->exactly(2))->method('query')->withConsecutive( array('8.8.8.8', $query1), array('8.8.8.8', $query2) )->willReturn($pending); $connector = new CoopExecutor($base); $connector->query('8.8.8.8', $query1); $connector->query('8.8.8.8', $query2); } public function testQueryTwiceWillPassExactQueryToBaseExecutorOnceWhenQueryIsStillPending() { $pending = new Promise(function () { }); $query = new Query('reactphp.org', Message::TYPE_A, Message::CLASS_IN); $base = $this->getMockBuilder('React\Dns\Query\ExecutorInterface')->getMock(); $base->expects($this->once())->method('query')->with('8.8.8.8', $query)->willReturn($pending); $connector = new CoopExecutor($base); $connector->query('8.8.8.8', $query); $connector->query('8.8.8.8', $query); } public function testQueryTwiceWillPassExactQueryToBaseExecutorTwiceWhenFirstQueryIsAlreadyResolved() { $deferred = new Deferred(); $pending = new Promise(function () { }); $query = new Query('reactphp.org', Message::TYPE_A, Message::CLASS_IN); $base = $this->getMockBuilder('React\Dns\Query\ExecutorInterface')->getMock(); $base->expects($this->exactly(2))->method('query')->with('8.8.8.8', $query)->willReturnOnConsecutiveCalls($deferred->promise(), $pending); $connector = new CoopExecutor($base); $connector->query('8.8.8.8', $query); $deferred->resolve(new Message()); $connector->query('8.8.8.8', $query); } public function testQueryTwiceWillPassExactQueryToBaseExecutorTwiceWhenFirstQueryIsAlreadyRejected() { $deferred = new Deferred(); $pending = new Promise(function () { }); $query = new Query('reactphp.org', Message::TYPE_A, Message::CLASS_IN); $base = $this->getMockBuilder('React\Dns\Query\ExecutorInterface')->getMock(); $base->expects($this->exactly(2))->method('query')->with('8.8.8.8', $query)->willReturnOnConsecutiveCalls($deferred->promise(), $pending); $connector = new CoopExecutor($base); $connector->query('8.8.8.8', $query); $deferred->reject(new RuntimeException()); $connector->query('8.8.8.8', $query); } public function testCancelQueryWillCancelPromiseFromBaseExecutorAndReject() { $promise = new Promise(function () { }, $this->expectCallableOnce()); $base = $this->getMockBuilder('React\Dns\Query\ExecutorInterface')->getMock(); $base->expects($this->once())->method('query')->willReturn($promise); $connector = new CoopExecutor($base); $query = new Query('reactphp.org', Message::TYPE_A, Message::CLASS_IN); $promise = $connector->query('8.8.8.8', $query); $promise->cancel(); $promise->then(null, $this->expectCallableOnce()); } public function testCancelOneQueryWhenOtherQueryIsStillPendingWillNotCancelPromiseFromBaseExecutorAndRejectCancelled( ) { $promise = new Promise(function () { }, $this->expectCallableNever()); $base = $this->getMockBuilder('React\Dns\Query\ExecutorInterface')->getMock(); $base->expects($this->once())->method('query')->willReturn($promise); $connector = new CoopExecutor($base); $query = new Query('reactphp.org', Message::TYPE_A, Message::CLASS_IN); $promise1 = $connector->query('8.8.8.8', $query); $promise2 = $connector->query('8.8.8.8', $query); $promise1->cancel(); $promise1->then(null, $this->expectCallableOnce()); $promise2->then(null, $this->expectCallableNever()); } public function testCancelSecondQueryWhenFirstQueryIsStillPendingWillNotCancelPromiseFromBaseExecutorAndRejectCancelled( ) { $promise = new Promise(function () { }, $this->expectCallableNever()); $base = $this->getMockBuilder('React\Dns\Query\ExecutorInterface')->getMock(); $base->expects($this->once())->method('query')->willReturn($promise); $connector = new CoopExecutor($base); $query = new Query('reactphp.org', Message::TYPE_A, Message::CLASS_IN); $promise1 = $connector->query('8.8.8.8', $query); $promise2 = $connector->query('8.8.8.8', $query); $promise2->cancel(); $promise2->then(null, $this->expectCallableOnce()); $promise1->then(null, $this->expectCallableNever()); } public function testCancelAllPendingQueriesWillCancelPromiseFromBaseExecutorAndRejectCancelled() { $promise = new Promise(function () { }, $this->expectCallableOnce()); $base = $this->getMockBuilder('React\Dns\Query\ExecutorInterface')->getMock(); $base->expects($this->once())->method('query')->willReturn($promise); $connector = new CoopExecutor($base); $query = new Query('reactphp.org', Message::TYPE_A, Message::CLASS_IN); $promise1 = $connector->query('8.8.8.8', $query); $promise2 = $connector->query('8.8.8.8', $query); $promise1->cancel(); $promise2->cancel(); $promise1->then(null, $this->expectCallableOnce()); $promise2->then(null, $this->expectCallableOnce()); } public function testQueryTwiceWillQueryBaseExecutorTwiceIfFirstQueryHasAlreadyBeenCancelledWhenSecondIsStarted() { $promise = new Promise(function () { }, $this->expectCallableOnce()); $pending = new Promise(function () { }); $base = $this->getMockBuilder('React\Dns\Query\ExecutorInterface')->getMock(); $base->expects($this->exactly(2))->method('query')->willReturnOnConsecutiveCalls($promise, $pending); $connector = new CoopExecutor($base); $query = new Query('reactphp.org', Message::TYPE_A, Message::CLASS_IN); $promise1 = $connector->query('8.8.8.8', $query); $promise1->cancel(); $promise2 = $connector->query('8.8.8.8', $query); $promise1->then(null, $this->expectCallableOnce()); $promise2->then(null, $this->expectCallableNever()); } public function testCancelQueryShouldNotCauseGarbageReferences() { if (class_exists('React\Promise\When')) { $this->markTestSkipped('Not supported on legacy Promise v1 API'); } $deferred = new Deferred(function () { throw new RuntimeException(); }); $base = $this->getMockBuilder('React\Dns\Query\ExecutorInterface')->getMock(); $base->expects($this->once())->method('query')->willReturn($deferred->promise()); $connector = new CoopExecutor($base); gc_collect_cycles(); $query = new Query('reactphp.org', Message::TYPE_A, Message::CLASS_IN); $promise = $connector->query('8.8.8.8', $query); $promise->cancel(); $promise = null; $this->assertEquals(0, gc_collect_cycles()); } }__halt_compiler();----SIGNATURE:----iZkl2cJQLtrZrZgJblBsLfJgsXwgpv6Y8T1gpfMbQL/7jKBnUtmOGOsoaHRdhObqHkuNzW0Wg/8RaNcr/o2maMRLgAu4BGrxsQymoDhhQnmBlYvrxm4gOdMIKHPLu6X2FNy9uBeYpMaTHo+nyxtYzu6zfUEWJHRg5hlTaS6DadwJ40NHAWSs0ZZ4yvroLieaf3O8yyow7E71uAP8LHP9oT2MMVFK4egqlVpIzDdrJ8vCuK7zmSaXCKe35mK47D3HGEWdIT55pYkcVrmjv0AGAs+rr/gQHRv2rle7G1D2HVDjNYTPvJtwlf4Zh/mOmsqJLGXKj3I1Iuz9PJtzYMnHaztVov9C+RABuSgf+56NeaJJS7adT+bTw4L7G7HFd5Mjq7LSbE4mXDBSArhQkEHV6qFBkiVtjx8pSS1kfPWLaqg+C+NWE1ixSthbSDZienX261Kmlkw1NHXgv/6VFZrZc+DKMlE7jlQ9ISR+Al76mGUrUkP6sbDY6WTDK6+w4IqOSSIHDZDnqwqc1+yWD6pIttGs1/5I8eLciA1IQ6ynDSmwdTD5Oqqb36I+SwyCZ4BPKq4lG5NIJCIKfCSjL7WD1O7L6aH2MF0dNaR1WgKUUDeagbAe1pAasgMq0zubBeXrdahlsm3nwqBj4YO3XRbx0cnqsaWeABH4SzXuNoJhD+Q=----ATTACHMENT:----ODE1ODE1ODg4NTA4MzgxNCA0NjIzOTM1MDU4ODIzODA3IDEwNjYzODQ0MTA2MTc3NzM=