/** * @param string $channel * @param string $clientKey * @throws CM_Exception_Invalid */ protected function _unsubscribe($channel, $clientKey) { $channelData = CM_Model_StreamChannel_Message::extractStatusChannelData($channel); $channelKey = $channelData['key']; $channelType = $channelData['type']; $streamChannel = CM_Model_StreamChannel_Message::findByKeyAndAdapter($channelKey, $this->getType()); if (!$streamChannel) { return; } if ($streamChannel->getType() != $channelType) { throw new CM_Exception_Invalid('StreamChannel type `' . $streamChannel->getType() . '` doesn\'t match expected value `' . $channelType . '`'); } $streamChannelSubscribe = $streamChannel->getStreamSubscribes()->findKey($clientKey); if ($streamChannelSubscribe) { $streamChannelSubscribe->delete(); } if ($streamChannel->getStreamSubscribes()->getCount() === 0) { $streamChannel->delete(); } }
/** * @param array $status */ private function _testSynchronize($status) { $adapter = $this->getMockBuilder('CM_MessageStream_Adapter_SocketRedis')->disableOriginalConstructor()->setMethods(array('_fetchStatus'))->getMock(); $adapter->expects($this->any())->method('_fetchStatus')->will($this->returnValue($status)); /** @var $adapter CM_MessageStream_Adapter_SocketRedis */ $adapter->synchronize(); $streamChannels = new CM_Paging_StreamChannel_AdapterType($adapter->getType()); $this->assertSame(count($status), $streamChannels->getCount()); /** @var $streamChannel CM_Model_StreamChannel_Message */ foreach ($streamChannels as $streamChannel) { $this->assertInstanceOf('CM_Model_StreamChannel_Message', $streamChannel); $channel = $streamChannel->getKey() . ':' . CM_Model_StreamChannel_Message::getTypeStatic(); $this->assertSame(count($status[$channel]['subscribers']), $streamChannel->getStreamSubscribes()->getCount()); } foreach ($status as $channel => $channelData) { list($channelKey, $channelType) = explode(':', $channel); $streamChannel = CM_Model_StreamChannel_Message::findByKeyAndAdapter($channelKey, $adapter->getType()); $this->assertInstanceOf('CM_Model_StreamChannel_Message', $streamChannel); foreach ($channelData['subscribers'] as $clientKey => $subscriberData) { $subscribe = CM_Model_Stream_Subscribe::findByKeyAndChannel($clientKey, $streamChannel); $this->assertInstanceOf('CM_Model_Stream_Subscribe', $subscribe); $this->assertSameTime(time() - CM_MessageStream_Adapter_SocketRedis::SYNCHRONIZE_DELAY - 1, $subscribe->getStart()); } } }