| 
<?php
 namespace ZeusTest;
 
 use PHPUnit_Framework_TestCase;
 use Zend\EventManager\EventManager;
 use Zend\Log\Logger;
 use Zend\Log\Writer\Noop;
 use Zeus\ServerService\Manager;
 use Zeus\ServerService\ManagerEvent;
 use Zeus\ServerService\Shared\Logger\LoggerFactory;
 use Zeus\ServerService\Shared\Logger\LoggerInterface;
 use ZeusTest\Helpers\DummyServerService;
 use ZeusTest\Helpers\ZeusFactories;
 
 class ServerServiceManagerTest extends PHPUnit_Framework_TestCase
 {
 use ZeusFactories;
 
 protected function getManager()
 {
 $sm = $this->getServiceManager();
 $logger = new Logger();
 $logger->addWriter(new Noop());
 
 $sm->setFactory(LoggerInterface::class, LoggerFactory::class);
 
 /** @var Manager $manager */
 $manager = $sm->get(Manager::class);
 
 return $manager;
 }
 
 public function setUp()
 {
 parent::setUp();
 $tmpDir = __DIR__ . '/tmp';
 
 if (!file_exists($tmpDir)) {
 mkdir($tmpDir);
 }
 file_put_contents(__DIR__ . '/tmp/test.log', '');
 }
 
 public function tearDown()
 {
 unlink(__DIR__ . '/tmp/test.log');
 rmdir(__DIR__ . '/tmp');
 parent::tearDown();
 }
 
 public function testServicesStart()
 {
 $manager = $this->getManager();
 $service = new DummyServerService([], $this->getScheduler(1), $manager->getLogger());
 $manager->registerService('test-service', $service, true);
 $manager->startServices(['test-service']);
 
 $logEntries = file_get_contents(__DIR__ . '/tmp/test.log');
 $this->assertGreaterThan(0, strpos($logEntries, 'SERVICE STARTED'));
 }
 
 public function testServiceStart()
 {
 $manager = $this->getManager();
 $service = new DummyServerService([], $this->getScheduler(1), $manager->getLogger());
 $manager->registerService('test-service', $service, true);
 $manager->startService('test-service');
 
 $logEntries = file_get_contents(__DIR__ . '/tmp/test.log');
 $this->assertGreaterThan(0, strpos($logEntries, 'SERVICE STARTED'));
 }
 
 public function testManagerEvents()
 {
 $eventsFlow = [];
 $eventHandler = function(ManagerEvent $e) use (& $eventsFlow) {
 $eventsFlow[] = $e->getName();
 $this->assertInstanceOf(Manager::class, $e->getManager());
 };
 
 $manager = $this->getManager();
 $manager->getEventManager()->attach('*', $eventHandler);
 
 $service = new DummyServerService([], $this->getScheduler(1), $manager->getLogger());
 $manager->registerService('test-service', $service, true);
 $manager->startServices(['test-service']);
 
 $this->assertContains(ManagerEvent::EVENT_SERVICE_START, $eventsFlow);
 $this->assertContains(ManagerEvent::EVENT_SERVICE_STOP, $eventsFlow);
 $this->assertContains(ManagerEvent::EVENT_MANAGER_INIT, $eventsFlow);
 }
 
 public function testManagerSignalHandling()
 {
 $eventsFlow = [];
 $eventHandler = function(ManagerEvent $e) use (& $eventsFlow) {
 $eventsFlow[] = $e->getName();
 $this->assertInstanceOf(Manager::class, $e->getManager());
 };
 
 $manager = $this->getManager();
 $manager->getEventManager()->attach('*', $eventHandler);
 
 $service = new DummyServerService(['hang' => true], $this->getScheduler(1), $manager->getLogger());
 $manager->registerService('test-service', $service, true);
 $manager->startServices(['test-service']);
 
 $this->assertContains(ManagerEvent::EVENT_SERVICE_START, $eventsFlow);
 $this->assertContains(ManagerEvent::EVENT_SERVICE_STOP, $eventsFlow);
 }
 
 public function testThatDestructorDetachesEvents()
 {
 $mockBuilder = $this->getMockBuilder(EventManager::class);
 $mockBuilder->setMethods([
 'detach',
 ]);
 
 $events = $mockBuilder->getMock();
 $events->expects($this->atLeastOnce())
 ->method('detach');
 
 $manager = new Manager([]);
 $manager->setEventManager($events);
 $logger = new Logger();
 $logger->addWriter(new Noop());
 $manager->setLogger($logger);
 $service = new DummyServerService([], $this->getScheduler(1), $logger);
 $manager->registerService('test-service', $service, true);
 $manager->startServices(['test-service']);
 $manager->__destruct();
 }
 }
 |