2015-05-24 19:32:32 +00:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* This is project's console commands configuration for Robo task runner.
|
|
|
|
*
|
|
|
|
* Download robo.phar from http://robo.li/robo.phar and type in the root of the repo: $ php robo.phar
|
|
|
|
* Or do: $ composer update, and afterwards you will be able to execute robo like $ php vendor/bin/robo
|
|
|
|
*
|
|
|
|
* @see http://robo.li/
|
|
|
|
*/
|
|
|
|
|
2015-05-30 20:11:54 +00:00
|
|
|
require_once 'vendor/autoload.php';
|
2015-05-24 19:32:32 +00:00
|
|
|
|
2015-11-01 07:44:16 +00:00
|
|
|
if (!defined('JPATH_BASE'))
|
|
|
|
{
|
|
|
|
define('JPATH_BASE', __DIR__);
|
|
|
|
}
|
|
|
|
|
2015-05-24 19:32:32 +00:00
|
|
|
class RoboFile extends \Robo\Tasks
|
|
|
|
{
|
2015-05-30 20:11:54 +00:00
|
|
|
// Load tasks from composer, see composer.json
|
|
|
|
use \joomla_projects\robo\loadTasks;
|
2015-11-01 07:44:16 +00:00
|
|
|
use \JBuild\Tasks\loadTasks;
|
2015-05-24 19:32:32 +00:00
|
|
|
|
2015-05-30 19:31:14 +00:00
|
|
|
private $extension = '';
|
2015-05-30 20:11:54 +00:00
|
|
|
|
2015-10-29 10:12:58 +00:00
|
|
|
private $configuration = array();
|
|
|
|
|
2015-10-29 13:52:04 +00:00
|
|
|
private $cmsPath = '';
|
|
|
|
|
2015-10-31 10:31:08 +00:00
|
|
|
/**
|
|
|
|
* Constructor
|
|
|
|
*/
|
|
|
|
public function __construct()
|
|
|
|
{
|
|
|
|
$this->configuration = $this->getConfiguration();
|
|
|
|
|
|
|
|
$this->cmsPath = $this->getCmsPath();
|
|
|
|
|
|
|
|
// TODO make this coherent with the above initializations
|
|
|
|
$this->setExecExtension();
|
|
|
|
}
|
|
|
|
|
2015-05-30 20:11:54 +00:00
|
|
|
/**
|
2015-06-11 15:34:33 +00:00
|
|
|
* Set the Execute extension for Windows Operating System
|
2015-05-30 20:11:54 +00:00
|
|
|
*
|
|
|
|
* @return void
|
2015-05-30 20:17:14 +00:00
|
|
|
*/
|
2015-06-11 15:34:33 +00:00
|
|
|
private function setExecExtension()
|
2015-05-30 20:11:54 +00:00
|
|
|
{
|
2015-10-30 09:38:10 +00:00
|
|
|
if ($this->isWindows())
|
2015-05-30 20:11:54 +00:00
|
|
|
{
|
2015-05-30 19:31:14 +00:00
|
|
|
$this->extension = '.exe';
|
|
|
|
}
|
|
|
|
}
|
2015-05-30 20:11:54 +00:00
|
|
|
|
|
|
|
/**
|
2015-06-09 11:53:47 +00:00
|
|
|
* Executes all the Selenium System Tests in a suite on your machine
|
2015-05-30 20:11:54 +00:00
|
|
|
*
|
2015-10-30 09:43:37 +00:00
|
|
|
* @param bool $use_htaccess Renames and enable embedded Joomla .htaccess file
|
2015-05-30 20:11:54 +00:00
|
|
|
*
|
|
|
|
* @return mixed
|
|
|
|
*/
|
2015-10-30 09:43:37 +00:00
|
|
|
public function runTests($use_htaccess = false)
|
2015-05-30 20:11:54 +00:00
|
|
|
{
|
2015-10-30 09:43:37 +00:00
|
|
|
$this->createTestingSite($use_htaccess);
|
2015-05-30 20:11:54 +00:00
|
|
|
|
2015-09-30 17:29:14 +00:00
|
|
|
$this->getComposer();
|
2015-05-30 20:11:54 +00:00
|
|
|
|
2015-09-30 17:29:14 +00:00
|
|
|
$this->taskComposerInstall()->run();
|
2015-05-30 20:11:54 +00:00
|
|
|
|
2015-09-30 17:29:14 +00:00
|
|
|
$this->runSelenium();
|
2015-05-24 19:32:32 +00:00
|
|
|
|
2015-10-30 15:38:49 +00:00
|
|
|
// Make sure to run the build command to generate AcceptanceTester
|
2015-10-30 15:11:05 +00:00
|
|
|
$this->_exec($this->isWindows() ? 'vendor\bin\codecept.bat build' : 'php vendor/bin/codecept build');
|
2015-05-24 19:32:32 +00:00
|
|
|
|
2015-09-30 17:29:14 +00:00
|
|
|
$this->taskCodecept()
|
|
|
|
->arg('--steps')
|
|
|
|
->arg('--debug')
|
|
|
|
->arg('--fail-fast')
|
|
|
|
->arg('tests/acceptance/install/')
|
2015-05-30 20:11:54 +00:00
|
|
|
->run()
|
|
|
|
->stopOnFail();
|
2015-05-24 19:32:32 +00:00
|
|
|
|
2015-09-30 17:29:14 +00:00
|
|
|
$this->taskCodecept()
|
|
|
|
->arg('--steps')
|
|
|
|
->arg('--debug')
|
|
|
|
->arg('--fail-fast')
|
|
|
|
->arg('tests/acceptance/administrator/')
|
|
|
|
->run()
|
|
|
|
->stopOnFail();
|
2015-05-30 20:11:54 +00:00
|
|
|
|
|
|
|
$this->taskCodecept()
|
|
|
|
->arg('--steps')
|
|
|
|
->arg('--debug')
|
2015-09-30 17:29:14 +00:00
|
|
|
->arg('--fail-fast')
|
|
|
|
->arg('tests/acceptance/frontend/')
|
2015-05-30 20:11:54 +00:00
|
|
|
->run()
|
|
|
|
->stopOnFail();
|
|
|
|
/*
|
|
|
|
// Uncomment this lines if you need to debug selenium errors
|
|
|
|
$seleniumErrors = file_get_contents('selenium.log');
|
|
|
|
if ($seleniumErrors) {
|
|
|
|
$this->say('Printing Selenium Log files');
|
|
|
|
$this->say('------ selenium.log (start) ---------');
|
|
|
|
$this->say($seleniumErrors);
|
|
|
|
$this->say('------ selenium.log (end) -----------');
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
}
|
2015-06-09 11:53:47 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Executes a specific Selenium System Tests in your machine
|
|
|
|
*
|
|
|
|
* @param string $seleniumPath Optional path to selenium-standalone-server-x.jar
|
|
|
|
* @param string $pathToTestFile Optional name of the test to be run
|
|
|
|
* @param string $suite Optional name of the suite containing the tests, Acceptance by default.
|
|
|
|
*
|
|
|
|
* @return mixed
|
|
|
|
*/
|
2015-09-30 17:29:14 +00:00
|
|
|
public function runTest($pathToTestFile = null, $suite = 'acceptance')
|
2015-06-09 11:53:47 +00:00
|
|
|
{
|
2015-09-30 17:29:14 +00:00
|
|
|
$this->runSelenium();
|
2015-06-09 11:53:47 +00:00
|
|
|
|
2015-10-30 15:38:49 +00:00
|
|
|
// Make sure to run the build command to generate AcceptanceTester
|
2015-10-30 15:11:05 +00:00
|
|
|
$this->_exec($this->isWindows() ? 'vendor\bin\codecept.bat build' : 'php vendor/bin/codecept build');
|
2015-06-09 11:53:47 +00:00
|
|
|
|
|
|
|
if (!$pathToTestFile)
|
|
|
|
{
|
|
|
|
$this->say('Available tests in the system:');
|
2015-09-30 17:29:14 +00:00
|
|
|
|
|
|
|
$iterator = new RecursiveIteratorIterator(
|
|
|
|
new RecursiveDirectoryIterator(
|
|
|
|
'tests/' . $suite,
|
|
|
|
RecursiveDirectoryIterator::SKIP_DOTS
|
|
|
|
),
|
|
|
|
RecursiveIteratorIterator::SELF_FIRST
|
|
|
|
);
|
|
|
|
|
|
|
|
$tests = array();
|
|
|
|
|
|
|
|
$iterator->rewind();
|
2015-06-09 11:53:47 +00:00
|
|
|
$i = 1;
|
2015-06-09 17:10:05 +00:00
|
|
|
|
2015-09-30 17:29:14 +00:00
|
|
|
while ($iterator->valid())
|
2015-06-09 11:53:47 +00:00
|
|
|
{
|
2015-09-30 17:29:14 +00:00
|
|
|
if (strripos($iterator->getSubPathName(), 'cept.php')
|
|
|
|
|| strripos($iterator->getSubPathName(), 'cest.php'))
|
2015-06-09 11:53:47 +00:00
|
|
|
{
|
2015-09-30 17:29:14 +00:00
|
|
|
$this->say('[' . $i . '] ' . $iterator->getSubPathName());
|
|
|
|
$tests[$i] = $iterator->getSubPathName();
|
2015-06-09 11:53:47 +00:00
|
|
|
$i++;
|
|
|
|
}
|
2015-09-30 17:29:14 +00:00
|
|
|
|
|
|
|
$iterator->next();
|
2015-06-09 11:53:47 +00:00
|
|
|
}
|
2015-06-09 17:10:05 +00:00
|
|
|
|
2015-06-09 11:53:47 +00:00
|
|
|
$this->say('');
|
2015-09-30 17:29:14 +00:00
|
|
|
$testNumber = $this->ask('Type the number of the test in the list that you want to run...');
|
|
|
|
$test = $tests[$testNumber];
|
2015-06-09 11:53:47 +00:00
|
|
|
}
|
|
|
|
|
2015-09-30 17:29:14 +00:00
|
|
|
$pathToTestFile = 'tests/' . $suite . '/' . $test;
|
|
|
|
|
2015-06-09 11:53:47 +00:00
|
|
|
$this->taskCodecept()
|
|
|
|
->test($pathToTestFile)
|
|
|
|
->arg('--steps')
|
|
|
|
->arg('--debug')
|
|
|
|
->run()
|
|
|
|
->stopOnFail();
|
|
|
|
}
|
2015-10-29 10:14:35 +00:00
|
|
|
|
2015-10-31 11:54:14 +00:00
|
|
|
/**
|
|
|
|
* Run the specified checker tool. Valid options are phpmd, phpcs, phpcpd
|
|
|
|
*
|
|
|
|
* @param string $tool
|
|
|
|
*
|
|
|
|
* @return bool
|
|
|
|
*/
|
2015-10-31 10:04:54 +00:00
|
|
|
public function runChecker($tool = null)
|
|
|
|
{
|
|
|
|
if ($tool === null) {
|
|
|
|
$this->say('You have to specify a tool name as argument. Valid tools are phpmd, phpcs, phpcpd.');
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!in_array($tool, array('phpmd', 'phpcs', 'phpcpd') )) {
|
|
|
|
$this->say('The tool you required is not known. Valid tools are phpmd, phpcs, phpcpd.');
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch ($tool) {
|
|
|
|
case 'phpmd':
|
|
|
|
return $this->runPhpmd();
|
|
|
|
|
|
|
|
case 'phpcs':
|
|
|
|
return $this->runPhpcs();
|
|
|
|
|
|
|
|
case 'phpcpd':
|
|
|
|
return $this->runPhpcpd();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-06-09 11:53:47 +00:00
|
|
|
/**
|
|
|
|
* Creates a testing Joomla site for running the tests (use it before run:test)
|
2015-10-30 09:43:37 +00:00
|
|
|
*
|
|
|
|
* @param bool $use_htaccess (1/0) Rename and enable embedded Joomla .htaccess file
|
2015-06-09 11:53:47 +00:00
|
|
|
*/
|
2015-10-30 09:43:37 +00:00
|
|
|
public function createTestingSite($use_htaccess = false)
|
2015-06-09 11:53:47 +00:00
|
|
|
{
|
2015-10-29 15:06:04 +00:00
|
|
|
if (!empty($this->configuration->skipClone))
|
|
|
|
{
|
2015-10-29 13:52:04 +00:00
|
|
|
$this->say('Reusing Joomla CMS site already present at ' . $this->cmsPath);
|
2015-10-29 10:12:58 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-10-29 14:49:33 +00:00
|
|
|
// Caching cloned installations locally
|
|
|
|
if (!is_dir('tests/cache') || (time() - filemtime('tests/cache') > 60 * 60 * 24))
|
|
|
|
{
|
2015-10-30 09:38:10 +00:00
|
|
|
$this->_exec($this->buildGitCloneCommand());
|
2015-10-29 10:12:58 +00:00
|
|
|
}
|
|
|
|
|
2015-06-09 11:53:47 +00:00
|
|
|
// Get Joomla Clean Testing sites
|
2015-10-29 13:52:04 +00:00
|
|
|
if (is_dir($this->cmsPath))
|
2015-06-09 11:53:47 +00:00
|
|
|
{
|
2015-10-31 10:09:22 +00:00
|
|
|
try
|
|
|
|
{
|
|
|
|
$this->taskDeleteDir($this->cmsPath)->run();
|
|
|
|
}
|
|
|
|
catch (Exception $e)
|
|
|
|
{
|
|
|
|
// Sorry, we tried :(
|
|
|
|
$this->say('Sorry, you will have to delete ' . $this->cmsPath . ' manually. ');
|
|
|
|
exit(1);
|
|
|
|
}
|
2015-06-09 11:53:47 +00:00
|
|
|
}
|
|
|
|
|
2015-10-29 16:46:09 +00:00
|
|
|
$this->_copyDir('tests/cache', $this->cmsPath);
|
2015-10-30 14:56:05 +00:00
|
|
|
|
|
|
|
// Optionally change owner to fix permissions issues
|
|
|
|
if (!empty($this->configuration->localUser) && !$this->isWindows())
|
|
|
|
{
|
|
|
|
$this->_exec('chown -R ' . $this->configuration->localUser . ' ' . $this->cmsPath);
|
|
|
|
}
|
|
|
|
|
2015-11-01 07:44:16 +00:00
|
|
|
// Copy current package
|
|
|
|
if (!file_exists('dist/pkg-weblinks-current.zip'))
|
|
|
|
{
|
|
|
|
$this->build(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->_copy('dist/pkg-weblinks-current.zip', $this->cmsPath . "/pkg-weblinks-current.zip");
|
|
|
|
|
2015-10-29 13:52:04 +00:00
|
|
|
$this->say('Joomla CMS site created at ' . $this->cmsPath);
|
2015-10-29 14:49:33 +00:00
|
|
|
|
2015-10-30 13:36:20 +00:00
|
|
|
// Optionally uses Joomla default htaccess file. Used by TravisCI
|
2015-10-30 09:43:37 +00:00
|
|
|
if ($use_htaccess == true)
|
|
|
|
{
|
2015-10-31 11:22:02 +00:00
|
|
|
$this->_copy('./tests/joomla-cms3/htaccess.txt', './tests/joomla-cms3/.htaccess');
|
2015-10-31 11:37:27 +00:00
|
|
|
$this->_exec('sed -e "s,# RewriteBase /,RewriteBase /tests/joomla-cms3/,g" -in-place tests/joomla-cms3/.htaccess');
|
2015-10-30 09:43:37 +00:00
|
|
|
}
|
2015-06-09 11:53:47 +00:00
|
|
|
}
|
2015-09-30 17:29:14 +00:00
|
|
|
|
2015-10-29 10:12:58 +00:00
|
|
|
/**
|
|
|
|
* Get (optional) configuration from an external file
|
|
|
|
*
|
2015-10-29 11:58:49 +00:00
|
|
|
* @return \stdClass|null
|
2015-10-29 10:12:58 +00:00
|
|
|
*/
|
|
|
|
public function getConfiguration()
|
|
|
|
{
|
|
|
|
$configurationFile = __DIR__ . '/RoboFile.ini';
|
2015-10-29 11:58:49 +00:00
|
|
|
|
2015-10-29 15:06:04 +00:00
|
|
|
if (!file_exists($configurationFile))
|
|
|
|
{
|
2015-10-29 10:12:58 +00:00
|
|
|
$this->say("No local configuration file");
|
2015-10-29 11:58:49 +00:00
|
|
|
return null;
|
2015-10-29 10:12:58 +00:00
|
|
|
}
|
|
|
|
|
2015-10-29 11:58:49 +00:00
|
|
|
$configuration = parse_ini_file($configurationFile);
|
2015-10-29 15:06:04 +00:00
|
|
|
if ($configuration === false)
|
|
|
|
{
|
2015-10-29 11:58:49 +00:00
|
|
|
$this->say('Local configuration file is empty or wrong (check is it in correct .ini format');
|
|
|
|
return null;
|
2015-10-29 10:12:58 +00:00
|
|
|
}
|
2015-10-29 11:58:49 +00:00
|
|
|
|
|
|
|
return json_decode(json_encode($configuration));
|
2015-10-29 10:12:58 +00:00
|
|
|
}
|
|
|
|
|
2015-10-30 09:38:10 +00:00
|
|
|
/**
|
|
|
|
* Build correct git clone command according to local configuration and OS
|
|
|
|
*
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
private function buildGitCloneCommand()
|
|
|
|
{
|
|
|
|
$branch = empty($this->configuration->branch) ? 'staging' : $this->configuration->branch;
|
|
|
|
|
2015-10-31 10:28:05 +00:00
|
|
|
return "git" . $this->extension . " clone -b $branch --single-branch --depth 1 https://github.com/joomla/joomla-cms.git tests/cache";
|
2015-10-30 09:38:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Check if local OS is Windows
|
|
|
|
*
|
|
|
|
* @return bool
|
|
|
|
*/
|
|
|
|
private function isWindows()
|
|
|
|
{
|
|
|
|
return strtoupper(substr(PHP_OS, 0, 3)) === 'WIN';
|
|
|
|
}
|
|
|
|
|
2015-10-29 13:52:04 +00:00
|
|
|
/**
|
|
|
|
* Get the correct CMS root path
|
|
|
|
*
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
private function getCmsPath()
|
|
|
|
{
|
2015-10-29 15:06:04 +00:00
|
|
|
if (empty($this->configuration->cmsPath))
|
|
|
|
{
|
2015-10-29 13:52:04 +00:00
|
|
|
return 'tests/joomla-cms3';
|
|
|
|
}
|
|
|
|
|
2015-10-29 15:06:04 +00:00
|
|
|
if (!file_exists(dirname($this->configuration->cmsPath)))
|
|
|
|
{
|
2015-10-29 13:52:04 +00:00
|
|
|
$this->say("Cms path written in local configuration does not exists or is not readable");
|
|
|
|
return 'tests/joomla-cms3';
|
|
|
|
}
|
|
|
|
|
|
|
|
return $this->configuration->cmsPath;
|
|
|
|
}
|
|
|
|
|
2015-09-30 17:29:14 +00:00
|
|
|
/**
|
|
|
|
* Runs Selenium Standalone Server.
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
public function runSelenium()
|
|
|
|
{
|
|
|
|
if (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN')
|
|
|
|
{
|
|
|
|
$this->_exec("vendor/bin/selenium-server-standalone >> selenium.log 2>&1 &");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
$this->_exec("START java.exe -jar .\\vendor\\joomla-projects\\selenium-server-standalone\\bin\\selenium-server-standalone.jar");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN')
|
|
|
|
{
|
|
|
|
sleep(10);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
$this->taskWaitForSeleniumStandaloneServer()
|
|
|
|
->run()
|
|
|
|
->stopOnFail();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Downloads Composer
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
private function getComposer()
|
|
|
|
{
|
|
|
|
// Make sure we have Composer
|
|
|
|
if (!file_exists('./composer.phar'))
|
|
|
|
{
|
2015-10-31 10:28:05 +00:00
|
|
|
$insecure = $this->isWindows() ? ' --insecure' : '';
|
|
|
|
$this->_exec('curl ' . $insecure . ' --retry 3 --retry-delay 5 -sS https://getcomposer.org/installer | php');
|
2015-09-30 17:29:14 +00:00
|
|
|
}
|
|
|
|
}
|
2015-10-30 10:27:28 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Kills the selenium server running
|
|
|
|
*
|
|
|
|
* @param string $host Web host of the remote server.
|
|
|
|
* @param string $port Server port.
|
|
|
|
*/
|
|
|
|
public function killSelenium($host = 'localhost', $port = '4444')
|
|
|
|
{
|
|
|
|
$this->say('Trying to kill the selenium server.');
|
|
|
|
$this->_exec("curl http://$host:$port/selenium-server/driver/?cmd=shutDownSeleniumServer");
|
|
|
|
}
|
2015-10-31 10:04:54 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Run the phpmd tool
|
|
|
|
*/
|
|
|
|
private function runPhpmd()
|
|
|
|
{
|
|
|
|
return $this->_exec('phpmd' . $this->extension . ' ' . __DIR__ . '/src xml cleancode,codesize,controversial,design,naming,unusedcode');
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Run the phpcs tool
|
|
|
|
*/
|
|
|
|
private function runPhpcs()
|
|
|
|
{
|
|
|
|
$this->_exec('phpcs' . $this->extension . ' ' . __DIR__ . '/src');
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Run the phpcpd tool
|
|
|
|
*/
|
|
|
|
private function runPhpcpd()
|
|
|
|
{
|
|
|
|
$this->_exec('phpcpd' . $this->extension . ' ' . __DIR__ . '/src');
|
|
|
|
}
|
2015-11-01 07:44:16 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Build the joomla extension package
|
|
|
|
*
|
|
|
|
* @param array $params Additional params
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
public function build($params = ['dev' => false])
|
|
|
|
{
|
|
|
|
if (!file_exists('jbuild.ini'))
|
|
|
|
{
|
|
|
|
$this->_copy('jbuild.dist.ini', 'jbuild.ini');
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->taskBuild($params)->run();
|
|
|
|
}
|
2015-06-09 17:10:05 +00:00
|
|
|
}
|