| # Copyright 2010-2015 Gentoo Foundation |
| # Distributed under the terms of the GNU General Public License v2 |
| |
| from __future__ import unicode_literals |
| |
| import io |
| import tempfile |
| |
| import portage |
| from portage import os, shutil, _encodings |
| from portage.const import USER_CONFIG_PATH |
| from portage.dep import Atom |
| from portage.package.ebuild.config import config |
| from portage.package.ebuild._config.LicenseManager import LicenseManager |
| from portage.tests import TestCase |
| from portage.tests.resolver.ResolverPlayground import ResolverPlayground, ResolverPlaygroundTestCase |
| from portage.util import normalize_path |
| |
| class ConfigTestCase(TestCase): |
| |
| def testClone(self): |
| """ |
| Test the clone via constructor. |
| """ |
| |
| ebuilds = { |
| "dev-libs/A-1": { }, |
| } |
| |
| playground = ResolverPlayground(ebuilds=ebuilds) |
| try: |
| settings = config(clone=playground.settings) |
| result = playground.run(["=dev-libs/A-1"]) |
| pkg, existing_node = result.depgraph._select_package( |
| playground.eroot, Atom("=dev-libs/A-1")) |
| settings.setcpv(pkg) |
| |
| # clone after setcpv tests deepcopy of LazyItemsDict |
| settings2 = config(clone=settings) |
| finally: |
| playground.cleanup() |
| |
| def testFeaturesMutation(self): |
| """ |
| Test whether mutation of config.features updates the FEATURES |
| variable and persists through config.regenerate() calls. Also |
| verify that features_set._prune_overrides() works correctly. |
| """ |
| playground = ResolverPlayground() |
| try: |
| settings = config(clone=playground.settings) |
| |
| settings.features.add('noclean') |
| self.assertEqual('noclean' in settings['FEATURES'].split(), True) |
| settings.regenerate() |
| self.assertEqual('noclean' in settings['FEATURES'].split(), True) |
| |
| settings.features.discard('noclean') |
| self.assertEqual('noclean' in settings['FEATURES'].split(), False) |
| settings.regenerate() |
| self.assertEqual('noclean' in settings['FEATURES'].split(), False) |
| |
| settings.features.add('noclean') |
| self.assertEqual('noclean' in settings['FEATURES'].split(), True) |
| settings.regenerate() |
| self.assertEqual('noclean' in settings['FEATURES'].split(), True) |
| |
| # before: ['noclean', '-noclean', 'noclean'] |
| settings.features._prune_overrides() |
| # after: ['noclean'] |
| self.assertEqual(settings._features_overrides.count('noclean'), 1) |
| self.assertEqual(settings._features_overrides.count('-noclean'), 0) |
| |
| settings.features.remove('noclean') |
| |
| # before: ['noclean', '-noclean'] |
| settings.features._prune_overrides() |
| # after: ['-noclean'] |
| self.assertEqual(settings._features_overrides.count('noclean'), 0) |
| self.assertEqual(settings._features_overrides.count('-noclean'), 1) |
| finally: |
| playground.cleanup() |
| |
| def testLicenseManager(self): |
| |
| user_config = { |
| "package.license": |
| ( |
| "dev-libs/* TEST", |
| "dev-libs/A -TEST2", |
| "=dev-libs/A-2 TEST3 @TEST", |
| "*/* @EULA TEST2", |
| "=dev-libs/C-1 *", |
| "=dev-libs/C-2 -*", |
| ), |
| } |
| |
| playground = ResolverPlayground(user_config=user_config) |
| try: |
| portage.util.noiselimit = -2 |
| |
| license_group_locations = (os.path.join(playground.settings.repositories["test_repo"].location, "profiles"),) |
| pkg_license = os.path.join(playground.eroot, "etc", "portage") |
| |
| lic_man = LicenseManager(license_group_locations, pkg_license) |
| |
| self.assertEqual(lic_man._accept_license_str, None) |
| self.assertEqual(lic_man._accept_license, None) |
| self.assertEqual(lic_man._license_groups, {"EULA": frozenset(["TEST"])}) |
| self.assertEqual(lic_man._undef_lic_groups, set(["TEST"])) |
| |
| self.assertEqual(lic_man.extract_global_changes(), "TEST TEST2") |
| self.assertEqual(lic_man.extract_global_changes(), "") |
| |
| lic_man.set_accept_license_str("TEST TEST2") |
| self.assertEqual(lic_man._getPkgAcceptLicense("dev-libs/B-1", "0", None), ["TEST", "TEST2", "TEST"]) |
| self.assertEqual(lic_man._getPkgAcceptLicense("dev-libs/A-1", "0", None), ["TEST", "TEST2", "TEST", "-TEST2"]) |
| self.assertEqual(lic_man._getPkgAcceptLicense("dev-libs/A-2", "0", None), ["TEST", "TEST2", "TEST", "-TEST2", "TEST3", "@TEST"]) |
| |
| self.assertEqual(lic_man.get_prunned_accept_license("dev-libs/B-1", [], "TEST", "0", None), "TEST") |
| self.assertEqual(lic_man.get_prunned_accept_license("dev-libs/A-1", [], "-TEST2", "0", None), "") |
| self.assertEqual(lic_man.get_prunned_accept_license("dev-libs/A-2", [], "|| ( TEST TEST2 )", "0", None), "TEST") |
| self.assertEqual(lic_man.get_prunned_accept_license("dev-libs/C-1", [], "TEST5", "0", None), "TEST5") |
| self.assertEqual(lic_man.get_prunned_accept_license("dev-libs/C-2", [], "TEST2", "0", None), "") |
| |
| self.assertEqual(lic_man.getMissingLicenses("dev-libs/B-1", [], "TEST", "0", None), []) |
| self.assertEqual(lic_man.getMissingLicenses("dev-libs/A-1", [], "-TEST2", "0", None), ["-TEST2"]) |
| self.assertEqual(lic_man.getMissingLicenses("dev-libs/A-2", [], "|| ( TEST TEST2 )", "0", None), []) |
| self.assertEqual(lic_man.getMissingLicenses("dev-libs/A-3", [], "|| ( TEST2 || ( TEST3 TEST4 ) )", "0", None), ["TEST2", "TEST3", "TEST4"]) |
| self.assertEqual(lic_man.getMissingLicenses("dev-libs/C-1", [], "TEST5", "0", None), []) |
| self.assertEqual(lic_man.getMissingLicenses("dev-libs/C-2", [], "TEST2", "0", None), ["TEST2"]) |
| self.assertEqual(lic_man.getMissingLicenses("dev-libs/D-1", [], "", "0", None), []) |
| finally: |
| portage.util.noiselimit = 0 |
| playground.cleanup() |
| |
| def testPackageMaskOrder(self): |
| |
| ebuilds = { |
| "dev-libs/A-1": { }, |
| "dev-libs/B-1": { }, |
| "dev-libs/C-1": { }, |
| "dev-libs/D-1": { }, |
| "dev-libs/E-1": { }, |
| } |
| |
| repo_configs = { |
| "test_repo": { |
| "package.mask": |
| ( |
| "dev-libs/A", |
| "dev-libs/C", |
| ), |
| } |
| } |
| |
| profile = { |
| "package.mask": |
| ( |
| "-dev-libs/A", |
| "dev-libs/B", |
| "-dev-libs/B", |
| "dev-libs/D", |
| ), |
| } |
| |
| user_config = { |
| "package.mask": |
| ( |
| "-dev-libs/C", |
| "-dev-libs/D", |
| "dev-libs/E", |
| ), |
| } |
| |
| test_cases = ( |
| ResolverPlaygroundTestCase( |
| ["dev-libs/A"], |
| options = { "--autounmask": 'n' }, |
| success = False), |
| ResolverPlaygroundTestCase( |
| ["dev-libs/B"], |
| success = True, |
| mergelist = ["dev-libs/B-1"]), |
| ResolverPlaygroundTestCase( |
| ["dev-libs/C"], |
| success = True, |
| mergelist = ["dev-libs/C-1"]), |
| ResolverPlaygroundTestCase( |
| ["dev-libs/D"], |
| success = True, |
| mergelist = ["dev-libs/D-1"]), |
| ResolverPlaygroundTestCase( |
| ["dev-libs/E"], |
| options = { "--autounmask": 'n' }, |
| success = False), |
| ) |
| |
| playground = ResolverPlayground(ebuilds=ebuilds, repo_configs=repo_configs, \ |
| profile=profile, 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() |
| |
| |
| def testManifest(self): |
| |
| distfiles = { |
| 'B-2.tar.bz2': b'binary\0content', |
| 'C-2.zip': b'binary\0content', |
| 'C-2.tar.bz2': b'binary\0content', |
| } |
| |
| ebuilds = { |
| "dev-libs/A-1::old_repo": { }, |
| "dev-libs/A-2::new_repo": { }, |
| "dev-libs/B-2::new_repo": {"SRC_URI" : "B-2.tar.bz2"}, |
| "dev-libs/C-2::new_repo": {"SRC_URI" : "C-2.zip C-2.tar.bz2"}, |
| } |
| |
| repo_configs = { |
| "new_repo": { |
| "layout.conf": |
| ( |
| "profile-formats = pms", |
| "thin-manifests = true", |
| "manifest-hashes = SHA256 SHA512 WHIRLPOOL", |
| "manifest-required-hashes = SHA512", |
| "# use implicit masters" |
| ), |
| } |
| } |
| |
| test_cases = ( |
| ResolverPlaygroundTestCase( |
| ["=dev-libs/A-1"], |
| mergelist= ["dev-libs/A-1"], |
| success = True), |
| |
| ResolverPlaygroundTestCase( |
| ["=dev-libs/A-2"], |
| mergelist= ["dev-libs/A-2"], |
| success = True), |
| ) |
| |
| playground = ResolverPlayground(ebuilds=ebuilds, |
| repo_configs=repo_configs, distfiles=distfiles) |
| settings = playground.settings |
| |
| new_repo_config = settings.repositories["new_repo"] |
| old_repo_config = settings.repositories["old_repo"] |
| self.assertTrue(len(new_repo_config.masters) > 0, "new_repo has no default master") |
| self.assertEqual(new_repo_config.masters[0].location, playground.settings.repositories["test_repo"].location, |
| "new_repo default master is not test_repo") |
| self.assertEqual(new_repo_config.thin_manifest, True, |
| "new_repo_config.thin_manifest != True") |
| |
| new_manifest_file = os.path.join(new_repo_config.location, "dev-libs", "A", "Manifest") |
| self.assertNotExists(new_manifest_file) |
| |
| new_manifest_file = os.path.join(new_repo_config.location, "dev-libs", "B", "Manifest") |
| f = open(new_manifest_file) |
| self.assertEqual(len(list(f)), 1) |
| f.close() |
| |
| new_manifest_file = os.path.join(new_repo_config.location, "dev-libs", "C", "Manifest") |
| f = open(new_manifest_file) |
| self.assertEqual(len(list(f)), 2) |
| f.close() |
| |
| old_manifest_file = os.path.join(old_repo_config.location, "dev-libs", "A", "Manifest") |
| f = open(old_manifest_file) |
| self.assertEqual(len(list(f)), 1) |
| f.close() |
| |
| 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 testSetCpv(self): |
| """ |
| Test the clone via constructor. |
| """ |
| |
| ebuilds = { |
| "dev-libs/A-1": {"IUSE": "static-libs"}, |
| "dev-libs/B-1": {"IUSE": "static-libs"}, |
| } |
| |
| env_files = { |
| "A" : ("USE=\"static-libs\"",) |
| } |
| |
| package_env = ( |
| "dev-libs/A A", |
| ) |
| |
| eprefix = normalize_path(tempfile.mkdtemp()) |
| playground = None |
| try: |
| user_config_dir = os.path.join(eprefix, USER_CONFIG_PATH) |
| os.makedirs(user_config_dir) |
| |
| with io.open(os.path.join(user_config_dir, "package.env"), |
| mode='w', encoding=_encodings['content']) as f: |
| for line in package_env: |
| f.write(line + "\n") |
| |
| env_dir = os.path.join(user_config_dir, "env") |
| os.makedirs(env_dir) |
| for k, v in env_files.items(): |
| with io.open(os.path.join(env_dir, k), mode='w', |
| encoding=_encodings['content']) as f: |
| for line in v: |
| f.write(line + "\n") |
| |
| playground = ResolverPlayground(eprefix=eprefix, ebuilds=ebuilds) |
| settings = config(clone=playground.settings) |
| |
| result = playground.run(["=dev-libs/A-1"]) |
| pkg, existing_node = result.depgraph._select_package( |
| playground.eroot, Atom("=dev-libs/A-1")) |
| settings.setcpv(pkg) |
| self.assertTrue("static-libs" in |
| settings["PORTAGE_USE"].split()) |
| |
| # Test bug #522362, where a USE=static-libs package.env |
| # setting leaked from one setcpv call to the next. |
| pkg, existing_node = result.depgraph._select_package( |
| playground.eroot, Atom("=dev-libs/B-1")) |
| settings.setcpv(pkg) |
| self.assertTrue("static-libs" not in |
| settings["PORTAGE_USE"].split()) |
| |
| finally: |
| if playground is None: |
| shutil.rmtree(eprefix) |
| else: |
| playground.cleanup() |