/tests/Composer/Test/TestCase.php

https://github.com/fabpot/composer · PHP · 155 lines · 108 code · 26 blank · 21 comment · 13 complexity · fca4eb9202232f852c86dc4057d0f509 MD5 · raw file

  1. <?php
  2. /*
  3. * This file is part of Composer.
  4. *
  5. * (c) Nils Adermann <naderman@naderman.de>
  6. * Jordi Boggiano <j.boggiano@seld.be>
  7. *
  8. * For the full copyright and license information, please view the LICENSE
  9. * file that was distributed with this source code.
  10. */
  11. namespace Composer\Test;
  12. use Composer\Semver\VersionParser;
  13. use Composer\Package\AliasPackage;
  14. use Composer\Package\RootPackageInterface;
  15. use Composer\Package\PackageInterface;
  16. use Composer\Semver\Constraint\Constraint;
  17. use Composer\Util\Filesystem;
  18. use Composer\Util\Silencer;
  19. use Symfony\Component\Process\ExecutableFinder;
  20. use Composer\Package\Loader\ArrayLoader;
  21. use Composer\Package\BasePackage;
  22. abstract class TestCase extends PolyfillTestCase
  23. {
  24. private static $parser;
  25. private static $executableCache = array();
  26. public static function getUniqueTmpDirectory()
  27. {
  28. $attempts = 5;
  29. $root = sys_get_temp_dir();
  30. do {
  31. $unique = $root . DIRECTORY_SEPARATOR . uniqid('composer-test-' . rand(1000, 9000));
  32. if (!file_exists($unique) && Silencer::call('mkdir', $unique, 0777)) {
  33. return realpath($unique);
  34. }
  35. } while (--$attempts);
  36. throw new \RuntimeException('Failed to create a unique temporary directory.');
  37. }
  38. protected static function getVersionParser()
  39. {
  40. if (!self::$parser) {
  41. self::$parser = new VersionParser();
  42. }
  43. return self::$parser;
  44. }
  45. protected function getVersionConstraint($operator, $version)
  46. {
  47. $constraint = new Constraint(
  48. $operator,
  49. self::getVersionParser()->normalize($version)
  50. );
  51. $constraint->setPrettyString($operator.' '.$version);
  52. return $constraint;
  53. }
  54. protected function getPackage($name, $version, $class = 'Composer\Package\Package')
  55. {
  56. $normVersion = self::getVersionParser()->normalize($version);
  57. return new $class($name, $normVersion, $version);
  58. }
  59. protected function getAliasPackage($package, $version)
  60. {
  61. $normVersion = self::getVersionParser()->normalize($version);
  62. $class = 'Composer\Package\AliasPackage';
  63. if ($package instanceof RootPackageInterface) {
  64. $class = 'Composer\Package\RootAliasPackage';
  65. }
  66. return new $class($package, $normVersion, $version);
  67. }
  68. protected function configureLinks(PackageInterface $package, array $config)
  69. {
  70. $arrayLoader = new ArrayLoader();
  71. foreach (BasePackage::$supportedLinkTypes as $type => $opts) {
  72. if (isset($config[$type])) {
  73. $method = 'set'.ucfirst($opts['method']);
  74. $package->{$method}(
  75. $arrayLoader->parseLinks(
  76. $package->getName(),
  77. $package->getPrettyVersion(),
  78. $opts['description'],
  79. $config[$type]
  80. )
  81. );
  82. }
  83. }
  84. }
  85. protected static function ensureDirectoryExistsAndClear($directory)
  86. {
  87. $fs = new Filesystem();
  88. if (is_dir($directory)) {
  89. $fs->removeDirectory($directory);
  90. }
  91. mkdir($directory, 0777, true);
  92. }
  93. /**
  94. * Check whether or not the given name is an available executable.
  95. *
  96. * @param string $executableName The name of the binary to test.
  97. *
  98. * @throws \PHPUnit_Framework_SkippedTestError
  99. */
  100. protected function skipIfNotExecutable($executableName)
  101. {
  102. if (!isset(self::$executableCache[$executableName])) {
  103. $finder = new ExecutableFinder();
  104. self::$executableCache[$executableName] = (bool) $finder->find($executableName);
  105. }
  106. if (false === self::$executableCache[$executableName]) {
  107. $this->markTestSkipped($executableName . ' is not found or not executable.');
  108. }
  109. }
  110. /**
  111. * @param string $exception
  112. * @param string|null $message
  113. * @param int|null $code
  114. */
  115. public function setExpectedException($exception, $message = null, $code = null)
  116. {
  117. if (!class_exists('PHPUnit\Framework\Error\Notice')) {
  118. $exception = str_replace('PHPUnit\\Framework\\Error\\', 'PHPUnit_Framework_Error_', $exception);
  119. }
  120. if (method_exists($this, 'expectException')) {
  121. $this->expectException($exception);
  122. if (null !== $message) {
  123. $this->expectExceptionMessage($message);
  124. }
  125. } else {
  126. parent::setExpectedException($exception, $message, $code);
  127. }
  128. }
  129. }