Skip to content

Commit

Permalink
Merge pull request #21 from clue-labs/unexpected
Browse files Browse the repository at this point in the history
Emit "error" event for unexpected response messages
  • Loading branch information
clue committed Mar 31, 2015
2 parents 4f33e56 + 5ba53f7 commit 37c1363
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 2 deletions.
5 changes: 3 additions & 2 deletions src/Client.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
use UnexpectedValueException;
use Clue\React\Ami\Protocol\Message;
use Clue\React\Ami\Protocol\ErrorException;
use Clue\React\Ami\Protocol\UnexpectedMessageException;

class Client extends EventEmitter
{
Expand Down Expand Up @@ -66,6 +67,7 @@ public function request(Action $message)
return $deferred->promise();
}

/** @internal */
public function handleMessage(Message $message)
{
if ($message instanceof Event) {
Expand All @@ -74,8 +76,7 @@ public function handleMessage(Message $message)
}
$id = $message->getActionId();
if (!isset($this->pending[$id])) {
var_dump('unexpected', $message);
// unexpected message
$this->emit('error', array(new UnexpectedMessageException($message), $this));
return;
}

Expand Down
21 changes: 21 additions & 0 deletions src/Protocol/UnexpectedMessageException.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

namespace Clue\React\Ami\Protocol;

use UnexpectedValueException;

class UnexpectedMessageException extends UnexpectedValueException
{
private $response;

public function __construct(Response $response)
{
parent::__construct('Unexpected message with action ID "' . $response->getActionId() . '" received');
$this->response = $response;
}

public function getResponse()
{
return $this->response;
}
}
11 changes: 11 additions & 0 deletions tests/ClientTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
use Clue\React\Ami\Protocol\Parser;
use Clue\React\Ami\Client;
use React\EventLoop\Factory;
use Clue\React\Ami\Protocol\Response;

class ClientTest extends TestCase
{
Expand Down Expand Up @@ -32,6 +33,16 @@ public function testParserExceptionForwardsErrorAndClosesClient()
$stream->emit('data', array("invalid chunk\r\n\r\ninvalid chunk\r\n\r\n"));
}

public function testUnexpectedResponseEmitsErrorAndClosesClient()
{
$client = new Client($this->createStreamMock());

$client->on('error', $this->expectCallableOnce());
$client->on('close', $this->expectCallableOnce());

$client->handleMessage(new Response(array('ActionID' => 1)));
}

private function createStreamMock()
{
return new Stream(fopen('php://memory', 'r+'), $this->getMock('React\EventLoop\LoopInterface'));
Expand Down
16 changes: 16 additions & 0 deletions tests/Protocol/UnexpectedMessageExceptionTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

use Clue\React\Ami\Protocol\Response;
use Clue\React\Ami\Protocol\UnexpectedMessageException;

class UnexpectedMessageExceptionTest extends TestCase
{
public function testGetResponse()
{
$response = new Response(array('ActionID' => 1));

$exception = new UnexpectedMessageException($response);

$this->assertSame($response, $exception->getResponse());
}
}

0 comments on commit 37c1363

Please sign in to comment.