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()
	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()
    def testUseExpandIncremental(self):

        profiles = (
            (
                "base",
                {
                    "eapi": ("5", ),
                    "parent": ("..", ),
                    "make.defaults": (
                        'INPUT_DEVICES="keyboard mouse"',
                        'PYTHON_TARGETS="python2_7 python3_3"',
                        ('USE_EXPAND="INPUT_DEVICES PYTHON_TARGETS '
                         'VIDEO_CARDS"'),
                    ),
                },
            ),
            (
                "default/linux",
                {
                    "eapi": ("5", ),
                    "make.defaults": ('VIDEO_CARDS="dummy fbdev v4l"', )
                },
            ),
            (
                "default/linux/x86",
                {
                    "eapi": ("5", ),
                    "make.defaults": (
                        # Test negative incremental for bug 530222.
                        'PYTHON_TARGETS="-python3_3"', ),
                    "parent":
                    ("../../../base", "../../../mixins/python/3.4", ".."),
                },
            ),
            (
                "mixins/python/3.4",
                {
                    "eapi": ("5", ),
                    "make.defaults": ('PYTHON_TARGETS="python3_4"', )
                },
            ),
        )

        # USE_EXPAND variable settings in make.conf will cause
        # profile settings for the same variable to be discarded
        # (non-incremental behavior). PMS does not govern make.conf
        # behavior.
        user_config = {"make.conf": ('VIDEO_CARDS="intel"', )}

        ebuilds = {
            "x11-base/xorg-drivers-1.15": {
                "EAPI":
                "5",
                "IUSE": ("input_devices_keyboard input_devices_mouse "
                         "videos_cards_dummy video_cards_fbdev "
                         "video_cards_v4l video_cards_intel"),
            },
            "sys-apps/portage-2.2.14": {
                "EAPI":
                "5",
                "IUSE": ("python_targets_python2_7 "
                         "python_targets_python3_3 python_targets_python3_4"),
            },
        }

        package_expected_use = (
            (
                "x11-base/xorg-drivers-1.15",
                (
                    "input_devices_keyboard",
                    "input_devices_mouse",
                    "video_cards_intel",
                ),
            ),
            (
                "sys-apps/portage-2.2.14",
                ("python_targets_python2_7", "python_targets_python3_4"),
            ),
        )

        playground = ResolverPlayground(debug=False,
                                        ebuilds=ebuilds,
                                        user_config=user_config)
        try:
            repo_dir = playground.settings.repositories.get_location_for_name(
                "test_repo")
            profile_root = os.path.join(repo_dir, "profiles")

            for p, data in profiles:
                prof_path = os.path.join(profile_root, p)
                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()

            depgraph = playground.run(["=x11-base/xorg-drivers-1.15"]).depgraph
            settings = config(clone=playground.settings)

            for cpv, expected_use in package_expected_use:
                pkg, existing_node = depgraph._select_package(
                    playground.eroot, Atom("=" + cpv))
                settings.setcpv(pkg)
                expected = frozenset(expected_use)
                got = frozenset(settings["PORTAGE_USE"].split())
                self.assertEqual(got, expected, "%s != %s" % (got, expected))

        finally:
            playground.cleanup()
	def testProfilePackageSet(self):

		repo_configs = {
			"test_repo": {
				"layout.conf": ("profile-formats = profile-set",),
			}
		}

		profiles = (
			(
				'default/linux',
				{
					"eapi": ("5",),
					"packages": (
						"*sys-libs/A",
						"app-misc/A",
						"app-misc/B",
						"app-misc/C",
					),
				}
			),
			(
				'default/linux/x86',
				{
					"eapi": ("5",),
					"packages": (
						"-app-misc/B",
					),
					"parent": ("..",)
				}
			),
		)

		ebuilds = {
			"sys-libs/A-1": {
				"EAPI": "5",
			},
			"app-misc/A-1": {
				"EAPI": "5",
			},
			"app-misc/B-1": {
				"EAPI": "5",
			},
			"app-misc/C-1": {
				"EAPI": "5",
			},
		}

		installed = {
			"sys-libs/A-1": {
				"EAPI": "5",
			},
			"app-misc/A-1": {
				"EAPI": "5",
			},
			"app-misc/B-1": {
				"EAPI": "5",
			},
			"app-misc/C-1": {
				"EAPI": "5",
			},
		}

		test_cases = (

			ResolverPlaygroundTestCase(
				["@world"],
				options={"--update": True, "--deep": True},
				mergelist = [],
				success = True,
			),

			ResolverPlaygroundTestCase(
				[],
				options={"--depclean": True},
				success=True,
				cleanlist=["app-misc/B-1"]
			),

		)

		playground = ResolverPlayground(debug=False, ebuilds=ebuilds,
			installed=installed, repo_configs=repo_configs)
		try:
			repo_dir = (playground.settings.repositories.
				get_location_for_name("test_repo"))
			profile_root = os.path.join(repo_dir, "profiles")

			for p, data in profiles:
				prof_path = os.path.join(profile_root, p)
				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 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 testProfilePackageSet(self):

        repo_configs = {
            "test_repo": {
                "layout.conf": ("profile-formats = profile-set", ),
            }
        }

        profiles = (
            ('default/linux', {
                "eapi": ("5", ),
                "packages": (
                    "*sys-libs/A",
                    "app-misc/A",
                    "app-misc/B",
                    "app-misc/C",
                ),
            }),
            ('default/linux/x86', {
                "eapi": ("5", ),
                "packages": ("-app-misc/B", ),
                "parent": ("..", )
            }),
        )

        ebuilds = {
            "sys-libs/A-1": {
                "EAPI": "5",
            },
            "app-misc/A-1": {
                "EAPI": "5",
            },
            "app-misc/B-1": {
                "EAPI": "5",
            },
            "app-misc/C-1": {
                "EAPI": "5",
            },
        }

        installed = {
            "sys-libs/A-1": {
                "EAPI": "5",
            },
            "app-misc/A-1": {
                "EAPI": "5",
            },
            "app-misc/B-1": {
                "EAPI": "5",
            },
            "app-misc/C-1": {
                "EAPI": "5",
            },
        }

        test_cases = (
            ResolverPlaygroundTestCase(
                ["@world"],
                options={
                    "--update": True,
                    "--deep": True
                },
                mergelist=[],
                success=True,
            ),
            ResolverPlaygroundTestCase([],
                                       options={"--depclean": True},
                                       success=True,
                                       cleanlist=["app-misc/B-1"]),
        )

        playground = ResolverPlayground(debug=False,
                                        ebuilds=ebuilds,
                                        installed=installed,
                                        repo_configs=repo_configs)
        try:
            repo_dir = (playground.settings.repositories.get_location_for_name(
                "test_repo"))
            profile_root = os.path.join(repo_dir, "profiles")

            for p, data in profiles:
                prof_path = os.path.join(profile_root, p)
                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 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 testUseExpandIncremental(self):

		profiles = (
			(
				'base',
				{
					"eapi": ("5",),
					"parent": ("..",),
					"make.defaults": (
						"INPUT_DEVICES=\"keyboard mouse\"",
						"PYTHON_TARGETS=\"python2_7 python3_3\"",
						("USE_EXPAND=\"INPUT_DEVICES PYTHON_TARGETS "
							"VIDEO_CARDS\""),
					)
				}
			),
			(
				'default/linux',
				{
					"eapi": ("5",),
					"make.defaults": (
						"VIDEO_CARDS=\"dummy fbdev v4l\"",
					)
				}
			),
			(
				'default/linux/x86',
				{
					"eapi": ("5",),
					"make.defaults": (
						# Test negative incremental for bug 530222.
						"PYTHON_TARGETS=\"-python3_3\"",
					),
					"parent": ("../../../base",
						"../../../mixins/python/3.4",
						".."
					)
				}
			),
			(
				'mixins/python/3.4',
				{
					"eapi": ("5",),
					"make.defaults": (
						"PYTHON_TARGETS=\"python3_4\"",
					)
				}
			),
		)

		# USE_EXPAND variable settings in make.conf will cause
		# profile settings for the same variable to be discarded
		# (non-incremental behavior). PMS does not govern make.conf
		# behavior.
		user_config = {
			"make.conf" : (
				"VIDEO_CARDS=\"intel\"",
			)
		}

		ebuilds = {
			"x11-base/xorg-drivers-1.15": {
				"EAPI": "5",
				"IUSE": ("input_devices_keyboard input_devices_mouse "
					"videos_cards_dummy video_cards_fbdev "
					"video_cards_v4l video_cards_intel")
			},
			"sys-apps/portage-2.2.14": {
				"EAPI": "5",
				"IUSE": ("python_targets_python2_7 "
					"python_targets_python3_3 python_targets_python3_4")
			},
		}

		package_expected_use = (
			("x11-base/xorg-drivers-1.15", ("input_devices_keyboard",
				"input_devices_mouse", "video_cards_intel",)),
			("sys-apps/portage-2.2.14", ("python_targets_python2_7",
				"python_targets_python3_4"))
		)

		playground = ResolverPlayground(debug=False,
			ebuilds=ebuilds, user_config=user_config)
		try:
			repo_dir = (playground.settings.repositories.
				get_location_for_name("test_repo"))
			profile_root = os.path.join(repo_dir, "profiles")

			for p, data in profiles:
				prof_path = os.path.join(profile_root, p)
				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()

			depgraph = playground.run(
				["=x11-base/xorg-drivers-1.15"]).depgraph
			settings = config(clone=playground.settings)

			for cpv, expected_use in package_expected_use:
				pkg, existing_node = depgraph._select_package(
					playground.eroot, Atom("=" + cpv))
				settings.setcpv(pkg)
				expected = frozenset(expected_use)
				got = frozenset(settings["PORTAGE_USE"].split())
				self.assertEqual(got, expected,
					"%s != %s" % (got, expected))

		finally:
			playground.cleanup()