<?php
namespace ZeusTest\Services\Async;
use Opis\Closure\SerializableClosure;
use PHPUnit_Framework_TestCase;
use Zeus\Kernel\Networking\ConnectionInterface;
use Zeus\ServerService\Async\Message\Message;
use ZeusTest\Helpers\SocketTestConnection;
class AsyncMessageTest extends PHPUnit_Framework_TestCase
{
/** @var ConnectionInterface */
protected $connection;
/** @var Message */
protected $async;
public function setUp()
{
$this->connection = new SocketTestConnection(null);
$this->async = new Message();
$this->async->onOpen($this->connection);
$this->connection->setWriteBufferSize(0);
}
public function tearDown()
{
$this->async->onClose($this->connection);
}
public function testConnectionClosedOnError()
{
$result = $this->send("test\n", true);
$this->assertEquals("BAD_REQUEST\n", $result);
$this->assertTrue($this->connection->isConnectionClosed(), "Connection should be closed on error");
}
public function testErrorOnBadRequest()
{
$result = $this->send("test:aaa\n", true);
$this->assertEquals("BAD_REQUEST\n", $result);
$this->assertTrue($this->connection->isConnectionClosed(), "Connection should be closed on error");
}
public function testUnSerializationFailure()
{
$result = $this->send("3:aaa\n", true);
$this->assertEquals("PROCESSING\nCORRUPTED_REQUEST\n", $result);
$this->assertTrue($this->connection->isConnectionClosed(), "Connection should be closed on error");
}
public function testResultOfValidCallback()
{
$callback = new SerializableClosure(function() { return 4;});
$message = serialize($callback);
$size = strlen($message);
$result = $this->send("$size:$message\n", true);
$result = explode("\n", $result);
$this->assertEquals("PROCESSING", $result[0]);
$this->async->onHeartBeat($this->connection);
$this->assertStringMatchesFormat("%d:%s", $result[1]);
$pos = strpos($result[1], ":");
$result = unserialize(substr($result[1], $pos +1));
$this->assertEquals(4, $result);
}
public function testErrorOnCorruptedRequest()
{
$result = $this->send("3:aaaa\n", true);
$this->assertEquals("CORRUPTED_REQUEST\n", $result);
$this->assertTrue($this->connection->isConnectionClosed(), "Connection should be closed on error");
}
protected function send($message, $useExactMessage)
{
if ($useExactMessage) {
$this->async->onMessage($this->connection, $message);
}
$response = $this->connection->getSentData();
return $response;
}
}
|