Merge pull request #10343 from Seldaek/drop_old_php

Upgrade to PHP 7.2+
main
Jordi Boggiano 2 years ago committed by GitHub
commit efa08e7791
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -22,12 +22,6 @@ jobs:
strategy:
matrix:
php-version:
- "5.3"
- "5.4"
- "5.5"
- "5.6"
- "7.0"
- "7.1"
- "7.2"
- "7.3"
- "7.4"
@ -37,30 +31,34 @@ jobs:
os: [ubuntu-latest]
experimental: [false]
include:
- php-version: "5.3"
- php-version: "7.2"
dependencies: highest
os: ubuntu-latest
experimental: false
- php-version: "5.3"
- php-version: "7.2"
dependencies: lowest
os: ubuntu-latest
experimental: false
- php-version: "8.0"
- php-version: "8.1"
dependencies: highest
os: ubuntu-latest
experimental: false
- php-version: "8.1"
os: windows-latest
dependencies: locked
experimental: false
- php-version: "8.0"
- php-version: "8.1"
os: macos-latest
dependencies: locked
experimental: false
- php-version: "8.1"
dependencies: lowest
- php-version: "8.2"
dependencies: lowest-ignore
os: ubuntu-latest
experimental: false
- php-version: "8.1"
dependencies: highest
experimental: true
- php-version: "8.2"
dependencies: highest-ignore
os: ubuntu-latest
experimental: false
experimental: true
steps:
- name: "Checkout"
@ -99,24 +97,6 @@ jobs:
if: "matrix.dependencies == 'locked'"
run: "composer install ${{ env.COMPOSER_FLAGS }}"
- name: "Require latest PHPUnitBridge for PHP 8.x"
if: "startsWith(matrix.php-version, '8.')"
# using ~ here to avoid issues with windows CLI removing the ^
run: 'composer require --no-update --dev "symfony/phpunit-bridge:~5.2"'
# temporary fix until phpunit-bridge has a release supporting 8.1
- name: "Require latest dev PHPUnitBridge for PHP 8.1"
if: "matrix.experimental"
# using ~ here to avoid issues with windows CLI removing the ^
run: 'composer require --no-update --dev "symfony/phpunit-bridge:~5.4@dev"'
- name: "Set ignored deprecations for php 8.1+ on lowest or locked deps"
if: "matrix.php-version >= '8.1' && !contains(matrix.dependencies, 'highest')"
run: "echo \"SYMFONY_DEPRECATIONS_HELPER=baselineFile=./tests/deprecations-8.1.json&max[direct]=0\" >> $GITHUB_ENV"
- name: "Update dev requirements to latest available for the current PHP even on locked builds as they are not bundled dependencies"
run: "composer config platform --unset && composer update ${{ env.COMPOSER_FLAGS }} symfony/phpunit-bridge phpspec/prophecy phpdocumentor/* sebastian/* doctrine/instantiator"
- name: "Run install again using composer binary from source"
run: "bin/composer install ${{ env.COMPOSER_FLAGS }}"

@ -17,7 +17,7 @@ jobs:
strategy:
matrix:
php-version:
- "5.3"
- "7.2"
- "latest"
steps:

@ -17,11 +17,16 @@ jobs:
name: "PHPStan"
runs-on: ubuntu-latest
continue-on-error: ${{ matrix.experimental }}
strategy:
matrix:
php-version:
- "7.4"
include:
- php-version: "7.2"
experimental: false
- php-version: "8.1"
experimental: true
fail-fast: false
steps:
- name: "Checkout"
@ -46,12 +51,16 @@ jobs:
key: "php-${{ matrix.php-version }}-symfony-php-unit-version-${{ env.SYMFONY_PHPUNIT_VERSION }}-${{ hashFiles('**/composer.lock') }}"
restore-keys: "php-${{ matrix.php-version }}-symfony-php-unit-version-${{ env.SYMFONY_PHPUNIT_VERSION }}"
- name: "Install highest dependencies from composer.json using composer binary provided by system"
- name: "Install highest dependencies"
if: "matrix.experimental == true"
run: "composer config platform --unset && composer update ${{ env.COMPOSER_FLAGS }}"
- name: "Install PHPStan"
# Locked to phpunit 7.5 here as newer ones have void return types which break inheritance
run: "bin/composer require --dev phpstan/phpstan:^1.0 phpstan/phpstan-phpunit:^1.0 phpstan/phpstan-deprecation-rules:^1 phpstan/phpstan-strict-rules:^1 phpunit/phpunit:^7.5.20 --with-all-dependencies ${{ env.COMPOSER_FLAGS }}"
- name: "Install locked dependencies"
if: "matrix.experimental == false"
run: "composer config platform --unset && composer update ${{ env.COMPOSER_FLAGS }}"
- name: "Initialize PHPUnit sources"
run: "vendor/bin/simple-phpunit --filter NO_TEST_JUST_AUTOLOAD_THANKS"
- name: "Run PHPStan"
run: "vendor/bin/phpstan analyse --configuration=phpstan/config.neon"
run: "composer phpstan"

