1
0
mirror of https://github.com/e107inc/e107.git synced 2025-08-12 09:34:54 +02:00

Preparation for merge with e107 repository

Moved all test files to e107_tests subdirectory
This commit is contained in:
Deltik
2019-11-27 11:18:53 -06:00
parent a07bc04280
commit e49ee50d31
206 changed files with 5 additions and 10 deletions

View File

@@ -0,0 +1,66 @@
<?php
class E107Preparer implements Preparer
{
const TEST_HASH = '000000test'; // see e107_config.php
public function snapshot()
{
return $this->deleteHashDirs();
}
public function rollback()
{
return $this->deleteHashDirs();
}
protected function deleteHashDirs()
{
$system = APP_PATH."/e107_system/".self::TEST_HASH;
$this->deleteDir($system);
$media = APP_PATH."/e107_media/".self::TEST_HASH;
$this->deleteDir($media);
if(is_dir($system))
{
throw new Exception(get_class() . " couldn't delete ".$system);
}
}
private function deleteDir($dirPath)
{
codecept_debug(get_class() . ' is deleting '.escapeshellarg($dirPath).'…');
if(!is_dir($dirPath))
{
// echo ($dirPath . "must be a directory");
return null;
}
if(substr($dirPath, strlen($dirPath) - 1, 1) != '/')
{
$dirPath .= '/';
}
$files = glob($dirPath . '*', GLOB_MARK);
foreach($files as $file)
{
if(is_dir($file))
{
$this->deleteDir($file);
}
else
{
unlink($file);
}
}
if(is_dir($dirPath))
{
rmdir($dirPath);
}
}
}

View File

@@ -0,0 +1,122 @@
<?php
class GitPreparer implements Preparer
{
const TEST_IN_PROGRESS = 'TEST-IN-PROGRESS';
const TEST_IN_PROGRESS_FILE = APP_PATH."/".self::TEST_IN_PROGRESS;
public function snapshot()
{
$this->debug('Snapshot requested');
return $this->setVcsInProgress();
}
public function rollback()
{
$this->debug('Rollback requested');
return $this->unsetVcsInProgress();
}
protected function setVcsInProgress()
{
// Cleanup in case of a fatal error
PriorityCallbacks::instance()->register_shutdown_function([$this, 'rollback']);
if ($this->isVcsInProgress())
{
$this->debug('Git repo shows test in progress. Probably crashed test.');
$this->unsetVcsInProgress();
}
$this->debug('Setting test locks in Git…');
touch(self::TEST_IN_PROGRESS_FILE);
$this->runCommand('git add -f '.escapeshellarg(self::TEST_IN_PROGRESS_FILE));
$this->runCommand('git add -A -f');
$commit_command = 'git commit -a --no-gpg-sign ' .
"-m '".self::TEST_IN_PROGRESS."! If test crashed, run `git log -1` for instructions' " .
"-m 'Running the test again after fixing the crash will clear this commit\nand any related stashes.' " .
"-m 'Alternatively, run these commands to restore the repository to its\npre-test state:' ";
$unsetVcsInProgress_commands = [
'git reset --hard HEAD',
'git clean -fdx',
// 'git stash pop',
'git reset --mixed HEAD^',
'rm -fv '.escapeshellarg(self::TEST_IN_PROGRESS)
];
foreach($unsetVcsInProgress_commands as $command)
{
$commit_command .= "-m ".escapeshellarg($command)." ";
}
$this->runCommand($commit_command);
// $this->runCommand('git stash push --all -m '.escapeshellarg(self::TEST_IN_PROGRESS));
}
protected function isVcsInProgress($case = '')
{
$in_progress = [];
$in_progress['file'] = file_exists(self::TEST_IN_PROGRESS_FILE);
$stdout = '';
$this->runCommand('git log -1 --pretty=%B', $stdout);
$in_progress['commit'] = strpos($stdout, self::TEST_IN_PROGRESS) !== false;
$stdout = '';
$this->runCommand('git stash list', $stdout);
$in_progress['stash'] = strpos($stdout, self::TEST_IN_PROGRESS) !== false;
if(!empty($case)) return $in_progress[$case];
return in_array(true, $in_progress);
}
protected function runCommand($command, &$stdout = "", &$stderr = "")
{
$descriptorspec = [
1 => ['pipe', 'w'],
2 => ['pipe', 'w'],
];
$pipes = [];
$resource = proc_open($command, $descriptorspec, $pipes, APP_PATH);
$stdout .= stream_get_contents($pipes[1]);
$stderr .= stream_get_contents($pipes[2]);
foreach ($pipes as $pipe)
{
fclose($pipe);
}
proc_close($resource);
}
protected function unsetVcsInProgress()
{
if (!$this->isVcsInProgress())
{
$this->debug('No test locks found');
return;
}
$this->debug('Rolling back Git repo to pre-test state…');
$this->runCommand('git reset --hard HEAD');
$this->runCommand('git clean -fdx');
while ($this->isVcsInProgress('commit'))
{
$this->debug('Going back one commit…');
$this->runCommand('git reset --mixed HEAD^');
}
while ($this->isVcsInProgress('stash'))
{
$this->debug('Popping top of stash…');
$this->runCommand('git stash pop');
}
@unlink(self::TEST_IN_PROGRESS_FILE);
}
protected function debug($message)
{
codecept_debug(get_class() . ': ' . $message);
}
}

View File

@@ -0,0 +1,7 @@
<?php
interface Preparer
{
public function snapshot();
public function rollback();
}

View File

@@ -0,0 +1,57 @@
<?php
spl_autoload_register(function($class_name) {
$candidate_path = __DIR__ . "/$class_name.php";
if (file_exists($candidate_path))
{
include_once($candidate_path);
}
});
class PreparerFactory
{
/**
* @return Preparer
*/
public static function create()
{
if (self::systemIsSlow())
{
return self::createFromName('E107Preparer');
}
elseif (self::systemHasGit() && self::appPathIsGitRepo())
{
return self::createFromName('GitPreparer');
}
return self::createFromName('E107Preparer');
}
/**
* @param $class_name
* @return Preparer
*/
public static function createFromName($class_name)
{
codecept_debug('Instantiating Preparer: ' . $class_name);
return new $class_name();
}
private static function systemIsSlow()
{
return self::systemIsWindows();
}
private static function systemIsWindows()
{
return strtolower(substr(php_uname('s'), 0, 3)) === 'win';
}
private static function systemHasGit()
{
return stripos(shell_exec('git --version'), 'git version') !== false;
}
private static function appPathIsGitRepo()
{
return file_exists(APP_PATH."/.git");
}
}