From c72b08616bf13aa6f5e97fff6e081423ef52cf37 Mon Sep 17 00:00:00 2001 From: Nick Liu Date: Wed, 12 Sep 2018 12:54:15 -0500 Subject: [PATCH] Refactored E107Base suite cleanup into "Preparer" classes Now works with the best of both worlds: * Barebones cleanup in slow Windows environments * Git snapshots in other Git environments --- lib/preparers/E107Preparer.php | 66 ++++++++++++ lib/preparers/GitPreparer.php | 111 ++++++++++++++++++++ lib/preparers/Preparer.php | 7 ++ lib/preparers/PreparerFactory.php | 57 +++++++++++ tests/_support/Helper/E107Base.php | 157 +++-------------------------- 5 files changed, 253 insertions(+), 145 deletions(-) create mode 100644 lib/preparers/E107Preparer.php create mode 100644 lib/preparers/GitPreparer.php create mode 100644 lib/preparers/Preparer.php create mode 100644 lib/preparers/PreparerFactory.php diff --git a/lib/preparers/E107Preparer.php b/lib/preparers/E107Preparer.php new file mode 100644 index 000000000..b736e6a10 --- /dev/null +++ b/lib/preparers/E107Preparer.php @@ -0,0 +1,66 @@ +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); + } + } +} diff --git a/lib/preparers/GitPreparer.php b/lib/preparers/GitPreparer.php new file mode 100644 index 000000000..ce628faba --- /dev/null +++ b/lib/preparers/GitPreparer.php @@ -0,0 +1,111 @@ +setVcsInProgress(); + } + + public function rollback() + { + return $this->unsetVcsInProgress(); + } + + protected function setVcsInProgress() + { + 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'); + + $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() + { + $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); + } +} diff --git a/lib/preparers/Preparer.php b/lib/preparers/Preparer.php new file mode 100644 index 000000000..81f7f8ffb --- /dev/null +++ b/lib/preparers/Preparer.php @@ -0,0 +1,7 @@ +preparer = \PreparerFactory::create(); + } public function _beforeSuite($settings = array()) { $this->backupLocalE107Config(); - $this->deleteHashDirs(); - // $this->setVcsInProgress(); + $this->preparer->snapshot(); parent::_beforeSuite($settings); $this->writeLocalE107Config(); } - 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)) - { - echo "Couldn't delete ".$system; - } - - } - - private function deleteDir($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); - } - } - protected function backupLocalE107Config() { if(file_exists(self::APP_PATH_E107_CONFIG)) @@ -78,95 +35,6 @@ abstract class E107Base extends Base } } - protected function setVcsInProgress() - { - if ($this->isVcsInProgress()) - { - codecept_debug('Git repo shows test in progress. Probably crashed test.'); - $this->unsetVcsInProgress(); - } - - codecept_debug('Setting VCS in progress…'); - - touch(self::TEST_IN_PROGRESS_FILE); - $this->runCommand('git add -f '.escapeshellarg(self::TEST_IN_PROGRESS_FILE)); - $this->runCommand('git add -A'); - - $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() - { - codecept_debug('Rolling back VCS to pre-test state…'); - $this->runCommand('git reset --hard HEAD'); - $this->runCommand('git clean -fdx'); - - while ($this->isVcsInProgress('commit')) - { - codecept_debug('Going back one commit…'); - $this->runCommand('git reset --mixed HEAD^'); - } - - while ($this->isVcsInProgress('stash')) - { - codecept_debug('Popping top of stash…'); - $this->runCommand('git stash pop'); - } - - @unlink(self::TEST_IN_PROGRESS_FILE); - } - protected function writeLocalE107Config() { $twig_loader = new \Twig_Loader_Array([ @@ -191,9 +59,8 @@ abstract class E107Base extends Base { parent::_afterSuite(); $this->revokeLocalE107Config(); - // $this->unsetVcsInProgress(); + $this->preparer->rollback(); $this->restoreLocalE107Config(); - $this->deleteHashDirs(); } protected function revokeLocalE107Config()