public function testRealmJoinNoAutocreate() { $loop = new \React\EventLoop\StreamSelectLoop(); $router = new \Thruway\Peer\Router($loop); // you have to have at least one transport for the router to start // internal client in this case $iClient = new \Thruway\Peer\Client('some_realm'); $router->registerModule(new \Thruway\Transport\InternalClientTransportProvider($iClient)); $router->start(false); $router->getRealmManager()->setAllowRealmAutocreate(false); $this->assertEquals(1, count($router->getRealmManager()->getRealms())); $transport = new \Thruway\Transport\DummyTransport(); $session = $router->createNewSession($transport); $prevMsg = null; $router->getEventDispatcher()->dispatch("connection_open", new \Thruway\Event\ConnectionOpenEvent($session)); $fromRouter = []; $toRouter = [new \Thruway\Message\HelloMessage("another_realm", (object) []), function () use(&$fromRouter) { $this->assertEquals(1, count($fromRouter)); $this->assertInstanceOf('\\Thruway\\Message\\AbortMessage', $fromRouter[0]); /** @var \Thruway\Message\AbortMessage $abortMessage */ $abortMessage = $fromRouter[0]; $this->assertEquals("wamp.error.no_such_realm", $abortMessage->getResponseURI()); }]; foreach ($toRouter as $msg) { if (is_callable($msg)) { $msg = $msg(); if (!$msg instanceof \Thruway\Message\Message) { continue; } } $session->dispatchMessage($msg); if ($prevMsg !== $transport->getLastMessageSent()) { $fromRouter[] = $prevMsg = $transport->getLastMessageSent(); } } }
public function testStateRestoreWithNoQueue() { $router = new \Thruway\Peer\Router(); $stateHandlerRegistry = new \Thruway\Subscription\StateHandlerRegistry('state.test.realm'); $router->registerModule($stateHandlerRegistry); $router->start(false); $transportStateHandler = $this->createTransportMock(); $registrationId = 0; $invocationReqId = 0; $subscriptionId = 0; $transportStateHandler->expects($this->exactly(7))->method('sendMessage')->withConsecutive([$this->isInstanceOf('\\Thruway\\Message\\WelcomeMessage')], [$this->callback(function (\Thruway\Message\RegisteredMessage $msg) use(&$registrationId) { $registrationId = $msg->getRegistrationId(); return true; })], [$this->callback(function (\Thruway\Message\ErrorMessage $msg) { $this->assertEquals("No uri set for state handler registration.", $msg->getArguments()[0]); return true; })], [$this->callback(function (\Thruway\Message\ErrorMessage $msg) { $this->assertEquals("No handler uri set for state handler registration.", $msg->getArguments()[0]); return true; })], [$this->callback(function (\Thruway\Message\ErrorMessage $msg) { $this->assertEquals("No uri set for state handler registration.", $msg->getArguments()[0]); return true; })], [$this->callback(function (\Thruway\Message\ResultMessage $msg) { return true; })], [$this->callback(function (\Thruway\Message\InvocationMessage $msg) use(&$registrationId, &$invocationReqId) { $this->assertEquals($registrationId, $msg->getRegistrationId()); $invocationReqId = $msg->getRequestId(); return true; })]); $transportSubscriber = $this->createTransportMock(); $transportSubscriber->expects($this->exactly(5))->method("sendMessage")->withConsecutive([$this->isInstanceOf('\\Thruway\\Message\\WelcomeMessage')], [$this->callback(function (\Thruway\Message\SubscribedMessage $msg) use(&$subscriptionId) { $subscriptionId = $msg->getSubscriptionId(); return true; })], [$this->callback(function ($msg) { $this->assertEventMessageWithArgument0(3, $msg); return true; })], [$this->callback(function ($msg) { $this->assertEventMessageWithArgument0(4, $msg); return true; })], [$this->callback(function ($msg) { $this->assertEventMessageWithArgument0(5, $msg); return true; })]); $sessionStateHandler = new \Thruway\Session($transportStateHandler); $sessionSubscriber = new \Thruway\Session($transportSubscriber); $router->getEventDispatcher()->dispatch("connection_open", new \Thruway\Event\ConnectionOpenEvent($sessionStateHandler)); $router->getEventDispatcher()->dispatch("connection_open", new \Thruway\Event\ConnectionOpenEvent($sessionSubscriber)); $hello = new \Thruway\Message\HelloMessage('state.test.realm', (object) []); $sessionStateHandler->dispatchMessage($hello); $sessionSubscriber->dispatchMessage($hello); $register = new \Thruway\Message\RegisterMessage(12345, (object) [], 'my_state_handler'); $sessionStateHandler->dispatchMessage($register); $call = new \Thruway\Message\CallMessage(2, (object) [], 'add_state_handler', [[]]); $sessionStateHandler->dispatchMessage($call); $call->setArguments([(object) ["uri" => "test.stateful.uri"]]); $sessionStateHandler->dispatchMessage($call); $call->setArguments([(object) ["handler_uri" => "my_state_handler"]]); $sessionStateHandler->dispatchMessage($call); $call->setArguments([(object) ["uri" => "test.stateful.uri", "handler_uri" => "my_state_handler"]]); $sessionStateHandler->dispatchMessage($call); $subscribe = new \Thruway\Message\SubscribeMessage(2, (object) [], "test.stateful.uri"); $sessionSubscriber->dispatchMessage($subscribe); $yield = new \Thruway\Message\YieldMessage($invocationReqId, (object) []); $sessionStateHandler->dispatchMessage($yield); for ($i = 3; $i < 6; $i++) { $publish = new \Thruway\Message\PublishMessage($i, (object) [], "test.stateful.uri", [$i]); $publish->setPublicationId($i); $sessionStateHandler->dispatchMessage($publish); } }