# Copyright 2014 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 from portage.tests import TestCase from portage.tests.resolver.ResolverPlayground import ResolverPlayground, ResolverPlaygroundTestCase class SlotConflictUnsatisfiedDeepDepsTestCase(TestCase): def testSlotConflictUnsatisfiedDeepDeps(self): ebuilds = { "dev-libs/A-1": { }, "dev-libs/A-2": { "KEYWORDS": "~x86" }, "dev-libs/B-1": { "DEPEND": "dev-libs/A" }, "dev-libs/C-1": { "DEPEND": ">=dev-libs/A-2" }, "dev-libs/D-1": { "DEPEND": "dev-libs/A" }, } installed = { "dev-libs/broken-1": { "RDEPEND": "dev-libs/A dev-libs/initially-unsatisfied" }, } world = ( "dev-libs/A", "dev-libs/B", "dev-libs/C", "dev-libs/D", "dev-libs/broken" ) test_cases = ( # Test bug #520950, where unsatisfied deps of installed # packages are supposed to be ignored when they are beyond # the depth requested by the user. ResolverPlaygroundTestCase( ["dev-libs/B", "dev-libs/C", "dev-libs/D"], all_permutations=True, options={ "--autounmask": "y", "--complete-graph": True }, mergelist=["dev-libs/A-2", "dev-libs/B-1", "dev-libs/C-1", "dev-libs/D-1"], ignore_mergelist_order=True, unstable_keywords=["dev-libs/A-2"], unsatisfied_deps=[], success=False), ResolverPlaygroundTestCase( ["@world"], options={ "--autounmask": "y", "--complete-graph": True }, mergelist=["dev-libs/A-2", "dev-libs/B-1", "dev-libs/C-1", "dev-libs/D-1"], ignore_mergelist_order=True, unstable_keywords=["dev-libs/A-2"], unsatisfied_deps=["dev-libs/broken"], success=False), # Test --selective with --deep = 0 ResolverPlaygroundTestCase( ["@world"], options={ "--autounmask": "y", "--complete-graph": True, "--selective": True, "--deep": 0 }, mergelist=["dev-libs/A-2", "dev-libs/B-1", "dev-libs/C-1", "dev-libs/D-1"], ignore_mergelist_order=True, unstable_keywords=["dev-libs/A-2"], unsatisfied_deps=[], success=False), # Test --deep = 1 ResolverPlaygroundTestCase( ["@world"], options={ "--autounmask": "y", "--autounmask-backtrack": "y", "--complete-graph": True, "--selective": True, "--deep": 1 }, mergelist=["dev-libs/A-2", "dev-libs/B-1", "dev-libs/C-1", "dev-libs/D-1"], ignore_mergelist_order=True, unstable_keywords=["dev-libs/A-2"], unsatisfied_deps=["dev-libs/initially-unsatisfied"], success=False), # With --autounmask-backtrack=y: #[ebuild N ~] dev-libs/A-2 #[ebuild N ] dev-libs/C-1 #[ebuild N ] dev-libs/D-1 #[ebuild N ] dev-libs/B-1 # #The following keyword changes are necessary to proceed: # (see "package.accept_keywords" in the portage(5) man page for more details) ## required by dev-libs/C-1::test_repo ## required by @selected ## required by @world (argument) #=dev-libs/A-2 ~x86 # #!!! Problems have been detected with your world file #!!! Please run emaint --check world # # #!!! Ebuilds for the following packages are either all #!!! masked or don't exist: #dev-libs/broken # #emerge: there are no ebuilds to satisfy "dev-libs/initially-unsatisfied". #(dependency required by "dev-libs/broken-1::test_repo" [installed]) #(dependency required by "@selected" [set]) #(dependency required by "@world" [argument]) # Without --autounmask-backtrack=y: #!!! Multiple package instances within a single package slot have been pulled #!!! into the dependency graph, resulting in a slot conflict: # #dev-libs/A:0 # # (dev-libs/A-1:0/0::test_repo, ebuild scheduled for merge) pulled in by # (no parents that aren't satisfied by other packages in this slot) # # (dev-libs/A-2:0/0::test_repo, ebuild scheduled for merge) pulled in by # >=dev-libs/A-2 required by (dev-libs/C-1:0/0::test_repo, ebuild scheduled for merge) # ^^ ^ # #The following keyword changes are necessary to proceed: # (see "package.accept_keywords" in the portage(5) man page for more details) ## required by dev-libs/C-1::test_repo ## required by @selected ## required by @world (argument) #=dev-libs/A-2 ~x86 # #emerge: there are no ebuilds to satisfy "dev-libs/initially-unsatisfied". #(dependency required by "dev-libs/broken-1::test_repo" [installed]) #(dependency required by "@selected" [set]) #(dependency required by "@world" [argument]) # Test --deep = True ResolverPlaygroundTestCase( ["@world"], options={ "--autounmask": "y", "--autounmask-backtrack": "y", "--complete-graph": True, "--selective": True, "--deep": True }, mergelist=["dev-libs/A-2", "dev-libs/B-1", "dev-libs/C-1", "dev-libs/D-1"], ignore_mergelist_order=True, unstable_keywords=["dev-libs/A-2"], unsatisfied_deps=["dev-libs/initially-unsatisfied"], success=False), # The effects of --autounmask-backtrack are the same as the previous test case. # Both test cases can randomly succeed with --autounmask-backtrack=n, when # "backtracking due to unsatisfied dep" randomly occurs before the autounmask # unstable keyword change. It would be possible to eliminate backtracking here # by recognizing that there are no alternatives to satisfy the dev-libs/broken # atom in the world file. Then the test cases will consistently succeed with # --autounmask-backtrack=n. ) playground = ResolverPlayground(ebuilds=ebuilds, installed=installed, world=world, debug=False) try: for test_case in test_cases: playground.run_TestCase(test_case) self.assertEqual(test_case.test_success, True, test_case.fail_msg) finally: playground.cleanup()