/** * @param SyncTask $task * * @return string */ protected function getEnvironment($task) { $environment = $this->environment; if (strlen($task->getEnvironment()) > 0) { $environment = $task->getEnvironment(); } return $environment; }
/** * Send message to beanstalkd server. * * @param SyncTask $task */ protected function send($task) { $content = json_encode(['id' => $task->getId(), 'task' => 'ongr.task.' . $task->getName(), 'args' => [implode(' ', array_merge([$task->getCommand(), '-e', $this->getEnvironment($task)], $task->getArguments()))]]); if ($this->connection) { $this->connection->useTube($task->getExchange())->put($content); } $this->logger && $this->logger->info('beanstalkd publish', [$task->getName(), $task->getPublishingType(), $task->getHost()]); }
/** * Test to check if disabled publisher do not publish. */ public function testDisabledPublisher() { $publisher = $this->getMockBuilder('ONGR\\TaskMessengerBundle\\Publishers\\BeanstalkdPublisher')->disableOriginalConstructor()->setMethods(null)->getMock(); $publisher->setEnabled(false); $task = new SyncTask(SyncTask::SYNC_TASK_BROADCAST); $task->setName('ongr:sync:download'); $publisher->expects($this->never())->method('send'); $publisher->publish($task); }
/** * Dummy test for verifying that TaskPublisher works with configured brokers. */ public function testPublish() { $client = self::createClient(); $publisher = $client->getContainer()->get('ongr_task_messenger.task_publisher.foo_publisher'); $task = new SyncTask(SyncTask::SYNC_TASK_PRESERVEHOST); $task->setName('task_foo'); $task->setCommand('command_foo'); $publisher->publish($task); $redis = new Predis\Client(); $this->verifyMessage($redis->get('test'), ['taskType' => 'task_foo', 'commandName' => 'command_foo -e test']); }
/** * Test if publisher is added correctly. */ public function testTaskPublisherConstructor() { $task = new SyncTask(SyncTask::SYNC_TASK_BROADCAST); $task->setName('ongr:sync:download'); $task->setCommand('ongr:sync:download'); $amqpPublisher = $this->getAMQPPublisher(); $amqpPublisher->expects($this->once())->method('publish')->with($task); /** @var TaskPublisher $taskPublisher */ $taskPublisher = $this->getMockBuilder('ONGR\\TaskMessengerBundle\\Service\\TaskPublisher')->setConstructorArgs([$amqpPublisher])->setMethods(null)->getMock(); $taskPublisher->publish($task); }
/** * Test if AMQPPublisher works as expected. */ public function testPublish() { $container = $this->getContainer(); $publisher = $container->get('ongr_task_messenger.publisher.default.amqp'); $logger = new NullLogger(); $publisher->setLogger($logger); $task = new SyncTask(SyncTask::SYNC_TASK_PRESERVEHOST); $task->setName('task_foo'); $task->setCommand('command_foo'); $publisher->publish($task); $this->channel->wait(); }
/** * Test if Redis works as expected. */ public function testLogging() { $container = $this->getContainer(); $publisher = $container->get('ongr_task_messenger.publisher.foo_publisher.custom'); $logger = new NullLogger(); $publisher->setLogger($logger); $task = new SyncTask(SyncTask::SYNC_TASK_PRESERVEHOST); $task->setName('task_foo'); $task->setCommand('command_foo'); $publisher->publish($task); $redis = new Predis\Client(); $this->verifyMessage($redis->get('test')); }
/** * Test if BeanstalkdPublisher works as expected. */ public function testLogging() { $container = $this->getContainer(); $publisher = $container->get('ongr_task_messenger.publisher.default.beanstalkd'); $logger = new NullLogger(); $publisher->setLogger($logger); $task = new SyncTask(SyncTask::SYNC_TASK_PRESERVEHOST); $task->setName('task_foo'); $task->setCommand('command_foo'); $publisher->publish($task); $pheanstalk = new Pheanstalk($container->getParameter('ongr_task_messenger.publisher.default.beanstalkd.host'), $container->getParameter('ongr_task_messenger.publisher.default.beanstalkd.port')); $job = $pheanstalk->watch('general')->reserve(); $jobData = json_decode($job->getData(), true); $this->assertEquals($jobData['task'], 'ongr.task.task_foo'); $this->assertEquals($jobData['args'][0], 'command_foo -e test'); }
/** * @return array */ public function getTestHandleEventData() { $out = []; // Case #0 convert. $event = new SyncTaskCompleteEvent(); $event->setTaskType(SyncTaskCompleteEvent::TASK_TYPE_CONVERT); $event->setInputFile('file.xml'); $event->setProvider('testProvider'); $event->setDataType(SyncTaskCompleteEvent::DATA_TYPE_FULL_DOCUMENTS); $event->setOutputFile('file.xml.converted.json'); $expected = new SyncTask(SyncTask::SYNC_TASK_PRESERVEHOST); $expected->setName(SyncTaskCompleteEvent::TASK_TYPE_PUSH); $expected->setArguments(['file.xml.converted.json', '-p', 'testProvider']); $out[] = [$event, $expected]; // Case #1 download. $event = new SyncTaskCompleteEvent(); $event->setTaskType(SyncTaskCompleteEvent::TASK_TYPE_DOWNLOAD); $event->setProvider('testProvider'); $event->setDataType(SyncTaskCompleteEvent::DATA_TYPE_FULL_DOCUMENTS); $event->setOutputFile('file.xml'); $event->setDataDescription('delta'); $expected = new SyncTask(SyncTask::SYNC_TASK_PRESERVEHOST); $expected->setName(SyncTaskCompleteEvent::TASK_TYPE_CONVERT); $expected->setArguments(['testProvider', 'file.xml', '-t', 'delta']); $out[] = [$event, $expected]; // Case #2 push. $event = new SyncTaskCompleteEvent(); $event->setTaskType(SyncTaskCompleteEvent::TASK_TYPE_PUSH); $event->setProvider('testProvider'); $event->setDataType(SyncTaskCompleteEvent::DATA_TYPE_FULL_DOCUMENTS); $out[] = [$event]; // Case #3 convert partial. $event = new SyncTaskCompleteEvent(); $event->setTaskType(SyncTaskCompleteEvent::TASK_TYPE_CONVERT); $event->setInputFile('file.xml'); $event->setProvider('testProvider'); $event->setDataType(SyncTaskCompleteEvent::DATA_TYPE_PARTIAL_DOCUMENTS); $event->setOutputFile('file.xml.converted.json'); $expected = new SyncTask(SyncTask::SYNC_TASK_PRESERVEHOST); $expected->setName(SyncTaskCompleteEvent::TASK_TYPE_PUSH); $expected->setArguments(['file.xml.converted.json', '-p', 'testProvider', '-d']); $out[] = [$event, $expected]; return $out; }
/** * Handles sync task complete event. * * @param SyncTaskCompleteEvent $event */ public function handleEvent($event) { switch ($event->getTaskType()) { case SyncTaskCompleteEvent::TASK_TYPE_DOWNLOAD: $task = new SyncTask(SyncTask::SYNC_TASK_PRESERVEHOST); $task->setName(SyncTaskCompleteEvent::TASK_TYPE_CONVERT); $task->setArguments([$event->getProvider(), $event->getOutputFile()]); if ($event->getDataDescription()) { $task->setArguments(array_merge($task->getArguments(), ['-t', $event->getDataDescription()])); } $this->publisher->publish($task); break; case SyncTaskCompleteEvent::TASK_TYPE_CONVERT: $task = new SyncTask(SyncTask::SYNC_TASK_PRESERVEHOST); $task->setName(SyncTaskCompleteEvent::TASK_TYPE_PUSH); $task->setArguments([$event->getOutputFile(), '-p', $event->getProvider()]); switch ($event->getDataType()) { case SyncTaskCompleteEvent::DATA_TYPE_PARTIAL_DOCUMENTS: $task->setArguments(array_merge($task->getArguments(), ['-d'])); break; default: // No other cases. break; } $this->publisher->publish($task); break; default: // No other cases. break; } }
/** * Send message to AMQP server. * * @param SyncTask $task */ protected function send($task) { $channel = $this->connection->channel(); if ($channel) { $channel->exchange_declare($task->getExchange(), $task->getPublishingType(), false, true, false); $content = json_encode(['id' => $task->getId(), 'task' => 'ongr.acme_task.' . $task->getName(), 'args' => [implode(' ', array_merge([$task->getCommand(), '-e', $this->getEnvironment($task)], $task->getArguments()))]]); $message = new AMQPMessage($content, ['content_type' => 'application/json']); $this->logger && $this->logger->info('amqp publish', [$task->getName(), $task->getPublishingType(), $task->getHost()]); $channel->basic_publish($message, $task->getExchange(), $task->getHost()); $channel->close(); } }
/** * Test to check if logging is working as expected. */ public function testLogging() { $channelMock = $this->getMockBuilder('\\PhpAmqpLib\\Channel\\AMQPChannel')->disableOriginalConstructor()->getMock(); $amqpConnection = $this->getMockBuilder('PhpAmqpLib\\Connection\\AMQPConnection')->disableOriginalConstructor()->getMock(); $amqpConnection->expects($this->once())->method('channel')->willReturn($channelMock); $connectionFactory = $this->getMockBuilder('ONGR\\TaskMessengerBundle\\Publishers\\ConnectionFactory')->disableOriginalConstructor()->setMethods(['create'])->getMock(); $connectionFactory->expects($this->once())->method('create')->willReturn($amqpConnection); $environment = 'dummy-environment'; $publisher = new AMQPPublisher($connectionFactory, $environment); $task = new SyncTask(SyncTask::SYNC_TASK_BROADCAST); $task->setName('ongr:sync:download'); $task->setCommand('ongr:sync:download'); $publisher->setLogger($this->getLoggerMock('amqp publish', ['ongr:sync:download', 'fanout', ''])); $publisher->publish($task); }
/** * Method to test whether exception is being thrown when task name is not set. */ public function testGetNameException() { $task = new SyncTask(SyncTask::SYNC_TASK_BROADCAST); $this->setExpectedException('InvalidArgumentException'); $task->getName(); }