DealerTest::testQueueProcessAfterNonMultiYield PHP Method

testQueueProcessAfterNonMultiYield() public method

    public function testQueueProcessAfterNonMultiYield()
    {
        $seq = 0;
        // there will be two callees
        //// Mocking
        $realm = $this->getMockBuilder('\\Thruway\\Realm')->setConstructorArgs(["theRealm"])->setMethods(["publishMeta"])->getMock();
        $sessionMockBuilder = $this->getMockBuilder('\\Thruway\\Session')->setMethods(['sendMessage'])->disableOriginalConstructor();
        $callee0Session = $sessionMockBuilder->getMock();
        $callee1Session = $sessionMockBuilder->getMock();
        $callerSession = $sessionMockBuilder->getMock();
        $callee0Session->setRealm($realm);
        $callee1Session->setRealm($realm);
        $callerSession->setRealm($realm);
        //// End of Mocking
        $realm->expects($this->exactly(2))->method("publishMeta")->with($this->equalTo('thruway.metaevent.procedure.congestion'), $this->equalTo([["name" => "qpanmy_proc0"]]));
        $invocationIDs = [];
        $callee0Session->expects($this->exactly(6))->method("sendMessage")->withConsecutive([$this->isInstanceOf('\\Thruway\\Message\\RegisteredMessage')], [$this->callback(function ($value) use(&$invocationIDs) {
            $this->assertInstanceOf('\\Thruway\\Message\\InvocationMessage', $value);
            $invocationIDs[0] = $value->getRequestId();
            return true;
        })], [$this->callback(function ($value) use(&$invocationIDs) {
            $this->assertInstanceOf('\\Thruway\\Message\\InvocationMessage', $value);
            $invocationIDs[1] = $value->getRequestId();
            return true;
        })], [$this->isInstanceOf('\\Thruway\\Message\\RegisteredMessage')], [$this->callback(function ($value) use(&$invocationIDs) {
            $this->assertInstanceOf('\\Thruway\\Message\\InvocationMessage', $value);
            $invocationIDs[2] = $value->getRequestId();
            return true;
        })], [$this->callback(function ($value) use(&$invocationIDs) {
            // invocation after yield
            $this->assertInstanceOf('\\Thruway\\Message\\InvocationMessage', $value);
            $invocationIDs[3] = $value->getRequestId();
            return true;
        })]);
        // create a dealer
        $dealer = new \Thruway\Role\Dealer();
        // register proc0 as multi
        $registerMsg = new \Thruway\Message\RegisterMessage(\Thruway\Common\Utils::getUniqueId(), ["thruway_multiregister" => true], "qpanmy_proc0");
        $dealer->handleRegisterMessage(new \Thruway\Event\MessageEvent($callee0Session, $registerMsg));
        $callMsg = new \Thruway\Message\CallMessage(\Thruway\Common\Utils::getUniqueId(), [], "qpanmy_proc0");
        $dealer->handleCallMessage(new \Thruway\Event\MessageEvent($callerSession, $callMsg));
        $callMsg->setRequestId(\Thruway\Common\Utils::getUniqueId());
        $dealer->handleCallMessage(new \Thruway\Event\MessageEvent($callerSession, $callMsg));
        $yieldMsg = new \Thruway\Message\YieldMessage($invocationIDs[0], []);
        $dealer->handleYieldMessage(new \Thruway\Event\MessageEvent($callee0Session, $yieldMsg));
        $yieldMsg = new \Thruway\Message\YieldMessage($invocationIDs[1], []);
        $dealer->handleYieldMessage(new \Thruway\Event\MessageEvent($callee0Session, $yieldMsg));
        // there are now zero calls on proc0
        $registerMsg = new \Thruway\Message\RegisterMessage(\Thruway\Common\Utils::getUniqueId(), [], "qpanmy_proc1");
        $callProc1Msg = new \Thruway\Message\CallMessage(\Thruway\Common\Utils::getUniqueId(), [], "qpanmy_proc1");
        $dealer->handleRegisterMessage(new \Thruway\Event\MessageEvent($callee0Session, $registerMsg));
        $dealer->handleCallMessage(new \Thruway\Event\MessageEvent($callerSession, $callProc1Msg));
        // this should cause congestion and queuing because it should be busy with proc1
        $callMsg->setRequestId(\Thruway\Common\Utils::getUniqueId());
        $dealer->handleCallMessage(new \Thruway\Event\MessageEvent($callerSession, $callMsg));
        // yield on proc1 - this should cause proc0 to process queue
        $yieldMsg = new \Thruway\Message\YieldMessage($invocationIDs[2], []);
        $dealer->handleYieldMessage(new \Thruway\Event\MessageEvent($callee0Session, $yieldMsg));
    }