| # Copyright 2010-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 MultirepoTestCase(TestCase): |
| |
| def testMultirepo(self): |
| ebuilds = { |
| #Simple repo selection |
| "dev-libs/A-1": { }, |
| "dev-libs/A-1::repo1": { }, |
| "dev-libs/A-2::repo1": { }, |
| "dev-libs/A-1::repo2": { }, |
| |
| #Packages in exactly one repo |
| "dev-libs/B-1": { }, |
| "dev-libs/C-1::repo1": { }, |
| |
| #Package in repository 1 and 2, but 1 must be used |
| "dev-libs/D-1::repo1": { }, |
| "dev-libs/D-1::repo2": { }, |
| |
| "dev-libs/E-1": { }, |
| "dev-libs/E-1::repo1": { }, |
| "dev-libs/E-1::repo2": { "SLOT": "1" }, |
| |
| "dev-libs/F-1::repo1": { "SLOT": "1" }, |
| "dev-libs/F-1::repo2": { "SLOT": "1" }, |
| |
| "dev-libs/G-1::repo1": { "EAPI" : "4", "IUSE":"+x +y", "REQUIRED_USE" : "" }, |
| "dev-libs/G-1::repo2": { "EAPI" : "4", "IUSE":"+x +y", "REQUIRED_USE" : "^^ ( x y )" }, |
| |
| "dev-libs/H-1": { "KEYWORDS": "x86", "EAPI" : "3", |
| "RDEPEND" : "|| ( dev-libs/I:2 dev-libs/I:1 )" }, |
| |
| "dev-libs/I-1::repo2": { "SLOT" : "1"}, |
| "dev-libs/I-2::repo2": { "SLOT" : "2"}, |
| |
| "dev-libs/K-1::repo2": { }, |
| } |
| |
| installed = { |
| "dev-libs/H-1": { "RDEPEND" : "|| ( dev-libs/I:2 dev-libs/I:1 )", "EAPI" : "3" }, |
| "dev-libs/I-2::repo1": {"SLOT" : "2"}, |
| "dev-libs/K-1::repo1": { }, |
| } |
| |
| binpkgs = { |
| "dev-libs/C-1::repo2": { }, |
| "dev-libs/I-2::repo1": {"SLOT" : "2"}, |
| "dev-libs/K-1::repo2": { }, |
| } |
| |
| sets = { |
| "multirepotest": |
| ("dev-libs/A::test_repo",) |
| } |
| |
| test_cases = ( |
| #Simple repo selection |
| ResolverPlaygroundTestCase( |
| ["dev-libs/A"], |
| success = True, |
| check_repo_names = True, |
| mergelist = ["dev-libs/A-2::repo1"]), |
| ResolverPlaygroundTestCase( |
| ["dev-libs/A::test_repo"], |
| success = True, |
| check_repo_names = True, |
| mergelist = ["dev-libs/A-1"]), |
| ResolverPlaygroundTestCase( |
| ["dev-libs/A::repo2"], |
| success = True, |
| check_repo_names = True, |
| mergelist = ["dev-libs/A-1::repo2"]), |
| ResolverPlaygroundTestCase( |
| ["=dev-libs/A-1::repo1"], |
| success = True, |
| check_repo_names = True, |
| mergelist = ["dev-libs/A-1::repo1"]), |
| ResolverPlaygroundTestCase( |
| ["@multirepotest"], |
| success = True, |
| check_repo_names = True, |
| mergelist = ["dev-libs/A-1"]), |
| |
| #Packages in exactly one repo |
| ResolverPlaygroundTestCase( |
| ["dev-libs/B"], |
| success = True, |
| check_repo_names = True, |
| mergelist = ["dev-libs/B-1"]), |
| ResolverPlaygroundTestCase( |
| ["dev-libs/C"], |
| success = True, |
| check_repo_names = True, |
| mergelist = ["dev-libs/C-1::repo1"]), |
| |
| #Package in repository 1 and 2, but 2 must be used |
| ResolverPlaygroundTestCase( |
| ["dev-libs/D"], |
| success = True, |
| check_repo_names = True, |
| mergelist = ["dev-libs/D-1::repo2"]), |
| |
| #--usepkg: don't reinstall on new repo without --newrepo |
| ResolverPlaygroundTestCase( |
| ["dev-libs/C"], |
| options = {"--usepkg": True, "--selective": True}, |
| success = True, |
| check_repo_names = True, |
| mergelist = ["[binary]dev-libs/C-1::repo2"]), |
| |
| #--usepkgonly: don't reinstall on new repo without --newrepo |
| ResolverPlaygroundTestCase( |
| ["dev-libs/C"], |
| options = {"--usepkgonly": True, "--selective": True}, |
| success = True, |
| check_repo_names = True, |
| mergelist = ["[binary]dev-libs/C-1::repo2"]), |
| |
| #--newrepo: pick ebuild if binpkg/ebuild have different repo |
| ResolverPlaygroundTestCase( |
| ["dev-libs/C"], |
| options = {"--usepkg": True, "--newrepo": True, "--selective": True}, |
| success = True, |
| check_repo_names = True, |
| mergelist = ["dev-libs/C-1::repo1"]), |
| |
| #--newrepo --usepkgonly: ebuild is ignored |
| ResolverPlaygroundTestCase( |
| ["dev-libs/C"], |
| options = {"--usepkgonly": True, "--newrepo": True, "--selective": True}, |
| success = True, |
| check_repo_names = True, |
| mergelist = ["[binary]dev-libs/C-1::repo2"]), |
| |
| #--newrepo: pick ebuild if binpkg/ebuild have different repo |
| ResolverPlaygroundTestCase( |
| ["dev-libs/I"], |
| options = {"--usepkg": True, "--newrepo": True, "--selective": True}, |
| success = True, |
| check_repo_names = True, |
| mergelist = ["dev-libs/I-2::repo2"]), |
| |
| #--newrepo --usepkgonly: if binpkg matches installed, do nothing |
| ResolverPlaygroundTestCase( |
| ["dev-libs/I"], |
| options = {"--usepkgonly": True, "--newrepo": True, "--selective": True}, |
| success = True, |
| mergelist = []), |
| |
| #--newrepo --usepkgonly: reinstall if binpkg has new repo. |
| ResolverPlaygroundTestCase( |
| ["dev-libs/K"], |
| options = {"--usepkgonly": True, "--newrepo": True, "--selective": True}, |
| success = True, |
| check_repo_names = True, |
| mergelist = ["[binary]dev-libs/K-1::repo2"]), |
| |
| #--usepkgonly: don't reinstall on new repo without --newrepo. |
| ResolverPlaygroundTestCase( |
| ["dev-libs/K"], |
| options = {"--usepkgonly": True, "--selective": True}, |
| success = True, |
| mergelist = []), |
| |
| #Atoms with slots |
| ResolverPlaygroundTestCase( |
| ["dev-libs/E"], |
| success = True, |
| check_repo_names = True, |
| mergelist = ["dev-libs/E-1::repo2"]), |
| ResolverPlaygroundTestCase( |
| ["dev-libs/E:1::repo2"], |
| success = True, |
| check_repo_names = True, |
| mergelist = ["dev-libs/E-1::repo2"]), |
| ResolverPlaygroundTestCase( |
| ["dev-libs/E:1"], |
| success = True, |
| check_repo_names = True, |
| mergelist = ["dev-libs/E-1::repo2"]), |
| ResolverPlaygroundTestCase( |
| ["dev-libs/F:1"], |
| success = True, |
| check_repo_names = True, |
| mergelist = ["dev-libs/F-1::repo2"]), |
| ResolverPlaygroundTestCase( |
| ["=dev-libs/F-1:1"], |
| success = True, |
| check_repo_names = True, |
| mergelist = ["dev-libs/F-1::repo2"]), |
| ResolverPlaygroundTestCase( |
| ["=dev-libs/F-1:1::repo1"], |
| success = True, |
| check_repo_names = True, |
| mergelist = ["dev-libs/F-1::repo1"]), |
| |
| # Dependency on installed dev-libs/C-2 ebuild for which ebuild is |
| # not available from the same repo should not unnecessarily |
| # reinstall the same version from a different repo. |
| ResolverPlaygroundTestCase( |
| ["dev-libs/H"], |
| options = {"--update": True, "--deep": True}, |
| success = True, |
| mergelist = []), |
| |
| # Dependency on installed dev-libs/I-2 ebuild should trigger reinstall |
| # when --newrepo flag is used. |
| ResolverPlaygroundTestCase( |
| ["dev-libs/H"], |
| options = {"--update": True, "--deep": True, "--newrepo": True}, |
| success = True, |
| check_repo_names = True, |
| mergelist = ["dev-libs/I-2::repo2"]), |
| |
| # Check interaction between repo priority and unsatisfied |
| # REQUIRED_USE, for bug #350254. |
| ResolverPlaygroundTestCase( |
| ["=dev-libs/G-1"], |
| check_repo_names = True, |
| success = False), |
| |
| ) |
| |
| playground = ResolverPlayground(ebuilds=ebuilds, |
| binpkgs=binpkgs, installed=installed, sets=sets) |
| 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() |
| |
| |
| def testMultirepoUserConfig(self): |
| ebuilds = { |
| #package.use test |
| "dev-libs/A-1": { "IUSE": "foo" }, |
| "dev-libs/A-2::repo1": { "IUSE": "foo" }, |
| "dev-libs/A-3::repo2": { }, |
| "dev-libs/B-1": { "DEPEND": "dev-libs/A", "EAPI": 2 }, |
| "dev-libs/B-2": { "DEPEND": "dev-libs/A[foo]", "EAPI": 2 }, |
| "dev-libs/B-3": { "DEPEND": "dev-libs/A[-foo]", "EAPI": 2 }, |
| |
| #package.keywords test |
| "dev-libs/C-1": { "KEYWORDS": "~x86" }, |
| "dev-libs/C-1::repo1": { "KEYWORDS": "~x86" }, |
| |
| #package.license |
| "dev-libs/D-1": { "LICENSE": "TEST" }, |
| "dev-libs/D-1::repo1": { "LICENSE": "TEST" }, |
| |
| #package.mask |
| "dev-libs/E-1": { }, |
| "dev-libs/E-1::repo1": { }, |
| "dev-libs/H-1": { }, |
| "dev-libs/H-1::repo1": { }, |
| "dev-libs/I-1::repo2": { "SLOT" : "1"}, |
| "dev-libs/I-2::repo2": { "SLOT" : "2"}, |
| "dev-libs/J-1": { "KEYWORDS": "x86", "EAPI" : "3", |
| "RDEPEND" : "|| ( dev-libs/I:2 dev-libs/I:1 )" }, |
| |
| #package.properties |
| "dev-libs/F-1": { "PROPERTIES": "bar"}, |
| "dev-libs/F-1::repo1": { "PROPERTIES": "bar"}, |
| |
| #package.unmask |
| "dev-libs/G-1": { }, |
| "dev-libs/G-1::repo1": { }, |
| |
| #package.mask with wildcards |
| "dev-libs/Z-1::repo3": { }, |
| } |
| |
| installed = { |
| "dev-libs/J-1": { "RDEPEND" : "|| ( dev-libs/I:2 dev-libs/I:1 )", "EAPI" : "3" }, |
| "dev-libs/I-2::repo1": {"SLOT" : "2"}, |
| } |
| |
| user_config = { |
| "package.use": |
| ( |
| "dev-libs/A::repo1 foo", |
| ), |
| "package.keywords": |
| ( |
| "=dev-libs/C-1::test_repo", |
| ), |
| "package.license": |
| ( |
| "=dev-libs/D-1::test_repo TEST", |
| ), |
| "package.mask": |
| ( |
| "dev-libs/E::repo1", |
| "dev-libs/H", |
| "dev-libs/I::repo1", |
| #needed for package.unmask test |
| "dev-libs/G", |
| #wildcard test |
| "*/*::repo3", |
| ), |
| "package.properties": |
| ( |
| "dev-libs/F::repo1 -bar", |
| ), |
| "package.unmask": |
| ( |
| "dev-libs/G::test_repo", |
| ), |
| } |
| |
| test_cases = ( |
| #package.use test |
| ResolverPlaygroundTestCase( |
| ["=dev-libs/B-1"], |
| success = True, |
| check_repo_names = True, |
| mergelist = ["dev-libs/A-3::repo2", "dev-libs/B-1"]), |
| ResolverPlaygroundTestCase( |
| ["=dev-libs/B-2"], |
| success = True, |
| check_repo_names = True, |
| mergelist = ["dev-libs/A-2::repo1", "dev-libs/B-2"]), |
| ResolverPlaygroundTestCase( |
| ["=dev-libs/B-3"], |
| options = { "--autounmask": 'n' }, |
| success = False, |
| check_repo_names = True), |
| |
| #package.keywords test |
| ResolverPlaygroundTestCase( |
| ["dev-libs/C"], |
| success = True, |
| check_repo_names = True, |
| mergelist = ["dev-libs/C-1"]), |
| |
| #package.license test |
| ResolverPlaygroundTestCase( |
| ["dev-libs/D"], |
| success = True, |
| check_repo_names = True, |
| mergelist = ["dev-libs/D-1"]), |
| |
| #package.mask test |
| ResolverPlaygroundTestCase( |
| ["dev-libs/E"], |
| success = True, |
| check_repo_names = True, |
| mergelist = ["dev-libs/E-1"]), |
| |
| # Dependency on installed dev-libs/C-2 ebuild for which ebuild is |
| # masked from the same repo should not unnecessarily pull |
| # in a different slot. It should just pull in the same slot from |
| # a different repo (bug #351828). |
| ResolverPlaygroundTestCase( |
| ["dev-libs/J"], |
| options = {"--update": True, "--deep": True}, |
| success = True, |
| mergelist = ["dev-libs/I-2"]), |
| |
| #package.properties test |
| ResolverPlaygroundTestCase( |
| ["dev-libs/F"], |
| success = True, |
| check_repo_names = True, |
| mergelist = ["dev-libs/F-1"]), |
| |
| #package.mask test |
| ResolverPlaygroundTestCase( |
| ["dev-libs/G"], |
| success = True, |
| check_repo_names = True, |
| mergelist = ["dev-libs/G-1"]), |
| ResolverPlaygroundTestCase( |
| ["dev-libs/H"], |
| options = { "--autounmask": 'n' }, |
| success = False), |
| |
| #package.mask with wildcards |
| ResolverPlaygroundTestCase( |
| ["dev-libs/Z"], |
| options = { "--autounmask": 'n' }, |
| success = False), |
| ) |
| |
| playground = ResolverPlayground(ebuilds=ebuilds, |
| installed=installed, user_config=user_config) |
| 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() |