/**
  * AbstractManagerTest constructor.
  */
 public function __construct()
 {
     parent::__construct();
     $this->eventDispatcher = new EventDispatcher();
     // Configure a null logger to suppress unwanted output
     $this->logger = new Logger('TestLogger');
     $this->logger->setHandlers([new NullHandler()]);
     // Configure a single test instance
     $this->configuration = ConfigurationParser::parseConfiguration(new ArrayReader($this->getBaseConfiguration()));
 }
 public function testParser()
 {
     $rawConfiguration = $this->getBaseConfiguration();
     // Configure two instances
     $rawConfiguration['instances'] = ['example.com' => ['address' => 'example.com', 'port' => 9981], 'foo.example.com' => ['address' => 'foo.example.com', 'port' => 9981]];
     $configuration = Parser::parseConfiguration(new ArrayReader($rawConfiguration));
     $this->assertEquals($rawConfiguration['database_path'], $configuration->getDatabasePath());
     $this->assertEquals($rawConfiguration['log_path'], $configuration->getLogPath());
     $this->assertEquals($rawConfiguration['access_token'], $configuration->getAccessToken());
     $this->assertCount(2, $configuration->getInstances());
     $this->assertEquals('example.com', $configuration->getInstanceByName('example.com')->getName());
     $this->assertEquals('foo.example.com', $configuration->getInstanceByName('foo.example.com')->getName());
     $this->assertEquals($rawConfiguration['update_interval'], $configuration->getUpdateInterval());
     $this->assertEquals($rawConfiguration['listen_address'], $configuration->getListenAddress());
     $this->assertEquals($rawConfiguration['listen_port'], $configuration->getListenPort());
     $this->assertEquals($rawConfiguration['http_listen_port'], $configuration->getHttpListenPort());
     $this->assertEquals($rawConfiguration['http_username'], $configuration->getHttpUsername());
     $this->assertEquals($rawConfiguration['http_password'], $configuration->getHttpPassword());
     $this->assertEquals([], $configuration->getInstanceByName('example.com')->getIgnoredUsers());
 }
 /**
  * @inheritdoc
  */
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     // Parse the configuration
     $configFile = $input->getArgument('configFile');
     $configuration = ConfigurationParser::parseConfiguration(new YamlReader($configFile));
     // Configure Propel and the logger
     $logger = $this->configureLogger($output, $configuration);
     $this->configurePropel($configuration, $logger);
     $injector = new Injector();
     // Configure shared instances
     $eventLoop = EventLoopFactory::create();
     $eventDispatcher = new EventDispatcher();
     $aliases = [':logger' => $logger, ':loop' => $eventLoop];
     $injector->share($configuration)->share($logger)->share($eventDispatcher)->share($eventLoop);
     // Create managers
     $statusManager = $injector->make('Jalle19\\StatusManager\\Manager\\StatusManager', $aliases);
     $instanceStateManager = $injector->make('Jalle19\\StatusManager\\Manager\\InstanceStateManager', $aliases);
     $webSocketManager = $injector->make('Jalle19\\StatusManager\\Manager\\WebSocketManager', $aliases);
     $persistenceManager = $injector->make('Jalle19\\StatusManager\\Manager\\PersistenceManager', $aliases);
     $statisticsManager = $injector->make('Jalle19\\StatusManager\\Manager\\StatisticsManager', $aliases);
     $inputErrorManager = $injector->make('Jalle19\\StatusManager\\Manager\\InputErrorManager', $aliases);
     $httpRequestManager = $injector->make('Jalle19\\StatusManager\\Manager\\HttpRequestManager', $aliases);
     // Wire the event dispatcher
     $webSocketManager->registerMessageHandler($statisticsManager);
     $webSocketManager->registerMessageHandler($webSocketManager);
     $eventDispatcher->addSubscriber($statusManager);
     $eventDispatcher->addSubscriber($instanceStateManager);
     $eventDispatcher->addSubscriber($webSocketManager);
     $eventDispatcher->addSubscriber($persistenceManager);
     $eventDispatcher->addSubscriber($inputErrorManager);
     $eventDispatcher->addSubscriber($httpRequestManager);
     // Configure the event loop and start the application
     $eventLoop->addPeriodicTimer($configuration->getUpdateInterval(), function () use($eventDispatcher) {
         // Emit an event on each tick
         $eventDispatcher->dispatch(Events::MAIN_LOOP_TICK);
     });
     $eventDispatcher->dispatch(Events::MAIN_LOOP_STARTING);
     $eventLoop->run();
 }