/** @BeforeSuite
  * @param BeforeSuiteScope $scope
  *
  * @throws \Exception
  */
 public static function loadMagentoConfiguration(BeforeSuiteScope $scope)
 {
     $environment = $scope->getEnvironment();
     if (!$environment->getSuite()->hasSetting('parameters')) {
         throw new \Exception('You must set the parameters scetion of the behat.yml');
     }
     $parameters = $environment->getSuite()->getSetting('parameters');
     if (!isset($parameters['magentoSettings'])) {
         throw new \Exception('You must include the magentoSetting in the behat.yml file');
     }
     $magentoSetting = $parameters['magentoSettings'];
     self::$_magentoSetting = $magentoSetting;
 }
 /** @BeforeSuite
  * @param BeforeSuiteScope $scope
  *
  * @throws \Exception
  */
 public static function loadErrorDetectionConfiguration(BeforeSuiteScope $scope)
 {
     $environment = $scope->getEnvironment();
     if (!$environment->getSuite()->hasSetting('parameters')) {
         $parameters['w3cValidationSettings']['errorThreshold'] = 0;
     } else {
         $parameters = $environment->getSuite()->getSetting('parameters');
     }
     if (!isset($parameters['w3cValidationSettings'])) {
         throw new \Exception('You must include the errorDetectionSettings in the behat.yml file');
     }
     $w3cValidationSettings = $parameters['w3cValidationSettings'];
     self::$_w3cValidationSettings = $w3cValidationSettings;
 }
 /**
  * Start up the built in httpd in php-5.4
  *
  * @BeforeSuite
  */
 public static function setUp(BeforeSuiteScope $scope)
 {
     $contexts = $scope->getSuite()->getSettings()['contexts'];
     $params = $contexts[0]['FeatureContext'];
     $url = parse_url($params['url']);
     $port = !empty($url['port']) ? $url['port'] : 80;
     if (self::canConnectToHttpd($url['host'], $port)) {
         throw new RuntimeException('Something is already running on ' . $params['url'] . '. Aborting tests.');
     }
     // Empty httpd log before starting new server
     if (is_writeable($params['httpdLog'])) {
         file_put_contents($params['httpdLog'], '');
     }
     $pid = self::startBuiltInHttpd($url['host'], $port, $params['documentRoot'], $params['router'], $params['httpdLog']);
     if (!$pid) {
         // Could not start the httpd for some reason
         throw new RuntimeException('Could not start the web server');
     }
     // Try to connect
     $start = microtime(true);
     $connected = false;
     while (microtime(true) - $start <= (int) $params['timeout']) {
         if (self::canConnectToHttpd($url['host'], $port)) {
             $connected = true;
             break;
         }
     }
     if (!$connected) {
         throw new RuntimeException(sprintf('Could not connect to the web server within the given timeframe (%d second(s))', $params['timeout']));
     }
     // Register a shutdown function that will automatically shut down the httpd
     register_shutdown_function(function () use($pid) {
         exec('kill ' . $pid);
     });
     self::$testSessionId = uniqid('', true);
 }
 /**
  * @BeforeSuite
  */
 public static function setup(BeforeSuiteScope $scope)
 {
     self::$suite = $scope->getSuite();
 }
 /** 
  * Starts the phantomjs GhostDriver for UI tests
  * 
  * Add a 'ghostd:   { port: 8643 }' suite setting to your `behat.yml` file.
  * 
  * @BeforeSuite
  */
 public static function startGhostDriver(BeforeSuiteScope $scope)
 {
     if ($scope->getSuite()->hasSetting('ghostd')) {
         $config = $scope->getSuite()->getSetting('ghostd');
         $port = $config['port'];
         $host = 'localhost';
         // launch if not already up
         if (!self::serverIsUp($host, $port)) {
             $command = "phantomjs --webdriver={$port} >/dev/null 2>&1 & echo \$!";
             $output = trim(shell_exec($command));
             self::$ghostDriverPid = is_numeric($output) ? intval($output) : null;
         }
         // check that the server is running, wait up to 5 seconds
         $attempts = 0;
         do {
             $up = self::serverIsUp($host, $port);
             $attempts++;
             usleep(100000);
             // 0.1 sec
         } while (!$up && $attempts < 50);
         if (!$up) {
             self::stopProcess(self::$ghostDriverPid);
             // just in case it *did* start but did not respond in time
             throw new \RuntimeException("Could not start ghost driver at {$host}:{$port}");
         }
     }
 }