From b5c0ad9a6ca2888d55088935081cc7ff42ce0994 Mon Sep 17 00:00:00 2001 From: Tim Otten Date: Mon, 22 Apr 2013 10:06:25 -0700 Subject: [PATCH] CRM-11948 - Apply patch for running with a remote Selenium server. (This isn't currently/strictly needed for CRM-11948 but was previously written for it -- and it's come up in other contexts.) ---------------------------------------- * CRM-11948: Run WebTests under Jenkins http://issues.civicrm.org/jira/browse/CRM-11948 --- CRM/Utils/Network.php | 81 +++++++++++++++++++ .../CiviTest/CiviSeleniumSettings.php.txt | 20 +++++ .../phpunit/CiviTest/CiviSeleniumTestCase.php | 17 ++++ 3 files changed, 118 insertions(+) create mode 100644 CRM/Utils/Network.php diff --git a/CRM/Utils/Network.php b/CRM/Utils/Network.php new file mode 100644 index 0000000000..11dc5157f5 --- /dev/null +++ b/CRM/Utils/Network.php @@ -0,0 +1,81 @@ += time()) { + $found = self::checkService($host, $port, $end - time()); + if ($found) { + return TRUE; + } + usleep($interval_usec); + } + return FALSE; + } + + /** + * Check whether a TCP service is available on $host and $port + */ + public static function checkService($host, $port, $serverConnectionTimeOut) { + $old_error_reporting = error_reporting(); + error_reporting($old_error_reporting & ~E_WARNING); + try { + $fh = fsockopen($host, $port, $errno, $errstr, $serverConnectionTimeOut); + if ($fh) { + fclose($fh); + error_reporting($old_error_reporting); + return TRUE; + } + } catch (Exception $e) { + } + error_reporting($old_error_reporting); + return FALSE; + } +} \ No newline at end of file diff --git a/tests/phpunit/CiviTest/CiviSeleniumSettings.php.txt b/tests/phpunit/CiviTest/CiviSeleniumSettings.php.txt index ec8fe93ee6..96efd31993 100644 --- a/tests/phpunit/CiviTest/CiviSeleniumSettings.php.txt +++ b/tests/phpunit/CiviTest/CiviSeleniumSettings.php.txt @@ -6,6 +6,16 @@ class CiviSeleniumSettings { var $browser = '*firefox'; + /** + * @var string SeleniumRC host name + */ + var $rcHost = 'localhost'; + + /** + * @var int SeleniumRC port number + */ + var $rcPort = 4444; + var $sandboxURL = 'http://devel.drupal.tests.dev.civicrm.org'; var $sandboxPATH = ''; @@ -25,6 +35,16 @@ class CiviSeleniumSettings { */ var $timeout = 30; + /** + * @var int|NULL seconds to wait for SeleniumRC to become available + * + * If you have custom scripts which launch Selenium and PHPUnit in tandem, then + * Selenium may initialize somewhat slowly. Set $serverStartupTimeOut to wait + * for Selenium to startup. If you launch Selenium independently or otherwise + * prefer to fail immediately, then leave the default value NULL. + */ + var $serverStartupTimeOut = NULL; + function __construct() { $this->fullSandboxPath = $this->sandboxURL . $this->sandboxPATH; } diff --git a/tests/phpunit/CiviTest/CiviSeleniumTestCase.php b/tests/phpunit/CiviTest/CiviSeleniumTestCase.php index 9caeec4d77..74431f40db 100644 --- a/tests/phpunit/CiviTest/CiviSeleniumTestCase.php +++ b/tests/phpunit/CiviTest/CiviSeleniumTestCase.php @@ -69,6 +69,17 @@ class CiviSeleniumTestCase extends PHPUnit_Extensions_SeleniumTestCase { require_once 'CiviSeleniumSettings.php'; $this->settings = new CiviSeleniumSettings(); + if (property_exists($this->settings, 'serverStartupTimeOut') && $this->settings->serverStartupTimeOut) { + global $CiviSeleniumTestCase_polled; + if (!$CiviSeleniumTestCase_polled) { + $CiviSeleniumTestCase_polled = TRUE; + CRM_Utils_Network::waitForServiceStartup( + $this->drivers[0]->getHost(), + $this->drivers[0]->getPort(), + $this->settings->serverStartupTimeOut + ); + } + } // autoload require_once 'CRM/Core/ClassLoader.php'; @@ -84,6 +95,12 @@ class CiviSeleniumTestCase extends PHPUnit_Extensions_SeleniumTestCase { // Make sure that below strings have path separator at the end $this->setBrowserUrl($this->settings->sandboxURL); $this->sboxPath = $this->settings->sandboxPATH; + if (property_exists($this->settings, 'rcHost') && $this->settings->rcHost) { + $this->setHost($this->settings->rcHost); + } + if (property_exists($this->settings, 'rcPort') && $this->settings->rcPort) { + $this->setPort($this->settings->rcPort); + } } protected function tearDown() { -- 2.25.1