@ -22,7 +22,7 @@
}
],
"require": {
"php": "^5.3.2 || ^7.0 || ^8.0",
"php": "^7.2.5 || ^8.0",
"composer/ca-bundle": "^1.0",
"composer/metadata-minifier": "^1.0",
"composer/semver": "^3.0",
@ -31,17 +31,20 @@
"justinrainbow/json-schema": "^5.2.11",
"psr/log": "^1.0 || ^2.0",
"seld/jsonlint": "^1.4",
"seld/phar-utils": "^1.0",
"symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0",
"symfony/filesystem": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0",
"symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0",
"symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0",
"react/promise": "^1.2 || ^2.7",
"seld/phar-utils": "^1.2",
"symfony/console": "^5.4.1 || ^6.0",
"symfony/filesystem": "^5.4 || ^6.0",
"symfony/finder": "^5.4 || ^6.0",
"symfony/process": "^5.4 || ^6.0",
"react/promise": "^2.8",
"composer/pcre": "^1.0"
},
"require-dev": {
"symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0",
"phpspec/prophecy": "^1.10"
"symfony/phpunit-bridge": "^6.0",
"phpstan/phpstan": "^1.0",
"phpstan/phpstan-phpunit": "^1.0",
"phpstan/phpstan-deprecation-rules": "^1",
"phpstan/phpstan-strict-rules": "^1"
},
"suggest": {
"ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages",
@ -50,13 +53,13 @@
},
"config": {
"platform": {
"php": "5.3.9"
"php": "7.2.5"
},
"platform-check": false
},
"extra": {
"branch-alias": {
"dev-main": "2.2-dev"
"dev-main": "2.3-dev"
}
},
"autoload": {
@ -80,18 +83,11 @@
"scripts": {
"compile": "@php -dphar.readonly=0 bin/compile",
"test": "@php simple-phpunit",
"phpstan-setup": [
"@composer config platform --unset",
"@composer update",
"@composer require --dev phpstan/phpstan:^1.0 phpstan/phpstan-phpunit:^1.0 phpstan/phpstan-deprecation-rules:^1 phpstan/phpstan-strict-rules:^1 phpunit/phpunit:^7.5.20 --with-all-dependencies",
"git checkout composer.json composer.lock"
],
"phpstan": "@php vendor/bin/phpstan analyse --configuration=phpstan/config.neon"
},
"scripts-descriptions": {
"compile": "Compile composer.phar",
"test": "Run all tests",
"phpstan-setup": "Prepare environment to run PHPStan locally (must be run with PHP7.4)",
"phpstan": "Runs PHPStan (after phpstan-setup was executed, must be run with PHP7.4)"
},
"support": {

1163
composer.lock generated

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -950,11 +950,6 @@ parameters:
count: 1
path: ../src/Composer/Command/GlobalCommand.php
-
message: "#^Return type \\(int\\|void\\) of method Composer\\\\Command\\\\GlobalCommand\\:\\:run\\(\\) should be covariant with return type \\(int\\) of method Symfony\\\\Component\\\\Console\\\\Command\\\\Command\\:\\:run\\(\\)$#"
count: 1
path: ../src/Composer/Command/GlobalCommand.php
-
message: "#^Cannot call method getPackage\\(\\) on Composer\\\\Composer\\|null\\.$#"
count: 1
@ -2440,16 +2435,6 @@ parameters:
count: 3
path: ../src/Composer/Compiler.php
-
message: "#^Only booleans are allowed in an if condition, array\\<int, bool\\|string\\> given\\.$#"
count: 1
path: ../src/Composer/Compiler.php
-
message: "#^Only booleans are allowed in an if condition, array\\<int, string\\> given\\.$#"
count: 1
path: ../src/Composer/Compiler.php
-
message: "#^Parameter \\#1 \\$haystack of function strpos expects string, string\\|false given\\.$#"
count: 1
@ -4235,6 +4220,11 @@ parameters:
count: 2
path: ../src/Composer/Installer/InstallationManager.php
-
message: "#^Constant PHP_WINDOWS_EVENT_CTRL_C not found\\.$#"
count: 1
path: ../src/Composer/Installer/InstallationManager.php
-
message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#"
count: 1
@ -4245,6 +4235,11 @@ parameters:
count: 2
path: ../src/Composer/Installer/InstallationManager.php
-
message: "#^Function sapi_windows_set_ctrl_handler not found\\.$#"
count: 3
path: ../src/Composer/Installer/InstallationManager.php
-
message: "#^Only booleans are allowed in &&, Composer\\\\EventDispatcher\\\\EventDispatcher\\|null given on the right side\\.$#"
count: 2
@ -6745,6 +6740,16 @@ parameters:
count: 2
path: ../src/Composer/Util/Http/CurlDownloader.php
-
message: "#^Constant CURLOPT_PROXY_CAINFO not found\\.$#"
count: 1
path: ../src/Composer/Util/Http/CurlDownloader.php
-
message: "#^Constant CURLOPT_PROXY_CAPATH not found\\.$#"
count: 1
path: ../src/Composer/Util/Http/CurlDownloader.php
-
message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#"
count: 3
@ -8450,12 +8455,12 @@ parameters:
path: ../tests/Composer/Test/Json/JsonValidationExceptionTest.php
-
message: "#^Composer\\\\Test\\\\Mock\\\\HttpDownloaderMock\\:\\:__construct\\(\\) does not call parent constructor from Composer\\\\Util\\\\HttpDownloader\\.$#"
message: "#^Property Composer\\\\Test\\\\Mock\\\\HttpDownloaderMock\\:\\:\\$defaultHandler \\(array\\{status\\: int, body\\: string, headers\\: array\\<string\\>\\}\\) does not accept non\\-empty\\-array\\<literal\\-string&non\\-empty\\-string, array\\<string\\>\\|int\\|string\\>\\.$#"
count: 1
path: ../tests/Composer/Test/Mock/HttpDownloaderMock.php
-
message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#"
message: "#^Property Composer\\\\Test\\\\Mock\\\\HttpDownloaderMock\\:\\:\\$expectations \\(array\\<array\\{url\\: string, options\\: array\\|null, status\\: int, body\\: string, headers\\: array\\<int, string\\>\\}\\>\\|null\\) does not accept array\\<non\\-empty\\-array\\<literal\\-string&non\\-empty\\-string, array\\|int\\|string\\|null\\>\\>\\.$#"
count: 1
path: ../tests/Composer/Test/Mock/HttpDownloaderMock.php
@ -8469,31 +8474,11 @@ parameters:
count: 1
path: ../tests/Composer/Test/Mock/InstallationManagerMock.php
-
message: "#^Call to method PHPUnit\\\\Framework\\\\Assert\\:\\:assertTrue\\(\\) with true will always evaluate to true\\.$#"
count: 1
path: ../tests/Composer/Test/Mock/ProcessExecutorMock.php
-
message: "#^Only booleans are allowed in &&, array\\<array\\<string, \\(callable\\)\\|int\\|string\\|null\\>\\> given on the left side\\.$#"
count: 1
path: ../tests/Composer/Test/Mock/ProcessExecutorMock.php
-
message: "#^Only booleans are allowed in a ternary operator condition, array\\<array\\<string, \\(callable\\)\\|int\\|string\\|null\\>\\> given\\.$#"
count: 1
path: ../tests/Composer/Test/Mock/ProcessExecutorMock.php
-
message: "#^Only booleans are allowed in an elseif condition, array\\<string, \\(callable\\)\\|int\\|string\\|null\\> given\\.$#"
count: 1
path: ../tests/Composer/Test/Mock/ProcessExecutorMock.php
-
message: "#^Only booleans are allowed in an if condition, array\\<array\\<string, \\(callable\\)\\|int\\|string\\|null\\>\\> given\\.$#"
count: 1
path: ../tests/Composer/Test/Mock/ProcessExecutorMock.php
-
message: "#^Only booleans are allowed in an if condition, string given\\.$#"
count: 2
@ -8510,7 +8495,7 @@ parameters:
path: ../tests/Composer/Test/Mock/ProcessExecutorMock.php
-
message: "#^Property Composer\\\\Test\\\\Mock\\\\ProcessExecutorMock\\:\\:\\$expectations \\(array\\<array\\{cmd\\: string, return\\: int, stdout\\: string, stderr\\: string, callback\\: \\(callable\\(\\)\\: mixed\\)\\|null\\}\\>\\) does not accept array\\<non\\-empty\\-array\\<literal\\-string&non\\-empty\\-string, \\(callable\\(\\)\\: mixed\\)\\|int\\|string\\|null\\>\\>\\.$#"
message: "#^Property Composer\\\\Test\\\\Mock\\\\ProcessExecutorMock\\:\\:\\$expectations \\(array\\<array\\{cmd\\: string, return\\: int, stdout\\: string, stderr\\: string, callback\\: \\(callable\\(\\)\\: mixed\\)\\|null\\}\\>\\|null\\) does not accept array\\<non\\-empty\\-array\\<literal\\-string&non\\-empty\\-string, \\(callable\\(\\)\\: mixed\\)\\|int\\|string\\|null\\>\\>\\.$#"
count: 1
path: ../tests/Composer/Test/Mock/ProcessExecutorMock.php
@ -8824,11 +8809,6 @@ parameters:
count: 1
path: ../tests/Composer/Test/Repository/RepositoryManagerTest.php
-
message: "#^Only booleans are allowed in an if condition, string\\|null given\\.$#"
count: 1
path: ../tests/Composer/Test/Repository/RepositoryManagerTest.php
-
message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#"
count: 1
@ -8869,31 +8849,6 @@ parameters:
count: 1
path: ../tests/Composer/Test/Repository/Vcs/GitLabDriverTest.php
-
message: "#^Parameter \\#1 \\$io of static method Composer\\\\Repository\\\\Vcs\\\\GitLabDriver\\:\\:supports\\(\\) expects Composer\\\\IO\\\\IOInterface, object given\\.$#"
count: 1
path: ../tests/Composer/Test/Repository/Vcs/GitLabDriverTest.php
-
message: "#^Parameter \\#2 \\$io of class Composer\\\\Repository\\\\Vcs\\\\GitLabDriver constructor expects Composer\\\\IO\\\\IOInterface, object given\\.$#"
count: 9
path: ../tests/Composer/Test/Repository/Vcs/GitLabDriverTest.php
-
message: "#^Parameter \\#4 \\$body of class Composer\\\\Util\\\\Http\\\\Response constructor expects string\\|null, string\\|false given\\.$#"
count: 2
path: ../tests/Composer/Test/Repository/Vcs/GitLabDriverTest.php
-
message: "#^Parameter \\#4 \\$httpDownloader of class Composer\\\\Repository\\\\Vcs\\\\GitLabDriver constructor expects Composer\\\\Util\\\\HttpDownloader, object given\\.$#"
count: 9
path: ../tests/Composer/Test/Repository/Vcs/GitLabDriverTest.php
-
message: "#^Parameter \\#5 \\$process of class Composer\\\\Repository\\\\Vcs\\\\GitLabDriver constructor expects Composer\\\\Util\\\\ProcessExecutor, object given\\.$#"
count: 9
path: ../tests/Composer/Test/Repository/Vcs/GitLabDriverTest.php
-
message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#"
count: 1
@ -8944,11 +8899,6 @@ parameters:
count: 1
path: ../tests/Composer/Test/Repository/VcsRepositoryTest.php
-
message: "#^Call to function method_exists\\(\\) with \\$this\\(Composer\\\\Test\\\\TestCase\\) and 'expectException' will always evaluate to true\\.$#"
count: 1
path: ../tests/Composer/Test/TestCase.php
-
message: "#^Method Composer\\\\Test\\\\TestCase\\:\\:getPackage\\(\\) should return Composer\\\\Package\\\\CompleteAliasPackage\\|Composer\\\\Package\\\\CompletePackage but returns PackageClass of Composer\\\\Package\\\\PackageInterface\\.$#"
count: 1

@ -3,6 +3,7 @@ includes:
- ../vendor/phpstan/phpstan-deprecation-rules/rules.neon
- ../vendor/phpstan/phpstan-strict-rules/rules.neon
- ./baseline.neon
- ./ignore-by-php-version.neon.php
parameters:
level: 8
@ -36,22 +37,16 @@ parameters:
# we don't have different constructors for parent/child
- '~^Unsafe usage of new static\(\)\.$~'
# BC with older PHPUnit
- '~^Call to an undefined static method Composer\\Test\\PolyfillTestCase::setExpectedException\(\)\.$~'
- '~^Call to an undefined method Composer\\Test\\[a-zA-Z0-9\\]+::(assertFileDoesNotExist|assertMatchesRegularExpression)\(\)\.$~'
# Mock errors
- '~^Call to an undefined method (PHPUnit\\Framework\\MockObject\\MockObject|Prophecy\\Prophecy\\ObjectProphecy)::.*$~'
# Ignore some irrelevant errors in test files
- '~Method Composer\\Test\\[^:]+::(setUp(BeforeClass)?|tearDown(AfterClass)?|test[^(]+)\(\) has no return type specified.~'
- '~Method Composer\\Test\\[^:]+::(data\w+|provide\w+|\w+?Provider)\(\) has no return type specified.~'
# PHPUnit assertions as instance methods
- '~Dynamic call to static method PHPUnit\\Framework\\Assert::\w+\(\)~'
- '~Dynamic call to static method PHPUnit\\Framework\\TestCase::(once|at|exactly|will|exactly|returnValue|returnCallback|any|atLeastOnce|throwException|onConsecutiveCalls|never|returnValueMap)\(\)~'
- '~Dynamic call to static method PHPUnit\\Framework\\TestCase::(once|atLeast|exactly|will|exactly|returnValue|returnCallback|any|atLeastOnce|throwException|onConsecutiveCalls|never|returnValueMap)\(\)~'
bootstrapFiles:
- ./locate-phpunit-autoloader.php
- ../tests/bootstrap.php
paths:

@ -0,0 +1,14 @@
<?php declare(strict_types = 1);
use PHPStan\DependencyInjection\NeonAdapter;
$adapter = new NeonAdapter();
// more inspiration at https://github.com/phpstan/phpstan-src/blob/master/build/ignore-by-php-version.neon.php
$config = [];
if (PHP_VERSION_ID >= 80000) {
$config = array_merge_recursive($config, $adapter->load(__DIR__ . '/baseline-8.1.neon'));
}
$config['parameters']['phpVersion'] = PHP_VERSION_ID;
return $config;

@ -0,0 +1,22 @@
<?php
$bestDirFound = null;
$dirs = glob(__DIR__.'/../vendor/bin/.phpunit/phpunit-*', GLOB_ONLYDIR);
natsort($dirs);
foreach (array_reverse($dirs) as $dir) {
$bestDirFound = $dir;
if (PHP_VERSION_ID >= 80000 && false !== strpos($dir, 'phpunit-9')) {
break;
}
if (PHP_VERSION_ID < 80000 && false !== strpos($dir, 'phpunit-8')) {
break;
}
}
if (null === $bestDirFound) {
echo 'Run "composer test" to initialize PHPUnit sources before running PHPStan'.PHP_EOL;
exit(1);
}
include $bestDirFound.'/vendor/autoload.php';

@ -16,7 +16,6 @@
>
<php>
<env name="SYMFONY_DEPRECATIONS_HELPER" value="max[direct]=0"/>
<env name="SYMFONY_PHPUNIT_REMOVE_RETURN_TYPEHINT" value="1"/>
<env name="COMPOSER_TEST_SUITE" value="1"/>
</php>
<testsuites>

@ -163,7 +163,8 @@ class ClassMapGenerator
$rejectedClasses = array();
$realSubPath = substr($filePath, strlen($basePath) + 1);
$realSubPath = substr($realSubPath, 0, strrpos($realSubPath, '.'));
$dotPosition = strrpos($realSubPath, '.');
$realSubPath = substr($realSubPath, 0, $dotPosition === false ? PHP_INT_MAX : $dotPosition);
foreach ($classes as $class) {
// silently skip if ns doesn't have common root
@ -226,7 +227,7 @@ class ClassMapGenerator
$message = 'File at "%s" does not exist, check your classmap definitions';
} elseif (!Filesystem::isReadable($path)) {
$message = 'File at "%s" is not readable, check its permissions';
} elseif ('' === trim(file_get_contents($path))) {
} elseif ('' === trim((string) file_get_contents($path))) {
// The input file was really empty and thus contains no classes
return array();
} else {

@ -218,7 +218,7 @@ class Cache
$file = Preg::replace('{[^'.$this->allowlist.']}i', '-', $file);
if (file_exists($this->root . $file)) {
try {
touch($this->root . $file, filemtime($this->root . $file), time());
touch($this->root . $file, (int) filemtime($this->root . $file), time());
} catch (\ErrorException $e) {
// fallback in case the above failed due to incorrect ownership
// see https://github.com/composer/composer/issues/4070

@ -62,10 +62,9 @@ EOT
}
/**
* @return int|void
* @throws \Symfony\Component\Console\Exception\ExceptionInterface
*/
public function run(InputInterface $input, OutputInterface $output)
public function run(InputInterface $input, OutputInterface $output): int
{
if (!method_exists($input, '__toString')) {
throw new \LogicException('Expected an Input instance that is stringable, got '.get_class($input));

@ -298,6 +298,9 @@ TAGSPUBKEY
}
$pubkeyid = openssl_pkey_get_public($sigFile);
if (false === $pubkeyid) {
throw new \RuntimeException('Failed loading the public key from '.$sigFile);
}
$algo = defined('OPENSSL_ALGO_SHA384') ? OPENSSL_ALGO_SHA384 : 'SHA384';
if (!in_array('sha384', array_map('strtolower', openssl_get_md_methods()))) {
throw new \RuntimeException('SHA384 is not supported by your openssl extension, could not verify the phar file integrity');
@ -308,6 +311,7 @@ TAGSPUBKEY
// PHP 8 automatically frees the key instance and deprecates the function
if (PHP_VERSION_ID < 80000) {
// @phpstan-ignore-next-line
openssl_free_key($pubkeyid);
}

@ -50,25 +50,13 @@ class Compiler
unlink($pharFile);
}
// TODO in v2.3 always call with an array
if (method_exists('Symfony\Component\Process\Process', 'fromShellCommandline')) {
$process = new Process(array('git', 'log', '--pretty="%H"', '-n1', 'HEAD'), __DIR__);
} else {
// @phpstan-ignore-next-line
$process = new Process('git log --pretty="%H" -n1 HEAD', __DIR__);
}
$process = new Process(array('git', 'log', '--pretty=%H', '-n1', 'HEAD'), __DIR__);
if ($process->run() != 0) {
throw new \RuntimeException('Can\'t run git log. You must ensure to run compile from composer git repository clone and that git binary is available.');
}
$this->version = trim($process->getOutput());
// TODO in v2.3 always call with an array
if (method_exists('Symfony\Component\Process\Process', 'fromShellCommandline')) {
$process = new Process(array('git', 'log', '-n1', '--pretty=%ci', 'HEAD'), __DIR__);
} else {
// @phpstan-ignore-next-line
$process = new Process('git log -n1 --pretty=%ci HEAD', __DIR__);
}
$process = new Process(array('git', 'log', '-n1', '--pretty=%ci', 'HEAD'), __DIR__);
if ($process->run() != 0) {
throw new \RuntimeException('Can\'t run git log. You must ensure to run compile from composer git repository clone and that git binary is available.');
}
@ -137,8 +125,8 @@ class Compiler
$finder->files()
->ignoreVCS(true)
->notPath('/\/(composer\.(json|lock)|[A-Z]+\.md|\.gitignore|appveyor.yml|phpunit\.xml\.dist|phpstan\.neon\.dist|phpstan-config\.neon)$/')
->notPath('/bin\/(jsonlint|validate-json|simple-phpunit)(\.bat)?$/')
->notPath('symfony/debug/Resources/ext/')
->notPath('/bin\/(jsonlint|validate-json|simple-phpunit|phpstan|phpstan\.phar)(\.bat)?$/')
->notPath('symfony/console/Resources/completion.bash')
->notPath('justinrainbow/json-schema/demo/')
->notPath('justinrainbow/json-schema/dist/')
->notPath('composer/installed.json')
@ -150,13 +138,18 @@ class Compiler
->sort($finderSort)
;
$extraFiles = array(
realpath(__DIR__ . '/../../vendor/composer/spdx-licenses/res/spdx-exceptions.json'),
realpath(__DIR__ . '/../../vendor/composer/spdx-licenses/res/spdx-licenses.json'),
realpath(CaBundle::getBundledCaBundlePath()),
realpath(__DIR__ . '/../../vendor/symfony/console/Resources/bin/hiddeninput.exe'),
realpath(__DIR__ . '/../../vendor/symfony/polyfill-mbstring/Resources/mb_convert_variables.php8'),
);
$extraFiles = [];
foreach (array(
__DIR__ . '/../../vendor/composer/spdx-licenses/res/spdx-exceptions.json',
__DIR__ . '/../../vendor/composer/spdx-licenses/res/spdx-licenses.json',
CaBundle::getBundledCaBundlePath(),
__DIR__ . '/../../vendor/symfony/console/Resources/bin/hiddeninput.exe',
) as $file) {
$extraFiles[$file] = realpath($file);
if (!file_exists($file)) {
throw new \RuntimeException('Extra file listed is missing from the filesystem: '.$file);
}
}
$unexpectedFiles = array();
foreach ($finder as $file) {
@ -173,11 +166,11 @@ class Compiler
}
}
if ($extraFiles) {
throw new \RuntimeException('These files were expected but not added to the phar, they might be excluded or gone from the source package:'.PHP_EOL.implode(PHP_EOL, $extraFiles));
if (count($extraFiles) > 0) {
throw new \RuntimeException('These files were expected but not added to the phar, they might be excluded or gone from the source package:'.PHP_EOL.var_export($extraFiles, true));
}
if ($unexpectedFiles) {
throw new \RuntimeException('These files were unexpectedly added to the phar, make sure they are excluded or listed in $extraFiles:'.PHP_EOL.implode(PHP_EOL, $unexpectedFiles));
if (count($unexpectedFiles) > 0) {
throw new \RuntimeException('These files were unexpectedly added to the phar, make sure they are excluded or listed in $extraFiles:'.PHP_EOL.var_export($unexpectedFiles, true));
}
// Add bin/composer
@ -200,7 +193,14 @@ class Compiler
$util->updateTimestamps($this->versionDate);
$util->save($pharFile, \Phar::SHA512);
Linter::lint($pharFile);
Linter::lint($pharFile, [
'vendor/symfony/console/Attribute/AsCommand.php',
'vendor/symfony/polyfill-intl-grapheme/bootstrap80.php',
'vendor/symfony/polyfill-intl-normalizer/bootstrap80.php',
'vendor/symfony/polyfill-mbstring/bootstrap80.php',
'vendor/symfony/polyfill-php73/Resources/stubs/JsonException.php',
'vendor/symfony/service-contracts/Attribute/SubscribedService.php',
]);
}
/**

@ -55,7 +55,7 @@ class Composer
const VERSION = '@package_version@';
const BRANCH_ALIAS_VERSION = '@package_branch_alias_version@';
const RELEASE_DATE = '@release_date@';
const SOURCE_VERSION = '2.2.999-dev+source';
const SOURCE_VERSION = '2.3.999-dev+source';
/**
* Version number of the internal composer-runtime-api package

@ -119,10 +119,7 @@ class Application extends BaseApplication
parent::__construct('Composer', Composer::getVersion());
}
/**
* @return int
*/
public function run(InputInterface $input = null, OutputInterface $output = null)
public function run(InputInterface $input = null, OutputInterface $output = null): int
{
if (null === $output) {
$output = Factory::createOutput();
@ -131,10 +128,7 @@ class Application extends BaseApplication
return parent::run($input, $output);
}
/**
* @return int
*/
public function doRun(InputInterface $input, OutputInterface $output)
public function doRun(InputInterface $input, OutputInterface $output): int
{
$this->disablePluginsByDefault = $input->hasParameterOption('--no-plugins');
$this->disableScriptsByDefault = $input->hasParameterOption('--no-scripts');
@ -483,10 +477,7 @@ class Application extends BaseApplication
return $this->io;
}
/**
* @return string
*/
public function getHelp()
public function getHelp(): string
{
return self::$logo . parent::getHelp();
}
@ -495,7 +486,7 @@ class Application extends BaseApplication
* Initializes all the composer commands.
* @return \Symfony\Component\Console\Command\Command[]
*/
protected function getDefaultCommands()
protected function getDefaultCommands(): array
{
$commands = array_merge(parent::getDefaultCommands(), array(
new Command\AboutCommand(),
@ -535,10 +526,7 @@ class Application extends BaseApplication
return $commands;
}
/**
* @return string
*/
public function getLongVersion()
public function getLongVersion(): string
{
if (Composer::BRANCH_ALIAS_VERSION && Composer::BRANCH_ALIAS_VERSION !== '@package_branch_alias_version'.'@') {
return sprintf(
@ -553,10 +541,7 @@ class Application extends BaseApplication
return parent::getLongVersion() . ' ' . Composer::RELEASE_DATE;
}
/**
* @return InputDefinition
*/
protected function getDefaultInputDefinition()
protected function getDefaultInputDefinition(): InputDefinition
{
$definition = parent::getDefaultInputDefinition();
$definition->addOption(new InputOption('--profile', null, InputOption::VALUE_NONE, 'Display timing and memory usage information'));

@ -60,12 +60,7 @@ class HtmlOutputFormatter extends OutputFormatter
parent::__construct(true, $styles);
}
/**
* @param ?string $message
*
* @return string
*/
public function format($message)
public function format(?string $message): ?string
{
$formatted = parent::format($message);

@ -205,20 +205,12 @@ class Decisions implements \Iterator, \Countable
array_pop($this->decisionQueue);
}
/**
* @return int
*/
#[\ReturnTypeWillChange]
public function count()
public function count(): int
{
return \count($this->decisionQueue);
}
/**
* @return void
*/
#[\ReturnTypeWillChange]
public function rewind()
public function rewind(): void
{
end($this->decisionQueue);
}
@ -232,29 +224,17 @@ class Decisions implements \Iterator, \Countable
return current($this->decisionQueue);
}
/**
* @return ?int
*/
#[\ReturnTypeWillChange]
public function key()
public function key(): ?int
{
return key($this->decisionQueue);
}
/**
* @return void
*/
#[\ReturnTypeWillChange]
public function next()
public function next(): void
{
prev($this->decisionQueue);
}
/**
* @return bool
*/
#[\ReturnTypeWillChange]
public function valid()
public function valid(): bool
{
return false !== current($this->decisionQueue);
}

@ -129,10 +129,8 @@ class Pool implements \Countable
/**
* Returns how many packages have been loaded into the pool
* @return int
*/
#[\ReturnTypeWillChange]
public function count()
public function count(): int
{
return \count($this->packages);
}

@ -103,11 +103,7 @@ class RuleSet implements \IteratorAggregate, \Countable
}
}
/**
* @return int
*/
#[\ReturnTypeWillChange]
public function count()
public function count(): int
{
return $this->nextRuleId;
}
@ -127,11 +123,7 @@ class RuleSet implements \IteratorAggregate, \Countable
return $this->rules;
}
/**
* @return RuleSetIterator
*/
#[\ReturnTypeWillChange]
public function getIterator()
public function getIterator(): RuleSetIterator
{
return new RuleSetIterator($this->getRules());
}

@ -42,11 +42,7 @@ class RuleSetIterator implements \Iterator
$this->rewind();
}
/**
* @return Rule
*/
#[\ReturnTypeWillChange]
public function current()
public function current(): Rule
{
return $this->rules[$this->currentType][$this->currentOffset];
}
@ -54,17 +50,12 @@ class RuleSetIterator implements \Iterator
/**
* @return RuleSet::TYPE_*|-1
*/
#[\ReturnTypeWillChange]
public function key()
public function key(): int
{
return $this->currentType;
}
/**
* @return void
*/
#[\ReturnTypeWillChange]
public function next()
public function next(): void
{
$this->currentOffset++;
@ -88,11 +79,7 @@ class RuleSetIterator implements \Iterator
}
}
/**
* @return void
*/
#[\ReturnTypeWillChange]
public function rewind()
public function rewind(): void
{
$this->currentOffset = 0;
@ -111,11 +98,7 @@ class RuleSetIterator implements \Iterator
} while (isset($this->types[$this->currentTypeOffset]) && !\count($this->rules[$this->currentType]));
}
/**
* @return bool
*/
#[\ReturnTypeWillChange]
public function valid()
public function valid(): bool
{
return isset($this->rules[$this->currentType], $this->rules[$this->currentType][$this->currentOffset]);
}

@ -159,74 +159,47 @@ abstract class BaseIO implements IOInterface
ProcessExecutor::setTimeout((int) $config->get('process-timeout'));
}
/**
* @return void
*/
public function emergency($message, array $context = array())
public function emergency($message, array $context = array()): void
{
$this->log(LogLevel::EMERGENCY, $message, $context);
}
/**
* @return void
*/
public function alert($message, array $context = array())
public function alert($message, array $context = array()): void
{
$this->log(LogLevel::ALERT, $message, $context);
}
/**
* @return void
*/
public function critical($message, array $context = array())
public function critical($message, array $context = array()): void
{
$this->log(LogLevel::CRITICAL, $message, $context);
}
/**
* @return void
*/
public function error($message, array $context = array())
public function error($message, array $context = array()): void
{
$this->log(LogLevel::ERROR, $message, $context);
}
/**
* @return void
*/
public function warning($message, array $context = array())
public function warning($message, array $context = array()): void
{
$this->log(LogLevel::WARNING, $message, $context);
}
/**
* @return void
*/
public function notice($message, array $context = array())
public function notice($message, array $context = array()): void
{
$this->log(LogLevel::NOTICE, $message, $context);
}
/**
* @return void
*/
public function info($message, array $context = array())
public function info($message, array $context = array()): void
{
$this->log(LogLevel::INFO, $message, $context);
}
/**
* @return void
*/
public function debug($message, array $context = array())
public function debug($message, array $context = array()): void
{
$this->log(LogLevel::DEBUG, $message, $context);
}
/**
* @return void
*/
public function log($level, $message, array $context = array())
public function log($level, $message, array $context = array()): void
{
if (in_array($level, array(LogLevel::EMERGENCY, LogLevel::ALERT, LogLevel::CRITICAL, LogLevel::ERROR))) {
$this->writeError('<error>'.$message.'</error>');

@ -223,7 +223,7 @@ class InstallationManager
};
$handleInterruptsUnix = function_exists('pcntl_async_signals') && function_exists('pcntl_signal');
$handleInterruptsWindows = function_exists('sapi_windows_set_ctrl_handler') && PHP_SAPI === 'cli';
$handleInterruptsWindows = PHP_VERSION_ID >= 70400 && function_exists('sapi_windows_set_ctrl_handler') && PHP_SAPI === 'cli';
$prevHandler = null;
$windowsHandler = null;
if ($handleInterruptsUnix) {

@ -23,8 +23,7 @@ class ArchivableFilesFilter extends FilterIterator
/**
* @return bool true if the current element is acceptable, otherwise false.
*/
#[\ReturnTypeWillChange]
public function accept()
public function accept(): bool
{
$file = $this->getInnerIterator()->current();
if ($file->isDir()) {

@ -90,8 +90,7 @@ class ArchivableFilesFinder extends \FilterIterator
parent::__construct($this->finder->getIterator());
}
#[\ReturnTypeWillChange]
public function accept()
public function accept(): bool
{
/** @var SplFileInfo $current */
$current = $this->getInnerIterator()->current();

@ -80,7 +80,7 @@ class Locker
*/
public static function getContentHash($composerFileContents)
{
$content = json_decode($composerFileContents, true);
$content = JsonFile::parseJson($composerFileContents, 'composer.json');
$relevantKeys = array(
'name',
@ -107,7 +107,7 @@ class Locker
ksort($relevantContent);
return md5(json_encode($relevantContent));
return md5(JsonFile::encode($relevantContent, 0));
}
/**

@ -32,7 +32,7 @@ interface PluginInterface
*
* @var string
*/
const PLUGIN_API_VERSION = '2.2.0';
const PLUGIN_API_VERSION = '2.3.0';
/**
* Apply plugin modifications to Composer

@ -322,8 +322,7 @@ class ArrayRepository implements RepositoryInterface
*
* @return int Number of packages
*/
#[\ReturnTypeWillChange]
public function count()
public function count(): int
{
if (null === $this->packages) {
$this->initialize();

@ -178,8 +178,7 @@ class CompositeRepository implements RepositoryInterface
/**
* @inheritDoc
*/
#[\ReturnTypeWillChange]
public function count()
public function count(): int
{
$total = 0;
foreach ($this->repositories as $repository) {

@ -181,8 +181,7 @@ class FilterRepository implements RepositoryInterface
/**
* @inheritDoc
*/
#[\ReturnTypeWillChange]
public function count()
public function count(): int
{
if ($this->repo->count() > 0) {
return count($this->getPackages());

@ -54,15 +54,6 @@ class ErrorHandler
}
if (self::$io) {
// ignore symfony/* deprecation warnings
// TODO remove in 2.3
if (Preg::isMatch('{^Return type of Symfony\\\\.*ReturnTypeWillChange}is', $message)) {
return true;
}
if (strpos(strtr($file, '\\', '/'), 'vendor/symfony/') !== false) {
return true;
}
self::$io->writeError('<warning>Deprecation Notice: '.$message.' in '.$file.':'.$line.'</warning>');
if (self::$io->isVerbose()) {
self::$io->writeError('<warning>Stack trace:</warning>');

@ -25,7 +25,7 @@ class Response
private $request;
/** @var int */
private $code;
/** @var string[] */
/** @var list<string> */
private $headers;
/** @var ?string */
private $body;
@ -33,7 +33,7 @@ class Response
/**
* @param Request $request
* @param int $code
* @param string[] $headers
* @param list<string> $headers
* @param ?string $body
*/
public function __construct(array $request, $code, array $headers, $body)

@ -98,9 +98,7 @@ class Perforce
*/
public static function checkServerExists($url, ProcessExecutor $processExecutor)
{
$output = null;
return 0 === $processExecutor->execute('p4 -p ' . ProcessExecutor::escape($url) . ' info -s', $output);
return 0 === $processExecutor->execute('p4 -p ' . ProcessExecutor::escape($url) . ' info -s', $ignoredOutput);
}
/**

@ -165,7 +165,7 @@ class Svn
}
$errorOutput = $this->process->getErrorOutput();
$fullOutput = implode("\n", array($output, $errorOutput));
$fullOutput = trim(implode("\n", array($output, $errorOutput)));
// the error is not auth-related
if (false === stripos($fullOutput, 'Could not authenticate to server:')

@ -137,7 +137,11 @@ final class TlsHelper
*/
public static function getCertificateFingerprint($certificate)
{
$pubkeydetails = openssl_pkey_get_details(openssl_get_publickey($certificate));
$pubkey = openssl_get_publickey($certificate);
if ($pubkey === false) {
throw new \RuntimeException('Failed to retrieve the public key from certificate');
}
$pubkeydetails = openssl_pkey_get_details($pubkey);
$pubkeypem = $pubkeydetails['key'];
//Convert PEM to DER before SHA1'ing
$start = '-----BEGIN PUBLIC KEY-----';

@ -31,15 +31,16 @@ class AllFunctionalTest extends TestCase
*/
private static $pharPath;
public function setUp()
public function setUp(): void
{
$this->oldcwd = getcwd();
chdir(__DIR__.'/Fixtures/functional');
}
public function tearDown()
protected function tearDown(): void
{
parent::tearDown();
if ($this->oldcwd) {
chdir($this->oldcwd);
}
@ -51,12 +52,12 @@ class AllFunctionalTest extends TestCase
}
}
public static function setUpBeforeClass()
public static function setUpBeforeClass(): void
{
self::$pharPath = self::getUniqueTmpDirectory() . '/composer.phar';
}
public static function tearDownAfterClass()
public static function tearDownAfterClass(): void
{
$fs = new Filesystem;
$fs->removeDirectory(dirname(self::$pharPath));
@ -123,18 +124,10 @@ class AllFunctionalTest extends TestCase
'COMPOSER_CACHE_DIR' => $this->testDir.'cache',
);
// TODO in v2.3 always call with an array
if (method_exists('Symfony\Component\Process\Process', 'fromShellCommandline')) {
$cmd = array((defined('PHP_BINARY') ? PHP_BINARY : 'php'), self::$pharPath, '--no-ansi', $testData['RUN']);
$proc = new Process($cmd, $this->testDir, $env, null, 300);
} else {
$cmd = (defined('PHP_BINARY') ? escapeshellcmd(PHP_BINARY) : 'php') .' '.escapeshellarg(self::$pharPath).' --no-ansi '.$testData['RUN'];
// @phpstan-ignore-next-line
$proc = new Process($cmd, $this->testDir, $env, null, 300);
}
$proc = Process::fromShellCommandline(escapeshellcmd(PHP_BINARY).' '.escapeshellarg(self::$pharPath).' --no-ansi '.$testData['RUN'], $this->testDir, $env, null, 300);
$output = '';
$exitcode = $proc->run(function ($type, $buffer) use (&$output) {
$exitCode = $proc->run(function ($type, $buffer) use (&$output) {
$output .= $buffer;
});
@ -176,16 +169,16 @@ class AllFunctionalTest extends TestCase
}
}
if (isset($testData['EXPECT-REGEX'])) {
$this->assertRegExp($testData['EXPECT-REGEX'], $this->cleanOutput($output));
$this->assertMatchesRegularExpression($testData['EXPECT-REGEX'], $this->cleanOutput($output));
}
if (isset($testData['EXPECT-REGEXES'])) {
$cleanOutput = $this->cleanOutput($output);
foreach (explode("\n", $testData['EXPECT-REGEXES']) as $regex) {
$this->assertRegExp($regex, $cleanOutput, 'Output: '.$output);
$this->assertMatchesRegularExpression($regex, $cleanOutput, 'Output: '.$output);
}
}
if (isset($testData['EXPECT-EXIT-CODE'])) {
$this->assertSame($testData['EXPECT-EXIT-CODE'], $exitcode);
$this->assertSame($testData['EXPECT-EXIT-CODE'], $exitCode);
}
}
@ -204,7 +197,7 @@ class AllFunctionalTest extends TestCase
/**
* @param string $file
* @return array<string, int|string>
* @return array{RUN: string, EXPECT?: string, EXPECT-EXIT-CODE?: int, EXPECT-REGEX?: string, EXPECT-REGEXES?: string, TEST?: string}
*/
private function parseTestFile($file)
{
@ -261,7 +254,7 @@ class AllFunctionalTest extends TestCase
throw new \RuntimeException('The test file must have a section named "EXPECT", "EXPECT-REGEX", or "EXPECT-REGEXES".');
}
return $data;
return $data; // @phpstan-ignore-line
}
/**

@ -14,11 +14,12 @@ namespace Composer\Test;
use Composer\Console\Application;
use Composer\XdebugHandler\XdebugHandler;
use Symfony\Component\Console\Output\BufferedOutput;
use Symfony\Component\Console\Output\OutputInterface;
class ApplicationTest extends TestCase
{
public function tearDown()
protected function tearDown(): void
{
parent::tearDown();
@ -34,27 +35,26 @@ class ApplicationTest extends TestCase
putenv('COMPOSER_NO_INTERACTION=1');
$index = 0;
$inputMock->expects($this->at($index++))
->method('hasParameterOption')
->with($this->equalTo('--no-plugins'))
->will($this->returnValue(true));
$inputMock->expects($this->at($index++))
$inputMock->expects($this->any())
->method('hasParameterOption')
->with($this->equalTo('--no-scripts'))
->will($this->returnValue(false));
$inputMock->expects($this->at($index++))
->willReturnCallback(function ($opt): bool {
switch ($opt) {
case '--no-plugins':
return true;
case '--no-scripts':
return false;
case '--no-cache':
return false;
}
return false;
});
$inputMock->expects($this->once())
->method('setInteractive')
->with($this->equalTo(false));
$inputMock->expects($this->at($index++))
->method('hasParameterOption')
->with($this->equalTo('--no-cache'))
->will($this->returnValue(false));
$inputMock->expects($this->at($index++))
$inputMock->expects($this->once())
->method('getParameterOption')
->with($this->equalTo(array('--working-dir', '-d')))
->will($this->returnValue(false));
@ -63,33 +63,22 @@ class ApplicationTest extends TestCase
->method('getFirstArgument')
->will($this->returnValue('show'));
$index = 0;
$outputMock->expects($this->at($index++))
->method("write");
$output = new BufferedOutput();
$expectedOutput = '';
if (XdebugHandler::isXdebugActive()) {
$outputMock->expects($this->at($index++))
->method("getVerbosity")
->willReturn(OutputInterface::VERBOSITY_NORMAL);
$outputMock->expects($this->at($index++))
->method("write")
->with($this->equalTo('<warning>Composer is operating slower than normal because you have Xdebug enabled. See https://getcomposer.org/xdebug</warning>'));
$expectedOutput .= '<warning>Composer is operating slower than normal because you have Xdebug enabled. See https://getcomposer.org/xdebug</warning>'.PHP_EOL;
}
$outputMock->expects($this->at($index++))
->method("getVerbosity")
->willReturn(OutputInterface::VERBOSITY_NORMAL);
$outputMock->expects($this->at($index++))
->method("write")
->with($this->equalTo(sprintf('<warning>Warning: This development build of Composer is over 60 days old. It is recommended to update it by running "%s self-update" to get the latest version.</warning>', $_SERVER['PHP_SELF'])));
$expectedOutput .= sprintf('<warning>Warning: This development build of Composer is over 60 days old. It is recommended to update it by running "%s self-update" to get the latest version.</warning>', $_SERVER['PHP_SELF']).PHP_EOL;
if (!defined('COMPOSER_DEV_WARNING_TIME')) {
define('COMPOSER_DEV_WARNING_TIME', time() - 1);
}
$application->doRun($inputMock, $outputMock);
$application->doRun($inputMock, $output);
$this->assertStringContainsString($expectedOutput, $output->fetch());
}
/**
@ -107,27 +96,26 @@ class ApplicationTest extends TestCase
putenv('COMPOSER_NO_INTERACTION=1');
$index = 0;
$inputMock->expects($this->at($index++))
->method('hasParameterOption')
->with($this->equalTo('--no-plugins'))
->will($this->returnValue(true));
$inputMock->expects($this->at($index++))
$inputMock->expects($this->any())
->method('hasParameterOption')
->with($this->equalTo('--no-scripts'))
->will($this->returnValue(false));
$inputMock->expects($this->at($index++))
->willReturnCallback(function ($opt): bool {
switch ($opt) {
case '--no-plugins':
return true;
case '--no-scripts':
return false;
case '--no-cache':
return false;
}
return false;
});
$inputMock->expects($this->once())
->method('setInteractive')
->with($this->equalTo(false));
$inputMock->expects($this->at($index++))
->method('hasParameterOption')
->with($this->equalTo('--no-cache'))
->will($this->returnValue(false));
$inputMock->expects($this->at($index++))
$inputMock->expects($this->once())
->method('getParameterOption')
->with($this->equalTo(array('--working-dir', '-d')))
->will($this->returnValue(false));

@ -29,7 +29,7 @@ use Composer\Installer\InstallationManager;
use Composer\Config;
use Composer\EventDispatcher\EventDispatcher;
use Composer\Util\Platform;
use PHPUnit_Framework_MockObject_MockObject as MockObject;
use PHPUnit\Framework\MockObject\MockObject;
class AutoloadGeneratorTest extends TestCase
{
@ -54,12 +54,12 @@ class AutoloadGeneratorTest extends TestCase
private $origDir;
/**
* @var InstallationManager|MockObject
* @var InstallationManager&MockObject
*/
private $im;
/**
* @var InstalledRepositoryInterface|MockObject
* @var InstalledRepositoryInterface&MockObject
*/
private $repository;
@ -74,7 +74,7 @@ class AutoloadGeneratorTest extends TestCase
private $fs;
/**
* @var EventDispatcher|MockObject
* @var EventDispatcher&MockObject
*/
private $eventDispatcher;
@ -89,7 +89,7 @@ class AutoloadGeneratorTest extends TestCase
*/
public $configValueMap;
protected function setUp()
protected function setUp(): void
{
$this->fs = new Filesystem;
$that = $this;
@ -148,8 +148,9 @@ class AutoloadGeneratorTest extends TestCase
$this->generator = new AutoloadGenerator($this->eventDispatcher);
}
protected function tearDown()
protected function tearDown(): void
{
parent::tearDown();
chdir($this->origDir);
if (is_dir($this->workingDir)) {
@ -957,17 +958,13 @@ EOF;
$notAutoloadPackages[] = $b = new Package('b/b', '1.0', '1.0');
$notAutoloadPackages[] = $c = new Package('c/c', '1.0', '1.0');
$this->repository->expects($this->at(1))
$this->repository->expects($this->exactly(3))
->method('getCanonicalPackages')
->will($this->returnValue($autoloadPackages));
$this->repository->expects($this->at(3))
->method('getCanonicalPackages')
->will($this->returnValue($notAutoloadPackages));
$this->repository->expects($this->at(5))
->method('getCanonicalPackages')
->will($this->returnValue($notAutoloadPackages));
->willReturnOnConsecutiveCalls(
$autoloadPackages,
$notAutoloadPackages,
$notAutoloadPackages
);
$this->fs->ensureDirectoryExists($this->vendorDir.'/a/a');
$this->fs->ensureDirectoryExists($this->vendorDir.'/b/b');
@ -1283,14 +1280,12 @@ EOF;
public function testPreAndPostEventsAreDispatchedDuringAutoloadDump()
{
$this->eventDispatcher
->expects($this->at(0))
->expects($this->exactly(2))
->method('dispatchScript')
->with(ScriptEvents::PRE_AUTOLOAD_DUMP, false);
$this->eventDispatcher
->expects($this->at(1))
->method('dispatchScript')
->with(ScriptEvents::POST_AUTOLOAD_DUMP, false);
->withConsecutive(
[ScriptEvents::PRE_AUTOLOAD_DUMP, false],
[ScriptEvents::POST_AUTOLOAD_DUMP, false]
);
$package = new RootPackage('root/a', '1.0', '1.0');
$package->setAutoload(array('psr-0' => array('Prefix' => 'foo/bar/non/existing/')));
@ -1866,38 +1861,16 @@ EOF;
/**
* @param string $expected
* @param string $actual
* @param string $message
* @param bool $canonicalize
* @param bool $ignoreCase
* @param string|null $message
*
* @return void
*/
public static function assertFileContentEquals($expected, $actual, $message = '', $canonicalize = false, $ignoreCase = false)
public static function assertFileContentEquals(string $expected, string $actual, ?string $message = null)
{
self::assertEqualsNormalized(
file_get_contents($expected),
file_get_contents($actual),
$message ?: $expected.' equals '.$actual,
0,
10,
$canonicalize,
$ignoreCase
self::assertSame(
str_replace("\r", '', (string) file_get_contents($expected)),
str_replace("\r", '', (string) file_get_contents($actual)),
$message ?? $expected.' equals '.$actual
);
}
/**
* @param string $expected
* @param string $actual
* @param string $message
* @param int $delta
* @param int $maxDepth
* @param bool $canonicalize
* @param bool $ignoreCase
*
* @return void
*/
public static function assertEqualsNormalized($expected, $actual, $message = '', $delta = 0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false)
{
parent::assertEquals(str_replace("\r", '', $expected), str_replace("\r", '', $actual), $message, $delta, $maxDepth, $canonicalize, $ignoreCase);
}
}

@ -146,7 +146,8 @@ class ClassMapGeneratorTest extends TestCase
$find = $r->getMethod('findClasses');
$find->setAccessible(true);
$this->setExpectedException('RuntimeException', 'does not exist');
self::expectException('RuntimeException');
self::expectExceptionMessage('does not exist');
$find->invoke(null, __DIR__ . '/no-file');
}
@ -232,7 +233,8 @@ class ClassMapGeneratorTest extends TestCase
public function testCreateMapThrowsWhenDirectoryDoesNotExist()
{
$this->setExpectedException('RuntimeException', 'Could not scan for classes inside');
self::expectException('RuntimeException');
self::expectExceptionMessage('Could not scan for classes inside');
ClassMapGenerator::createMap(__DIR__ . '/no-file.no-foler');
}

@ -28,7 +28,7 @@ class CacheTest extends TestCase
/** @var Cache&\PHPUnit\Framework\MockObject\MockObject */
private $cache;
public function setUp()
public function setUp(): void
{
$this->root = $this->getUniqueTmpDirectory();
$this->files = array();
@ -44,7 +44,7 @@ class CacheTest extends TestCase
$io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
$this->cache = $this->getMockBuilder('Composer\Cache')
->setMethods(array('getFinder'))
->onlyMethods(array('getFinder'))
->setConstructorArgs(array($io, $this->root))
->getMock();
$this->cache
@ -53,8 +53,9 @@ class CacheTest extends TestCase
->will($this->returnValue($this->finder));
}
protected function tearDown()
protected function tearDown(): void
{
parent::tearDown();
if (is_dir($this->root)) {
$fs = new Filesystem;
$fs->removeDirectory($this->root);

@ -49,17 +49,14 @@ class ArchiveCommandTest extends TestCase
$composer->setPackage($package);
$command = $this->getMockBuilder('Composer\Command\ArchiveCommand')
->setMethods(array(
->onlyMethods(array(
'mergeApplicationDefinition',
'bind',
'getSynopsis',
'initialize',
'isInteractive',
'getComposer',
))->getMock();
$command->expects($this->atLeastOnce())->method('getComposer')
->willReturn($composer);
$command->method('isInteractive')->willReturn(false);
$command->run($input, $output);
}
@ -73,12 +70,10 @@ class ArchiveCommandTest extends TestCase
$config = Factory::createConfig();
$command = $this->getMockBuilder('Composer\Command\ArchiveCommand')
->setMethods(array(
->onlyMethods(array(
'mergeApplicationDefinition',
'bind',
'getSynopsis',
'initialize',
'isInteractive',
'getComposer',
'archive',
))->getMock();
@ -96,7 +91,6 @@ class ArchiveCommandTest extends TestCase
false,
null
)->willReturn(0);
$command->method('isInteractive')->willReturn(false);
$this->assertEquals(0, $command->run($input, $output));
}

@ -82,14 +82,14 @@ class InitCommandTest extends TestCase
public function testParseEmptyAuthorString()
{
$command = new InitCommand;
$this->setExpectedException('InvalidArgumentException');
self::expectException('InvalidArgumentException');
$command->parseAuthorString('');
}
public function testParseAuthorStringWithInvalidEmail()
{
$command = new InitCommand;
$this->setExpectedException('InvalidArgumentException');
self::expectException('InvalidArgumentException');
$command->parseAuthorString('John Smith <john>');
}

@ -47,6 +47,9 @@ class RunScriptCommandTest extends TestCase
->method('hasArgument')
->with('command')
->willReturn(false);
$input
->method('isInteractive')
->willReturn(false);
$output = $this->getMockBuilder('Symfony\Component\Console\Output\OutputInterface')->getMock();
@ -73,17 +76,14 @@ class RunScriptCommandTest extends TestCase
$composer->setEventDispatcher($ed);
$command = $this->getMockBuilder('Composer\Command\RunScriptCommand')
->setMethods(array(
->onlyMethods(array(
'mergeApplicationDefinition',
'bind',
'getSynopsis',
'initialize',
'isInteractive',
'getComposer',
))
->getMock();
$command->expects($this->any())->method('getComposer')->willReturn($composer);
$command->method('isInteractive')->willReturn(false);
$command->run($input, $output);
}

@ -34,14 +34,15 @@ class JsonConfigSourceTest extends TestCase
return __DIR__.'/Fixtures/'.$name;
}
protected function setUp()
protected function setUp(): void
{
$this->fs = new Filesystem;
$this->workingDir = $this->getUniqueTmpDirectory();
}
protected function tearDown()
protected function tearDown(): void
{
parent::tearDown();
if (is_dir($this->workingDir)) {
$this->fs->removeDirectory($this->workingDir);
}

@ -259,10 +259,8 @@ class ConfigTest extends TestCase
*/
public function testProhibitedUrlsThrowException($url)
{
$this->setExpectedException(
'Composer\Downloader\TransportException',
'Your configuration does not allow connections to ' . $url
);
self::expectException('Composer\Downloader\TransportException');
self::expectExceptionMessage('Your configuration does not allow connections to ' . $url);
$config = new Config(false);
$config->prohibitUrlByConfig($url);
}

@ -32,7 +32,7 @@ class DefaultPolicyTest extends TestCase
/** @var DefaultPolicy */
protected $policy;
public function setUp()
public function setUp(): void
{
$this->repositorySet = new RepositorySet('dev');
$this->repo = new ArrayRepository;

@ -27,7 +27,7 @@ class RuleSetIteratorTest extends TestCase
/** @var Pool */
protected $pool;
protected function setUp()
protected function setUp(): void
{
$this->pool = new Pool();

@ -67,7 +67,7 @@ class RuleSetTest extends TestCase
{
$ruleSet = new RuleSet;
$this->setExpectedException('OutOfBoundsException');
self::expectException('OutOfBoundsException');
// @phpstan-ignore-next-line
$ruleSet->add(new GenericRule(array(), Rule::RULE_ROOT_REQUIRE, array('packageName' => '', 'constraint' => new MatchAllConstraint)), 7);
}

@ -48,7 +48,7 @@ class SolverTest extends TestCase
/** @var Pool */
protected $pool;
public function setUp()
public function setUp(): void
{
$this->repoSet = new RepositorySet();
$this->repo = new ArrayRepository;
@ -537,7 +537,7 @@ class SolverTest extends TestCase
$this->request->requireName('A');
// must explicitly pick the provider, so error in this case
$this->setExpectedException('Composer\DependencyResolver\SolverProblemsException');
self::expectException('Composer\DependencyResolver\SolverProblemsException');
$this->createSolver();
$this->solver->solve($this->request);
}
@ -571,7 +571,7 @@ class SolverTest extends TestCase
$this->request->requireName('A');
$this->setExpectedException('Composer\DependencyResolver\SolverProblemsException');
self::expectException('Composer\DependencyResolver\SolverProblemsException');
$this->createSolver();
$this->solver->solve($this->request);
}
@ -743,7 +743,7 @@ class SolverTest extends TestCase
$this->request->requireName('C', $this->getVersionConstraint('==', '2.0.0.0-dev'));
$this->setExpectedException('Composer\DependencyResolver\SolverProblemsException');
self::expectException('Composer\DependencyResolver\SolverProblemsException');
$this->createSolver();
$this->solver->solve($this->request);

@ -23,7 +23,7 @@ use Composer\Test\TestCase;
class TransactionTest extends TestCase
{
public function setUp()
public function setUp(): void
{
}

@ -13,6 +13,7 @@
namespace Composer\Test\Downloader;
use Composer\Downloader\DownloadManager;
use Composer\Package\PackageInterface;
use Composer\Test\TestCase;
class DownloadManagerTest extends TestCase
@ -23,7 +24,7 @@ class DownloadManagerTest extends TestCase
/** @var \Composer\IO\IOInterface&\PHPUnit\Framework\MockObject\MockObject */
protected $io;
public function setUp()
public function setUp(): void
{
$this->filesystem = $this->getMockBuilder('Composer\Util\Filesystem')->getMock();
$this->io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
@ -37,7 +38,7 @@ class DownloadManagerTest extends TestCase
$manager->setDownloader('test', $downloader);
$this->assertSame($downloader, $manager->getDownloader('test'));
$this->setExpectedException('InvalidArgumentException');
self::expectException('InvalidArgumentException');
$manager->getDownloader('unregistered');
}
@ -51,7 +52,7 @@ class DownloadManagerTest extends TestCase
$manager = new DownloadManager($this->io, false, $this->filesystem);
$this->setExpectedException('InvalidArgumentException');
self::expectException('InvalidArgumentException');
$manager->getDownloaderForPackage($package);
}
@ -76,7 +77,7 @@ class DownloadManagerTest extends TestCase
$manager = $this->getMockBuilder('Composer\Downloader\DownloadManager')
->setConstructorArgs(array($this->io, false, $this->filesystem))
->setMethods(array('getDownloader'))
->onlyMethods(array('getDownloader'))
->getMock();
$manager
@ -108,7 +109,7 @@ class DownloadManagerTest extends TestCase
$manager = $this->getMockBuilder('Composer\Downloader\DownloadManager')
->setConstructorArgs(array($this->io, false, $this->filesystem))
->setMethods(array('getDownloader'))
->onlyMethods(array('getDownloader'))
->getMock();
$manager
@ -117,7 +118,7 @@ class DownloadManagerTest extends TestCase
->with('git')
->will($this->returnValue($downloader));
$this->setExpectedException('LogicException');
self::expectException('LogicException');
$manager->getDownloaderForPackage($package);
}
@ -142,7 +143,7 @@ class DownloadManagerTest extends TestCase
$manager = $this->getMockBuilder('Composer\Downloader\DownloadManager')
->setConstructorArgs(array($this->io, false, $this->filesystem))
->setMethods(array('getDownloader'))
->onlyMethods(array('getDownloader'))
->getMock();
$manager
@ -174,7 +175,7 @@ class DownloadManagerTest extends TestCase
$manager = $this->getMockBuilder('Composer\Downloader\DownloadManager')
->setConstructorArgs(array($this->io, false, $this->filesystem))
->setMethods(array('getDownloader'))
->onlyMethods(array('getDownloader'))
->getMock();
$manager
@ -183,7 +184,7 @@ class DownloadManagerTest extends TestCase
->with('pear')
->will($this->returnValue($downloader));
$this->setExpectedException('LogicException');
self::expectException('LogicException');
$manager->getDownloaderForPackage($package);
}
@ -226,7 +227,7 @@ class DownloadManagerTest extends TestCase
$manager = $this->getMockBuilder('Composer\Downloader\DownloadManager')
->setConstructorArgs(array($this->io, false, $this->filesystem))
->setMethods(array('getDownloaderForPackage'))
->onlyMethods(array('getDownloaderForPackage'))
->getMock();
$manager
->expects($this->once())
@ -254,13 +255,12 @@ class DownloadManagerTest extends TestCase
->will($this->returnValue('prettyPackage'));
$package
->expects($this->at(3))
->method('setInstallationSource')
->with('dist');
$package
->expects($this->at(5))
->expects($this->exactly(2))
->method('setInstallationSource')
->with('source');
->withConsecutive(
['dist'],
['source']
);
$downloaderFail = $this->createDownloaderMock();
$downloaderFail
@ -277,18 +277,16 @@ class DownloadManagerTest extends TestCase
$manager = $this->getMockBuilder('Composer\Downloader\DownloadManager')
->setConstructorArgs(array($this->io, false, $this->filesystem))
->setMethods(array('getDownloaderForPackage'))
->onlyMethods(array('getDownloaderForPackage'))
->getMock();
$manager
->expects($this->at(0))
->method('getDownloaderForPackage')
->with($package)
->will($this->returnValue($downloaderFail));
$manager
->expects($this->at(1))
->expects($this->exactly(2))
->method('getDownloaderForPackage')
->with($package)
->will($this->returnValue($downloaderSuccess));
->willReturnOnConsecutiveCalls(
$downloaderFail,
$downloaderSuccess
);
$manager->download($package, 'target_dir');
}
@ -307,7 +305,7 @@ class DownloadManagerTest extends TestCase
$manager = new DownloadManager($this->io, false, $this->filesystem);
$this->setExpectedException('InvalidArgumentException');
self::expectException('InvalidArgumentException');
$manager->download($package, 'target_dir');
}
@ -336,7 +334,7 @@ class DownloadManagerTest extends TestCase
$manager = $this->getMockBuilder('Composer\Downloader\DownloadManager')
->setConstructorArgs(array($this->io, false, $this->filesystem))
->setMethods(array('getDownloaderForPackage'))
->onlyMethods(array('getDownloaderForPackage'))
->getMock();
$manager
->expects($this->once())
@ -372,7 +370,7 @@ class DownloadManagerTest extends TestCase
$manager = $this->getMockBuilder('Composer\Downloader\DownloadManager')
->setConstructorArgs(array($this->io, false, $this->filesystem))
->setMethods(array('getDownloaderForPackage'))
->onlyMethods(array('getDownloaderForPackage'))
->getMock();
$manager
->expects($this->once())
@ -402,7 +400,7 @@ class DownloadManagerTest extends TestCase
$manager = $this->getMockBuilder('Composer\Downloader\DownloadManager')
->setConstructorArgs(array($this->io, false, $this->filesystem))
->setMethods(array('getDownloaderForPackage'))
->onlyMethods(array('getDownloaderForPackage'))
->getMock();
$manager
->expects($this->once())
@ -438,7 +436,7 @@ class DownloadManagerTest extends TestCase
$manager = $this->getMockBuilder('Composer\Downloader\DownloadManager')
->setConstructorArgs(array($this->io, false, $this->filesystem))
->setMethods(array('getDownloaderForPackage'))
->onlyMethods(array('getDownloaderForPackage'))
->getMock();
$manager
->expects($this->once())
@ -475,7 +473,7 @@ class DownloadManagerTest extends TestCase
$manager = $this->getMockBuilder('Composer\Downloader\DownloadManager')
->setConstructorArgs(array($this->io, false, $this->filesystem))
->setMethods(array('getDownloaderForPackage'))
->onlyMethods(array('getDownloaderForPackage'))
->getMock();
$manager
->expects($this->once())
@ -512,7 +510,7 @@ class DownloadManagerTest extends TestCase
$manager = $this->getMockBuilder('Composer\Downloader\DownloadManager')
->setConstructorArgs(array($this->io, false, $this->filesystem))
->setMethods(array('getDownloaderForPackage'))
->onlyMethods(array('getDownloaderForPackage'))
->getMock();
$manager
->expects($this->once())
@ -539,7 +537,7 @@ class DownloadManagerTest extends TestCase
$manager = new DownloadManager($this->io, false, $this->filesystem);
$manager->setPreferSource(true);
$this->setExpectedException('InvalidArgumentException');
self::expectException('InvalidArgumentException');
$manager->download($package, 'target_dir');
}
@ -642,20 +640,30 @@ class DownloadManagerTest extends TestCase
{
$initial = null;
if ($prevPkgSource) {
$initial = $this->prophesize('Composer\Package\PackageInterface');
$initial->getInstallationSource()->willReturn($prevPkgSource);
$initial->isDev()->willReturn($prevPkgIsDev);
$initial = $this->getMockBuilder(PackageInterface::class)->getMock();
$initial->expects($this->atLeastOnce())
->method('getInstallationSource')
->willReturn($prevPkgSource);
$initial->expects($this->any())
->method('isDev')
->willReturn($prevPkgIsDev);
}
$target = $this->prophesize('Composer\Package\PackageInterface');
$target->getSourceType()->willReturn(in_array('source', $targetAvailable, true) ? 'git' : null);
$target->getDistType()->willReturn(in_array('dist', $targetAvailable, true) ? 'zip' : null);
$target->isDev()->willReturn($targetIsDev);
$target = $this->getMockBuilder(PackageInterface::class)->getMock();
$target->expects($this->atLeastOnce())
->method('getSourceType')
->willReturn(in_array('source', $targetAvailable, true) ? 'git' : null);
$target->expects($this->atLeastOnce())
->method('getDistType')
->willReturn(in_array('dist', $targetAvailable, true) ? 'zip' : null);
$target->expects($this->any())
->method('isDev')
->willReturn($targetIsDev);
$manager = new DownloadManager($this->io, false, $this->filesystem);
$method = new \ReflectionMethod($manager, 'getAvailableSources');
$method->setAccessible(true);
$this->assertEquals($expected, $method->invoke($manager, $target->reveal(), $initial ? $initial->reveal() : null));
$this->assertEquals($expected, $method->invoke($manager, $target, $initial ?? null));
}
public static function updatesProvider()
@ -688,7 +696,7 @@ class DownloadManagerTest extends TestCase
$manager = $this->getMockBuilder('Composer\Downloader\DownloadManager')
->setConstructorArgs(array($this->io, false, $this->filesystem))
->setMethods(array('getDownloaderForPackage'))
->onlyMethods(array('getDownloaderForPackage'))
->getMock();
$manager
->expects($this->exactly(2))
@ -711,7 +719,7 @@ class DownloadManagerTest extends TestCase
$manager = $this->getMockBuilder('Composer\Downloader\DownloadManager')
->setConstructorArgs(array($this->io, false, $this->filesystem))
->setMethods(array('getDownloaderForPackage'))
->onlyMethods(array('getDownloaderForPackage'))
->getMock();
$manager
->expects($this->once())
@ -728,7 +736,7 @@ class DownloadManagerTest extends TestCase
$manager = $this->getMockBuilder('Composer\Downloader\DownloadManager')
->setConstructorArgs(array($this->io, false, $this->filesystem))
->setMethods(array('getDownloaderForPackage'))
->onlyMethods(array('getDownloaderForPackage'))
->getMock();
$manager
->expects($this->once())
@ -771,7 +779,7 @@ class DownloadManagerTest extends TestCase
$manager = $this->getMockBuilder('Composer\Downloader\DownloadManager')
->setConstructorArgs(array($this->io, false, $this->filesystem))
->setMethods(array('getDownloaderForPackage'))
->onlyMethods(array('getDownloaderForPackage'))
->getMock();
$manager
->expects($this->once())
@ -814,7 +822,7 @@ class DownloadManagerTest extends TestCase
$manager = $this->getMockBuilder('Composer\Downloader\DownloadManager')
->setConstructorArgs(array($this->io, false, $this->filesystem))
->setMethods(array('getDownloaderForPackage'))
->onlyMethods(array('getDownloaderForPackage'))
->getMock();
$manager
->expects($this->once())
@ -860,7 +868,7 @@ class DownloadManagerTest extends TestCase
$manager = $this->getMockBuilder('Composer\Downloader\DownloadManager')
->setConstructorArgs(array($this->io, false, $this->filesystem))
->setMethods(array('getDownloaderForPackage'))
->onlyMethods(array('getDownloaderForPackage'))
->getMock();
$manager
->expects($this->once())
@ -907,7 +915,7 @@ class DownloadManagerTest extends TestCase
$manager = $this->getMockBuilder('Composer\Downloader\DownloadManager')
->setConstructorArgs(array($this->io, false, $this->filesystem))
->setMethods(array('getDownloaderForPackage'))
->onlyMethods(array('getDownloaderForPackage'))
->getMock();
$manager
->expects($this->once())
@ -954,7 +962,7 @@ class DownloadManagerTest extends TestCase
$manager = $this->getMockBuilder('Composer\Downloader\DownloadManager')
->setConstructorArgs(array($this->io, false, $this->filesystem))
->setMethods(array('getDownloaderForPackage'))
->onlyMethods(array('getDownloaderForPackage'))
->getMock();
$manager
->expects($this->once())
@ -1001,7 +1009,7 @@ class DownloadManagerTest extends TestCase
$manager = $this->getMockBuilder('Composer\Downloader\DownloadManager')
->setConstructorArgs(array($this->io, false, $this->filesystem))
->setMethods(array('getDownloaderForPackage'))
->onlyMethods(array('getDownloaderForPackage'))
->getMock();
$manager
->expects($this->once())
@ -1044,7 +1052,7 @@ class DownloadManagerTest extends TestCase
$manager = $this->getMockBuilder('Composer\Downloader\DownloadManager')
->setConstructorArgs(array($this->io, false, $this->filesystem))
->setMethods(array('getDownloaderForPackage'))
->onlyMethods(array('getDownloaderForPackage'))
->getMock();
$manager
->expects($this->once())
@ -1087,7 +1095,7 @@ class DownloadManagerTest extends TestCase
$manager = $this->getMockBuilder('Composer\Downloader\DownloadManager')
->setConstructorArgs(array($this->io, false, $this->filesystem))
->setMethods(array('getDownloaderForPackage'))
->onlyMethods(array('getDownloaderForPackage'))
->getMock();
$manager
->expects($this->once())

@ -30,7 +30,7 @@ class FileDownloaderTest extends TestCase
/** @var \Composer\Config&\PHPUnit\Framework\MockObject\MockObject */
private $config;
public function setUp()
public function setUp(): void
{
$this->httpDownloader = $this->getMockBuilder('Composer\Util\HttpDownloader')->disableOriginalConstructor()->getMock();
$this->config = $this->getMockBuilder('Composer\Config')->getMock();
@ -67,7 +67,7 @@ class FileDownloaderTest extends TestCase
->will($this->returnValue(null))
;
$this->setExpectedException('InvalidArgumentException');
self::expectException('InvalidArgumentException');
$downloader = $this->getDownloader();
$downloader->download($packageMock, '/path');
@ -85,7 +85,7 @@ class FileDownloaderTest extends TestCase
->will($this->returnValue(array('url')))
;
$path = tempnam($this->getUniqueTmpDirectory(), 'c');
$path = $this->createTempFile($this->getUniqueTmpDirectory());
$downloader = $this->getDownloader();
try {
@ -220,7 +220,7 @@ class FileDownloaderTest extends TestCase
$dispatcher = new EventDispatcher(
$composerMock,
$this->getMockBuilder('Composer\IO\IOInterface')->getMock(),
new ProcessExecutorMock
$this->getProcessExecutorMock()
);
$dispatcher->addListener(PluginEvents::PRE_FILE_DOWNLOAD, function (PreFileDownloadEvent $event) use ($expectedUrl) {
$event->setProcessedUrl($expectedUrl);
@ -322,7 +322,7 @@ class FileDownloaderTest extends TestCase
$dispatcher = new EventDispatcher(
$composerMock,
$this->getMockBuilder('Composer\IO\IOInterface')->getMock(),
new ProcessExecutorMock
$this->getProcessExecutorMock()
);
$dispatcher->addListener(PluginEvents::PRE_FILE_DOWNLOAD, function (PreFileDownloadEvent $event) use ($customCacheKey) {
$event->setCustomCacheKey($customCacheKey);
@ -387,15 +387,12 @@ class FileDownloaderTest extends TestCase
$this->config = $this->getMockBuilder('Composer\Config')->getMock();
$this->config
->expects($this->at(0))
->expects($this->atLeast(2))
->method('get')
->with('cache-files-ttl')
->will($this->returnValue($expectedTtl));
$this->config
->expects($this->at(1))
->method('get')
->with('cache-files-maxsize')
->will($this->returnValue('500M'));
->willReturnMap([
['cache-files-ttl', 0, $expectedTtl],
['cache-files-maxsize', 0, '500M'],
]);
$cacheMock = $this->getMockBuilder('Composer\Cache')
->disableOriginalConstructor()
@ -492,13 +489,12 @@ class FileDownloaderTest extends TestCase
->will($this->returnValue(array($distUrl)));
$ioMock = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
$ioMock->expects($this->at(0))
->method('writeError')
->with($this->stringContains('Downloading'));
$ioMock->expects($this->at(1))
$ioMock->expects($this->atLeast(2))
->method('writeError')
->with($this->stringContains('Downgrading'));
->withConsecutive(
[$this->stringContains('Downloading')],
[$this->stringContains('Downgrading')]
);
$path = $this->getUniqueTmpDirectory();
$filesystem = $this->getMockBuilder('Composer\Util\Filesystem')->getMock();

@ -22,13 +22,14 @@ class FossilDownloaderTest extends TestCase
/** @var string */
private $workingDir;
protected function setUp()
protected function setUp(): void
{
$this->workingDir = $this->getUniqueTmpDirectory();
}
protected function tearDown()
protected function tearDown(): void
{
parent::tearDown();
if (is_dir($this->workingDir)) {
$fs = new Filesystem;
$fs->removeDirectory($this->workingDir);
@ -46,7 +47,7 @@ class FossilDownloaderTest extends TestCase
{
$io = $io ?: $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
$config = $config ?: $this->getMockBuilder('Composer\Config')->getMock();
$executor = $executor ?: new ProcessExecutorMock;
$executor = $executor ?: $this->getProcessExecutorMock();
$filesystem = $filesystem ?: $this->getMockBuilder('Composer\Util\Filesystem')->getMock();
return new FossilDownloader($io, $config, $executor, $filesystem);
@ -59,7 +60,7 @@ class FossilDownloaderTest extends TestCase
->method('getSourceReference')
->will($this->returnValue(null));
$this->setExpectedException('InvalidArgumentException');
self::expectException('InvalidArgumentException');
$downloader = $this->getDownloaderMock();
$downloader->install($packageMock, '/path');
@ -75,7 +76,7 @@ class FossilDownloaderTest extends TestCase
->method('getSourceUrls')
->will($this->returnValue(array('http://fossil.kd2.org/kd2fw/')));
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
$this->getCmd('fossil clone -- \'http://fossil.kd2.org/kd2fw/\' \'repo.fossil\''),
$this->getCmd('fossil open --nested -- \'repo.fossil\''),
@ -84,8 +85,6 @@ class FossilDownloaderTest extends TestCase
$downloader = $this->getDownloaderMock(null, null, $process);
$downloader->install($packageMock, 'repo');
$process->assertComplete($this);
}
public function testUpdateforPackageWithoutSourceReference()
@ -96,7 +95,7 @@ class FossilDownloaderTest extends TestCase
->method('getSourceReference')
->will($this->returnValue(null));
$this->setExpectedException('InvalidArgumentException');
self::expectException('InvalidArgumentException');
$downloader = $this->getDownloaderMock();
$downloader->prepare('update', $sourcePackageMock, '/path', $initialPackageMock);
@ -124,7 +123,7 @@ class FossilDownloaderTest extends TestCase
->method('getVersion')
->will($this->returnValue('1.0.0.0'));
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
$this->getCmd("fossil changes"),
$this->getCmd("fossil pull && fossil up 'trunk'"),
@ -134,8 +133,6 @@ class FossilDownloaderTest extends TestCase
$downloader->prepare('update', $packageMock, $this->workingDir, $packageMock);
$downloader->update($packageMock, $packageMock, $this->workingDir);
$downloader->cleanup('update', $packageMock, $this->workingDir, $packageMock);
$process->assertComplete($this);
}
public function testRemove()
@ -146,7 +143,7 @@ class FossilDownloaderTest extends TestCase
$packageMock = $this->getMockBuilder('Composer\Package\PackageInterface')->getMock();
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
$this->getCmd('fossil changes'),
), true);
@ -161,8 +158,6 @@ class FossilDownloaderTest extends TestCase
$downloader->prepare('uninstall', $packageMock, $this->workingDir);
$downloader->remove($packageMock, $this->workingDir);
$downloader->cleanup('uninstall', $packageMock, $this->workingDir);
$process->assertComplete($this);
}
public function testGetInstallationSource()

@ -27,7 +27,7 @@ class GitDownloaderTest extends TestCase
/** @var string */
private $workingDir;
protected function setUp()
protected function setUp(): void
{
$this->skipIfNotExecutable('git');
@ -37,8 +37,9 @@ class GitDownloaderTest extends TestCase
$this->workingDir = $this->getUniqueTmpDirectory();
}
protected function tearDown()
protected function tearDown(): void
{
parent::tearDown();
if (is_dir($this->workingDir)) {
$this->fs->removeDirectory($this->workingDir);
}
@ -85,7 +86,7 @@ class GitDownloaderTest extends TestCase
protected function getDownloaderMock($io = null, $config = null, $executor = null, $filesystem = null)
{
$io = $io ?: $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
$executor = $executor ?: new ProcessExecutorMock;
$executor = $executor ?: $this->getProcessExecutorMock();
$filesystem = $filesystem ?: $this->getMockBuilder('Composer\Util\Filesystem')->getMock();
$config = $this->setupConfig($config);
@ -99,7 +100,7 @@ class GitDownloaderTest extends TestCase
->method('getSourceReference')
->will($this->returnValue(null));
$this->setExpectedException('InvalidArgumentException');
self::expectException('InvalidArgumentException');
$downloader = $this->getDownloaderMock();
$downloader->download($packageMock, '/path');
@ -124,7 +125,7 @@ class GitDownloaderTest extends TestCase
->method('getPrettyVersion')
->will($this->returnValue('dev-master'));
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
$this->winCompat("git clone --no-checkout -- 'https://example.com/composer/composer' 'composerPath' && cd 'composerPath' && git remote add composer -- 'https://example.com/composer/composer' && git fetch composer && git remote set-url origin -- 'https://example.com/composer/composer' && git remote set-url composer -- 'https://example.com/composer/composer'"),
$this->winCompat("git branch -r"),
@ -136,8 +137,6 @@ class GitDownloaderTest extends TestCase
$downloader->prepare('install', $packageMock, 'composerPath');
$downloader->install($packageMock, 'composerPath');
$downloader->cleanup('install', $packageMock, 'composerPath');
$process->assertComplete($this);
}
public function testDownloadWithCache()
@ -165,7 +164,7 @@ class GitDownloaderTest extends TestCase
$filesystem = new \Composer\Util\Filesystem;
$filesystem->removeDirectory($cachePath);
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
array('cmd' => $this->winCompat(sprintf("git clone --mirror -- 'https://example.com/composer/composer' '%s'", $cachePath)), 'callback' => function () use ($cachePath) {
@mkdir($cachePath, 0777, true);
@ -183,8 +182,6 @@ class GitDownloaderTest extends TestCase
$downloader->install($packageMock, 'composerPath');
$downloader->cleanup('install', $packageMock, 'composerPath');
@rmdir($cachePath);
$process->assertComplete($this);
}
public function testDownloadUsesVariousProtocolsAndSetsPushUrlForGithub()
@ -203,7 +200,7 @@ class GitDownloaderTest extends TestCase
->method('getPrettyVersion')
->will($this->returnValue('1.0.0'));
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
array(
'cmd' => $this->winCompat("git clone --no-checkout -- 'https://github.com/mirrors/composer' 'composerPath' && cd 'composerPath' && git remote add composer -- 'https://github.com/mirrors/composer' && git fetch composer && git remote set-url origin -- 'https://github.com/mirrors/composer' && git remote set-url composer -- 'https://github.com/mirrors/composer'"),
@ -222,8 +219,6 @@ class GitDownloaderTest extends TestCase
$downloader->prepare('install', $packageMock, 'composerPath');
$downloader->install($packageMock, 'composerPath');
$downloader->cleanup('install', $packageMock, 'composerPath');
$process->assertComplete($this);
}
public function pushUrlProvider()
@ -260,7 +255,7 @@ class GitDownloaderTest extends TestCase
->method('getPrettyVersion')
->will($this->returnValue('1.0.0'));
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
$this->winCompat("git clone --no-checkout -- '{$url}' 'composerPath' && cd 'composerPath' && git remote add composer -- '{$url}' && git fetch composer && git remote set-url origin -- '{$url}' && git remote set-url composer -- '{$url}'"),
$this->winCompat("git remote set-url --push origin -- '{$pushUrl}'"),
@ -276,8 +271,6 @@ class GitDownloaderTest extends TestCase
$downloader->prepare('install', $packageMock, 'composerPath');
$downloader->install($packageMock, 'composerPath');
$downloader->cleanup('install', $packageMock, 'composerPath');
$process->assertComplete($this);
}
public function testDownloadThrowsRuntimeExceptionIfGitCommandFails()
@ -296,7 +289,7 @@ class GitDownloaderTest extends TestCase
->method('getPrettyVersion')
->will($this->returnValue('1.0.0'));
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
array(
'cmd' => $this->winCompat("git clone --no-checkout -- 'https://example.com/composer/composer' 'composerPath' && cd 'composerPath' && git remote add composer -- 'https://example.com/composer/composer' && git fetch composer && git remote set-url origin -- 'https://example.com/composer/composer' && git remote set-url composer -- 'https://example.com/composer/composer'"),
@ -312,8 +305,6 @@ class GitDownloaderTest extends TestCase
$downloader->install($packageMock, 'composerPath');
$downloader->cleanup('install', $packageMock, 'composerPath');
$process->assertComplete($this);
$this->fail('This test should throw');
} catch (\RuntimeException $e) {
if ('RuntimeException' !== get_class($e)) {
@ -331,7 +322,7 @@ class GitDownloaderTest extends TestCase
->method('getSourceReference')
->will($this->returnValue(null));
$this->setExpectedException('InvalidArgumentException');
self::expectException('InvalidArgumentException');
$downloader = $this->getDownloaderMock();
$downloader->download($sourcePackageMock, '/path', $initialPackageMock);
@ -358,7 +349,7 @@ class GitDownloaderTest extends TestCase
->method('getPrettyVersion')
->will($this->returnValue('1.0.0'));
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
$this->winCompat('git show-ref --head -d'),
$this->winCompat('git status --porcelain --untracked-files=no'),
@ -375,8 +366,6 @@ class GitDownloaderTest extends TestCase
$downloader->prepare('update', $packageMock, $this->workingDir, $packageMock);
$downloader->update($packageMock, $packageMock, $this->workingDir);
$downloader->cleanup('update', $packageMock, $this->workingDir, $packageMock);
$process->assertComplete($this);
}
public function testUpdateWithNewRepoUrl()
@ -400,7 +389,7 @@ class GitDownloaderTest extends TestCase
->method('getPrettyVersion')
->will($this->returnValue('1.0.0'));
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
$this->winCompat("git show-ref --head -d"),
$this->winCompat("git status --porcelain --untracked-files=no"),
@ -426,8 +415,6 @@ composer https://github.com/old/url (push)
$downloader->prepare('update', $packageMock, $this->workingDir, $packageMock);
$downloader->update($packageMock, $packageMock, $this->workingDir);
$downloader->cleanup('update', $packageMock, $this->workingDir, $packageMock);
$process->assertComplete($this);
}
/**
@ -449,7 +436,7 @@ composer https://github.com/old/url (push)
->method('getVersion')
->will($this->returnValue('1.0.0.0'));
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
$this->winCompat('git show-ref --head -d'),
$this->winCompat('git status --porcelain --untracked-files=no'),
@ -463,7 +450,6 @@ composer https://github.com/old/url (push)
'return' => 1,
),
$this->winCompat('git --version'),
$this->winCompat('git branch -r'),
), true);
$this->fs->ensureDirectoryExists($this->workingDir.'/.git');
@ -476,8 +462,6 @@ composer https://github.com/old/url (push)
$downloader->update($packageMock, $packageMock, $this->workingDir);
$downloader->cleanup('update', $packageMock, $this->workingDir, $packageMock);
$process->assertComplete($this);
$this->fail('This test should throw');
} catch (\RuntimeException $e) {
if ('RuntimeException' !== get_class($e)) {
@ -506,7 +490,7 @@ composer https://github.com/old/url (push)
->method('getPrettyVersion')
->will($this->returnValue('1.0.0'));
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
$this->winCompat('git show-ref --head -d'),
$this->winCompat('git status --porcelain --untracked-files=no'),
@ -532,8 +516,6 @@ composer https://github.com/old/url (push)
$downloader->prepare('update', $packageMock, $this->workingDir, $packageMock);
$downloader->update($packageMock, $packageMock, $this->workingDir);
$downloader->cleanup('update', $packageMock, $this->workingDir, $packageMock);
$process->assertComplete($this);
}
public function testDowngradeShowsAppropriateMessage()
@ -569,12 +551,14 @@ composer https://github.com/old/url (push)
->method('getFullPrettyVersion')
->will($this->returnValue('1.0.0'));
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$ioMock = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
$ioMock->expects($this->at(0))
$ioMock->expects($this->atLeastOnce())
->method('writeError')
->with($this->stringContains('Downgrading'));
->withConsecutive(
[$this->stringContains('Downgrading')]
);
$this->fs->ensureDirectoryExists($this->workingDir.'/.git');
$downloader = $this->getDownloaderMock($ioMock, null, $process);
@ -611,12 +595,14 @@ composer https://github.com/old/url (push)
->method('getPrettyVersion')
->will($this->returnValue('dev-ref2'));
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$ioMock = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
$ioMock->expects($this->at(0))
$ioMock->expects($this->atLeastOnce())
->method('writeError')
->with($this->stringContains('Upgrading'));
->withConsecutive(
[$this->stringContains('Upgrading')]
);
$this->fs->ensureDirectoryExists($this->workingDir.'/.git');
$downloader = $this->getDownloaderMock($ioMock, null, $process);
@ -631,7 +617,7 @@ composer https://github.com/old/url (push)
$expectedGitResetCommand = $this->winCompat("git status --porcelain --untracked-files=no");
$packageMock = $this->getMockBuilder('Composer\Package\PackageInterface')->getMock();
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
'git show-ref --head -d',
$expectedGitResetCommand,
@ -649,8 +635,6 @@ composer https://github.com/old/url (push)
$downloader->prepare('uninstall', $packageMock, $this->workingDir);
$downloader->remove($packageMock, $this->workingDir);
$downloader->cleanup('uninstall', $packageMock, $this->workingDir);
$process->assertComplete($this);
}
public function testGetInstallationSource()

@ -22,13 +22,14 @@ class HgDownloaderTest extends TestCase
/** @var string */
private $workingDir;
protected function setUp()
protected function setUp(): void
{
$this->workingDir = $this->getUniqueTmpDirectory();
}
protected function tearDown()
protected function tearDown(): void
{
parent::tearDown();
if (is_dir($this->workingDir)) {
$fs = new Filesystem;
$fs->removeDirectory($this->workingDir);
@ -46,7 +47,7 @@ class HgDownloaderTest extends TestCase
{
$io = $io ?: $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
$config = $config ?: $this->getMockBuilder('Composer\Config')->getMock();
$executor = $executor ?: new ProcessExecutorMock;
$executor = $executor ?: $this->getProcessExecutorMock();
$filesystem = $filesystem ?: $this->getMockBuilder('Composer\Util\Filesystem')->getMock();
return new HgDownloader($io, $config, $executor, $filesystem);
@ -59,7 +60,7 @@ class HgDownloaderTest extends TestCase
->method('getSourceReference')
->will($this->returnValue(null));
$this->setExpectedException('InvalidArgumentException');
self::expectException('InvalidArgumentException');
$downloader = $this->getDownloaderMock();
$downloader->install($packageMock, '/path');
@ -75,7 +76,7 @@ class HgDownloaderTest extends TestCase
->method('getSourceUrls')
->will($this->returnValue(array('https://mercurial.dev/l3l0/composer')));
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
$this->getCmd('hg clone -- \'https://mercurial.dev/l3l0/composer\' \'composerPath\''),
$this->getCmd('hg up -- \'ref\''),
@ -83,8 +84,6 @@ class HgDownloaderTest extends TestCase
$downloader = $this->getDownloaderMock(null, null, $process);
$downloader->install($packageMock, 'composerPath');
$process->assertComplete($this);
}
public function testUpdateforPackageWithoutSourceReference()
@ -95,7 +94,7 @@ class HgDownloaderTest extends TestCase
->method('getSourceReference')
->will($this->returnValue(null));
$this->setExpectedException('InvalidArgumentException');
self::expectException('InvalidArgumentException');
$downloader = $this->getDownloaderMock();
$downloader->prepare('update', $sourcePackageMock, '/path', $initialPackageMock);
@ -118,7 +117,7 @@ class HgDownloaderTest extends TestCase
->method('getSourceUrls')
->will($this->returnValue(array('https://github.com/l3l0/composer')));
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
$this->getCmd('hg st'),
$this->getCmd("hg pull -- 'https://github.com/l3l0/composer' && hg up -- 'ref'"),
@ -128,8 +127,6 @@ class HgDownloaderTest extends TestCase
$downloader->prepare('update', $packageMock, $this->workingDir, $packageMock);
$downloader->update($packageMock, $packageMock, $this->workingDir);
$downloader->cleanup('update', $packageMock, $this->workingDir, $packageMock);
$process->assertComplete($this);
}
public function testRemove()
@ -138,7 +135,7 @@ class HgDownloaderTest extends TestCase
$fs->ensureDirectoryExists($this->workingDir.'/.hg');
$packageMock = $this->getMockBuilder('Composer\Package\PackageInterface')->getMock();
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
$this->getCmd('hg st'),
), true);
@ -153,8 +150,6 @@ class HgDownloaderTest extends TestCase
$downloader->prepare('uninstall', $packageMock, $this->workingDir);
$downloader->remove($packageMock, $this->workingDir);
$downloader->cleanup('uninstall', $packageMock, $this->workingDir);
$process->assertComplete($this);
}
public function testGetInstallationSource()

@ -43,13 +43,13 @@ class PerforceDownloaderTest extends TestCase
/** @var string */
protected $testPath;
protected function setUp()
protected function setUp(): void
{
$this->testPath = $this->getUniqueTmpDirectory();
$this->repoConfig = $this->getRepoConfig();
$this->config = $this->getConfig();
$this->io = $this->getMockIoInterface();
$this->processExecutor = new ProcessExecutorMock;
$this->processExecutor = $this->getProcessExecutorMock();
$this->repository = $this->getMockRepository($this->repoConfig, $this->io, $this->config);
$this->package = $this->getMockPackageInterface($this->repository);
$this->downloader = new PerforceDownloader($this->io, $this->config, $this->processExecutor);
@ -103,7 +103,7 @@ class PerforceDownloaderTest extends TestCase
protected function getMockRepository(array $repoConfig, IOInterface $io, Config $config)
{
$repository = $this->getMockBuilder('Composer\Repository\VcsRepository')
->setMethods(array('getRepoConfig'))
->onlyMethods(array('getRepoConfig'))
->setConstructorArgs(array($repoConfig, $io, $config, Factory::createHttpDownloader($io, $config)))
->getMock();
$repository->expects($this->any())->method('getRepoConfig')->will($this->returnValue($repoConfig));
@ -140,13 +140,13 @@ class PerforceDownloaderTest extends TestCase
$this->io->expects($this->once())->method('writeError')->with($this->stringContains('Cloning '.$ref));
$perforceMethods = array('setStream', 'p4Login', 'writeP4ClientSpec', 'connectClient', 'syncCodeBase', 'cleanupClientSpec');
$perforce = $this->getMockBuilder('Composer\Util\Perforce')->disableOriginalConstructor()->getMock();
$perforce->expects($this->at(0))->method('initializePath')->with($this->equalTo($this->testPath));
$perforce->expects($this->at(1))->method('setStream')->with($this->equalTo($ref));
$perforce->expects($this->at(2))->method('p4Login');
$perforce->expects($this->at(3))->method('writeP4ClientSpec');
$perforce->expects($this->at(4))->method('connectClient');
$perforce->expects($this->at(5))->method('syncCodeBase')->with($label);
$perforce->expects($this->at(6))->method('cleanupClientSpec');
$perforce->expects($this->once())->method('initializePath')->with($this->equalTo($this->testPath));
$perforce->expects($this->once())->method('setStream')->with($this->equalTo($ref));
$perforce->expects($this->once())->method('p4Login');
$perforce->expects($this->once())->method('writeP4ClientSpec');
$perforce->expects($this->once())->method('connectClient');
$perforce->expects($this->once())->method('syncCodeBase')->with($label);
$perforce->expects($this->once())->method('cleanupClientSpec');
$this->downloader->setPerforce($perforce);
$this->downloader->doInstall($this->package, $this->testPath, 'url');
}
@ -163,13 +163,13 @@ class PerforceDownloaderTest extends TestCase
$this->io->expects($this->once())->method('writeError')->with($this->stringContains('Cloning '.$ref));
$perforceMethods = array('setStream', 'p4Login', 'writeP4ClientSpec', 'connectClient', 'syncCodeBase', 'cleanupClientSpec');
$perforce = $this->getMockBuilder('Composer\Util\Perforce')->disableOriginalConstructor()->getMock();
$perforce->expects($this->at(0))->method('initializePath')->with($this->equalTo($this->testPath));
$perforce->expects($this->at(1))->method('setStream')->with($this->equalTo($ref));
$perforce->expects($this->at(2))->method('p4Login');
$perforce->expects($this->at(3))->method('writeP4ClientSpec');
$perforce->expects($this->at(4))->method('connectClient');
$perforce->expects($this->at(5))->method('syncCodeBase')->with($label);
$perforce->expects($this->at(6))->method('cleanupClientSpec');
$perforce->expects($this->once())->method('initializePath')->with($this->equalTo($this->testPath));
$perforce->expects($this->once())->method('setStream')->with($this->equalTo($ref));
$perforce->expects($this->once())->method('p4Login');
$perforce->expects($this->once())->method('writeP4ClientSpec');
$perforce->expects($this->once())->method('connectClient');
$perforce->expects($this->once())->method('syncCodeBase')->with($label);
$perforce->expects($this->once())->method('cleanupClientSpec');
$this->downloader->setPerforce($perforce);
$this->downloader->doInstall($this->package, $this->testPath, 'url');
}

@ -31,7 +31,7 @@ class XzDownloaderTest extends TestCase
*/
private $testDir;
public function setUp()
public function setUp(): void
{
if (Platform::isWindows()) {
$this->markTestSkipped('Skip test on Windows');
@ -39,8 +39,12 @@ class XzDownloaderTest extends TestCase
$this->testDir = $this->getUniqueTmpDirectory();
}
public function tearDown()
protected function tearDown(): void
{
if (Platform::isWindows()) {
return;
}
parent::tearDown();
$this->fs = new Filesystem;
$this->fs->removeDirectory($this->testDir);
}

@ -32,7 +32,7 @@ class ZipDownloaderTest extends TestCase
/** @var \Composer\Package\PackageInterface&\PHPUnit\Framework\MockObject\MockObject */
private $package;
public function setUp()
public function setUp(): void
{
$this->testDir = $this->getUniqueTmpDirectory();
$this->io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
@ -42,8 +42,9 @@ class ZipDownloaderTest extends TestCase
$this->package = $this->getMockBuilder('Composer\Package\PackageInterface')->getMock();
}
public function tearDown()
protected function tearDown(): void
{
parent::tearDown();
$fs = new Filesystem;
$fs->removeDirectory($this->testDir);
$this->setPrivateProperty('hasZipArchive', null);
@ -107,7 +108,8 @@ class ZipDownloaderTest extends TestCase
public function testZipArchiveOnlyFailed()
{
$this->setExpectedException('RuntimeException', 'There was an error extracting the ZIP file');
self::expectException('RuntimeException');
self::expectExceptionMessage('There was an error extracting the ZIP file');
if (!class_exists('ZipArchive')) {
$this->markTestSkipped('zip extension missing');
}
@ -115,10 +117,10 @@ class ZipDownloaderTest extends TestCase
$this->setPrivateProperty('hasZipArchive', true);
$downloader = new MockedZipDownloader($this->io, $this->config, $this->httpDownloader);
$zipArchive = $this->getMockBuilder('ZipArchive')->getMock();
$zipArchive->expects($this->at(0))
$zipArchive->expects($this->once())
->method('open')
->will($this->returnValue(true));
$zipArchive->expects($this->at(1))
$zipArchive->expects($this->once())
->method('extractTo')
->will($this->returnValue(false));
@ -129,7 +131,8 @@ class ZipDownloaderTest extends TestCase
public function testZipArchiveExtractOnlyFailed()
{
$this->setExpectedException('RuntimeException', 'The archive may contain identical file names with different capitalization (which fails on case insensitive filesystems): Not a directory');
self::expectException('RuntimeException');
self::expectExceptionMessage('The archive may contain identical file names with different capitalization (which fails on case insensitive filesystems): Not a directory');
if (!class_exists('ZipArchive')) {
$this->markTestSkipped('zip extension missing');
}
@ -137,10 +140,10 @@ class ZipDownloaderTest extends TestCase
$this->setPrivateProperty('hasZipArchive', true);
$downloader = new MockedZipDownloader($this->io, $this->config, $this->httpDownloader);
$zipArchive = $this->getMockBuilder('ZipArchive')->getMock();
$zipArchive->expects($this->at(0))
$zipArchive->expects($this->once())
->method('open')
->will($this->returnValue(true));
$zipArchive->expects($this->at(1))
$zipArchive->expects($this->once())
->method('extractTo')
->will($this->throwException(new \ErrorException('Not a directory')));
@ -158,10 +161,10 @@ class ZipDownloaderTest extends TestCase
$this->setPrivateProperty('hasZipArchive', true);
$downloader = new MockedZipDownloader($this->io, $this->config, $this->httpDownloader);
$zipArchive = $this->getMockBuilder('ZipArchive')->getMock();
$zipArchive->expects($this->at(0))
$zipArchive->expects($this->once())
->method('open')
->will($this->returnValue(true));
$zipArchive->expects($this->at(1))
$zipArchive->expects($this->once())
->method('extractTo')
->will($this->returnValue(true));
@ -172,7 +175,8 @@ class ZipDownloaderTest extends TestCase
public function testSystemUnzipOnlyFailed()
{
$this->setExpectedException('Exception', 'Failed to extract : (1) unzip');
self::expectException('Exception');
self::expectExceptionMessage('Failed to extract : (1) unzip');
$this->setPrivateProperty('isWindows', false);
$this->setPrivateProperty('hasZipArchive', false);
$this->setPrivateProperty('unzipCommands', array(array('unzip', 'unzip -qq %s -d %s')));
@ -189,7 +193,7 @@ class ZipDownloaderTest extends TestCase
->will($this->returnValue('output'));
$processExecutor = $this->getMockBuilder('Composer\Util\ProcessExecutor')->getMock();
$processExecutor->expects($this->at(0))
$processExecutor->expects($this->once())
->method('executeAsync')
->will($this->returnValue(\React\Promise\resolve($procMock)));
@ -216,7 +220,7 @@ class ZipDownloaderTest extends TestCase
->will($this->returnValue('output'));
$processExecutor = $this->getMockBuilder('Composer\Util\ProcessExecutor')->getMock();
$processExecutor->expects($this->at(0))
$processExecutor->expects($this->once())
->method('executeAsync')
->will($this->returnValue(\React\Promise\resolve($procMock)));
@ -246,15 +250,15 @@ class ZipDownloaderTest extends TestCase
->will($this->returnValue('output'));
$processExecutor = $this->getMockBuilder('Composer\Util\ProcessExecutor')->getMock();
$processExecutor->expects($this->at(0))
$processExecutor->expects($this->once())
->method('executeAsync')
->will($this->returnValue(\React\Promise\resolve($procMock)));
$zipArchive = $this->getMockBuilder('ZipArchive')->getMock();
$zipArchive->expects($this->at(0))
$zipArchive->expects($this->once())
->method('open')
->will($this->returnValue(true));
$zipArchive->expects($this->at(1))
$zipArchive->expects($this->once())
->method('extractTo')
->will($this->returnValue(true));
@ -266,7 +270,8 @@ class ZipDownloaderTest extends TestCase
public function testNonWindowsFallbackFailed()
{
$this->setExpectedException('Exception', 'There was an error extracting the ZIP file');
self::expectException('Exception');
self::expectExceptionMessage('There was an error extracting the ZIP file');
if (!class_exists('ZipArchive')) {
$this->markTestSkipped('zip extension missing');
}
@ -286,15 +291,15 @@ class ZipDownloaderTest extends TestCase
->will($this->returnValue('output'));
$processExecutor = $this->getMockBuilder('Composer\Util\ProcessExecutor')->getMock();
$processExecutor->expects($this->at(0))
$processExecutor->expects($this->once())
->method('executeAsync')
->will($this->returnValue(\React\Promise\resolve($procMock)));
$zipArchive = $this->getMockBuilder('ZipArchive')->getMock();
$zipArchive->expects($this->at(0))
$zipArchive->expects($this->once())
->method('open')
->will($this->returnValue(true));
$zipArchive->expects($this->at(1))
$zipArchive->expects($this->once())
->method('extractTo')
->will($this->returnValue(false));

@ -31,24 +31,23 @@ class EventDispatcherTest extends TestCase
{
public function testListenerExceptionsAreCaught()
{
$this->setExpectedException('RuntimeException');
self::expectException('RuntimeException');
$io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
$dispatcher = $this->getDispatcherStubForListenersTest(array(
'Composer\Test\EventDispatcher\EventDispatcherTest::call',
), $io);
$io->expects($this->at(0))
$io->expects($this->once())
->method('isVerbose')
->willReturn(0);
$io->expects($this->at(1))
->method('writeError')
->with('> Composer\Test\EventDispatcher\EventDispatcherTest::call');
$io->expects($this->at(2))
$io->expects($this->atLeast(2))
->method('writeError')
->with('<error>Script Composer\Test\EventDispatcher\EventDispatcherTest::call handling the post-install-cmd event terminated with an exception</error>');
->withConsecutive(
['> Composer\Test\EventDispatcher\EventDispatcherTest::call'],
['<error>Script Composer\Test\EventDispatcher\EventDispatcherTest::call handling the post-install-cmd event terminated with an exception</error>']
);
$dispatcher->dispatchScript(ScriptEvents::POST_INSTALL_CMD, false);
}
@ -60,7 +59,7 @@ class EventDispatcherTest extends TestCase
*/
public function testDispatcherCanExecuteSingleCommandLineScript($command)
{
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
$command,
), true);
@ -71,7 +70,7 @@ class EventDispatcherTest extends TestCase
$this->getMockBuilder('Composer\IO\IOInterface')->getMock(),
$process,
))
->setMethods(array('getListeners'))
->onlyMethods(array('getListeners'))
->getMock();
$listener = array($command);
@ -80,8 +79,6 @@ class EventDispatcherTest extends TestCase
->will($this->returnValue($listener));
$dispatcher->dispatchScript(ScriptEvents::POST_INSTALL_CMD, false);
$process->assertComplete($this);
}
/**
@ -110,7 +107,7 @@ class EventDispatcherTest extends TestCase
$dispatcher = new EventDispatcher(
$composer,
$this->getMockBuilder('Composer\IO\IOInterface')->getMock(),
new ProcessExecutorMock
$this->getProcessExecutorMock()
);
$event = $this->getMockBuilder('Composer\Script\Event')
@ -139,7 +136,7 @@ class EventDispatcherTest extends TestCase
{
$generator = $this->getMockBuilder('Composer\Autoload\AutoloadGenerator')
->disableOriginalConstructor()
->setMethods(array(
->onlyMethods(array(
'buildPackageMap',
'parseAutoloads',
'createLoader',
@ -166,7 +163,7 @@ class EventDispatcherTest extends TestCase
{
$rm = $this->getMockBuilder('Composer\Repository\RepositoryManager')
->disableOriginalConstructor()
->setMethods(array('getLocalRepository'))
->onlyMethods(array('getLocalRepository'))
->getMock();
$repo = $this->getMockBuilder('Composer\Repository\InstalledRepositoryInterface')->getMock();
@ -191,7 +188,7 @@ class EventDispatcherTest extends TestCase
$dispatcher = new EventDispatcher(
$composer,
$io = new BufferIO('', OutputInterface::VERBOSITY_VERBOSE),
new ProcessExecutorMock
$this->getProcessExecutorMock()
);
$listener = array($this, 'someMethod');
@ -226,7 +223,7 @@ class EventDispatcherTest extends TestCase
public function testDispatcherCanExecuteCliAndPhpInSameEventScriptStack()
{
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
'echo -n foo',
'echo -n bar',
@ -238,7 +235,7 @@ class EventDispatcherTest extends TestCase
$io = new BufferIO('', OutputInterface::VERBOSITY_VERBOSE),
$process,
))
->setMethods(array(
->onlyMethods(array(
'getListeners',
))
->getMock();
@ -259,8 +256,6 @@ class EventDispatcherTest extends TestCase
'> post-install-cmd: Composer\Test\EventDispatcher\EventDispatcherTest::someMethod'.PHP_EOL.
'> post-install-cmd: echo -n bar'.PHP_EOL;
$this->assertEquals($expected, $io->getOutput());
$process->assertComplete($this);
}
public function testDispatcherCanPutEnv()
@ -269,9 +264,9 @@ class EventDispatcherTest extends TestCase
->setConstructorArgs(array(
$this->createComposerInstance(),
$io = new BufferIO('', OutputInterface::VERBOSITY_VERBOSE),
new ProcessExecutorMock,
$this->getProcessExecutorMock(),
))
->setMethods(array(
->onlyMethods(array(
'getListeners',
))
->getMock();
@ -302,8 +297,8 @@ class EventDispatcherTest extends TestCase
$dispatcher = $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher')->setConstructorArgs(array(
$this->createComposerInstance(),
$io = new BufferIO('', OutputInterface::VERBOSITY_VERBOSE),
new ProcessExecutorMock,
))->setMethods(array(
$this->getProcessExecutorMock(),
))->onlyMethods(array(
'getListeners',
))->getMock();
@ -368,7 +363,7 @@ class EventDispatcherTest extends TestCase
public function testDispatcherCanExecuteComposerScriptGroups()
{
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
'echo -n foo',
'echo -n baz',
@ -381,7 +376,7 @@ class EventDispatcherTest extends TestCase
$io = new BufferIO('', OutputInterface::VERBOSITY_VERBOSE),
$process,
))
->setMethods(array(
->onlyMethods(array(
'getListeners',
))
->getMock();
@ -411,13 +406,11 @@ class EventDispatcherTest extends TestCase
'> subgroup: echo -n baz'.PHP_EOL.
'> group: echo -n bar'.PHP_EOL;
$this->assertEquals($expected, $io->getOutput());
$process->assertComplete($this);
}
public function testRecursionInScriptsNames()
{
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
'echo Hello '.ProcessExecutor::escape('World'),
), true);
@ -428,7 +421,7 @@ class EventDispatcherTest extends TestCase
$io = new BufferIO('', OutputInterface::VERBOSITY_VERBOSE),
$process,
))
->setMethods(array(
->onlyMethods(array(
'getListeners',
))
->getMock();
@ -452,21 +445,19 @@ class EventDispatcherTest extends TestCase
"> hello: echo Hello " .$this->getCmd("'World'").PHP_EOL;
$this->assertEquals($expected, $io->getOutput());
$process->assertComplete($this);
}
public function testDispatcherDetectInfiniteRecursion()
{
$this->setExpectedException('RuntimeException');
self::expectException('RuntimeException');
$dispatcher = $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher')
->setConstructorArgs(array(
$composer = $this->createComposerInstance(),
$io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock(),
new ProcessExecutorMock,
$this->getProcessExecutorMock(),
))
->setMethods(array(
->onlyMethods(array(
'getListeners',
))
->getMock();
@ -500,7 +491,7 @@ class EventDispatcherTest extends TestCase
$this->createComposerInstance(),
$io,
))
->setMethods(array('getListeners'))
->onlyMethods(array('getListeners'))
->getMock();
$dispatcher->expects($this->atLeastOnce())
@ -527,7 +518,7 @@ class EventDispatcherTest extends TestCase
$io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock(),
new ProcessExecutor($io),
))
->setMethods(array('getListeners'))
->onlyMethods(array('getListeners'))
->getMock();
$listener = array('echo foo');
@ -554,7 +545,7 @@ class EventDispatcherTest extends TestCase
$io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock(),
new ProcessExecutor,
))
->setMethods(array('getListeners'))
->onlyMethods(array('getListeners'))
->getMock();
$code = 'exit 1';
@ -563,23 +554,22 @@ class EventDispatcherTest extends TestCase
->method('getListeners')
->will($this->returnValue($listener));
$io->expects($this->at(0))
$io->expects($this->once())
->method('isVerbose')
->willReturn(0);
$io->expects($this->at(1))
$io->expects($this->atLeast(2))
->method('writeError')
->willReturn('> exit 1');
->withConsecutive(
['> exit 1'],
['<error>Script '.$code.' handling the post-install-cmd event returned with error code 1</error>']
);
$io->expects($this->at(2))
$io->expects($this->once())
->method('isInteractive')
->willReturn(1);
$io->expects($this->at(3))
->method('writeError')
->with($this->equalTo('<error>Script '.$code.' handling the post-install-cmd event returned with error code 1</error>'));
$this->setExpectedException('RuntimeException');
self::expectException('RuntimeException');
$dispatcher->dispatchScript(ScriptEvents::POST_INSTALL_CMD, false);
}
@ -589,9 +579,9 @@ class EventDispatcherTest extends TestCase
->setConstructorArgs(array(
$this->createComposerInstance(),
$this->getMockBuilder('Composer\IO\IOInterface')->getMock(),
new ProcessExecutorMock,
$this->getProcessExecutorMock(),
))
->setMethods(array('getListeners'))
->onlyMethods(array('getListeners'))
->getMock();
$dispatcher->expects($this->atLeastOnce())

@ -32,7 +32,8 @@ final class PlatformRequirementFilterFactoryTest extends TestCase
public function testFromBoolThrowsExceptionIfTypeIsUnknown()
{
$this->setExpectedException('InvalidArgumentException', 'PlatformRequirementFilter: Unknown $boolOrList parameter NULL. Please report at https://github.com/composer/composer/issues/new.');
self::expectException('InvalidArgumentException');
self::expectExceptionMessage('PlatformRequirementFilter: Unknown $boolOrList parameter NULL. Please report at https://github.com/composer/composer/issues/new.');
PlatformRequirementFilterFactory::fromBoolOrList(null);
}

@ -8,7 +8,7 @@ Checks that package versions in InstalledVersions are correct on initial install
update
--EXPECT--
> Hooks::preUpdate
!!PreUpdate:["composer/ca-bundle","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/log","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/debug","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-mbstring","symfony/process"]
!!PreUpdate:["composer/ca-bundle","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string"]
!!Versions:console:%[2-8]\.\d+\.\d+.0%;process:%[2-8]\.\d+\.\d+.0%;filesystem:%[2-8]\.\d+\.\d+.0%
Loading composer repositories with package information
Updating dependencies
@ -26,12 +26,12 @@ Package operations: 6 installs, 0 updates, 0 removals%(\nAs there is no 'unzip'
- Downloading symfony/filesystem (%v?[2-8]\.\d+\.\d+%)
- Installing symfony/console (99999.1.2): Symlinking from symfony-console
- Installing plugin/a (1.1.1): Symlinking from plugin-a
!!PluginAInit["composer/ca-bundle","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/log","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/debug","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-mbstring","symfony/process","root/pkg"]
!!PluginAInit["composer/ca-bundle","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","root/pkg"]
!!PluginA:null
!!PluginB:null
!!Versions:console:%[2-8]\.\d+\.\d+.0%;process:%[2-8]\.\d+\.\d+.0%;filesystem:%[2-8]\.\d+\.\d+.0%
- Installing plugin/b (2.2.2): Symlinking from plugin-b
!!PluginBInit["composer/ca-bundle","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/log","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/debug","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-mbstring","symfony/process","plugin/a","root/pkg"]
!!PluginBInit["composer/ca-bundle","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","root/pkg"]
!!PluginA:1.1.1.0
!!PluginB:null
!!Versions:console:%[2-8]\.\d+\.\d+.0%;process:%[2-8]\.\d+\.\d+.0%;filesystem:%[2-8]\.\d+\.\d+.0%
@ -42,7 +42,7 @@ Generating autoload files
2 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
> Hooks::postUpdate
!!PostUpdate:["composer/ca-bundle","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/log","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/debug","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-mbstring","symfony/process","plugin/a","plugin/b","root/pkg"]
!!PostUpdate:["composer/ca-bundle","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"]
!!Versions:console:%[2-8]\.\d+\.\d+.0%;process:%[2-8]\.\d+\.\d+.0%;filesystem:%[2-8]\.\d+\.\d+.0%
--EXPECT-EXIT-CODE--

@ -7,14 +7,14 @@ Checks that package versions in InstalledVersions are correct during an upgrade.
--RUN--
update plugin/* symfony/console symfony/filesystem symfony/process
--EXPECT--
!!PluginA:1.1.1.0["composer/ca-bundle","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/log","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/debug","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-mbstring","symfony/process","plugin/a","plugin/b","root/pkg"]
!!PluginA:1.1.1.0["composer/ca-bundle","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"]
!!PluginB:2.2.2.0
!!Versions:console:%[2-8]\.\d+\.\d+.0%;process:%[2-8]\.\d+\.\d+.0%;filesystem:%[2-8]\.\d+\.\d+.0%
!!PluginB:2.2.2.0["composer/ca-bundle","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/log","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/debug","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-mbstring","symfony/process","plugin/a","plugin/b","root/pkg"]
!!PluginB:2.2.2.0["composer/ca-bundle","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"]
!!PluginA:1.1.1.0
!!Versions:console:%[2-8]\.\d+\.\d+.0%;process:%[2-8]\.\d+\.\d+.0%;filesystem:%[2-8]\.\d+\.\d+.0%
> Hooks::preUpdate
!!PreUpdate:["composer/ca-bundle","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/log","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/debug","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-mbstring","symfony/process","plugin/a","plugin/b","root/pkg"]
!!PreUpdate:["composer/ca-bundle","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"]
!!Versions:console:%[2-8]\.\d+\.\d+.0%;process:%[2-8]\.\d+\.\d+.0%;filesystem:%[2-8]\.\d+\.\d+.0%
Loading composer repositories with package information
Updating dependencies
@ -30,12 +30,12 @@ Package operations: 0 installs, 5 updates, 0 removals%(\nAs there is no 'unzip'
- Downloading symfony/filesystem (%v?[2-8]\.\d+\.\d+%)
- Upgrading symfony/console (99999.1.2 => 99999.1.3): Mirroring from symfony-console
- Upgrading plugin/a (1.1.1 => 1.1.2): Mirroring from plugin-a
!!PluginAInit["composer/ca-bundle","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/log","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/debug","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-mbstring","symfony/process","plugin/a","plugin/b","root/pkg"]
!!PluginAInit["composer/ca-bundle","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"]
!!PluginA:1.1.1.0
!!PluginB:2.2.2.0
!!Versions:console:%[2-8]\.\d+\.\d+.0%;process:%[2-8]\.\d+\.\d+.0%;filesystem:%[2-8]\.\d+\.\d+.0%
- Upgrading plugin/b (2.2.2 => 2.2.3): Mirroring from plugin-b
!!PluginBInit["composer/ca-bundle","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/log","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/debug","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-mbstring","symfony/process","plugin/a","plugin/b","root/pkg"]
!!PluginBInit["composer/ca-bundle","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"]
!!PluginA:1.1.2.0
!!PluginB:2.2.2.0
!!Versions:console:%[2-8]\.\d+\.\d+.0%;process:%[2-8]\.\d+\.\d+.0%;filesystem:%[2-8]\.\d+\.\d+.0%
@ -45,7 +45,7 @@ Generating autoload files
2 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
> Hooks::postUpdate
!!PostUpdate:["composer/ca-bundle","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/log","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/debug","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-mbstring","symfony/process","plugin/a","plugin/b","root/pkg"]
!!PostUpdate:["composer/ca-bundle","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"]
!!Versions:console:%[2-8]\.\d+\.\d+.0%;process:%[2-8]\.\d+\.\d+.0%;filesystem:%[2-8]\.\d+\.\d+.0%
!!PluginA:1.1.2.0
!!PluginB:2.2.3.0

@ -27,7 +27,8 @@ class BufferIOTest extends TestCase
$input = $refl->getValue($bufferIO);
if (!$input instanceof StreamableInputInterface) {
$this->setExpectedException('\RuntimeException', 'Setting the user inputs requires at least the version 3.2 of the symfony/console component.');
self::expectException('\RuntimeException');
self::expectExceptionMessage('Setting the user inputs requires at least the version 3.2 of the symfony/console component.');
}
$bufferIO->setUserInputs(array(

@ -22,12 +22,12 @@ class ConsoleIOTest extends TestCase
public function testIsInteractive()
{
$inputMock = $this->getMockBuilder('Symfony\Component\Console\Input\InputInterface')->getMock();
$inputMock->expects($this->at(0))
$inputMock->expects($this->exactly(2))
->method('isInteractive')
->will($this->returnValue(true));
$inputMock->expects($this->at(1))
->method('isInteractive')
->will($this->returnValue(false));
->willReturnOnConsecutiveCalls(
true,
false
);
$outputMock = $this->getMockBuilder('Symfony\Component\Console\Output\OutputInterface')->getMock();
$helperMock = $this->getMockBuilder('Symfony\Component\Console\Helper\HelperSet')->getMock();
@ -109,27 +109,17 @@ class ConsoleIOTest extends TestCase
$outputMock->expects($this->any())
->method('getVerbosity')
->willReturn(OutputInterface::VERBOSITY_NORMAL);
$outputMock->expects($this->at(1))
->method('write')
->with($this->equalTo('something (<question>strlen = 23</question>)'));
$outputMock->expects($this->at(3))
->method('write')
->with($this->equalTo(str_repeat("\x08", 23)), $this->equalTo(false));
$outputMock->expects($this->at(5))
->method('write')
->with($this->equalTo('shorter (<comment>12</comment>)'), $this->equalTo(false));
$outputMock->expects($this->at(7))
$outputMock->expects($this->atLeast(7))
->method('write')
->with($this->equalTo(str_repeat(' ', 11)), $this->equalTo(false));
$outputMock->expects($this->at(9))
->method('write')
->with($this->equalTo(str_repeat("\x08", 11)), $this->equalTo(false));
$outputMock->expects($this->at(11))
->method('write')
->with($this->equalTo(str_repeat("\x08", 12)), $this->equalTo(false));
$outputMock->expects($this->at(13))
->method('write')
->with($this->equalTo('something longer than initial (<info>34</info>)'));
->withConsecutive(
[$this->equalTo('something (<question>strlen = 23</question>)')],
[$this->equalTo(str_repeat("\x08", 23)), $this->equalTo(false)],
[$this->equalTo('shorter (<comment>12</comment>)'), $this->equalTo(false)],
[$this->equalTo(str_repeat(' ', 11)), $this->equalTo(false)],
[$this->equalTo(str_repeat("\x08", 11)), $this->equalTo(false)],
[$this->equalTo(str_repeat("\x08", 12)), $this->equalTo(false)],
[$this->equalTo('something longer than initial (<info>34</info>)')]
);
$helperMock = $this->getMockBuilder('Symfony\Component\Console\Helper\HelperSet')->getMock();

@ -22,7 +22,7 @@ class InstalledVersionsTest extends TestCase
*/
private $root;
public static function setUpBeforeClass()
public static function setUpBeforeClass(): void
{
// disable multiple-ClassLoader-based checks of InstalledVersions by making it seem like no
// class loaders are registered
@ -31,12 +31,12 @@ class InstalledVersionsTest extends TestCase
$prop->setValue(array());
}
public static function tearDownAfterClass()
public static function tearDownAfterClass(): void
{
self::setUpBeforeClass();
}
public function setUp()
public function setUp(): void
{
$this->root = $this->getUniqueTmpDirectory();
@ -200,7 +200,7 @@ class InstalledVersionsTest extends TestCase
public function testGetVersionOutOfBounds()
{
$this->setExpectedException('OutOfBoundsException');
self::expectException('OutOfBoundsException');
InstalledVersions::getVersion('not/installed');
}

@ -46,7 +46,7 @@ class BinaryInstallerTest extends TestCase
*/
protected $fs;
protected function setUp()
protected function setUp(): void
{
$this->fs = new Filesystem;
@ -60,8 +60,9 @@ class BinaryInstallerTest extends TestCase
$this->io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
}
protected function tearDown()
protected function tearDown(): void
{
parent::tearDown();
$this->fs->removeDirectory($this->rootDir);
}

@ -36,7 +36,7 @@ class InstallationManagerTest extends TestCase
*/
protected $io;
public function setUp()
public function setUp(): void
{
$this->loop = $this->getMockBuilder('Composer\Util\Loop')->disableOriginalConstructor()->getMock();
$this->repository = $this->getMockBuilder('Composer\Repository\InstalledRepositoryInterface')->getMock();
@ -59,7 +59,7 @@ class InstallationManagerTest extends TestCase
$manager->addInstaller($installer);
$this->assertSame($installer, $manager->getInstaller('vendor'));
$this->setExpectedException('InvalidArgumentException');
self::expectException('InvalidArgumentException');
$manager->getInstaller('unregistered');
}
@ -97,7 +97,7 @@ class InstallationManagerTest extends TestCase
{
$manager = $this->getMockBuilder('Composer\Installer\InstallationManager')
->setConstructorArgs(array($this->loop, $this->io))
->setMethods(array('install', 'update', 'uninstall'))
->onlyMethods(array('install', 'update', 'uninstall'))
->getMock();
$installOperation = new InstallOperation($package = $this->createPackageMock());

@ -65,7 +65,7 @@ class LibraryInstallerTest extends TestCase
*/
protected $fs;
protected function setUp()
protected function setUp(): void
{
$this->fs = new Filesystem;
@ -96,8 +96,9 @@ class LibraryInstallerTest extends TestCase
$this->io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
}
protected function tearDown()
protected function tearDown(): void
{
parent::tearDown();
$this->fs->removeDirectory($this->rootDir);
}
@ -222,7 +223,7 @@ class LibraryInstallerTest extends TestCase
$this->assertFileExists($this->vendorDir, 'Vendor dir should be created');
$this->assertFileExists($this->binDir, 'Bin dir should be created');
$this->setExpectedException('InvalidArgumentException');
self::expectException('InvalidArgumentException');
$library->update($this->repository, $initial, $target);
}
@ -259,7 +260,7 @@ class LibraryInstallerTest extends TestCase
$library->uninstall($this->repository, $package);
$this->setExpectedException('InvalidArgumentException');
self::expectException('InvalidArgumentException');
$library->uninstall($this->repository, $package);
}

@ -30,7 +30,7 @@ class MetapackageInstallerTest extends TestCase
*/
private $io;
protected function setUp()
protected function setUp(): void
{
$this->repository = $this->getMockBuilder('Composer\Repository\InstalledRepositoryInterface')->getMock();
@ -80,7 +80,7 @@ class MetapackageInstallerTest extends TestCase
$this->installer->update($this->repository, $initial, $target);
$this->setExpectedException('InvalidArgumentException');
self::expectException('InvalidArgumentException');
$this->installer->update($this->repository, $initial, $target);
}
@ -102,7 +102,7 @@ class MetapackageInstallerTest extends TestCase
$this->installer->uninstall($this->repository, $package);
$this->setExpectedException('InvalidArgumentException');
self::expectException('InvalidArgumentException');
$this->installer->uninstall($this->repository, $package);
}

@ -30,7 +30,7 @@ class SuggestedPackagesReporterTest extends TestCase
*/
private $suggestedPackagesReporter;
protected function setUp()
protected function setUp(): void
{
$this->io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
@ -141,13 +141,13 @@ class SuggestedPackagesReporterTest extends TestCase
{
$this->suggestedPackagesReporter->addPackage('a', 'b', 'c');
$this->io->expects($this->at(0))
$this->io->expects($this->exactly(3))
->method('write')
->with('<comment>a</comment> suggests:');
$this->io->expects($this->at(1))
->method('write')
->with(' - <info>b</info>: c');
->withConsecutive(
['<comment>a</comment> suggests:'],
[' - <info>b</info>: c'],
['']
);
$this->suggestedPackagesReporter->output(SuggestedPackagesReporter::MODE_BY_PACKAGE);
}
@ -159,13 +159,13 @@ class SuggestedPackagesReporterTest extends TestCase
{
$this->suggestedPackagesReporter->addPackage('a', 'b', '');
$this->io->expects($this->at(0))
$this->io->expects($this->exactly(3))
->method('write')
->with('<comment>a</comment> suggests:');
$this->io->expects($this->at(1))
->method('write')
->with(' - <info>b</info>');
->withConsecutive(
['<comment>a</comment> suggests:'],
[' - <info>b</info>'],
['']
);
$this->suggestedPackagesReporter->output(SuggestedPackagesReporter::MODE_BY_PACKAGE);
}
@ -178,17 +178,14 @@ class SuggestedPackagesReporterTest extends TestCase
$this->suggestedPackagesReporter->addPackage('source', 'target1', "\x1b[1;37;42m Like us\r\non Facebook \x1b[0m");
$this->suggestedPackagesReporter->addPackage('source', 'target2', "<bg=green>Like us on Facebook</>");
$this->io->expects($this->at(0))
$this->io->expects($this->exactly(4))
->method('write')
->with('<comment>source</comment> suggests:');
$this->io->expects($this->at(1))
->method('write')
->with(' - <info>target1</info>: [1;37;42m Like us on Facebook [0m');
$this->io->expects($this->at(2))
->method('write')
->with(' - <info>target2</info>: \\<bg=green>Like us on Facebook\\</>');
->withConsecutive(
['<comment>source</comment> suggests:'],
[' - <info>target1</info>: [1;37;42m Like us on Facebook [0m'],
[' - <info>target2</info>: \\<bg=green>Like us on Facebook\\</>'],
['']
);
$this->suggestedPackagesReporter->output(SuggestedPackagesReporter::MODE_BY_PACKAGE);
}
@ -201,25 +198,16 @@ class SuggestedPackagesReporterTest extends TestCase
$this->suggestedPackagesReporter->addPackage('a', 'b', 'c');
$this->suggestedPackagesReporter->addPackage('source package', 'target', 'because reasons');
$this->io->expects($this->at(0))
->method('write')
->with('<comment>a</comment> suggests:');
$this->io->expects($this->at(1))
->method('write')
->with(' - <info>b</info>: c');
$this->io->expects($this->at(2))
->method('write')
->with('');
$this->io->expects($this->at(3))
$this->io->expects($this->exactly(6))
->method('write')
->with('<comment>source package</comment> suggests:');
$this->io->expects($this->at(4))
->method('write')
->with(' - <info>target</info>: because reasons');
->withConsecutive(
['<comment>a</comment> suggests:'],
[' - <info>b</info>: c'],
[''],
['<comment>source package</comment> suggests:'],
[' - <info>target</info>: because reasons'],
['']
);
$this->suggestedPackagesReporter->output(SuggestedPackagesReporter::MODE_BY_PACKAGE);
}
@ -251,13 +239,13 @@ class SuggestedPackagesReporterTest extends TestCase
$this->suggestedPackagesReporter->addPackage('a', 'b', 'c');
$this->suggestedPackagesReporter->addPackage('source package', 'target', 'because reasons');
$this->io->expects($this->at(0))
->method('write')
->with('<comment>source package</comment> suggests:');
$this->io->expects($this->at(1))
$this->io->expects($this->exactly(3))
->method('write')
->with(' - <info>target</info>: because reasons');
->withConsecutive(
['<comment>source package</comment> suggests:'],
[' - <info>target</info>: because reasons'],
['']
);
$this->suggestedPackagesReporter->output(SuggestedPackagesReporter::MODE_BY_PACKAGE, $repository);
}

@ -50,14 +50,15 @@ class InstallerTest extends TestCase
/** @var ?string */
protected $tempComposerHome;
public function setUp()
public function setUp(): void
{
$this->prevCwd = getcwd();
chdir(__DIR__);
}
public function tearDown()
protected function tearDown(): void
{
parent::tearDown();
Platform::clearEnv('COMPOSER_POOL_OPTIMIZER');
chdir($this->prevCwd);
@ -234,7 +235,7 @@ class InstallerTest extends TestCase
* @param ?string $expectOutput
* @param ?string $expectOutputOptimized
* @param string $expect
* @param int|string $expectResult
* @param int|class-string<\Throwable> $expectResult
*/
public function testSlowIntegration($file, $message, $condition, $composerConfig, $lock, $installed, $run, $expectLock, $expectInstalled, $expectOutput, $expectOutputOptimized, $expect, $expectResult)
{
@ -257,7 +258,7 @@ class InstallerTest extends TestCase
* @param ?string $expectOutput
* @param ?string $expectOutputOptimized
* @param string $expect
* @param int|string $expectResult
* @param int|class-string<\Throwable> $expectResult
*/
public function testIntegrationWithPoolOptimizer($file, $message, $condition, $composerConfig, $lock, $installed, $run, $expectLock, $expectInstalled, $expectOutput, $expectOutputOptimized, $expect, $expectResult)
{
@ -280,7 +281,7 @@ class InstallerTest extends TestCase
* @param ?string $expectOutput
* @param ?string $expectOutputOptimized
* @param string $expect
* @param int|string $expectResult
* @param int|class-string<\Throwable> $expectResult
*/
public function testIntegrationWithRawPool($file, $message, $condition, $composerConfig, $lock, $installed, $run, $expectLock, $expectInstalled, $expectOutput, $expectOutputOptimized, $expect, $expectResult)
{
@ -301,7 +302,7 @@ class InstallerTest extends TestCase
* @param ?mixed[] $expectInstalled
* @param ?string $expectOutput
* @param string $expect
* @param int|string $expectResult
* @param int|class-string<\Throwable> $expectResult
* @return void
*/
private function doTestIntegration($file, $message, $condition, $composerConfig, $lock, $installed, $run, $expectLock, $expectInstalled, $expectOutput, $expect, $expectResult)
@ -318,7 +319,8 @@ class InstallerTest extends TestCase
// Prepare for exceptions
if (!is_int($expectResult)) {
$normalizedOutput = rtrim(str_replace("\n", PHP_EOL, $expect));
$this->setExpectedException($expectResult, $normalizedOutput);
self::expectException($expectResult);
self::expectExceptionMessage($normalizedOutput);
}
// Create Composer mock object according to configuration
@ -451,6 +453,9 @@ class InstallerTest extends TestCase
$application->setAutoExit(false);
$appOutput = fopen('php://memory', 'w+');
if (false === $appOutput) {
self::fail('Failed to open memory stream');
}
$input = new StringInput($run.' -vvv');
$input->setInteractive(false);
$result = $application->run($input, new StreamOutput($appOutput));
@ -553,7 +558,7 @@ class InstallerTest extends TestCase
if (!empty($testData['LOCK'])) {
$lock = JsonFile::parseJson($testData['LOCK']);
if (!isset($lock['hash'])) {
$lock['hash'] = md5(json_encode($composer));
$lock['hash'] = md5(JsonFile::encode($composer, 0));
}
}
if (!empty($testData['INSTALLED'])) {

@ -99,7 +99,7 @@ class JsonFileTest extends TestCase
public function testSchemaValidationError()
{
$file = tempnam(sys_get_temp_dir(), 'c');
$file = $this->createTempFile();
file_put_contents($file, '{ "name": null }');
$json = new JsonFile($file);
$expectedMessage = sprintf('"%s" does not match the expected JSON schema', $file);
@ -123,7 +123,7 @@ class JsonFileTest extends TestCase
public function testSchemaValidationLaxAdditionalProperties()
{
$file = tempnam(sys_get_temp_dir(), 'c');
$file = $this->createTempFile();
file_put_contents($file, '{ "name": "vendor/package", "description": "generic description", "foo": "bar" }');
$json = new JsonFile($file);
try {
@ -139,7 +139,7 @@ class JsonFileTest extends TestCase
public function testSchemaValidationLaxRequired()
{
$file = tempnam(sys_get_temp_dir(), 'c');
$file = $this->createTempFile();
$json = new JsonFile($file);
$expectedMessage = sprintf('"%s" does not match the expected JSON schema', $file);
@ -209,10 +209,10 @@ class JsonFileTest extends TestCase
public function testCustomSchemaValidationLax()
{
$file = tempnam(sys_get_temp_dir(), 'c');
$file = $this->createTempFile();
file_put_contents($file, '{ "custom": "property", "another custom": "property" }');
$schema = tempnam(sys_get_temp_dir(), 'c');
$schema = $this->createTempFile();
file_put_contents($schema, '{ "properties": { "custom": { "type": "string" }}}');
$json = new JsonFile($file);
@ -225,10 +225,10 @@ class JsonFileTest extends TestCase
public function testCustomSchemaValidationStrict()
{
$file = tempnam(sys_get_temp_dir(), 'c');
$file = $this->createTempFile();
file_put_contents($file, '{ "custom": "property" }');
$schema = tempnam(sys_get_temp_dir(), 'c');
$schema = $this->createTempFile();
file_put_contents($schema, '{ "properties": { "custom": { "type": "string" }}}');
$json = new JsonFile($file);

@ -12,31 +12,120 @@
namespace Composer\Test\Mock;
use Composer\Config;
use Composer\IO\BufferIO;
use Composer\IO\IOInterface;
use Composer\Util\HttpDownloader;
use Composer\Util\Http\Response;
use Composer\Downloader\TransportException;
use PHPUnit\Framework\Assert;
use PHPUnit\Framework\AssertionFailedError;
class HttpDownloaderMock extends HttpDownloader
{
/**
* @var array<string, string>
* @var array<array{url: string, options: array<mixed>|null, status: int, body: string, headers: list<string>}>|null
*/
protected $contentMap;
private $expectations = null;
/**
* @var bool
*/
private $strict = false;
/**
* @var array{status: int, body: string, headers: array<string>}
*/
private $defaultHandler = array('status' => 200, 'body' => '', 'headers' => []);
/**
* @var string[]
*/
private $log = array();
public function __construct(IOInterface $io = null, Config $config = null)
{
if ($io === null) {
$io = new BufferIO();
}
if ($config === null) {
$config = new Config(false);
}
parent::__construct($io, $config);
}
/**
* @param array<string, string> $contentMap associative array of locations and content
* @param array<array{url: string, options?: array<mixed>, status?: int, body?: string, headers?: array<string>}> $expectations
* @param bool $strict set to true if you want to provide *all* expected http requests, and not just a subset you are interested in testing
* @param array{status?: int, body?: string, headers?: array<string>} $defaultHandler default URL handler for undefined requests if not in strict mode
*/
public function __construct(array $contentMap)
public function expects(array $expectations, bool $strict = false, array $defaultHandler = array('status' => 200, 'body' => '', 'headers' => [])): void
{
$this->contentMap = $contentMap;
$default = ['url' => '', 'options' => null, 'status' => 200, 'body' => '', 'headers' => ['']];
$this->expectations = array_map(function (array $expect) use ($default): array {
if (count($diff = array_diff_key(array_merge($default, $expect), $default)) > 0) {
throw new \UnexpectedValueException('Unexpected keys in process execution step: '.implode(', ', array_keys($diff)));
}
return array_merge($default, $expect);
}, $expectations);
$this->strict = $strict;
$this->defaultHandler = array_merge($this->defaultHandler, $defaultHandler);
}
public function get($fileUrl, $options = array())
public function assertComplete(): void
{
if (!empty($this->contentMap[$fileUrl])) {
return new Response(array('url' => $fileUrl), 200, array(), $this->contentMap[$fileUrl]);
// this was not configured to expect anything, so no need to react here
if (!is_array($this->expectations)) {
return;
}
throw new TransportException('The "'.$fileUrl.'" file could not be downloaded (NOT FOUND)', 404);
if (count($this->expectations) > 0) {
$expectations = array_map(function ($expect) {
return $expect['url'];
}, $this->expectations);
throw new AssertionFailedError(
'There are still '.count($this->expectations).' expected HTTP requests which have not been consumed:'.PHP_EOL.
implode(PHP_EOL, $expectations).PHP_EOL.PHP_EOL.
'Received calls:'.PHP_EOL.implode(PHP_EOL, $this->log)
);
}
// dummy assertion to ensure the test is not marked as having no assertions
Assert::assertTrue(true); // @phpstan-ignore-line
}
public function get($fileUrl, $options = array()): Response
{
$this->log[] = $fileUrl;
if (is_array($this->expectations) && count($this->expectations) > 0 && $fileUrl === $this->expectations[0]['url'] && ($this->expectations[0]['options'] === null || $options === $this->expectations[0]['options'])) {
$expect = array_shift($this->expectations);
return $this->respond($fileUrl, $expect['status'], $expect['headers'], $expect['body']);
}
if (!$this->strict) {
return $this->respond($fileUrl, $this->defaultHandler['status'], $this->defaultHandler['headers'], $this->defaultHandler['body']);
}
throw new AssertionFailedError(
'Received unexpected request for "'.$fileUrl.'"'.PHP_EOL.
(is_array($this->expectations) && count($this->expectations) > 0 ? 'Expected "'.$this->expectations[0]['url'].'" at this point.' : 'Expected no more calls at this point.').PHP_EOL.
'Received calls:'.PHP_EOL.implode(PHP_EOL, array_slice($this->log, 0, -1))
);
}
/**
* @param string[] $headers
*/
private function respond(string $url, int $status, array $headers, string $body): Response
{
if ($status < 400) {
return new Response(array('url' => $url), $status, $headers, $body);
}
$e = new TransportException('The "'.$url.'" file could not be downloaded', $status);
$e->setHeaders($headers);
$e->setResponse($body);
throw $e;
}
}

@ -14,6 +14,7 @@ namespace Composer\Test\Mock;
use Composer\Util\ProcessExecutor;
use Composer\Util\Platform;
use PHPUnit\Framework\Assert;
use PHPUnit\Framework\TestCase;
use PHPUnit\Framework\AssertionFailedError;
use Symfony\Component\Process\Process;
@ -25,9 +26,9 @@ use React\Promise\Promise;
class ProcessExecutorMock extends ProcessExecutor
{
/**
* @var array<array{cmd: string, return: int, stdout: string, stderr: string, callback: ?callable}>
* @var array<array{cmd: string, return: int, stdout: string, stderr: string, callback: callable|null}>|null
*/
private $expectations = array();
private $expectations = null;
/**
* @var bool
*/
@ -64,10 +65,14 @@ class ProcessExecutorMock extends ProcessExecutor
$this->defaultHandler = array_merge($this->defaultHandler, $defaultHandler);
}
/** @return void */
public function assertComplete(TestCase $testCase)
public function assertComplete(): void
{
if ($this->expectations) {
// this was not configured to expect anything, so no need to react here
if (!is_array($this->expectations)) {
return;
}
if (count($this->expectations) > 0) {
$expectations = array_map(function ($expect) {
return $expect['cmd'];
}, $this->expectations);
@ -78,7 +83,8 @@ class ProcessExecutorMock extends ProcessExecutor
);
}
$testCase->assertTrue(true);
// dummy assertion to ensure the test is not marked as having no assertions
Assert::assertTrue(true); // @phpstan-ignore-line
}
public function execute($command, &$output = null, $cwd = null)
@ -115,7 +121,7 @@ class ProcessExecutorMock extends ProcessExecutor
$this->log[] = $command;
if ($this->expectations && $command === $this->expectations[0]['cmd']) {
if (is_array($this->expectations) && count($this->expectations) > 0 && $command === $this->expectations[0]['cmd']) {
$expect = array_shift($this->expectations);
$stdout = $expect['stdout'];
$stderr = $expect['stderr'];
@ -130,7 +136,7 @@ class ProcessExecutorMock extends ProcessExecutor
} else {
throw new AssertionFailedError(
'Received unexpected command "'.$command.'" in "'.$cwd.'"'.PHP_EOL.
($this->expectations ? 'Expected "'.$this->expectations[0]['cmd'].'" at this point.' : 'Expected no more calls at this point.').PHP_EOL.
(is_array($this->expectations) && count($this->expectations) > 0 ? 'Expected "'.$this->expectations[0]['cmd'].'" at this point.' : 'Expected no more calls at this point.').PHP_EOL.
'Received calls:'.PHP_EOL.implode(PHP_EOL, array_slice($this->log, 0, -1))
);
}

@ -33,7 +33,7 @@ class ArchivableFilesFinderTest extends TestCase
*/
protected $fs;
protected function setUp()
protected function setUp(): void
{
$fs = new Filesystem;
$this->fs = $fs;
@ -95,8 +95,9 @@ class ArchivableFilesFinderTest extends TestCase
}
}
protected function tearDown()
protected function tearDown(): void
{
parent::tearDown();
$fs = new Filesystem;
$fs->removeDirectory($this->sources);
}

@ -32,7 +32,7 @@ class ArchiveManagerTest extends ArchiverTest
*/
protected $targetDir;
public function setUp()
public function setUp(): void
{
parent::setUp();
@ -50,7 +50,7 @@ class ArchiveManagerTest extends ArchiverTest
public function testUnknownFormat()
{
$this->setExpectedException('RuntimeException');
self::expectException('RuntimeException');
$package = $this->setupPackage();

@ -34,15 +34,16 @@ abstract class ArchiverTest extends TestCase
*/
protected $testDir;
public function setUp()
public function setUp(): void
{
$this->filesystem = new Filesystem();
$this->process = new ProcessExecutor();
$this->testDir = $this->getUniqueTmpDirectory();
}
public function tearDown()
protected function tearDown(): void
{
parent::tearDown();
$this->filesystem->removeDirectory($this->testDir);
}

@ -35,7 +35,7 @@ class BasePackageTest extends TestCase
public function testSetAnotherRepository()
{
$this->setExpectedException('LogicException');
self::expectException('LogicException');
$package = $this->getMockForAbstractClass('Composer\Package\BasePackage', array('foo'));

@ -24,11 +24,11 @@ class ArrayDumperTest extends TestCase
*/
private $dumper;
/**
* @var \Composer\Package\CompletePackageInterface|\PHPUnit_Framework_MockObject_MockObject
* @var \Composer\Package\CompletePackageInterface|\PHPUnit\Framework\MockObject\MockObject
*/
private $package;
public function setUp()
public function setUp(): void
{
$this->dumper = new ArrayDumper();
$this->package = $this->getMockBuilder('Composer\Package\CompletePackageInterface')->getMock();

@ -24,7 +24,7 @@ class ArrayLoaderTest extends TestCase
*/
private $loader;
public function setUp()
public function setUp(): void
{
$this->loader = new ArrayLoader(null);
}

@ -20,8 +20,6 @@ use Composer\Package\RootPackage;
use Composer\Package\Version\VersionGuesser;
use Composer\Semver\VersionParser;
use Composer\Test\TestCase;
use Composer\Test\Mock\ProcessExecutorMock;
use Prophecy\Argument;
class RootPackageLoaderTest extends TestCase
{
@ -81,7 +79,7 @@ class RootPackageLoaderTest extends TestCase
$config = new Config;
$config->merge(array('repositories' => array('packagist' => false)));
$loader = new RootPackageLoader($manager, $config, null, new VersionGuesser($config, $process = new ProcessExecutorMock, new VersionParser()));
$loader = new RootPackageLoader($manager, $config, null, new VersionGuesser($config, $process = $this->getProcessExecutorMock(), new VersionParser()));
$process->expects(array(), false, array('return' => 1));
$package = $loader->load(array());
@ -93,9 +91,10 @@ class RootPackageLoaderTest extends TestCase
public function testPrettyVersionForRootPackageInVersionBranch()
{
// see #6845
$manager = $this->prophesize('Composer\\Repository\\RepositoryManager');
$versionGuesser = $this->prophesize('Composer\\Package\\Version\\VersionGuesser');
$versionGuesser->guessVersion(Argument::cetera())
$manager = $this->getMockBuilder('Composer\\Repository\\RepositoryManager')->disableOriginalConstructor()->getMock();
$versionGuesser = $this->getMockBuilder('Composer\\Package\\Version\\VersionGuesser')->disableOriginalConstructor()->getMock();
$versionGuesser->expects($this->atLeastOnce())
->method('guessVersion')
->willReturn(array(
'name' => 'A',
'version' => '3.0.9999999.9999999-dev',
@ -104,7 +103,7 @@ class RootPackageLoaderTest extends TestCase
));
$config = new Config;
$config->merge(array('repositories' => array('packagist' => false)));
$loader = new RootPackageLoader($manager->reveal(), $config, null, $versionGuesser->reveal());
$loader = new RootPackageLoader($manager, $config, null, $versionGuesser);
$package = $loader->load(array());
$this->assertEquals('3.0-dev', $package->getPrettyVersion());
@ -121,7 +120,7 @@ class RootPackageLoaderTest extends TestCase
->getMock()
;
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
array(
'cmd' => 'git branch -a --no-color --no-abbrev -v',
@ -136,8 +135,6 @@ class RootPackageLoaderTest extends TestCase
$package = $loader->load(array('require' => array('foo/bar' => 'self.version')));
$this->assertEquals("dev-master", $package->getPrettyVersion());
$process->assertComplete($this);
}
public function testNonFeatureBranchPrettyVersion()
@ -151,7 +148,7 @@ class RootPackageLoaderTest extends TestCase
->getMock()
;
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
array(
'cmd' => 'git branch -a --no-color --no-abbrev -v',
@ -165,7 +162,5 @@ class RootPackageLoaderTest extends TestCase
$package = $loader->load(array('require' => array('foo/bar' => 'self.version'), "non-feature-branches" => array("latest-.*")));
$this->assertEquals("dev-latest-production", $package->getPrettyVersion());
$process->assertComplete($this);
}
}

@ -12,6 +12,7 @@
namespace Composer\Test\Package;
use Composer\Json\JsonFile;
use Composer\Package\Locker;
use Composer\Plugin\PluginInterface;
use Composer\IO\NullIO;
@ -53,7 +54,7 @@ class LockerTest extends TestCase
->method('exists')
->will($this->returnValue(false));
$this->setExpectedException('LogicException');
self::expectException('LogicException');
$locker->getLockedRepository();
}
@ -170,7 +171,7 @@ class LockerTest extends TestCase
->method('getPrettyName')
->will($this->returnValue('pkg1'));
$this->setExpectedException('LogicException');
self::expectException('LogicException');
$locker->setLockData(array($package1), array(), array(), array(), array(), 'dev', array(), false, false, array());
}
@ -282,16 +283,13 @@ class LockerTest extends TestCase
*/
private function createPackageMock()
{
return $this->getMockBuilder('Composer\Package\PackageInterface')
->getMock();
return $this->getMockBuilder('Composer\Package\PackageInterface')->getMock();
}
/**
* @param array<string, string> $customData
*
* @return false|string
*/
private function getJsonContent(array $customData = array())
private function getJsonContent(array $customData = array()): string
{
$data = array_merge(array(
'minimum-stability' => 'beta',
@ -300,6 +298,6 @@ class LockerTest extends TestCase
ksort($data);
return json_encode($data);
return JsonFile::encode($data, 0);
}
}

@ -14,84 +14,112 @@ namespace Composer\Test\Package;
use Composer\Package\Link;
use Composer\Package\RootAliasPackage;
use Composer\Package\RootPackage;
use Composer\Semver\Constraint\MatchAllConstraint;
use Composer\Test\TestCase;
use Prophecy\Argument;
use PHPUnit\Framework\MockObject\MockObject;
class RootAliasPackageTest extends TestCase
{
public function testUpdateRequires()
{
$root = $this->getMockRootPackageInterface();
$root->setRequires(Argument::type('array'))->shouldBeCalled();
$links = array(new Link('a', 'b', new MatchAllConstraint(), Link::TYPE_REQUIRE, 'self.version'));
$root = $this->getMockRootPackage();
$root->expects($this->once())
->method('setRequires')
->with($this->equalTo($links));
$alias = new RootAliasPackage($root->reveal(), '1.0', '1.0.0.0');
$alias = new RootAliasPackage($root, '1.0', '1.0.0.0');
$this->assertEmpty($alias->getRequires());
$links = array(new Link('a', 'b', new MatchAllConstraint(), Link::TYPE_REQUIRE, 'self.version'));
$alias->setRequires($links);
$this->assertNotEmpty($alias->getRequires());
}
public function testUpdateDevRequires()
{
$root = $this->getMockRootPackageInterface();
$root->setDevRequires(Argument::type('array'))->shouldBeCalled();
$links = array(new Link('a', 'b', new MatchAllConstraint(), Link::TYPE_DEV_REQUIRE, 'self.version'));
$alias = new RootAliasPackage($root->reveal(), '1.0', '1.0.0.0');
$root = $this->getMockRootPackage();
$root->expects($this->once())
->method('setDevRequires')
->with($this->equalTo($links));
$alias = new RootAliasPackage($root, '1.0', '1.0.0.0');
$this->assertEmpty($alias->getDevRequires());
$links = array(new Link('a', 'b', new MatchAllConstraint(), Link::TYPE_DEV_REQUIRE, 'self.version'));
$alias->setDevRequires($links);
$this->assertNotEmpty($alias->getDevRequires());
}
public function testUpdateConflicts()
{
$root = $this->getMockRootPackageInterface();
$root->setConflicts(Argument::type('array'))->shouldBeCalled();
$links = array(new Link('a', 'b', new MatchAllConstraint(), Link::TYPE_CONFLICT, 'self.version'));
$root = $this->getMockRootPackage();
$root->expects($this->once())
->method('setConflicts')
->with($this->equalTo($links));
$alias = new RootAliasPackage($root->reveal(), '1.0', '1.0.0.0');
$alias = new RootAliasPackage($root, '1.0', '1.0.0.0');
$this->assertEmpty($alias->getConflicts());
$links = array(new Link('a', 'b', new MatchAllConstraint(), Link::TYPE_CONFLICT, 'self.version'));
$alias->setConflicts($links);
$this->assertNotEmpty($alias->getConflicts());
}
public function testUpdateProvides()
{
$root = $this->getMockRootPackageInterface();
$root->setProvides(Argument::type('array'))->shouldBeCalled();
$links = array(new Link('a', 'b', new MatchAllConstraint(), Link::TYPE_PROVIDE, 'self.version'));
$alias = new RootAliasPackage($root->reveal(), '1.0', '1.0.0.0');
$root = $this->getMockRootPackage();
$root->expects($this->once())
->method('setProvides')
->with($this->equalTo($links));
$alias = new RootAliasPackage($root, '1.0', '1.0.0.0');
$this->assertEmpty($alias->getProvides());
$links = array(new Link('a', 'b', new MatchAllConstraint(), Link::TYPE_PROVIDE, 'self.version'));
$alias->setProvides($links);
$this->assertNotEmpty($alias->getProvides());
}
public function testUpdateReplaces()
{
$root = $this->getMockRootPackageInterface();
$root->setReplaces(Argument::type('array'))->shouldBeCalled();
$links = array(new Link('a', 'b', new MatchAllConstraint(), Link::TYPE_REPLACE, 'self.version'));
$root = $this->getMockRootPackage();
$root->expects($this->once())
->method('setReplaces')
->with($this->equalTo($links));
$alias = new RootAliasPackage($root->reveal(), '1.0', '1.0.0.0');
$alias = new RootAliasPackage($root, '1.0', '1.0.0.0');
$this->assertEmpty($alias->getReplaces());
$links = array(new Link('a', 'b', new MatchAllConstraint(), Link::TYPE_REPLACE, 'self.version'));
$alias->setReplaces($links);
$this->assertNotEmpty($alias->getReplaces());
}
/**
* @return \Prophecy\Prophecy\ObjectProphecy
* @return RootPackage&MockObject
*/
protected function getMockRootPackageInterface()
protected function getMockRootPackage()
{
$root = $this->prophesize('Composer\\Package\\RootPackage');
$root->getName()->willReturn('something/something')->shouldBeCalled();
$root->getRequires()->willReturn(array())->shouldBeCalled();
$root->getDevRequires()->willReturn(array())->shouldBeCalled();
$root->getConflicts()->willReturn(array())->shouldBeCalled();
$root->getProvides()->willReturn(array())->shouldBeCalled();
$root->getReplaces()->willReturn(array())->shouldBeCalled();
$root = $this->getMockBuilder(RootPackage::class)->disableOriginalConstructor()->getMock();
$root->expects($this->atLeastOnce())
->method('getName')
->willReturn('something/something');
$root->expects($this->atLeastOnce())
->method('getRequires')
->willReturn(array());
$root->expects($this->atLeastOnce())
->method('getDevRequires')
->willReturn(array());
$root->expects($this->atLeastOnce())
->method('getConflicts')
->willReturn(array());
$root->expects($this->atLeastOnce())
->method('getProvides')
->willReturn(array());
$root->expects($this->atLeastOnce())
->method('getReplaces')
->willReturn(array());
return $root;
}

@ -22,7 +22,7 @@ use Composer\Test\Mock\ProcessExecutorMock;
class VersionGuesserTest extends TestCase
{
public function setUp()
public function setUp(): void
{
if (!function_exists('proc_open')) {
$this->markTestSkipped('proc_open() is not available');
@ -33,7 +33,7 @@ class VersionGuesserTest extends TestCase
{
$branch = 'default';
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
array('cmd' => 'git branch -a --no-color --no-abbrev -v', 'return' => 128),
array('cmd' => 'git describe --exact-match --tags', 'return' => 128),
@ -53,8 +53,6 @@ class VersionGuesserTest extends TestCase
$this->assertEquals("dev-".$branch, $versionArray['version']);
$this->assertEquals("dev-".$branch, $versionArray['pretty_version']);
$this->assertEmpty($versionArray['commit']);
$process->assertComplete($this);
}
public function testGuessVersionReturnsData()
@ -62,7 +60,7 @@ class VersionGuesserTest extends TestCase
$commitHash = '03a15d220da53c52eddd5f32ffca64a7b3801bea';
$anotherCommitHash = '03a15d220da53c52eddd5f32ffca64a7b3801bea';
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
array(
'cmd' => 'git branch -a --no-color --no-abbrev -v',
@ -80,8 +78,6 @@ class VersionGuesserTest extends TestCase
$this->assertArrayNotHasKey('feature_version', $versionArray);
$this->assertArrayNotHasKey('feature_pretty_version', $versionArray);
$this->assertEquals($commitHash, $versionArray['commit']);
$process->assertComplete($this);
}
public function testGuessVersionDoesNotSeeCustomDefaultBranchAsNonFeatureBranch()
@ -89,7 +85,7 @@ class VersionGuesserTest extends TestCase
$commitHash = '03a15d220da53c52eddd5f32ffca64a7b3801bea';
$anotherCommitHash = '13a15d220da53c52eddd5f32ffca64a7b3801bea';
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
array(
'cmd' => 'git branch -a --no-color --no-abbrev -v',
@ -105,8 +101,6 @@ class VersionGuesserTest extends TestCase
$this->assertEquals("dev-current", $versionArray['version']);
$this->assertEquals($anotherCommitHash, $versionArray['commit']);
$process->assertComplete($this);
}
public function testGuessVersionReadsAndRespectsNonFeatureBranchesConfigurationForArbitraryNaming()
@ -114,7 +108,7 @@ class VersionGuesserTest extends TestCase
$commitHash = '03a15d220da53c52eddd5f32ffca64a7b3801bea';
$anotherCommitHash = '13a15d220da53c52eddd5f32ffca64a7b3801bea';
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
array(
'cmd' => 'git branch -a --no-color --no-abbrev -v',
@ -135,8 +129,6 @@ class VersionGuesserTest extends TestCase
$this->assertEquals($anotherCommitHash, $versionArray['commit']);
$this->assertEquals("dev-feature", $versionArray['feature_version']);
$this->assertEquals("dev-feature", $versionArray['feature_pretty_version']);
$process->assertComplete($this);
}
public function testGuessVersionReadsAndRespectsNonFeatureBranchesConfigurationForArbitraryNamingRegex()
@ -144,7 +136,7 @@ class VersionGuesserTest extends TestCase
$commitHash = '03a15d220da53c52eddd5f32ffca64a7b3801bea';
$anotherCommitHash = '13a15d220da53c52eddd5f32ffca64a7b3801bea';
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
array(
'cmd' => 'git branch -a --no-color --no-abbrev -v',
@ -165,8 +157,6 @@ class VersionGuesserTest extends TestCase
$this->assertEquals($anotherCommitHash, $versionArray['commit']);
$this->assertEquals("dev-feature", $versionArray['feature_version']);
$this->assertEquals("dev-feature", $versionArray['feature_pretty_version']);
$process->assertComplete($this);
}
public function testGuessVersionReadsAndRespectsNonFeatureBranchesConfigurationForArbitraryNamingWhenOnNonFeatureBranch()
@ -174,7 +164,7 @@ class VersionGuesserTest extends TestCase
$commitHash = '03a15d220da53c52eddd5f32ffca64a7b3801bea';
$anotherCommitHash = '13a15d220da53c52eddd5f32ffca64a7b3801bea';
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
array(
'cmd' => 'git branch -a --no-color --no-abbrev -v',
@ -191,15 +181,13 @@ class VersionGuesserTest extends TestCase
$this->assertEquals($commitHash, $versionArray['commit']);
$this->assertArrayNotHasKey('feature_version', $versionArray);
$this->assertArrayNotHasKey('feature_pretty_version', $versionArray);
$process->assertComplete($this);
}
public function testDetachedHeadBecomesDevHash()
{
$commitHash = '03a15d220da53c52eddd5f32ffca64a7b3801bea';
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
array(
'cmd' => 'git branch -a --no-color --no-abbrev -v',
@ -214,15 +202,13 @@ class VersionGuesserTest extends TestCase
$versionData = $guesser->guessVersion(array(), 'dummy/path');
$this->assertEquals("dev-$commitHash", $versionData['version']);
$process->assertComplete($this);
}
public function testDetachedFetchHeadBecomesDevHashGit2()
{
$commitHash = '03a15d220da53c52eddd5f32ffca64a7b3801bea';
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
array(
'cmd' => 'git branch -a --no-color --no-abbrev -v',
@ -237,15 +223,13 @@ class VersionGuesserTest extends TestCase
$versionData = $guesser->guessVersion(array(), 'dummy/path');
$this->assertEquals("dev-$commitHash", $versionData['version']);
$process->assertComplete($this);
}
public function testDetachedCommitHeadBecomesDevHashGit2()
{
$commitHash = '03a15d220da53c52eddd5f32ffca64a7b3801bea';
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
array(
'cmd' => 'git branch -a --no-color --no-abbrev -v',
@ -260,13 +244,11 @@ class VersionGuesserTest extends TestCase
$versionData = $guesser->guessVersion(array(), 'dummy/path');
$this->assertEquals("dev-$commitHash", $versionData['version']);
$process->assertComplete($this);
}
public function testTagBecomesVersion()
{
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
array(
'cmd' => 'git branch -a --no-color --no-abbrev -v',
@ -284,13 +266,11 @@ class VersionGuesserTest extends TestCase
$versionData = $guesser->guessVersion(array(), 'dummy/path');
$this->assertEquals("2.0.5.0-alpha2", $versionData['version']);
$process->assertComplete($this);
}
public function testTagBecomesPrettyVersion()
{
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
array(
'cmd' => 'git branch -a --no-color --no-abbrev -v',
@ -309,13 +289,11 @@ class VersionGuesserTest extends TestCase
$this->assertEquals('1.0.0.0', $versionData['version']);
$this->assertEquals('1.0.0', $versionData['pretty_version']);
$process->assertComplete($this);
}
public function testInvalidTagBecomesVersion()
{
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
array(
'cmd' => 'git branch -a --no-color --no-abbrev -v',
@ -329,13 +307,11 @@ class VersionGuesserTest extends TestCase
$versionData = $guesser->guessVersion(array(), 'dummy/path');
$this->assertEquals("dev-foo", $versionData['version']);
$process->assertComplete($this);
}
public function testNumericBranchesShowNicely()
{
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
array(
'cmd' => 'git branch -a --no-color --no-abbrev -v',
@ -350,13 +326,11 @@ class VersionGuesserTest extends TestCase
$this->assertEquals("1.5.x-dev", $versionData['pretty_version']);
$this->assertEquals("1.5.9999999.9999999-dev", $versionData['version']);
$process->assertComplete($this);
}
public function testRemoteBranchesAreSelected()
{
$process = new ProcessExecutorMock;
$process = $this->getProcessExecutorMock();
$process->expects(array(
array(
'cmd' => 'git branch -a --no-color --no-abbrev -v',
@ -375,7 +349,5 @@ class VersionGuesserTest extends TestCase
$versionData = $guesser->guessVersion(array('version' => 'self.version'), 'dummy/path');
$this->assertEquals("1.5.x-dev", $versionData['pretty_version']);
$this->assertEquals("1.5.9999999.9999999-dev", $versionData['version']);
$process->assertComplete($this);
}
}

@ -181,15 +181,13 @@ class VersionSelectorTest extends TestCase
$packages = array($package1, $package2);
$repositorySet = $this->createMockRepositorySet();
$repositorySet->expects($this->at(0))
$repositorySet->expects($this->exactly(2))
->method('findPackages')
->with($packageName, null)
->will($this->returnValue($packages));
$repositorySet->expects($this->at(1))
->method('findPackages')
->with($packageName, null)
->will($this->returnValue(array_reverse($packages)));
->willReturnOnConsecutiveCalls(
$packages,
array_reverse($packages)
);
$versionSelector = new VersionSelector($repositorySet);
$best = $versionSelector->findBestCandidate($packageName);

@ -25,7 +25,7 @@ class HhvmDetectorTest extends TestCase
*/
private $hhvmDetector;
protected function setUp()
protected function setUp(): void
{
$this->hhvmDetector = new HhvmDetector();
$this->hhvmDetector->reset();

@ -68,7 +68,7 @@ class PluginInstallerTest extends TestCase
*/
protected $io;
protected function setUp()
protected function setUp(): void
{
$loader = new JsonLoader(new ArrayLoader());
$this->packages = array();
@ -127,8 +127,9 @@ class PluginInstallerTest extends TestCase
$this->composer->setPluginManager($this->pm);
}
protected function tearDown()
protected function tearDown(): void
{
parent::tearDown();
$filesystem = new Filesystem();
$filesystem->removeDirectory($this->directory);
}
@ -282,7 +283,7 @@ class PluginInstallerTest extends TestCase
{
// reset the plugin manager's installed plugins
$this->pm = $this->getMockBuilder('Composer\Plugin\PluginManager')
->setMethods(array('getPluginApiVersion'))
->onlyMethods(array('getPluginApiVersion'))
->setConstructorArgs(array($this->io, $this->composer))
->getMock();
@ -431,13 +432,13 @@ class PluginInstallerTest extends TestCase
/**
* @dataProvider invalidImplementationClassNames
* @param callable $invalidImplementationClassNames
* @param string $expect
* @param class-string<\Throwable> $expect
*
* @return void
*/
public function testQueryingWithInvalidCapabilityClassNameThrows($invalidImplementationClassNames, $expect = 'UnexpectedValueException')
{
$this->setExpectedException($expect);
self::expectException($expect);
$capabilityApi = 'Composer\Plugin\Capability\Capability';

@ -1,759 +0,0 @@
<?php
/*
* This file is part of Composer.
*
* (c) Nils Adermann <naderman@naderman.de>
* Jordi Boggiano <j.boggiano@seld.be>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Composer\Test {
use PHPUnit\Framework\TestCase;
use PHPUnit\Framework\Constraint\LogicalNot;
use PHPUnit\Framework\Constraint\StringContains;
if (method_exists('PHPUnit\Framework\TestCase', 'assertStringContainsString')) {
abstract class PolyfillTestCase extends TestCase
{
}
} else {
abstract class PolyfillTestCase extends TestCase
{
// all the functions below are form https://github.com/symfony/phpunit-bridge/blob/bd341a45ef79b30918376e8b8e2279fac6894c3b/Legacy/PolyfillAssertTrait.php
/**
* @param string $message
*
* @return void
*/
public static function assertIsInt($actual, $message = '')
{
static::assertInternalType('int', $actual, $message);
}
/**
* @param string $message
*
* @return void
*/
public static function assertIsNumeric($actual, $message = '')
{
static::assertInternalType('numeric', $actual, $message);
}
/**
* @param string $message
*
* @return void
*/
public static function assertIsObject($actual, $message = '')
{
static::assertInternalType('object', $actual, $message);
}
/**
* @param string $message
*
* @return void
*/
public static function assertIsResource($actual, $message = '')
{
static::assertInternalType('resource', $actual, $message);
}
/**
* @param string $message
*
* @return void
*/
public static function assertIsString($actual, $message = '')
{
static::assertInternalType('string', $actual, $message);
}
/**
* @param string $message
*
* @return void
*/
public static function assertIsScalar($actual, $message = '')
{
static::assertInternalType('scalar', $actual, $message);
}
/**
* @param string $message
*
* @return void
*/
public static function assertIsCallable($actual, $message = '')
{
static::assertInternalType('callable', $actual, $message);
}
/**
* @param string $message
*
* @return void
*/
public static function assertIsIterable($actual, $message = '')
{
static::assertInternalType('iterable', $actual, $message);
}
/**
* @param string $needle
* @param string $haystack
* @param string $message
*
* @return void
*/
public static function assertStringContainsString($needle, $haystack, $message = '')
{
$constraint = new StringContains($needle, false);
static::assertThat($haystack, $constraint, $message);
}
/**
* @param string $needle
* @param string $haystack
* @param string $message
*
* @return void
*/
public static function assertStringContainsStringIgnoringCase($needle, $haystack, $message = '')
{
$constraint = new StringContains($needle, true);
static::assertThat($haystack, $constraint, $message);
}
/**
* @param string $needle
* @param string $haystack
* @param string $message
*
* @return void
*/
public static function assertStringNotContainsString($needle, $haystack, $message = '')
{
$constraint = new LogicalNot(new StringContains($needle, false));
static::assertThat($haystack, $constraint, $message);
}
/**
* @param string $needle
* @param string $haystack
* @param string $message
*
* @return void
*/
public static function assertStringNotContainsStringIgnoringCase($needle, $haystack, $message = '')
{
$constraint = new LogicalNot(new StringContains($needle, true));
static::assertThat($haystack, $constraint, $message);
}
/**
* @param string $message
*
* @return void
*/
public static function assertFinite($actual, $message = '')
{
static::assertInternalType('float', $actual, $message);
static::assertTrue(is_finite($actual), $message ? $message : "Failed asserting that $actual is finite.");
}
/**
* @param string $message
*
* @return void
*/
public static function assertInfinite($actual, $message = '')
{
static::assertInternalType('float', $actual, $message);
static::assertTrue(is_infinite($actual), $message ? $message : "Failed asserting that $actual is infinite.");
}
/**
* @param string $message
*
* @return void
*/
public static function assertNan($actual, $message = '')
{
static::assertInternalType('float', $actual, $message);
static::assertTrue(is_nan($actual), $message ? $message : "Failed asserting that $actual is nan.");
}
/**
* @param string $filename
* @param string $message
*
* @return void
*/
public static function assertIsReadable($filename, $message = '')
{
static::assertInternalType('string', $filename, $message);
static::assertTrue(is_readable($filename), $message ? $message : "Failed asserting that $filename is readable.");
}
/**
* @param string $filename
* @param string $message
*
* @return void
*/
public static function assertNotIsReadable($filename, $message = '')
{
static::assertInternalType('string', $filename, $message);
static::assertFalse(is_readable($filename), $message ? $message : "Failed asserting that $filename is not readable.");
}
/**
* @param string $filename
* @param string $message
*
* @return void
*/
public static function assertIsNotReadable($filename, $message = '')
{
static::assertNotIsReadable($filename, $message);
}
/**
* @param string $filename
* @param string $message
*
* @return void
*/
public static function assertIsWritable($filename, $message = '')
{
static::assertInternalType('string', $filename, $message);
static::assertTrue(is_writable($filename), $message ? $message : "Failed asserting that $filename is writable.");
}
/**
* @param string $filename
* @param string $message
*
* @return void
*/
public static function assertNotIsWritable($filename, $message = '')
{
static::assertInternalType('string', $filename, $message);
static::assertFalse(is_writable($filename), $message ? $message : "Failed asserting that $filename is not writable.");
}
/**
* @param string $filename
* @param string $message
*
* @return void
*/
public static function assertIsNotWritable($filename, $message = '')
{
static::assertNotIsWritable($filename, $message);
}
/**
* @param string $directory
* @param string $message
*
* @return void
*/
public static function assertDirectoryExists($directory, $message = '')
{
static::assertInternalType('string', $directory, $message);
static::assertTrue(is_dir($directory), $message ? $message : "Failed asserting that $directory exists.");
}
/**
* @param string $directory
* @param string $message
*
* @return void
*/
public static function assertDirectoryNotExists($directory, $message = '')
{
static::assertInternalType('string', $directory, $message);
static::assertFalse(is_dir($directory), $message ? $message : "Failed asserting that $directory does not exist.");
}
/**
* @param string $directory
* @param string $message
*
* @return void
*/
public static function assertDirectoryDoesNotExist($directory, $message = '')
{
static::assertDirectoryNotExists($directory, $message);
}
/**
* @param string $directory
* @param string $message
*
* @return void
*/
public static function assertDirectoryIsReadable($directory, $message = '')
{
static::assertDirectoryExists($directory, $message);
static::assertIsReadable($directory, $message);
}
/**
* @param string $directory
* @param string $message
*
* @return void
*/
public static function assertDirectoryNotIsReadable($directory, $message = '')
{
static::assertDirectoryExists($directory, $message);
static::assertNotIsReadable($directory, $message);
}
/**
* @param string $directory
* @param string $message
*
* @return void
*/
public static function assertDirectoryIsNotReadable($directory, $message = '')
{
static::assertDirectoryNotIsReadable($directory, $message);
}
/**
* @param string $directory
* @param string $message
*
* @return void
*/
public static function assertDirectoryIsWritable($directory, $message = '')
{
static::assertDirectoryExists($directory, $message);
static::assertIsWritable($directory, $message);
}
/**
* @param string $directory
* @param string $message
*
* @return void
*/
public static function assertDirectoryNotIsWritable($directory, $message = '')
{
static::assertDirectoryExists($directory, $message);
static::assertNotIsWritable($directory, $message);
}
/**
* @param string $directory
* @param string $message
*
* @return void
*/
public static function assertDirectoryIsNotWritable($directory, $message = '')
{
static::assertDirectoryNotIsWritable($directory, $message);
}
/**
* @param string $filename
* @param string $message
*
* @return void
*/
public static function assertFileExists($filename, $message = '')
{
static::assertInternalType('string', $filename, $message);
static::assertTrue(file_exists($filename), $message ? $message : "Failed asserting that $filename exists.");
}
/**
* @param string $filename
* @param string $message
*
* @return void
*/
public static function assertFileNotExists($filename, $message = '')
{
static::assertInternalType('string', $filename, $message);
static::assertFalse(file_exists($filename), $message ? $message : "Failed asserting that $filename does not exist.");
}
/**
* @param string $filename
* @param string $message
*
* @return void
*/
public static function assertFileDoesNotExist($filename, $message = '')
{
static::assertFileNotExists($filename, $message);
}
/**
* @param string $filename
* @param string $message
*
* @return void
*/
public static function assertFileIsReadable($filename, $message = '')
{
static::assertFileExists($filename, $message);
static::assertIsReadable($filename, $message);
}
/**
* @param string $filename
* @param string $message
*
* @return void
*/
public static function assertFileNotIsReadable($filename, $message = '')
{
static::assertFileExists($filename, $message);
static::assertNotIsReadable($filename, $message);
}
/**
* @param string $filename
* @param string $message
*
* @return void
*/
public static function assertFileIsNotReadable($filename, $message = '')
{
static::assertFileNotIsReadable($filename, $message);
}
/**
* @param string $filename
* @param string $message
*
* @return void
*/
public static function assertFileIsWritable($filename, $message = '')
{
static::assertFileExists($filename, $message);
static::assertIsWritable($filename, $message);
}
/**
* @param string $filename
* @param string $message
*
* @return void
*/
public static function assertFileNotIsWritable($filename, $message = '')
{
static::assertFileExists($filename, $message);
static::assertNotIsWritable($filename, $message);
}
/**
* @param string $filename
* @param string $message
*
* @return void
*/
public static function assertFileIsNotWritable($filename, $message = '')
{
static::assertFileNotIsWritable($filename, $message);
}
/**
* @param string $pattern
* @param string $string
* @param string $message
*
* @return void
*/
public static function assertMatchesRegularExpression($pattern, $string, $message = '')
{
static::assertRegExp($pattern, $string, $message);
}
/**
* @param string $pattern
* @param string $string
* @param string $message
*
* @return void
*/
public static function assertDoesNotMatchRegularExpression($pattern, $string, $message = '')
{
static::assertNotRegExp($pattern, $string, $message);
}
}
}
}
namespace {
foreach (array(
'PHPUnit\Framework\Constraint\IsEqual',
'PHPUnit\Framework\Constraint\StringContains',
'PHPUnit\Framework\Constraint\TraversableContains',
) as $class) {
if (!class_exists($class) && class_exists(str_replace('\\', '_', $class))) {
class_alias(str_replace('\\', '_', $class), $class);
}
}
foreach (array(
'PHPUnit\Framework\SelfDescribing',
) as $interface) {
if (!interface_exists($interface) && interface_exists(str_replace('\\', '_', $interface))) {
class_alias(str_replace('\\', '_', $interface), $interface);
}
}
if (!class_exists('PHPUnit\Framework\Constraint\Constraint')) {
class_alias('PHPUnit_Framework_Constraint', 'PHPUnit\Framework\Constraint\Constraint');
}
}
// all the code below taken from various PHPUnit versions to make things work on PHPUnit 4.8 / PHP 5.3
/*
* This file is part of PHPUnit.
*
* (c) Sebastian Bergmann <sebastian@phpunit.de>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace PHPUnit\Framework\Constraint {
use PHPUnit\Framework\ExpectationFailedException;
if (!class_exists('PHPUnit\Framework\Constraint\RegularExpression')) {
/**
* Constraint that asserts that the string it is evaluated for matches
* a regular expression.
*
* Checks a given value using the Perl Compatible Regular Expression extension
* in PHP. The pattern is matched by executing preg_match().
*
* The pattern string passed in the constructor.
*/
class RegularExpression extends Constraint
{
/**
* @var string
*/
protected $pattern;
/**
* @param string $pattern
*/
public function __construct($pattern)
{
parent::__construct();
$this->pattern = $pattern;
}
/**
* Evaluates the constraint for parameter $other. Returns true if the
* constraint is met, false otherwise.
*
* @param mixed $other Value or object to evaluate.
*
* @return bool
*/
protected function matches($other)
{
return \preg_match($this->pattern, $other) > 0;
}
/**
* Returns a string representation of the constraint.
*
* @return string
*/
public function toString()
{
return \sprintf(
'matches PCRE pattern "%s"',
$this->pattern
);
}
}
}
if (!class_exists('PHPUnit\Framework\Constraint\LogicalNot')) {
/**
* Logical NOT.
*/
class LogicalNot extends Constraint
{
/**
* @var Constraint
*/
protected $constraint;
/**
* @param Constraint $constraint
*/
public function __construct($constraint)
{
parent::__construct();
if (!($constraint instanceof Constraint)) {
$constraint = new IsEqual($constraint);
}
$this->constraint = $constraint;
}
/**
* @param string $string
*
* @return string
*/
public static function negate($string)
{
$positives = array(
'contains ',
'exists',
'has ',
'is ',
'are ',
'matches ',
'starts with ',
'ends with ',
'reference ',
'not not ',
);
$negatives = array(
'does not contain ',
'does not exist',
'does not have ',
'is not ',
'are not ',
'does not match ',
'starts not with ',
'ends not with ',
'don\'t reference ',
'not ',
);
\preg_match('/(\'[\w\W]*\')([\w\W]*)("[\w\W]*")/i', $string, $matches);
if (\count($matches) > 0) {
$nonInput = $matches[2];
$negatedString = \str_replace(
$nonInput,
\str_replace(
$positives,
$negatives,
$nonInput
),
$string
);
} else {
$negatedString = \str_replace(
$positives,
$negatives,
$string
);
}
return $negatedString;
}
/**
* Evaluates the constraint for parameter $other
*
* If $returnResult is set to false (the default), an exception is thrown
* in case of a failure. null is returned otherwise.
*
* If $returnResult is true, the result of the evaluation is returned as
* a boolean value instead: true in case of success, false in case of a
* failure.
*
* @param mixed $other Value or object to evaluate.
* @param string $description Additional information about the test
* @param bool $returnResult Whether to return a result or throw an exception
*
* @throws ExpectationFailedException
* @return mixed
*/
public function evaluate($other, $description = '', $returnResult = false)
{
$success = !$this->constraint->evaluate($other, $description, true);
if ($returnResult) {
return $success;
}
if (!$success) {
$this->fail($other, $description);
}
}
/**
* Returns the description of the failure
*
* The beginning of failure messages is "Failed asserting that" in most
* cases. This method should return the second part of that sentence.
*
* @param mixed $other Evaluated value or object.
*
* @return string
*/
protected function failureDescription($other)
{
switch (\get_class($this->constraint)) {
case 'PHPUnit\Framework\Constraint\LogicalAnd':
case 'PHPUnit\Framework\Constraint\LogicalNot':
case 'PHPUnit\Framework\Constraint\LogicalOr':
return 'not( ' . $this->constraint->failureDescription($other) . ' )';
default:
return self::negate(
$this->constraint->failureDescription($other)
);
}
}
/**
* Returns a string representation of the constraint.
*
* @return string
*/
public function toString()
{
switch (\get_class($this->constraint)) {
case 'PHPUnit\Framework\Constraint\LogicalAnd':
case 'PHPUnit\Framework\Constraint\LogicalNot':
case 'PHPUnit\Framework\Constraint\LogicalOr':
return 'not( ' . $this->constraint->toString() . ' )';
default:
return self::negate(
$this->constraint->toString()
);
}
}
/**
* Counts the number of constraint elements.
*
* @return int
*/
public function count()
{
return \count($this->constraint);
}
}
}
}

@ -50,7 +50,8 @@ class StrictConfirmationQuestionTest extends TestCase
{
list($input, $dialog) = $this->createInput($answer."\n");
$this->setExpectedException('InvalidArgumentException', 'Please answer yes, y, no, or n.');
self::expectException('InvalidArgumentException');
self::expectExceptionMessage('Please answer yes, y, no, or n.');
$question = new StrictConfirmationQuestion('Do you like French fries?');
$question->setMaxAttempts(1);

@ -19,7 +19,7 @@ use Composer\Package\BasePackage;
class ArtifactRepositoryTest extends TestCase
{
public function setUp()
public function setUp(): void
{
parent::setUp();
if (!extension_loaded('zip')) {

@ -37,7 +37,7 @@ class ComposerRepositoryTest extends TestCase
);
$repository = $this->getMockBuilder('Composer\Repository\ComposerRepository')
->setMethods(array('loadRootServerFile', 'createPackages'))
->onlyMethods(array('loadRootServerFile', 'createPackages'))
->setConstructorArgs(array(
$repoConfig,
new NullIO,
@ -58,7 +58,7 @@ class ComposerRepositoryTest extends TestCase
}
$repository
->expects($this->at(2))
->expects($this->once())
->method('createPackages')
->with($this->identicalTo($expected), $this->equalTo('root file (http://example.org/packages.json)'))
->will($this->returnValue($stubs));
@ -111,7 +111,7 @@ class ComposerRepositoryTest extends TestCase
$this->getMockBuilder('Composer\Util\HttpDownloader')->disableOriginalConstructor()->getMock(),
$this->getMockBuilder('Composer\EventDispatcher\EventDispatcher')->disableOriginalConstructor()->getMock(),
))
->setMethods(array('fetchFile'))
->onlyMethods(array('fetchFile'))
->getMock();
$cache = $this->getMockBuilder('Composer\Cache')->disableOriginalConstructor()->getMock();
@ -156,7 +156,6 @@ class ComposerRepositoryTest extends TestCase
),
)));
$versionParser = new VersionParser();
$reflMethod = new \ReflectionMethod($repo, 'whatProvides');
$reflMethod->setAccessible(true);
$packages = $reflMethod->invoke($repo, 'a');
@ -181,16 +180,22 @@ class ComposerRepositoryTest extends TestCase
),
);
$httpDownloader = new HttpDownloaderMock(array(
'http://example.org/packages.json' => JsonFile::encode(array('search' => '/search.json?q=%query%&type=%type%')),
'http://example.org/search.json?q=foo&type=composer-plugin' => JsonFile::encode($result),
'http://example.org/search.json?q=foo&type=library' => JsonFile::encode(array()),
));
$httpDownloader = $this->getHttpDownloaderMock();
$httpDownloader->expects(
[
['url' => 'http://example.org/packages.json', 'body' => JsonFile::encode(array('search' => '/search.json?q=%query%&type=%type%'))],
['url' => 'http://example.org/search.json?q=foo&type=composer-plugin', 'body' => JsonFile::encode($result)],
['url' => 'http://example.org/search.json?q=foo&type=library', 'body' => JsonFile::encode(array())],
],
true
);
$eventDispatcher = $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher')
->disableOriginalConstructor()
->getMock();
$repository = new ComposerRepository($repoConfig, new NullIO, FactoryMock::createConfig(), $httpDownloader, $eventDispatcher);
$config = FactoryMock::createConfig();
$config->merge(['config' => ['cache-read-only' => true]]);
$repository = new ComposerRepository($repoConfig, new NullIO, $config, $httpDownloader, $eventDispatcher);
$this->assertSame(
array(array('name' => 'foo', 'description' => null)),
@ -205,7 +210,7 @@ class ComposerRepositoryTest extends TestCase
public function testSearchWithAbandonedPackages()
{
$repoConfig = array(
'url' => 'http://2.example.org',
'url' => 'http://example.org',
);
$result = array(
@ -223,15 +228,22 @@ class ComposerRepositoryTest extends TestCase
),
);
$httpDownloader = new HttpDownloaderMock(array(
'http://2.example.org/packages.json' => JsonFile::encode(array('search' => '/search.json?q=%query%')),
'http://2.example.org/search.json?q=foo' => JsonFile::encode($result),
));
$httpDownloader = $this->getHttpDownloaderMock();
$httpDownloader->expects(
[
['url' => 'http://example.org/packages.json', 'body' => JsonFile::encode(array('search' => '/search.json?q=%query%'))],
['url' => 'http://example.org/search.json?q=foo', 'body' => JsonFile::encode($result)],
],
true
);
$eventDispatcher = $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher')
->disableOriginalConstructor()
->getMock();
$repository = new ComposerRepository($repoConfig, new NullIO, FactoryMock::createConfig(), $httpDownloader, $eventDispatcher);
$config = FactoryMock::createConfig();
$config->merge(['config' => ['cache-read-only' => true]]);
$repository = new ComposerRepository($repoConfig, new NullIO, $config, $httpDownloader, $eventDispatcher);
$this->assertSame(
array(
@ -313,15 +325,22 @@ class ComposerRepositoryTest extends TestCase
public function testGetProviderNamesWillReturnPartialPackageNames()
{
$httpDownloader = new HttpDownloaderMock(array(
'http://example.org/packages.json' => JsonFile::encode(array(
'providers-lazy-url' => '/foo/p/%package%.json',
'packages' => array('foo/bar' => array(
'dev-branch' => array('name' => 'foo/bar'),
'v1.0.0' => array('name' => 'foo/bar'),
)),
)),
));
$httpDownloader = $this->getHttpDownloaderMock();
$httpDownloader->expects(
[
[
'url' => 'http://example.org/packages.json',
'body' => JsonFile::encode(array(
'providers-lazy-url' => '/foo/p/%package%.json',
'packages' => array('foo/bar' => array(
'dev-branch' => array('name' => 'foo/bar'),
'v1.0.0' => array('name' => 'foo/bar'),
)),
)),
],
],
true
);
$repository = new ComposerRepository(
array('url' => 'http://example.org/packages.json'),

@ -129,7 +129,7 @@ class CompositeRepositoryTest extends TestCase
/**
* @dataProvider provideMethodCalls
*
* @param string $method
* @param string $method
* @param mixed[] $args
*/
public function testNoRepositories($method, $args)

@ -48,7 +48,7 @@ class FilesystemRepositoryTest extends TestCase
public function testCorruptedRepositoryFile()
{
$this->setExpectedException('Composer\Repository\InvalidRepositoryException');
self::expectException('Composer\Repository\InvalidRepositoryException');
$json = $this->createJsonFileMock();
$repository = new FilesystemRepository($json);

@ -25,7 +25,7 @@ class FilterRepositoryTest extends TestCase
*/
private $arrayRepo;
public function setUp()
public function setUp(): void
{
$this->arrayRepo = new ArrayRepository();
$this->arrayRepo->addPackage($this->getPackage('foo/aaa', '1.0.0'));

@ -45,7 +45,7 @@ class InstalledRepositoryTest extends TestCase
{
$arrayRepoOne = new ArrayRepository;
$this->setExpectedException('LogicException');
self::expectException('LogicException');
new InstalledRepository(array($arrayRepoOne));
}

@ -19,7 +19,7 @@ class PathRepositoryTest extends TestCase
{
public function testLoadPackageFromFileSystemWithIncorrectPath()
{
$this->setExpectedException('RuntimeException');
self::expectException('RuntimeException');
$ioInterface = $this->getMockBuilder('Composer\IO\IOInterface')
->getMock();

@ -118,7 +118,7 @@ class PlatformRepositoryTest extends TestCase
*
* @param array<string, mixed> $constants
* @param array<string, string> $packages
* @param array<string, mixed> $functions
* @param list<array{string, list<string>, string|bool}> $functions
*/
public function testPhpVersion(array $constants, array $packages, array $functions = array())
{
@ -1086,10 +1086,11 @@ Linked Version => 1.2.11',
* @param string|string[] $extensions
* @param string|null $info
* @param array<string,string|false> $expectations
* @param array<string,mixed> $functions
* @param array<string,mixed> $constants
* @param array<string,class-string> $classDefinitions
* @param list<mixed> $functions
* @param list<mixed> $constants
* @param list<mixed> $classDefinitions
*/
public function testLibraryInformation(
$extensions,
$info,

@ -21,13 +21,14 @@ class RepositoryManagerTest extends TestCase
/** @var string */
protected $tmpdir;
public function setUp()
public function setUp(): void
{
$this->tmpdir = $this->getUniqueTmpDirectory();
}
public function tearDown()
protected function tearDown(): void
{
parent::tearDown();
if (is_dir($this->tmpdir)) {
$fs = new Filesystem();
$fs->removeDirectory($this->tmpdir);
@ -56,17 +57,17 @@ class RepositoryManagerTest extends TestCase
*
* @param string $type
* @param array<string, mixed> $options
* @param string|null $exception
* @param class-string<\Throwable>|null $exception
*/
public function testRepoCreation($type, $options, $exception = null)
public function testRepoCreation($type, $options, ?string $exception = null)
{
if ($exception) {
$this->setExpectedException($exception);
if ($exception !== null) {
self::expectException($exception);
}
$rm = new RepositoryManager(
$this->getMockBuilder('Composer\IO\IOInterface')->getMock(),
$config = $this->getMockBuilder('Composer\Config')->setMethods(array('get'))->getMock(),
$config = $this->getMockBuilder('Composer\Config')->onlyMethods(array('get'))->getMock(),
$this->getMockBuilder('Composer\Util\HttpDownloader')->disableOriginalConstructor()->getMock(),
$this->getMockBuilder('Composer\EventDispatcher\EventDispatcher')->disableOriginalConstructor()->getMock()
);
@ -118,7 +119,7 @@ class RepositoryManagerTest extends TestCase
{
$rm = new RepositoryManager(
$this->getMockBuilder('Composer\IO\IOInterface')->getMock(),
$config = $this->getMockBuilder('Composer\Config')->setMethods(array('get'))->getMock(),
$config = $this->getMockBuilder('Composer\Config')->onlyMethods(array('get'))->getMock(),
$this->getMockBuilder('Composer\Util\HttpDownloader')->disableOriginalConstructor()->getMock(),
$this->getMockBuilder('Composer\EventDispatcher\EventDispatcher')->disableOriginalConstructor()->getMock()
);

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save