# Copyright 2014 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 from __future__ import unicode_literals import io from portage import os, _encodings from portage.const import USER_CONFIG_PATH from portage.tests import TestCase from portage.tests.resolver.ResolverPlayground import ResolverPlayground from portage.dep import ExtendedAtomDict from portage.util import ensure_dirs class ProfileDefaultEAPITestCase(TestCase): def testProfileDefaultEAPI(self): repo_configs = { "test_repo": { "layout.conf": ( "profile-formats = profile-default-eapi", "profile_eapi_when_unspecified = 5" ), } } profiles = ( ( "", { "package.mask": ("sys-libs/A:1",), "package.use": ("sys-libs/A:1 flag",) } ), ( "default/linux", { "package.mask": ("sys-libs/B:1",), "package.use": ("sys-libs/B:1 flag",), "package.keywords": ("sys-libs/B:1 x86",) } ), ( "default/linux/x86", { "package.mask": ("sys-libs/C:1",), "package.use": ("sys-libs/C:1 flag",), "package.keywords": ("sys-libs/C:1 x86",), "parent": ("..",) } ), ) user_profile = { "package.mask": ("sys-libs/D:1",), "package.use": ("sys-libs/D:1 flag",), "package.keywords": ("sys-libs/D:1 x86",), } test_cases = ( (lambda x: x._mask_manager._pmaskdict, { "sys-libs/A": ("sys-libs/A:1::test_repo",), "sys-libs/B": ("sys-libs/B:1",), "sys-libs/C": ("sys-libs/C:1",), "sys-libs/D": ("sys-libs/D:1",), }), (lambda x: x._use_manager._repo_puse_dict, { "test_repo": { "sys-libs/A": { "sys-libs/A:1": ("flag",) } } }), (lambda x: x._use_manager._pkgprofileuse, ( {"sys-libs/B": {"sys-libs/B:1": "flag"}}, {"sys-libs/C": {"sys-libs/C:1": "flag"}}, {}, {"sys-libs/D": {"sys-libs/D:1": "flag"}}, )), (lambda x: x._keywords_manager._pkeywords_list, ( {"sys-libs/B": {"sys-libs/B:1": ["x86"]}}, {"sys-libs/C": {"sys-libs/C:1": ["x86"]}}, {"sys-libs/D": {"sys-libs/D:1": ["x86"]}}, ) ) ) playground = ResolverPlayground(debug=False, repo_configs=repo_configs) try: repo_dir = (playground.settings.repositories. get_location_for_name("test_repo")) profile_root = os.path.join(repo_dir, "profiles") profile_info = [(os.path.join(profile_root, p), data) for p, data in profiles] profile_info.append((os.path.join(playground.eroot, USER_CONFIG_PATH, "profile"), user_profile)) for prof_path, data in profile_info: ensure_dirs(prof_path) for k, v in data.items(): with io.open(os.path.join(prof_path, k), mode="w", encoding=_encodings["repo.content"]) as f: for line in v: f.write("%s\n" % line) # The config must be reloaded in order to account # for the above profile customizations. playground.reload_config() for fn, expected in test_cases: result = self._translate_result(fn(playground.settings)) self.assertEqual(result, expected) finally: playground.cleanup() @staticmethod def _translate_result(result): if isinstance(result, ExtendedAtomDict): result = dict(result.items()) elif isinstance(result, tuple): result = tuple(dict(x.items()) for x in result) return result