* Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer; use Composer\Semver\VersionParser; use Composer\Package\AliasPackage; use Composer\Semver\Constraint\Constraint; use Composer\Util\Filesystem; use Composer\Util\Silencer; use PHPUnit\Framework\TestCase as BaseTestCase; use Symfony\Component\Process\ExecutableFinder; abstract class TestCase extends BaseTestCase { private static $parser; private static $executableCache = array(); public static function getUniqueTmpDirectory() { $attempts = 5; $root = sys_get_temp_dir(); do { $unique = $root . DIRECTORY_SEPARATOR . uniqid('composer-test-' . rand(1000, 9000)); if (!file_exists($unique) && Silencer::call('mkdir', $unique, 0777)) { return realpath($unique); } } while (--$attempts); throw new \RuntimeException('Failed to create a unique temporary directory.'); } protected static function getVersionParser() { if (!self::$parser) { self::$parser = new VersionParser(); } return self::$parser; } protected function getVersionConstraint($operator, $version) { $constraint = new Constraint( $operator, self::getVersionParser()->normalize($version) ); $constraint->setPrettyString($operator.' '.$version); return $constraint; } protected function getPackage($name, $version, $class = 'Composer\Package\Package') { $normVersion = self::getVersionParser()->normalize($version); return new $class($name, $normVersion, $version); } protected function getAliasPackage($package, $version) { $normVersion = self::getVersionParser()->normalize($version); return new AliasPackage($package, $normVersion, $version); } protected static function ensureDirectoryExistsAndClear($directory) { $fs = new Filesystem(); if (is_dir($directory)) { $fs->removeDirectory($directory); } mkdir($directory, 0777, true); } /** * Check whether or not the given name is an available executable. * * @param string $executableName The name of the binary to test. * * @throws \PHPUnit_Framework_SkippedTestError */ protected function skipIfNotExecutable($executableName) { if (!isset(self::$executableCache[$executableName])) { $finder = new ExecutableFinder(); self::$executableCache[$executableName] = (bool) $finder->find($executableName); } if (false === self::$executableCache[$executableName]) { $this->markTestSkipped($executableName . ' is not found or not executable.'); } } }