From 26da52227ebac871a1a1eeddc0c10cbb9a35d38c Mon Sep 17 00:00:00 2001 From: Nils Adermann Date: Thu, 7 Nov 2019 21:51:53 +0100 Subject: [PATCH] Clean up the Solver tests, no more installed repo input and new sorting The solver now only calculates a lock file transaction which does not need to be sorted in order of dependencies. This is only necessary for the local repo transaction generated without the solver during install --- src/Composer/Installer.php | 2 + src/Composer/Plugin/PluginManager.php | 2 +- .../DependencyResolver/DefaultPolicyTest.php | 6 +- .../Test/DependencyResolver/SolverTest.php | 92 ++++++++----------- 4 files changed, 45 insertions(+), 57 deletions(-) diff --git a/src/Composer/Installer.php b/src/Composer/Installer.php index 493989bab..982f9baae 100644 --- a/src/Composer/Installer.php +++ b/src/Composer/Installer.php @@ -367,6 +367,8 @@ class Installer if (!$repositorySet->isPackageAcceptable($lockedPackage->getNames(), $lockedPackage->getStability())) { $constraint = new Constraint('=', $lockedPackage->getVersion()); $constraint->setPrettyString('(stability not acceptable)'); + + // if we can get rid of this remove() here, we can generally get rid of remove support in the request $request->remove($lockedPackage->getName(), $constraint); } } diff --git a/src/Composer/Plugin/PluginManager.php b/src/Composer/Plugin/PluginManager.php index 814b0218a..03b872d47 100644 --- a/src/Composer/Plugin/PluginManager.php +++ b/src/Composer/Plugin/PluginManager.php @@ -158,7 +158,7 @@ class PluginManager $localRepo = $this->composer->getRepositoryManager()->getLocalRepository(); $globalRepo = $this->globalComposer ? $this->globalComposer->getRepositoryManager()->getLocalRepository() : null; - $repositorySet = new RepositorySet(array(), 'dev'); + $repositorySet = new RepositorySet(array(), array(), 'dev'); $repositorySet->addRepository($localRepo); if ($globalRepo) { $repositorySet->addRepository($globalRepo); diff --git a/tests/Composer/Test/DependencyResolver/DefaultPolicyTest.php b/tests/Composer/Test/DependencyResolver/DefaultPolicyTest.php index 919d098e3..b4df12310 100644 --- a/tests/Composer/Test/DependencyResolver/DefaultPolicyTest.php +++ b/tests/Composer/Test/DependencyResolver/DefaultPolicyTest.php @@ -35,7 +35,7 @@ class DefaultPolicyTest extends TestCase public function setUp() { - $this->repositorySet = new RepositorySet(array(), 'dev'); + $this->repositorySet = new RepositorySet(array(), array(), 'dev'); $this->repo = new ArrayRepository; $this->repoLocked = new ArrayRepository; @@ -181,7 +181,7 @@ class DefaultPolicyTest extends TestCase $this->assertSame($expected, $selected); - $this->repositorySet = new RepositorySet(array(), 'dev'); + $this->repositorySet = new RepositorySet(array(), array(), 'dev'); $this->repositorySet->addRepository($repo2); $this->repositorySet->addRepository($repo1); @@ -287,7 +287,7 @@ class DefaultPolicyTest extends TestCase $repo->addPackage($packageA = clone $packageA); $repo->addPackage($packageB = clone $packageB); - $repositorySet = new RepositorySet(array(), 'dev'); + $repositorySet = new RepositorySet(array(), array(), 'dev'); $repositorySet->addRepository($this->repo); $pool = $this->repositorySet->createPoolForPackages(array('vendor-a/replacer', 'vendor-b/replacer')); diff --git a/tests/Composer/Test/DependencyResolver/SolverTest.php b/tests/Composer/Test/DependencyResolver/SolverTest.php index 3491f9c05..8f12f3122 100644 --- a/tests/Composer/Test/DependencyResolver/SolverTest.php +++ b/tests/Composer/Test/DependencyResolver/SolverTest.php @@ -29,7 +29,6 @@ class SolverTest extends TestCase { protected $repoSet; protected $repo; - protected $repoInstalled; protected $repoLocked; protected $request; protected $policy; @@ -39,10 +38,9 @@ class SolverTest extends TestCase { $this->repoSet = new RepositorySet(array()); $this->repo = new ArrayRepository; - $this->repoInstalled = new InstalledArrayRepository; $this->repoLocked = new ArrayRepository; - $this->request = new Request(); + $this->request = new Request($this->repoLocked); $this->policy = new DefaultPolicy; } @@ -58,10 +56,9 @@ class SolverTest extends TestCase )); } - public function testSolverRemoveIfNotInstalled() + public function testSolverRemoveIfNotRequested() { - $this->repoInstalled->addPackage($packageA = $this->getPackage('A', '1.0')); - $this->repoLocked->addPackage(clone $packageA); + $this->repoLocked->addPackage($packageA = $this->getPackage('A', '1.0')); $this->reposComplete(); $this->checkSolverResult(array( @@ -96,7 +93,6 @@ class SolverTest extends TestCase $repo1->addPackage($foo1 = $this->getPackage('foo', '1')); $repo2->addPackage($foo2 = $this->getPackage('foo', '1')); - $this->repoSet->addRepository($this->repoInstalled); $this->repoSet->addRepository($repo1); $this->repoSet->addRepository($repo2); @@ -172,36 +168,36 @@ class SolverTest extends TestCase $this->request->install('C'); $this->checkSolverResult(array( - array('job' => 'install', 'package' => $packageA), array('job' => 'install', 'package' => $packageC), array('job' => 'install', 'package' => $packageB), + array('job' => 'install', 'package' => $packageA), )); } - public function testSolverInstallInstalled() + public function testSolverFixLocked() { - $this->repoInstalled->addPackage($this->getPackage('A', '1.0')); + $this->repoLocked->addPackage($packageA = $this->getPackage('A', '1.0')); $this->reposComplete(); - $this->request->install('A'); + $this->request->fixPackage($packageA); $this->checkSolverResult(array()); } - public function testSolverInstallInstalledWithAlternative() + public function testSolverFixLockedWithAlternative() { $this->repo->addPackage($this->getPackage('A', '1.0')); - $this->repoInstalled->addPackage($this->getPackage('A', '1.0')); + $this->repoLocked->addPackage($packageA = $this->getPackage('A', '1.0')); $this->reposComplete(); - $this->request->install('A'); + $this->request->fixPackage($packageA); $this->checkSolverResult(array()); } public function testSolverRemoveSingle() { - $this->repoInstalled->addPackage($packageA = $this->getPackage('A', '1.0')); + $this->repoLocked->addPackage($packageA = $this->getPackage('A', '1.0')); $this->reposComplete(); $this->request->remove('A'); @@ -223,17 +219,15 @@ class SolverTest extends TestCase public function testSolverUpdateDoesOnlyUpdate() { - $this->repoInstalled->addPackage($packageA = $this->getPackage('A', '1.0')); - $this->repoInstalled->addPackage($packageB = $this->getPackage('B', '1.0')); + $this->repoLocked->addPackage($packageA = $this->getPackage('A', '1.0')); + $this->repoLocked->addPackage($packageB = $this->getPackage('B', '1.0')); $this->repo->addPackage($newPackageB = $this->getPackage('B', '1.1')); $this->reposComplete(); $packageA->setRequires(array('b' => new Link('A', 'B', $this->getVersionConstraint('>=', '1.0.0.0'), 'requires'))); - $this->request->install('A', $this->getVersionConstraint('=', '1.0.0.0')); + $this->request->fixPackage($packageA); $this->request->install('B', $this->getVersionConstraint('=', '1.1.0.0')); - $this->request->update('A', $this->getVersionConstraint('=', '1.0.0.0')); - $this->request->update('B', $this->getVersionConstraint('=', '1.0.0.0')); $this->checkSolverResult(array( array('job' => 'update', 'from' => $packageB, 'to' => $newPackageB), @@ -242,12 +236,11 @@ class SolverTest extends TestCase public function testSolverUpdateSingle() { - $this->repoInstalled->addPackage($packageA = $this->getPackage('A', '1.0')); + $this->repoLocked->addPackage($packageA = $this->getPackage('A', '1.0')); $this->repo->addPackage($newPackageA = $this->getPackage('A', '1.1')); $this->reposComplete(); $this->request->install('A'); - $this->request->update('A'); $this->checkSolverResult(array( array('job' => 'update', 'from' => $packageA, 'to' => $newPackageA), @@ -256,8 +249,8 @@ class SolverTest extends TestCase public function testSolverUpdateAll() { - $this->repoInstalled->addPackage($packageA = $this->getPackage('A', '1.0')); - $this->repoInstalled->addPackage($packageB = $this->getPackage('B', '1.0')); + $this->repoLocked->addPackage($packageA = $this->getPackage('A', '1.0')); + $this->repoLocked->addPackage($packageB = $this->getPackage('B', '1.0')); $this->repo->addPackage($newPackageA = $this->getPackage('A', '1.1')); $this->repo->addPackage($newPackageB = $this->getPackage('B', '1.1')); @@ -267,7 +260,6 @@ class SolverTest extends TestCase $this->reposComplete(); $this->request->install('A'); - $this->request->updateAll(); $this->checkSolverResult(array( array('job' => 'update', 'from' => $packageB, 'to' => $newPackageB), @@ -277,28 +269,26 @@ class SolverTest extends TestCase public function testSolverUpdateCurrent() { - $this->repoInstalled->addPackage($this->getPackage('A', '1.0')); + $this->repoLocked->addPackage($this->getPackage('A', '1.0')); $this->repo->addPackage($this->getPackage('A', '1.0')); $this->reposComplete(); $this->request->install('A'); - $this->request->update('A'); $this->checkSolverResult(array()); } public function testSolverUpdateOnlyUpdatesSelectedPackage() { - $this->repoInstalled->addPackage($packageA = $this->getPackage('A', '1.0')); - $this->repoInstalled->addPackage($packageB = $this->getPackage('B', '1.0')); + $this->repoLocked->addPackage($packageA = $this->getPackage('A', '1.0')); + $this->repoLocked->addPackage($packageB = $this->getPackage('B', '1.0')); $this->repo->addPackage($packageAnewer = $this->getPackage('A', '1.1')); $this->repo->addPackage($packageBnewer = $this->getPackage('B', '1.1')); $this->reposComplete(); $this->request->install('A'); - $this->request->install('B'); - $this->request->update('A'); + $this->request->fixPackage($packageB); $this->checkSolverResult(array( array('job' => 'update', 'from' => $packageA, 'to' => $packageAnewer), @@ -307,13 +297,12 @@ class SolverTest extends TestCase public function testSolverUpdateConstrained() { - $this->repoInstalled->addPackage($packageA = $this->getPackage('A', '1.0')); + $this->repoLocked->addPackage($packageA = $this->getPackage('A', '1.0')); $this->repo->addPackage($newPackageA = $this->getPackage('A', '1.2')); $this->repo->addPackage($this->getPackage('A', '2.0')); $this->reposComplete(); $this->request->install('A', $this->getVersionConstraint('<', '2.0.0.0')); - $this->request->update('A'); $this->checkSolverResult(array(array( 'job' => 'update', @@ -324,13 +313,12 @@ class SolverTest extends TestCase public function testSolverUpdateFullyConstrained() { - $this->repoInstalled->addPackage($packageA = $this->getPackage('A', '1.0')); + $this->repoLocked->addPackage($packageA = $this->getPackage('A', '1.0')); $this->repo->addPackage($newPackageA = $this->getPackage('A', '1.2')); $this->repo->addPackage($this->getPackage('A', '2.0')); $this->reposComplete(); $this->request->install('A', $this->getVersionConstraint('<', '2.0.0.0')); - $this->request->update('A', $this->getVersionConstraint('=', '1.0.0.0')); $this->checkSolverResult(array(array( 'job' => 'update', @@ -341,14 +329,13 @@ class SolverTest extends TestCase public function testSolverUpdateFullyConstrainedPrunesInstalledPackages() { - $this->repoInstalled->addPackage($packageA = $this->getPackage('A', '1.0')); - $this->repoInstalled->addPackage($packageB = $this->getPackage('B', '1.0')); + $this->repoLocked->addPackage($packageA = $this->getPackage('A', '1.0')); + $this->repoLocked->addPackage($packageB = $this->getPackage('B', '1.0')); $this->repo->addPackage($newPackageA = $this->getPackage('A', '1.2')); $this->repo->addPackage($this->getPackage('A', '2.0')); $this->reposComplete(); $this->request->install('A', $this->getVersionConstraint('<', '2.0.0.0')); - $this->request->update('A', $this->getVersionConstraint('=', '1.0.0.0')); $this->checkSolverResult(array( array( @@ -365,8 +352,8 @@ class SolverTest extends TestCase public function testSolverAllJobs() { - $this->repoInstalled->addPackage($packageD = $this->getPackage('D', '1.0')); - $this->repoInstalled->addPackage($oldPackageC = $this->getPackage('C', '1.0')); + $this->repoLocked->addPackage($packageD = $this->getPackage('D', '1.0')); + $this->repoLocked->addPackage($oldPackageC = $this->getPackage('C', '1.0')); $this->repo->addPackage($packageA = $this->getPackage('A', '2.0')); $this->repo->addPackage($packageB = $this->getPackage('B', '1.0')); @@ -379,12 +366,11 @@ class SolverTest extends TestCase $this->request->install('A'); $this->request->install('C'); - $this->request->update('C'); $this->request->remove('D'); $this->checkSolverResult(array( - array('job' => 'update', 'from' => $oldPackageC, 'to' => $packageC), array('job' => 'install', 'package' => $packageB), + array('job' => 'update', 'from' => $oldPackageC, 'to' => $packageC), array('job' => 'install', 'package' => $packageA), array('job' => 'remove', 'package' => $packageD), )); @@ -411,7 +397,7 @@ class SolverTest extends TestCase public function testSolverObsolete() { - $this->repoInstalled->addPackage($packageA = $this->getPackage('A', '1.0')); + $this->repoLocked->addPackage($packageA = $this->getPackage('A', '1.0')); $this->repo->addPackage($packageB = $this->getPackage('B', '1.0')); $packageB->setReplaces(array('a' => new Link('B', 'A', new MultiConstraint(array())))); @@ -540,8 +526,8 @@ class SolverTest extends TestCase $this->request->install('X'); $this->checkSolverResult(array( - array('job' => 'install', 'package' => $newPackageB), array('job' => 'install', 'package' => $packageA), + array('job' => 'install', 'package' => $newPackageB), array('job' => 'install', 'package' => $packageX), )); } @@ -584,9 +570,9 @@ class SolverTest extends TestCase $this->request->install('C'); $this->checkSolverResult(array( - array('job' => 'install', 'package' => $packageA), - array('job' => 'install', 'package' => $packageC), array('job' => 'install', 'package' => $packageB), + array('job' => 'install', 'package' => $packageC), + array('job' => 'install', 'package' => $packageA), )); } @@ -766,7 +752,7 @@ class SolverTest extends TestCase $msg .= " - C 1.0 requires d >= 1.0 -> satisfiable by D[1.0].\n"; $msg .= " - D 1.0 requires b < 1.0 -> satisfiable by B[0.9].\n"; $msg .= " - B 1.0 requires c >= 1.0 -> satisfiable by C[1.0].\n"; - $msg .= " - Can only install one of: B[0.9, 1.0].\n"; + $msg .= " - Same name, can only install one of: B[0.9, 1.0].\n"; $msg .= " - A 1.0 requires b >= 1.0 -> satisfiable by B[1.0].\n"; $msg .= " - Installation request for a -> satisfiable by A[1.0].\n"; $this->assertEquals($msg, $e->getMessage()); @@ -820,8 +806,8 @@ class SolverTest extends TestCase $this->request->install('A', $this->getVersionConstraint('==', '1.1.0.0')); $this->checkSolverResult(array( - array('job' => 'install', 'package' => $packageA2), array('job' => 'install', 'package' => $packageB), + array('job' => 'install', 'package' => $packageA2), array('job' => 'install', 'package' => $packageA2Alias), )); } @@ -843,9 +829,9 @@ class SolverTest extends TestCase $this->request->install('B'); $this->checkSolverResult(array( - array('job' => 'install', 'package' => $packageA), array('job' => 'install', 'package' => $packageAAlias), array('job' => 'install', 'package' => $packageB), + array('job' => 'install', 'package' => $packageA), )); } @@ -908,12 +894,12 @@ class SolverTest extends TestCase $this->assertFalse($this->solver->testFlagLearnedPositiveLiteral); $this->checkSolverResult(array( - array('job' => 'install', 'package' => $packageF1), - array('job' => 'install', 'package' => $packageD), - array('job' => 'install', 'package' => $packageG2), array('job' => 'install', 'package' => $packageC2), + array('job' => 'install', 'package' => $packageG2), + array('job' => 'install', 'package' => $packageF1), array('job' => 'install', 'package' => $packageE), array('job' => 'install', 'package' => $packageB), + array('job' => 'install', 'package' => $packageD), array('job' => 'install', 'package' => $packageA), )); @@ -939,7 +925,7 @@ class SolverTest extends TestCase $transaction = $this->solver->solve($this->request); $result = array(); - foreach ($transaction as $operation) { + foreach ($transaction->getOperations() as $operation) { if ('update' === $operation->getJobType()) { $result[] = array( 'job' => 'update',