| # 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 AutounmaskUseBreakageTestCase(TestCase): |
| |
| def testAutounmaskUseBreakage(self): |
| |
| ebuilds = { |
| |
| "app-misc/A-0" : { |
| "EAPI": "5", |
| "RDEPEND": "app-misc/D[-foo]", |
| }, |
| |
| "app-misc/B-0" : { |
| "EAPI": "5", |
| "RDEPEND": "app-misc/D[foo]" |
| }, |
| |
| "app-misc/C-0" : { |
| "EAPI": "5", |
| "RDEPEND": ">=app-misc/D-1" |
| }, |
| |
| "app-misc/D-0" : { |
| "EAPI": "5", |
| "IUSE": "foo" |
| }, |
| |
| "app-misc/D-1" : { |
| "EAPI": "5", |
| "IUSE": "bar" |
| }, |
| |
| } |
| |
| test_cases = ( |
| |
| # Bug 510270 |
| # _solve_non_slot_operator_slot_conflicts throws |
| # IndexError: tuple index out of range |
| # due to autounmask USE breakage. |
| ResolverPlaygroundTestCase( |
| ["app-misc/C", "app-misc/B", "app-misc/A"], |
| options={"--autounmask-backtrack": "y"}, |
| all_permutations = True, |
| success = False, |
| ambiguous_slot_collision_solutions = True, |
| slot_collision_solutions = [None, []] |
| ), |
| |
| # With --autounmask-backtrack=y: |
| #emerge: there are no ebuilds built with USE flags to satisfy "app-misc/D[foo]". |
| #!!! One of the following packages is required to complete your request: |
| #- app-misc/D-0::test_repo (Change USE: +foo) |
| #(dependency required by "app-misc/B-0::test_repo" [ebuild]) |
| #(dependency required by "app-misc/B" [argument]) |
| |
| # Without --autounmask-backtrack=y: |
| #[ebuild N ] app-misc/D-0 USE="foo" |
| #[ebuild N ] app-misc/D-1 USE="-bar" |
| #[ebuild N ] app-misc/C-0 |
| #[ebuild N ] app-misc/B-0 |
| #[ebuild N ] app-misc/A-0 |
| # |
| #!!! Multiple package instances within a single package slot have been pulled |
| #!!! into the dependency graph, resulting in a slot conflict: |
| # |
| #app-misc/D:0 |
| # |
| # (app-misc/D-0:0/0::test_repo, ebuild scheduled for merge) pulled in by |
| # app-misc/D[-foo] required by (app-misc/A-0:0/0::test_repo, ebuild scheduled for merge) |
| # ^^^^ |
| # app-misc/D[foo] required by (app-misc/B-0:0/0::test_repo, ebuild scheduled for merge) |
| # ^^^ |
| # |
| # (app-misc/D-1:0/0::test_repo, ebuild scheduled for merge) pulled in by |
| # >=app-misc/D-1 required by (app-misc/C-0:0/0::test_repo, ebuild scheduled for merge) |
| # ^^ ^ |
| # |
| #The following USE changes are necessary to proceed: |
| # (see "package.use" in the portage(5) man page for more details) |
| ## required by app-misc/B-0::test_repo |
| ## required by app-misc/B (argument) |
| #=app-misc/D-0 foo |
| |
| # NOTE: The --autounmask-backtrack=n output is preferable here, |
| # because it highlights the unsolvable dependency conflict. |
| # It would be better if it eliminated the autounmask suggestion, |
| # since that suggestion won't solve the conflict. |
| ) |
| |
| playground = ResolverPlayground(ebuilds=ebuilds, 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() |