def testBacktrackNoWrongRebuilds(self):
        """
		Ensure we remove backtrack masks if the reason for the mask gets masked itself.
		"""

        ebuilds = {
            "dev-libs/A-1": {},
            "dev-libs/A-2": {},
            "dev-libs/B-1": {"RDEPEND": "dev-libs/D"},
            "dev-libs/C-1": {},
            "dev-libs/C-2": {"RDEPEND": ">=dev-libs/A-2"},
            "dev-libs/D-1": {"RDEPEND": "<dev-libs/A-2"},
        }

        installed = {
            "dev-libs/A-1": {},
            "dev-libs/B-1": {"RDEPEND": "dev-libs/D"},
            "dev-libs/C-1": {},
            "dev-libs/D-1": {"RDEPEND": "<dev-libs/A-2"},
        }

        world = ["dev-libs/B", "dev-libs/C"]

        options = {"--update": True, "--deep": True, "--selective": True}

        test_cases = (ResolverPlaygroundTestCase(["@world"], options=options, mergelist=[], success=True),)

        playground = ResolverPlayground(ebuilds=ebuilds, installed=installed, world=world)

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

        self.todo = True

        ebuilds = {
            "x11-proto/xextproto-7.2.1-r1": {"EAPI": "5", "IUSE": "abi_x86_32 abi_x86_64"},
            "x11-libs/libXaw-1.0.11-r2": {
                "EAPI": "5",
                "IUSE": "abi_x86_32 abi_x86_64",
                "RDEPEND": "x11-proto/xextproto[abi_x86_32(-)?,abi_x86_64(-)?]",
            },
            "app-emulation/emul-linux-x86-xlibs-20130224-r2": {"EAPI": "5", "RDEPEND": "x11-libs/libXaw[abi_x86_32]"},
            "games-util/steam-client-meta-0-r20130514": {"EAPI": "5", "RDEPEND": "app-emulation/emul-linux-x86-xlibs"},
        }

        installed = {
            "x11-proto/xextproto-7.2.1-r1": {
                "EAPI": "5",
                "IUSE": "abi_x86_32 abi_x86_64",
                "USE": "abi_x86_32 abi_x86_64",
            },
            "x11-libs/libXaw-1.0.11-r2": {
                "EAPI": "5",
                "IUSE": "abi_x86_32 abi_x86_64",
                "RDEPEND": "x11-proto/xextproto[abi_x86_32(-)?,abi_x86_64(-)?]",
                "USE": "abi_x86_32 abi_x86_64",
            },
            "app-emulation/emul-linux-x86-xlibs-20130224-r2": {"EAPI": "5", "RDEPEND": "x11-libs/libXaw[abi_x86_32]"},
            "games-util/steam-client-meta-0-r20130514": {"EAPI": "5", "RDEPEND": "app-emulation/emul-linux-x86-xlibs"},
        }

        user_config = {
            # "make.conf" : ("USE=\"abi_x86_32 abi_x86_64\"",)
            "make.conf": ('USE="abi_x86_64"',)
        }

        world = ("games-util/steam-client-meta",)

        test_cases = (
            # Test autounmask solving of multilib use deps for bug #481628.
            # We would like it to suggest some USE changes, but instead it
            # currently fails with a SLOT conflict.
            ResolverPlaygroundTestCase(
                ["x11-proto/xextproto", "x11-libs/libXaw"],
                options={"--oneshot": True, "--autounmask": True, "--backtrack": 30},
                mergelist=["x11-proto/xextproto-7.2.1-r1", "x11-libs/libXaw-1.0.11-r2"],
                success=True,
            ),
        )

        playground = ResolverPlayground(
            ebuilds=ebuilds, installed=installed, user_config=user_config, world=world, 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()
示例#3
0
    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 testBacktrackingGoodVersionFirst(self):
		"""
		When backtracking due to slot conflicts, we masked the version that has been pulled
		in first. This is not always a good idea. Mask the highest version instead.
		"""

		ebuilds = {
			"dev-libs/A-1": { "DEPEND": "=dev-libs/C-1 dev-libs/B" },
			"dev-libs/B-1": { "DEPEND": "=dev-libs/C-1" },
			"dev-libs/B-2": { "DEPEND": "=dev-libs/C-2" },
			"dev-libs/C-1": { },
			"dev-libs/C-2": { },
			}

		test_cases = (
				ResolverPlaygroundTestCase(
					["dev-libs/A"],
					mergelist = ["dev-libs/C-1", "dev-libs/B-1", "dev-libs/A-1", ],
					success = True),
			)

		playground = ResolverPlayground(ebuilds=ebuilds)

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

		ebuilds = {
			"app-arch/libarchive-3.1.1" : {
				"EAPI": "5",
				"SLOT": "0/13"
			},
			"app-arch/libarchive-3.0.4-r1" : {
				"EAPI": "5",
				"SLOT": "0"
			},
			"kde-base/ark-4.10.0" : {
				"EAPI": "5",
				"DEPEND": "app-arch/libarchive:=",
				"RDEPEND": "app-arch/libarchive:="
			},
		}

		binpkgs = {
			"app-arch/libarchive-3.1.1" : {
				"EAPI": "5",
				"SLOT": "0"
			},
		}

		installed = {
			"app-arch/libarchive-3.1.1" : {
				"EAPI": "5",
				"SLOT": "0"
			},

			"kde-base/ark-4.10.0" : {
				"EAPI": "5",
				"DEPEND": "app-arch/libarchive:0/0=",
				"RDEPEND": "app-arch/libarchive:0/0="
			},
		}

		world = ["kde-base/ark"]

		test_cases = (

			# Demonstrate bug #456208, where a sub-slot change
			# without revbump needs to trigger a rebuild.
			ResolverPlaygroundTestCase(
				["kde-base/ark"],
				options = {"--oneshot": True, "--usepkg": True},
				success = True,
				mergelist = ['app-arch/libarchive-3.1.1', "kde-base/ark-4.10.0"]),

		)

		playground = ResolverPlayground(ebuilds=ebuilds, binpkgs=binpkgs,
			installed=installed, world=world, 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()
	def testDirectVirtualCircularDependency(self):

		# Bug #384107
		self.todo = True

		ebuilds = {
			"dev-java/icedtea-6.1.10.3": { "SLOT" : "6", "DEPEND": "virtual/jdk" },
			"dev-java/icedtea6-bin-1.10.3": {},
			"virtual/jdk-1.6.0": { "SLOT" : "1.6", "RDEPEND": "|| ( dev-java/icedtea6-bin =dev-java/icedtea-6* )" },
		}

		test_cases = (
			# Automatically pull in icedtea6-bin to solve a circular dep
			ResolverPlaygroundTestCase(
				["dev-java/icedtea"],
				mergelist = ["dev-java/icedtea6-bin-1.10.3", "virtual/jdk-1.6.0", "dev-java/icedtea-6.1.10.3"],
				success = True,
			),
		)

		playground = ResolverPlayground(ebuilds=ebuilds)
		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 testWithTestDeps(self):
		ebuilds = {
			"app-misc/A-0": {
				"EAPI": "5",
				"IUSE": "test",
				"DEPEND": "test? ( app-misc/B )"
			},
			"app-misc/B-0": {
				"EAPI": "5",
				"IUSE": "test",
				"DEPEND": "test? ( app-misc/C )"
			},
			"app-misc/C-0": {
				"EAPI": "5",
			}
		}

		test_cases = (
			# Test that --with-test-deps only pulls in direct
			# test deps of packages matched by arguments.
			ResolverPlaygroundTestCase(
				["app-misc/A"],
				success = True,
				options = { "--onlydeps": True, "--with-test-deps": True },
				mergelist = ["app-misc/B-0"]),
		)

		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()
示例#8
0
	def testDepcleanInstalledKeywordMaskedSlot(self):
		"""
		Verify that depclean removes newer slot
		masked by KEYWORDS (see bug #350285).
		"""
		ebuilds = {
			"dev-libs/A-1": { "RDEPEND": "|| ( =dev-libs/B-2.7* =dev-libs/B-2.6* )" },
			"dev-libs/B-2.6": { "SLOT":"2.6", "KEYWORDS": "x86" },
			"dev-libs/B-2.7": { "SLOT":"2.7", "KEYWORDS": "~x86" },
			}
		installed = {
			"dev-libs/A-1": { "EAPI" : "3", "RDEPEND": "|| ( dev-libs/B:2.7 dev-libs/B:2.6 )" },
			"dev-libs/B-2.6": { "SLOT":"2.6", "KEYWORDS": "x86" },
			"dev-libs/B-2.7": { "SLOT":"2.7", "KEYWORDS": "~x86" },
			}

		world = (
			"dev-libs/A",
			)

		test_cases = (
			ResolverPlaygroundTestCase(
				[],
				options={"--depclean": True},
				success=True,
				cleanlist=["dev-libs/B-2.7"]),
			)

		playground = ResolverPlayground(ebuilds=ebuilds, installed=installed, world=world)
		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()
示例#9
0
	def testSimpleDepclean(self):
		ebuilds = {
			"dev-libs/A-1": {},
			"dev-libs/B-1": {},
			}
		installed = {
			"dev-libs/A-1": {},
			"dev-libs/B-1": {},
			}

		world = (
			"dev-libs/A",
			)

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

		playground = ResolverPlayground(ebuilds=ebuilds, installed=installed, world=world)
		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()
示例#10
0
	def testOnlydeps(self):
		ebuilds = {
			"dev-libs/A-1": { "DEPEND": "dev-libs/B" },
			"dev-libs/B-1": { },
			}
		installed = {
			"dev-libs/B-1": { },
		}

		test_cases = (
			ResolverPlaygroundTestCase(
				["dev-libs/A", "dev-libs/B"],
				all_permutations = True,
				success = True,
				options = { "--onlydeps": True },
				mergelist = ["dev-libs/B-1"]),
			)

		playground = ResolverPlayground(ebuilds=ebuilds,
			installed=installed, 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()
	def testBacktrackMissedUpdates(self):
		"""
		An update is missed due to a dependency on an older version.
		"""

		ebuilds = {
			"dev-libs/A-1": { },
			"dev-libs/A-2": { },
			"dev-libs/B-1": { "RDEPEND": "<=dev-libs/A-1" },
			}

		installed = {
			"dev-libs/A-1": { "USE": "" },
			"dev-libs/B-1": { "USE": "", "RDEPEND": "<=dev-libs/A-1" },
			}

		options = {'--update' : True, '--deep' : True, '--selective' : True}

		test_cases = (
				ResolverPlaygroundTestCase(
					["dev-libs/A", "dev-libs/B"],
					options = options,
					all_permutations = True,
					mergelist = [],
					success = True),
			)

		playground = ResolverPlayground(ebuilds=ebuilds, installed=installed)

		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 testOldDepChainDisplay(self):
		ebuilds = {
			"dev-libs/A-1": { "DEPEND": "foo? ( dev-libs/B[-bar] )", "IUSE": "+foo", "EAPI": "2" }, 
			"dev-libs/A-2": { "DEPEND": "foo? ( dev-libs/C )", "IUSE": "+foo", "EAPI": "1" }, 
			"dev-libs/B-1": { "IUSE": "bar", "DEPEND": "!bar? ( dev-libs/D[-baz] )", "EAPI": "2" },
			"dev-libs/C-1": { "KEYWORDS": "~x86" },
			"dev-libs/D-1": { "IUSE": "+baz", "EAPI": "1" },
			}

		test_cases = (
			ResolverPlaygroundTestCase(
				["=dev-libs/A-1"],
				options = { "--autounmask": 'n' },
				success = False),
			ResolverPlaygroundTestCase(
				["=dev-libs/A-2"],
				options = { "--autounmask": 'n' },
				success = False),
			)

		playground = ResolverPlayground(ebuilds=ebuilds)
		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 testAutounmaskParentUse(self):

		ebuilds = {
			"dev-libs/B-1": {
				"EAPI": "5",
				"DEPEND": "dev-libs/D[foo(-)?,bar(-)?]",
				"IUSE": "+bar +foo",
			},
			"dev-libs/D-1": {},
		}

		test_cases = (
			# Test bug 566704
			ResolverPlaygroundTestCase(
				["=dev-libs/B-1"],
				options={"--autounmask": True},
				success=False,
				use_changes={
					"dev-libs/B-1": {
						"foo": False,
						"bar": False,
					}
				}),
		)

		playground = ResolverPlayground(ebuilds=ebuilds)
		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()
示例#14
0
    def testBacktrackNotNeeded(self):
        ebuilds = {
            "dev-libs/A-1": {},
            "dev-libs/A-2": {},
            "dev-libs/B-1": {},
            "dev-libs/B-2": {},
            "dev-libs/C-1": {"DEPEND": "dev-libs/A dev-libs/B"},
            "dev-libs/D-1": {"DEPEND": "=dev-libs/A-1 =dev-libs/B-1"},
        }

        test_cases = (
            ResolverPlaygroundTestCase(
                ["dev-libs/C", "dev-libs/D"],
                all_permutations=True,
                options={"--backtrack": 1},
                mergelist=["dev-libs/A-1", "dev-libs/B-1", "dev-libs/C-1", "dev-libs/D-1"],
                ignore_mergelist_order=True,
                success=True,
            ),
        )

        playground = ResolverPlayground(ebuilds=ebuilds)

        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 testBacktrackWithoutUpdates(self):
		"""
		If --update is not given we might have to mask the old installed version later.
		"""

		ebuilds = {
			"dev-libs/A-1": { "DEPEND": "dev-libs/Z" },
			"dev-libs/B-1": { "DEPEND": ">=dev-libs/Z-2" },
			"dev-libs/Z-1": { },
			"dev-libs/Z-2": { },
			}

		installed = {
			"dev-libs/Z-1": { "USE": "" },
			}

		test_cases = (
				ResolverPlaygroundTestCase(
					["dev-libs/B", "dev-libs/A"],
					all_permutations = True,
					mergelist = ["dev-libs/Z-2", "dev-libs/B-1", "dev-libs/A-1", ],
					ignore_mergelist_order = True,
					success = True),
			)

		playground = ResolverPlayground(ebuilds=ebuilds, installed=installed)

		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()
示例#16
0
	def testSelfDEPENDRemovalCrash(self):
		"""
		Make sure we don't try to remove a packages twice. This happened
		in the past when a package had a DEPEND on itself.
		"""
		ebuilds = {
			"dev-libs/A-1": { "RDEPEND": "=dev-libs/X-1" },
			"dev-libs/B-1": { "RDEPEND": "dev-libs/X" },

			"dev-libs/X-1": { },
			"dev-libs/X-2": { "DEPEND": ">=dev-libs/X-2" },
			}

		test_cases = (
			ResolverPlaygroundTestCase(
				["dev-libs/A", "dev-libs/B"],
				all_permutations = True,
				success = True,
				ignore_mergelist_order = True,
				mergelist = ["dev-libs/X-1", "dev-libs/A-1", "dev-libs/B-1"]),
			)

		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()
	def testHittingTheBacktrackLimit(self):
		ebuilds = {
			"dev-libs/A-1": {},
			"dev-libs/A-2": {},
			"dev-libs/B-1": {},
			"dev-libs/B-2": {},
			"dev-libs/C-1": { "DEPEND": "dev-libs/A dev-libs/B" },
			"dev-libs/D-1": { "DEPEND": "=dev-libs/A-1 =dev-libs/B-1" },
			}

		test_cases = (
				ResolverPlaygroundTestCase(
					["dev-libs/C", "dev-libs/D"],
					all_permutations = True,
					mergelist = ["dev-libs/A-1", "dev-libs/B-1", "dev-libs/C-1", "dev-libs/D-1"],
					ignore_mergelist_order = True,
					success = True),
				#This one hits the backtrack limit. Be aware that this depends on the argument order.
				ResolverPlaygroundTestCase(
					["dev-libs/D", "dev-libs/C"],
					options = { "--backtrack": 1 },
					mergelist = ["dev-libs/A-1", "dev-libs/B-1", "dev-libs/A-2", "dev-libs/B-2", "dev-libs/C-1", "dev-libs/D-1"],
					ignore_mergelist_order = True,
					slot_collision_solutions = [],
					success = False),
			)

		playground = ResolverPlayground(ebuilds=ebuilds)

		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()
示例#18
0
	def testConnectedCollision(self):
		"""
		Ensure that we are able to solve connected slot conflicts
		which cannot be solved each on their own.
		"""
		ebuilds = {
			"dev-libs/A-1": { "RDEPEND": "=dev-libs/X-1" },
			"dev-libs/B-1": { "RDEPEND": "dev-libs/X" },

			"dev-libs/X-1": { "RDEPEND": "=dev-libs/Y-1" },
			"dev-libs/X-2": { "RDEPEND": "=dev-libs/Y-2" },

			"dev-libs/Y-1": { "PDEPEND": "=dev-libs/X-1" },
			"dev-libs/Y-2": { "PDEPEND": "=dev-libs/X-2" },
			}

		test_cases = (
			ResolverPlaygroundTestCase(
				["dev-libs/A", "dev-libs/B"],
				all_permutations = True,
				options = { "--backtrack": 0 },
				success = True,
				ambiguous_merge_order = True,
				mergelist = ["dev-libs/Y-1", "dev-libs/X-1", ("dev-libs/A-1", "dev-libs/B-1")]),
			)

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

		ebuilds = {
			"dev-libs/A-1": { "DEPEND": "dev-libs/B[foo]", "RDEPEND": "dev-libs/B[foo]", "EAPI": "2" },
			"dev-libs/A-2": { "DEPEND": "dev-libs/B[foo(+)]", "RDEPEND": "dev-libs/B[foo(+)]", "EAPI": "4" },
			"dev-libs/A-3": { "DEPEND": "dev-libs/B[foo(-)]", "RDEPEND": "dev-libs/B[foo(-)]", "EAPI": "4" },
			"dev-libs/B-1": { "IUSE": "+foo", "EAPI": "1" },
			"dev-libs/B-2": {},
			}

		test_cases = (
			ResolverPlaygroundTestCase(
				["=dev-libs/A-1"],
				success = True,
				mergelist = ["dev-libs/B-1", "dev-libs/A-1"]),
			ResolverPlaygroundTestCase(
				["=dev-libs/A-2"],
				success = True,
				mergelist = ["dev-libs/B-2", "dev-libs/A-2"]),
			ResolverPlaygroundTestCase(
				["=dev-libs/A-3"],
				success = True,
				mergelist = ["dev-libs/B-1", "dev-libs/A-3"]),
			)

		playground = ResolverPlayground(ebuilds=ebuilds)
		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 testSlotOperatorUpdateProbeParentDowngrade(self):

		ebuilds = {
			"net-nds/openldap-2.4.40-r3": {
				"EAPI": "5",
				"RDEPEND": "<sys-libs/db-6.0:= " + \
					"|| ( sys-libs/db:5.3 sys-libs/db:5.1 )"
			},
			"net-nds/openldap-2.4.40": {
				"EAPI": "5",
				"RDEPEND": "sys-libs/db"
			},
			"sys-libs/db-6.0": {
				"SLOT": "6.0",
			},
			"sys-libs/db-5.3": {
				"SLOT": "5.3",
			},
		}

		installed = {
			"net-nds/openldap-2.4.40-r3": {
				"EAPI": "5",
				"RDEPEND": "<sys-libs/db-6.0:5.3/5.3= " + \
					"|| ( sys-libs/db:5.3 sys-libs/db:5.1 )"
			},
			"sys-libs/db-6.0": {
				"SLOT": "6.0",
			},
			"sys-libs/db-5.3": {
				"SLOT": "5.3",
			},
		}

		world = (
			"net-nds/openldap",
		)

		test_cases = (
			# bug 528610 - openldap rebuild was triggered
			# inappropriately, due to slot_operator_update_probe
			# selecting an inappropriate replacement parent of
			# a lower version than desired.
			ResolverPlaygroundTestCase(
				["@world"],
				success = True,
				options = { "--update": True, "--deep": True },
				mergelist = []),
		)

		playground = ResolverPlayground(ebuilds=ebuilds,
			installed=installed, world=world, 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()
示例#21
0
	def testVirtualRust(self):
		ebuilds = {
			'dev-lang/rust-1.19.0': {},
			'dev-lang/rust-1.23.0': {},
			'dev-lang/rust-bin-1.19.0': {},
			'virtual/rust-1.19.0': {
				'RDEPEND': '|| ( =dev-lang/rust-1.19.0* =dev-lang/rust-bin-1.19.0* )'
			},
		}

		installed = {
			'dev-lang/rust-1.19.0': {},
			'virtual/rust-1.19.0': {
				'RDEPEND': '|| ( =dev-lang/rust-1.19.0* =dev-lang/rust-bin-1.19.0* )'
			},
		}

		world = ['virtual/rust']

		test_cases = (
			# Test bug 645416, where rust-bin-1.19.0 was pulled in
			# inappropriately due to the rust-1.23.0 update being
			# available.
			ResolverPlaygroundTestCase(
				['virtual/rust'],
				options={'--update': True, '--deep': True},
				success=True,
				mergelist=[]
			),
			# Test upgrade to rust-1.23.0, which is only possible
			# if rust-bin-1.19.0 is installed in order to satisfy
			# virtual/rust-1.19.0.
			ResolverPlaygroundTestCase(
				['=dev-lang/rust-1.23.0', 'virtual/rust'],
				options={'--update': True, '--deep': True},
				all_permutations=True,
				success=True,
				ambiguous_merge_order=True,
				mergelist=(
					(
						'dev-lang/rust-1.23.0',
						'dev-lang/rust-bin-1.19.0',
					),
				),
			),
		)

		playground = ResolverPlayground(debug=False,
			ebuilds=ebuilds, installed=installed, world=world)

		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.debug = False
			playground.cleanup()
示例#22
0
	def testAutounmaskAndSets(self):

		ebuilds = {
			#ebuilds to test use changes
			"dev-libs/A-1": { },
			"dev-libs/A-2": { "KEYWORDS": "~x86" },
			"dev-libs/B-1": { "DEPEND": "dev-libs/A" },
			"dev-libs/C-1": { "DEPEND": ">=dev-libs/A-2" },
			"dev-libs/D-1": { "DEPEND": "dev-libs/A" },
			}

		world_sets = ["@test-set"]
		sets = {
			"test-set": (
					"dev-libs/A", "dev-libs/B", "dev-libs/C", "dev-libs/D",
				),
			}

		test_cases = (
				#Test USE changes.
				#The simple case.

				ResolverPlaygroundTestCase(
					["dev-libs/B", "dev-libs/C", "dev-libs/D"],
					all_permutations=True,
					options={"--autounmask": "y"},
					mergelist=["dev-libs/A-2", "dev-libs/B-1", "dev-libs/C-1", "dev-libs/D-1"],
					ignore_mergelist_order=True,
					unstable_keywords=["dev-libs/A-2"],
					success=False),

				ResolverPlaygroundTestCase(
					["@test-set"],
					all_permutations=True,
					options={"--autounmask": "y"},
					mergelist=["dev-libs/A-2", "dev-libs/B-1", "dev-libs/C-1", "dev-libs/D-1"],
					ignore_mergelist_order=True,
					unstable_keywords=["dev-libs/A-2"],
					success=False),

				ResolverPlaygroundTestCase(
					["@world"],
					all_permutations=True,
					options={"--autounmask": "y"},
					mergelist=["dev-libs/A-2", "dev-libs/B-1", "dev-libs/C-1", "dev-libs/D-1"],
					ignore_mergelist_order=True,
					unstable_keywords=["dev-libs/A-2"],
					success=False),
			)


		playground = ResolverPlayground(ebuilds=ebuilds, world_sets=world_sets, 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 testUnpackDependencies(self):
		distfiles = {
			"A-1.tar.gz": b"binary\0content",
			"B-1.TAR.XZ": b"binary\0content",
			"B-docs-1.tar.bz2": b"binary\0content",
			"C-1.TAR.XZ": b"binary\0content",
			"C-docs-1.tar.bz2": b"binary\0content",
		}

		ebuilds = {
			"dev-libs/A-1": {"SRC_URI": "A-1.tar.gz", "EAPI": "5-progress"},
			"dev-libs/B-1": {"IUSE": "doc", "SRC_URI": "B-1.TAR.XZ doc? ( B-docs-1.tar.bz2 )", "EAPI": "5-progress"},
			"dev-libs/C-1": {"IUSE": "doc", "SRC_URI": "C-1.TAR.XZ doc? ( C-docs-1.tar.bz2 )", "EAPI": "5-progress"},
			"app-arch/bzip2-1": {},
			"app-arch/gzip-1": {},
			"app-arch/tar-1": {},
			"app-arch/xz-utils-1": {},
		}

		repo_configs = {
			"test_repo": {
				"unpack_dependencies/5-progress": (
					"tar.bz2 app-arch/tar app-arch/bzip2",
					"tar.gz app-arch/tar app-arch/gzip",
					"tar.xz app-arch/tar app-arch/xz-utils",
				),
			},
		}

		test_cases = (
			ResolverPlaygroundTestCase(
				["dev-libs/A"],
				success = True,
				ignore_mergelist_order = True,
				mergelist = ["app-arch/tar-1", "app-arch/gzip-1", "dev-libs/A-1"]),
			ResolverPlaygroundTestCase(
				["dev-libs/B"],
				success = True,
				ignore_mergelist_order = True,
				mergelist = ["app-arch/tar-1", "app-arch/xz-utils-1", "dev-libs/B-1"]),
			ResolverPlaygroundTestCase(
				["dev-libs/C"],
				success = True,
				ignore_mergelist_order = True,
				mergelist = ["app-arch/tar-1", "app-arch/xz-utils-1", "app-arch/bzip2-1", "dev-libs/C-1"]),
		)

		user_config = {
			"package.use": ("dev-libs/C doc",)
		}

		playground = ResolverPlayground(distfiles=distfiles, ebuilds=ebuilds, repo_configs=repo_configs, 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()
示例#24
0
	def testFeaturesTestUse(self):
		ebuilds = {
			"dev-libs/A-1" : {
				"IUSE": "test"
			},
			"dev-libs/B-1" : {
				"IUSE": "test foo"
			},
		}

		installed = {
			"dev-libs/A-1" : {
				"USE": "",
				"IUSE": "test"
			},
			"dev-libs/B-1" : {
				"USE": "foo",
				"IUSE": "test foo"
			},
		}

		user_config = {
			"make.conf" : ("FEATURES=test", "USE=\"-test -foo\"")
		}

		test_cases = (

			# USE=test state should not trigger --newuse rebuilds, as
			# specified in bug #373209, comment #3.
			ResolverPlaygroundTestCase(
				["dev-libs/A"],
				options = {"--newuse": True, "--selective": True},
				success = True,
				mergelist = []),

			# USE=-test -> USE=test, with USE=test forced by FEATURES=test
			ResolverPlaygroundTestCase(
				["dev-libs/A"],
				options = {},
				success = True,
				mergelist = ["dev-libs/A-1"]),

			# USE=foo -> USE=-foo, with USE=test forced by FEATURES=test
			ResolverPlaygroundTestCase(
				["dev-libs/B"],
				options = {"--newuse": True, "--selective": True},
				success = True,
				mergelist = ["dev-libs/B-1"]),
		)

		playground = ResolverPlayground(ebuilds=ebuilds,
			installed=installed, user_config=user_config, 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()
	def testAutounmaskBinpkgUse(self):
		ebuilds = {
			"dev-libs/A-1": {
				"EAPI": "6",
				"DEPEND": "dev-libs/B[foo]",
				"RDEPEND": "dev-libs/B[foo]",
			},
			"dev-libs/B-1": {
				"EAPI": "6",
				"IUSE": "foo",
			},
		}
		binpkgs = {
			"dev-libs/A-1": {
				"EAPI": "6",
				"DEPEND": "dev-libs/B[foo]",
				"RDEPEND": "dev-libs/B[foo]",
			},
			"dev-libs/B-1": {
				"EAPI": "6",
				"IUSE": "foo",
				"USE": "foo",
			},
		}
		installed = {
		}

		test_cases = (
			# Bug 619626: Test for unnecessary rebuild due
			# to rejection of binary packages that would
			# be acceptable after appplication of autounmask
			# USE changes.
			ResolverPlaygroundTestCase(
				["dev-libs/A"],
				all_permutations = True,
				success = True,
				options = {
					"--usepkg": True,
					"--autounmask": True,
				},
				mergelist = [
				    "[binary]dev-libs/B-1",
				    "[binary]dev-libs/A-1",
				],
				use_changes = {"dev-libs/B-1": {"foo": True}}
			),
		)

		playground = ResolverPlayground(ebuilds=ebuilds,
			binpkgs=binpkgs, installed=installed, 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.debug = False
			playground.cleanup()
示例#26
0
	def testCompleteGraphVersionChange(self):
		"""
		Prevent reverse dependency breakage triggered by version changes.
		"""

		ebuilds = {
			"sys-libs/x-0.1": {},
			"sys-libs/x-1": {},
			"sys-libs/x-2": {},
			"sys-apps/a-1": {"RDEPEND" : ">=sys-libs/x-1 <sys-libs/x-2"},
		}

		installed = {
			"sys-libs/x-1": {},
			"sys-apps/a-1": {"RDEPEND" : ">=sys-libs/x-1 <sys-libs/x-2"},
		}

		world = ["sys-apps/a"]

		test_cases = (
			ResolverPlaygroundTestCase(
				[">=sys-libs/x-2"],
				options = {"--complete-graph-if-new-ver" : "n", "--rebuild-if-new-slot": "n"},
				mergelist = ["sys-libs/x-2"],
				success = True,
			),
			ResolverPlaygroundTestCase(
				[">=sys-libs/x-2"],
				options = {"--complete-graph-if-new-ver" : "y"},
				mergelist = ["sys-libs/x-2"],
				slot_collision_solutions = [],
				success = False,
			),
			ResolverPlaygroundTestCase(
				["<sys-libs/x-1"],
				options = {"--complete-graph-if-new-ver" : "n", "--rebuild-if-new-slot": "n"},
				mergelist = ["sys-libs/x-0.1"],
				success = True,
			),
			ResolverPlaygroundTestCase(
				["<sys-libs/x-1"],
				options = {"--complete-graph-if-new-ver" : "y"},
				mergelist = ["sys-libs/x-0.1"],
				slot_collision_solutions = [],
				success = False,
			),
		)

		playground = ResolverPlayground(ebuilds=ebuilds,
			installed=installed, world=world, 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()
示例#27
0
	def testUseMask(self):

		profile = {
			"use.mask":
			(
				"abi_ppc_32",
			),
		}

		ebuilds = {

			"sys-libs/A-1" : {
				"EAPI": "5",
				"RDEPEND": "|| ( sys-libs/zlib[abi_ppc_32(-)] " + \
					"sys-libs/zlib[abi_x86_32(-)] )"
			},

			"sys-libs/zlib-1.2.8-r1" : {
				"EAPI": "5",
				"IUSE": "abi_ppc_32 abi_x86_32"
			},

			"sys-libs/zlib-1.2.8" : {
				"EAPI": "5",
				"IUSE": ""
			},
		}

		test_cases = (

			# bug #515584: We want to prefer choices that do
			# not require changes to use.mask or use.force.
			# In this case, abi_ppc_32 is use.masked in the
			# profile, so we want to avoid that choice.
			ResolverPlaygroundTestCase(
				["sys-libs/A"],
				options = {},
				success = False,
				use_changes = {
					'sys-libs/zlib-1.2.8-r1': {'abi_x86_32': True}
				},
				mergelist = ["sys-libs/zlib-1.2.8-r1", "sys-libs/A-1"]
			),

		)

		playground = ResolverPlayground(ebuilds=ebuilds,
			profile=profile, 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()
	def testSlotConflictDepChange(self):
		"""
		Bug 490362
		The dependency in the ebuild was changed form slot operator to
		no slot operator. The vdb contained the slot operator and emerge
		would refuse to rebuild.
		"""
		ebuilds = {
			"app-misc/A-1" : {
				"EAPI": "5",
				"DEPEND": "app-misc/B",
				"RDEPEND": "app-misc/B"
			},

			"app-misc/B-1" : {
				"EAPI": "5",
				"SLOT": "0/1"
			},

			"app-misc/B-2" : {
				"EAPI": "5",
				"SLOT": "0/2"
			},
		}

		installed = {
			"app-misc/A-1" : {
				"EAPI": "5",
				"DEPEND": "app-misc/B:0/1=",
				"RDEPEND": "app-misc/B:0/1="
			},
			"app-misc/B-1" : {
				"EAPI": "5",
				"SLOT": "0/1"
			},
		}

		test_cases = (
			ResolverPlaygroundTestCase(
				["app-misc/B"],
				success = True,
				mergelist = ['app-misc/B-2', 'app-misc/A-1']),
		)

		world = ["app-misc/A"]

		playground = ResolverPlayground(ebuilds=ebuilds,
			installed=installed, world=world, 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()
示例#29
0
	def testOrChoicesLibpostproc(self):
		ebuilds = {
			"media-video/ffmpeg-0.10" : {
				"EAPI": "5",
				"SLOT": "0.10"
			},
			"media-video/ffmpeg-1.2.2" : {
				"EAPI": "5",
				"SLOT": "0"
			},
			"media-libs/libpostproc-0.8.0.20121125" : {
				"EAPI": "5"
			},
			"media-plugins/gst-plugins-ffmpeg-0.10.13_p201211-r1" : {
				"EAPI": "5",
				"RDEPEND" : "|| ( media-video/ffmpeg:0 media-libs/libpostproc )"
			},
		}

		installed = {
			"media-video/ffmpeg-0.10" : {
				"EAPI": "5",
				"SLOT": "0.10"
			},
			"media-libs/libpostproc-0.8.0.20121125" : {
				"EAPI": "5"
			},
			"media-plugins/gst-plugins-ffmpeg-0.10.13_p201211-r1" : {
				"EAPI": "5",
				"RDEPEND" : "|| ( media-video/ffmpeg:0 media-libs/libpostproc )"
			},
		}

		world = ["media-plugins/gst-plugins-ffmpeg"]

		test_cases = (
			# Demonstrate that libpostproc is preferred
			# over ffmpeg:0 for bug #480736.
			ResolverPlaygroundTestCase(
				["@world"],
				options = {"--update": True, "--deep": True},
				success=True,
				all_permutations = True,
				mergelist = []),
		)

		playground = ResolverPlayground(ebuilds=ebuilds, installed=installed,
			world=world, 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()
	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"],
				all_permutations = True,
				success = False,
				ambiguous_slot_collision_solutions = True,
				slot_collision_solutions = [None, []]
			),

		)

		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()
示例#31
0
    def testMergeOrder(self):
        ebuilds = {
            "app-misc/blocker-buildtime-a-1": {},
            "app-misc/blocker-buildtime-unbuilt-a-1": {
                "DEPEND": "!app-misc/installed-blocker-a",
            },
            "app-misc/blocker-buildtime-unbuilt-hard-a-1": {
                "EAPI": "2",
                "DEPEND": "!!app-misc/installed-blocker-a",
            },
            "app-misc/blocker-update-order-a-1": {},
            "app-misc/blocker-update-order-hard-a-1": {},
            "app-misc/blocker-update-order-hard-unsolvable-a-1": {},
            "app-misc/blocker-runtime-a-1": {},
            "app-misc/blocker-runtime-b-1": {},
            "app-misc/blocker-runtime-hard-a-1": {},
            "app-misc/circ-buildtime-a-0": {},
            "app-misc/circ-buildtime-a-1": {
                "RDEPEND": "app-misc/circ-buildtime-b",
            },
            "app-misc/circ-buildtime-b-1": {
                "RDEPEND": "app-misc/circ-buildtime-c",
            },
            "app-misc/circ-buildtime-c-1": {
                "DEPEND": "app-misc/circ-buildtime-a",
            },
            "app-misc/circ-buildtime-unsolvable-a-1": {
                "RDEPEND": "app-misc/circ-buildtime-unsolvable-b",
            },
            "app-misc/circ-buildtime-unsolvable-b-1": {
                "RDEPEND": "app-misc/circ-buildtime-unsolvable-c",
            },
            "app-misc/circ-buildtime-unsolvable-c-1": {
                "DEPEND": "app-misc/circ-buildtime-unsolvable-a",
            },
            "app-misc/circ-post-runtime-a-1": {
                "PDEPEND": "app-misc/circ-post-runtime-b",
            },
            "app-misc/circ-post-runtime-b-1": {
                "RDEPEND": "app-misc/circ-post-runtime-c",
            },
            "app-misc/circ-post-runtime-c-1": {
                "RDEPEND": "app-misc/circ-post-runtime-a",
            },
            "app-misc/circ-runtime-a-1": {
                "RDEPEND": "app-misc/circ-runtime-b",
            },
            "app-misc/circ-runtime-b-1": {
                "RDEPEND": "app-misc/circ-runtime-c",
            },
            "app-misc/circ-runtime-c-1": {
                "RDEPEND": "app-misc/circ-runtime-a",
            },
            "app-misc/circ-satisfied-a-0": {
                "RDEPEND": "app-misc/circ-satisfied-b",
            },
            "app-misc/circ-satisfied-a-1": {
                "RDEPEND": "app-misc/circ-satisfied-b",
            },
            "app-misc/circ-satisfied-b-0": {
                "RDEPEND": "app-misc/circ-satisfied-c",
            },
            "app-misc/circ-satisfied-b-1": {
                "RDEPEND": "app-misc/circ-satisfied-c",
            },
            "app-misc/circ-satisfied-c-0": {
                "DEPEND": "app-misc/circ-satisfied-a",
                "RDEPEND": "app-misc/circ-satisfied-a",
            },
            "app-misc/circ-satisfied-c-1": {
                "DEPEND": "app-misc/circ-satisfied-a",
                "RDEPEND": "app-misc/circ-satisfied-a",
            },
            "app-misc/circ-direct-a-1": {
                "RDEPEND": "app-misc/circ-direct-b",
            },
            "app-misc/circ-direct-b-1": {
                "RDEPEND": "app-misc/circ-direct-a",
                "DEPEND": "app-misc/circ-direct-a",
            },
            "app-misc/circ-smallest-a-1": {
                "RDEPEND": "app-misc/circ-smallest-b",
            },
            "app-misc/circ-smallest-b-1": {
                "RDEPEND": "app-misc/circ-smallest-a",
            },
            "app-misc/circ-smallest-c-1": {
                "RDEPEND": "app-misc/circ-smallest-d",
            },
            "app-misc/circ-smallest-d-1": {
                "RDEPEND": "app-misc/circ-smallest-e",
            },
            "app-misc/circ-smallest-e-1": {
                "RDEPEND": "app-misc/circ-smallest-c",
            },
            "app-misc/circ-smallest-f-1": {
                "RDEPEND":
                "app-misc/circ-smallest-g app-misc/circ-smallest-a app-misc/circ-smallest-c",
            },
            "app-misc/circ-smallest-g-1": {
                "RDEPEND": "app-misc/circ-smallest-f",
            },
            "app-misc/installed-blocker-a-1": {
                "EAPI":
                "2",
                "DEPEND":
                "!app-misc/blocker-buildtime-a",
                "RDEPEND":
                "!app-misc/blocker-runtime-a !app-misc/blocker-runtime-b !!app-misc/blocker-runtime-hard-a",
            },
            "app-misc/installed-old-version-blocks-a-1": {
                "RDEPEND": "!app-misc/blocker-update-order-a",
            },
            "app-misc/installed-old-version-blocks-a-2": {},
            "app-misc/installed-old-version-blocks-hard-a-1": {
                "EAPI": "2",
                "RDEPEND": "!!app-misc/blocker-update-order-hard-a",
            },
            "app-misc/installed-old-version-blocks-hard-a-2": {},
            "app-misc/installed-old-version-blocks-hard-unsolvable-a-1": {
                "EAPI": "2",
                "RDEPEND": "!!app-misc/blocker-update-order-hard-unsolvable-a",
            },
            "app-misc/installed-old-version-blocks-hard-unsolvable-a-2": {
                "DEPEND": "app-misc/blocker-update-order-hard-unsolvable-a",
                "RDEPEND": "",
            },
            "app-misc/some-app-a-1": {
                "RDEPEND": "app-misc/circ-runtime-a app-misc/circ-runtime-b",
            },
            "app-misc/some-app-b-1": {
                "RDEPEND":
                "app-misc/circ-post-runtime-a app-misc/circ-post-runtime-b",
            },
            "app-misc/some-app-c-1": {
                "RDEPEND":
                "app-misc/circ-buildtime-a app-misc/circ-buildtime-b",
            },
            "app-admin/eselect-python-20100321": {},
            "sys-apps/portage-2.1.9.42": {
                "DEPEND": "dev-lang/python",
                "RDEPEND": "dev-lang/python",
            },
            "sys-apps/portage-2.1.9.49": {
                "DEPEND":
                "dev-lang/python >=app-admin/eselect-python-20091230",
                "RDEPEND": "dev-lang/python",
            },
            "dev-lang/python-3.1": {},
            "dev-lang/python-3.2": {},
            "virtual/libc-0": {
                "RDEPEND": "sys-libs/glibc",
            },
            "sys-devel/gcc-4.5.2": {},
            "sys-devel/binutils-2.18": {},
            "sys-devel/binutils-2.20.1": {},
            "sys-libs/glibc-2.11": {
                "DEPEND":
                "virtual/os-headers sys-devel/gcc sys-devel/binutils",
                "RDEPEND": "",
            },
            "sys-libs/glibc-2.13": {
                "DEPEND":
                "virtual/os-headers sys-devel/gcc sys-devel/binutils",
                "RDEPEND": "",
            },
            "virtual/os-headers-0": {
                "RDEPEND": "sys-kernel/linux-headers",
            },
            "sys-kernel/linux-headers-2.6.38": {
                "DEPEND": "app-arch/xz-utils",
                "RDEPEND": "",
            },
            "sys-kernel/linux-headers-2.6.39": {
                "DEPEND": "app-arch/xz-utils",
                "RDEPEND": "",
            },
            "app-arch/xz-utils-5.0.1": {},
            "app-arch/xz-utils-5.0.2": {},
            "dev-util/pkgconfig-0.25-r2": {},
            "kde-base/kdelibs-3.5.7": {
                "PDEPEND": "kde-misc/kdnssd-avahi",
            },
            "kde-misc/kdnssd-avahi-0.1.2": {
                "DEPEND":
                "kde-base/kdelibs app-arch/xz-utils dev-util/pkgconfig",
                "RDEPEND": "kde-base/kdelibs",
            },
            "kde-base/kdnssd-3.5.7": {
                "DEPEND": "kde-base/kdelibs",
                "RDEPEND": "kde-base/kdelibs",
            },
            "kde-base/libkdegames-3.5.7": {
                "DEPEND": "kde-base/kdelibs",
                "RDEPEND": "kde-base/kdelibs",
            },
            "kde-base/kmines-3.5.7": {
                "DEPEND": "kde-base/libkdegames",
                "RDEPEND": "kde-base/libkdegames",
            },
            "media-libs/mesa-9.1.3": {
                "EAPI": "5",
                "IUSE": "+xorg",
                "DEPEND": "xorg? ( x11-base/xorg-server:= )",
                "RDEPEND": "xorg? ( x11-base/xorg-server:= )",
            },
            "media-video/libav-0.7_pre20110327": {
                "EAPI": "2",
                "IUSE": "X +encode",
                "RDEPEND": "!media-video/ffmpeg",
            },
            "media-video/ffmpeg-0.7_rc1": {
                "EAPI": "2",
                "IUSE": "X +encode",
            },
            "virtual/ffmpeg-0.6.90": {
                "EAPI":
                "2",
                "IUSE":
                "X +encode",
                "RDEPEND":
                "|| ( >=media-video/ffmpeg-0.6.90_rc0-r2[X=,encode=] >=media-video/libav-0.6.90_rc[X=,encode=] )",
            },
            "x11-base/xorg-drivers-1.20-r2": {
                "EAPI":
                "7",
                "IUSE":
                "+video_cards_fbdev",
                "PDEPEND":
                "x11-base/xorg-server video_cards_fbdev? ( x11-drivers/xf86-video-fbdev )",
            },
            "x11-base/xorg-server-1.14.1": {
                "EAPI": "5",
                "SLOT": "0/1.14.1",
                "DEPEND": "media-libs/mesa",
                "RDEPEND": "media-libs/mesa",
                "PDEPEND": "x11-base/xorg-drivers",
            },
            "x11-drivers/xf86-video-fbdev-0.5.0-r1": {
                "EAPI": "7",
                "DEPEND": "x11-base/xorg-server",
                "RDEPEND": "x11-base/xorg-server:=",
            }
        }

        installed = {
            "app-misc/circ-direct-a-1": {
                "RDEPEND": "app-misc/circ-direct-b",
            },
            "app-misc/circ-direct-b-1": {
                "RDEPEND": "app-misc/circ-direct-a",
                "DEPEND": "app-misc/circ-direct-a",
            },
            "app-misc/circ-buildtime-a-0": {},
            "app-misc/circ-satisfied-a-0": {
                "RDEPEND": "app-misc/circ-satisfied-b",
            },
            "app-misc/circ-satisfied-b-0": {
                "RDEPEND": "app-misc/circ-satisfied-c",
            },
            "app-misc/circ-satisfied-c-0": {
                "DEPEND": "app-misc/circ-satisfied-a",
                "RDEPEND": "app-misc/circ-satisfied-a",
            },
            "app-misc/installed-blocker-a-1": {
                "EAPI":
                "2",
                "DEPEND":
                "!app-misc/blocker-buildtime-a",
                "RDEPEND":
                "!app-misc/blocker-runtime-a !app-misc/blocker-runtime-b !!app-misc/blocker-runtime-hard-a",
            },
            "app-misc/installed-old-version-blocks-a-1": {
                "RDEPEND": "!app-misc/blocker-update-order-a",
            },
            "app-misc/installed-old-version-blocks-hard-a-1": {
                "EAPI": "2",
                "RDEPEND": "!!app-misc/blocker-update-order-hard-a",
            },
            "app-misc/installed-old-version-blocks-hard-unsolvable-a-1": {
                "EAPI": "2",
                "RDEPEND": "!!app-misc/blocker-update-order-hard-unsolvable-a",
            },
            "sys-apps/portage-2.1.9.42": {
                "DEPEND": "dev-lang/python",
                "RDEPEND": "dev-lang/python",
            },
            "dev-lang/python-3.1": {},
            "virtual/libc-0": {
                "RDEPEND": "sys-libs/glibc",
            },
            "sys-devel/binutils-2.18": {},
            "sys-libs/glibc-2.11": {
                "DEPEND":
                "virtual/os-headers sys-devel/gcc sys-devel/binutils",
                "RDEPEND": "",
            },
            "virtual/os-headers-0": {
                "RDEPEND": "sys-kernel/linux-headers",
            },
            "sys-kernel/linux-headers-2.6.38": {
                "DEPEND": "app-arch/xz-utils",
                "RDEPEND": "",
            },
            "app-arch/xz-utils-5.0.1": {},
            "media-libs/mesa-9.1.3": {
                "EAPI": "5",
                "IUSE": "+xorg",
                "USE": "xorg",
                "DEPEND": "x11-base/xorg-server:0/1.14.1=",
                "RDEPEND": "x11-base/xorg-server:0/1.14.1=",
            },
            "media-video/ffmpeg-0.7_rc1": {
                "EAPI": "2",
                "IUSE": "X +encode",
                "USE": "encode",
            },
            "virtual/ffmpeg-0.6.90": {
                "EAPI":
                "2",
                "IUSE":
                "X +encode",
                "USE":
                "encode",
                "RDEPEND":
                "|| ( >=media-video/ffmpeg-0.6.90_rc0-r2[X=,encode=] >=media-video/libav-0.6.90_rc[X=,encode=] )",
            },
            "x11-base/xorg-drivers-1.20-r2": {
                "EAPI": "7",
                "IUSE": "+video_cards_fbdev",
                "USE": "video_cards_fbdev",
                "PDEPEND": "x11-base/xorg-server x11-drivers/xf86-video-fbdev",
            },
            "x11-base/xorg-server-1.14.1": {
                "EAPI": "5",
                "SLOT": "0/1.14.1",
                "DEPEND": "media-libs/mesa",
                "RDEPEND": "media-libs/mesa",
                "PDEPEND": "x11-base/xorg-drivers",
            },
            "x11-drivers/xf86-video-fbdev-0.5.0-r1": {
                "EAPI": "7",
                "DEPEND": "x11-base/xorg-server",
                "RDEPEND": "x11-base/xorg-server:0/1.14.1=",
            }
        }

        test_cases = (
            ResolverPlaygroundTestCase(
                ["app-misc/circ-direct-a", "app-misc/circ-direct-b"],
                success=True,
                all_permutations=True,
                mergelist=[
                    "app-misc/circ-direct-a-1", "app-misc/circ-direct-b-1"
                ],
            ),
            ResolverPlaygroundTestCase(["app-misc/some-app-a"],
                                       success=True,
                                       ambiguous_merge_order=True,
                                       mergelist=[
                                           ("app-misc/circ-runtime-a-1",
                                            "app-misc/circ-runtime-b-1",
                                            "app-misc/circ-runtime-c-1"),
                                           "app-misc/some-app-a-1"
                                       ]),
            ResolverPlaygroundTestCase(["app-misc/some-app-a"],
                                       success=True,
                                       ambiguous_merge_order=True,
                                       mergelist=[
                                           ("app-misc/circ-runtime-c-1",
                                            "app-misc/circ-runtime-b-1",
                                            "app-misc/circ-runtime-a-1"),
                                           "app-misc/some-app-a-1"
                                       ]),
            # Test unsolvable circular dep that is RDEPEND in one
            # direction and DEPEND in the other.
            ResolverPlaygroundTestCase(
                ["app-misc/circ-buildtime-unsolvable-a"],
                success=False,
                circular_dependency_solutions={}),
            # Test optimal merge order for a circular dep that is
            # RDEPEND in one direction and DEPEND in the other.
            # This requires an installed instance of the DEPEND
            # package in order to be solvable.
            ResolverPlaygroundTestCase(
                ["app-misc/some-app-c", "app-misc/circ-buildtime-a"],
                success=True,
                ambiguous_merge_order=True,
                # The following merge order assertion reflects optimal order for
                # a circular relationship which is DEPEND in one direction and
                # RDEPEND in the other.
                merge_order_assertions=(("app-misc/circ-buildtime-a-1",
                                         "app-misc/circ-buildtime-c-1"), ),
                mergelist=[("app-misc/circ-buildtime-b-1",
                            "app-misc/circ-buildtime-c-1",
                            "app-misc/circ-buildtime-a-1"),
                           "app-misc/some-app-c-1"]),
            # Test optimal merge order for a circular dep that is
            # RDEPEND in one direction and PDEPEND in the other.
            ResolverPlaygroundTestCase(["app-misc/some-app-b"],
                                       success=True,
                                       ambiguous_merge_order=True,
                                       mergelist=[
                                           "app-misc/circ-post-runtime-a-1",
                                           ("app-misc/circ-post-runtime-b-1",
                                            "app-misc/circ-post-runtime-c-1"),
                                           "app-misc/some-app-b-1"
                                       ]),
            # Test optimal merge order for a circular dep that is
            # RDEPEND in one direction and DEPEND in the other,
            # with all dependencies initially satisfied. Optimally,
            # the DEPEND/buildtime dep should be updated before the
            # package that depends on it, even though it's feasible
            # to update it later since it is already satisfied.
            ResolverPlaygroundTestCase(
                [
                    "app-misc/circ-satisfied-a", "app-misc/circ-satisfied-b",
                    "app-misc/circ-satisfied-c"
                ],
                success=True,
                all_permutations=True,
                ambiguous_merge_order=True,
                merge_order_assertions=(("app-misc/circ-satisfied-a-1",
                                         "app-misc/circ-satisfied-c-1"), ),
                mergelist=[("app-misc/circ-satisfied-a-1",
                            "app-misc/circ-satisfied-b-1",
                            "app-misc/circ-satisfied-c-1")]),
            # In the case of multiple runtime cycles, where some cycles
            # may depend on smaller independent cycles, it's optimal
            # to merge smaller independent cycles before other cycles
            # that depend on them.
            ResolverPlaygroundTestCase([
                "app-misc/circ-smallest-a", "app-misc/circ-smallest-c",
                "app-misc/circ-smallest-f"
            ],
                                       success=True,
                                       ambiguous_merge_order=True,
                                       all_permutations=True,
                                       mergelist=[
                                           ('app-misc/circ-smallest-a-1',
                                            'app-misc/circ-smallest-b-1'),
                                           ('app-misc/circ-smallest-c-1',
                                            'app-misc/circ-smallest-d-1',
                                            'app-misc/circ-smallest-e-1'),
                                           ('app-misc/circ-smallest-f-1',
                                            'app-misc/circ-smallest-g-1')
                                       ]),
            # installed package has buildtime-only blocker
            # that should be ignored
            ResolverPlaygroundTestCase(
                ["app-misc/blocker-buildtime-a"],
                success=True,
                mergelist=["app-misc/blocker-buildtime-a-1"]),
            # We're installing a package that an old version of
            # an installed package blocks. However, an update is
            # available to the old package. The old package should
            # be updated first, in order to solve the blocker without
            # any need for blocking packages to temporarily overlap.
            ResolverPlaygroundTestCase(
                [
                    "app-misc/blocker-update-order-a",
                    "app-misc/installed-old-version-blocks-a"
                ],
                success=True,
                all_permutations=True,
                mergelist=[
                    "app-misc/installed-old-version-blocks-a-2",
                    "app-misc/blocker-update-order-a-1"
                ]),
            # This is the same as above but with a hard blocker. The hard
            # blocker is solved automatically since the update makes it
            # irrelevant.
            ResolverPlaygroundTestCase(
                [
                    "app-misc/blocker-update-order-hard-a",
                    "app-misc/installed-old-version-blocks-hard-a"
                ],
                success=True,
                all_permutations=True,
                mergelist=[
                    "app-misc/installed-old-version-blocks-hard-a-2",
                    "app-misc/blocker-update-order-hard-a-1"
                ]),
            # This is similar to the above case except that it's unsolvable
            # due to merge order, unless bug 250286 is implemented so that
            # the installed blocker will be unmerged before installation
            # of the package it blocks (rather than after like a soft blocker
            # would be handled). The "unmerge before" behavior requested
            # in bug 250286 must be optional since essential programs or
            # libraries may be temporarily unavailable during a
            # non-overlapping update like this.
            ResolverPlaygroundTestCase(
                [
                    "app-misc/blocker-update-order-hard-unsolvable-a",
                    "app-misc/installed-old-version-blocks-hard-unsolvable-a"
                ],
                success=False,
                all_permutations=True,
                ambiguous_merge_order=True,
                merge_order_assertions=((
                    'app-misc/blocker-update-order-hard-unsolvable-a-1',
                    'app-misc/installed-old-version-blocks-hard-unsolvable-a-2'
                ), ),
                mergelist=[(
                    'app-misc/blocker-update-order-hard-unsolvable-a-1',
                    'app-misc/installed-old-version-blocks-hard-unsolvable-a-2',
                    '!!app-misc/blocker-update-order-hard-unsolvable-a')]),
            # The installed package has runtime blockers that
            # should cause it to be uninstalled. The uninstall
            # task is executed only after blocking packages have
            # been merged.
            # TODO: distinguish between install/uninstall tasks in mergelist
            ResolverPlaygroundTestCase(
                ["app-misc/blocker-runtime-a", "app-misc/blocker-runtime-b"],
                success=True,
                all_permutations=True,
                ambiguous_merge_order=True,
                mergelist=[("app-misc/blocker-runtime-a-1",
                            "app-misc/blocker-runtime-b-1"),
                           "[uninstall]app-misc/installed-blocker-a-1",
                           ("!app-misc/blocker-runtime-a",
                            "!app-misc/blocker-runtime-b")]),
            # We have a soft buildtime blocker against an installed
            # package that should cause it to be uninstalled. Note that with
            # soft blockers, the blocking packages are allowed to temporarily
            # overlap. This allows any essential programs/libraries provided
            # by both packages to be available at all times.
            # TODO: distinguish between install/uninstall tasks in mergelist
            ResolverPlaygroundTestCase(
                ["app-misc/blocker-buildtime-unbuilt-a"],
                success=True,
                mergelist=[
                    "app-misc/blocker-buildtime-unbuilt-a-1",
                    "[uninstall]app-misc/installed-blocker-a-1",
                    "!app-misc/installed-blocker-a"
                ]),
            # We have a hard buildtime blocker against an installed
            # package that will not resolve automatically (unless
            # the option requested in bug 250286 is implemented).
            ResolverPlaygroundTestCase(
                ["app-misc/blocker-buildtime-unbuilt-hard-a"],
                success=False,
                mergelist=[
                    'app-misc/blocker-buildtime-unbuilt-hard-a-1',
                    '!!app-misc/installed-blocker-a'
                ]),
            # An installed package has a hard runtime blocker that
            # will not resolve automatically (unless the option
            # requested in bug 250286 is implemented).
            ResolverPlaygroundTestCase(["app-misc/blocker-runtime-hard-a"],
                                       success=False,
                                       mergelist=[
                                           'app-misc/blocker-runtime-hard-a-1',
                                           '!!app-misc/blocker-runtime-hard-a'
                                       ]),
            # Test swapping of providers for a new-style virtual package,
            # which relies on delayed evaluation of disjunctive (virtual
            # and ||) deps as required to solve bug #264434. Note that
            # this behavior is not supported for old-style PROVIDE virtuals,
            # as reported in bug #339164.
            ResolverPlaygroundTestCase(
                ["media-video/libav"],
                success=True,
                mergelist=[
                    'media-video/libav-0.7_pre20110327',
                    '[uninstall]media-video/ffmpeg-0.7_rc1',
                    '!media-video/ffmpeg'
                ]),
            # Test that OS_HEADERS_PACKAGE_ATOM and LIBC_PACKAGE_ATOM
            # are merged asap, in order to account for implicit
            # dependencies. See bug #303567. Optimally, satisfied deps
            # are always merged after the asap nodes that depend on them.
            ResolverPlaygroundTestCase([
                "app-arch/xz-utils", "sys-kernel/linux-headers",
                "sys-devel/binutils", "sys-libs/glibc"
            ],
                                       options={"--complete-graph": True},
                                       success=True,
                                       all_permutations=True,
                                       ambiguous_merge_order=True,
                                       mergelist=[
                                           'sys-kernel/linux-headers-2.6.39',
                                           'sys-devel/gcc-4.5.2',
                                           'sys-libs/glibc-2.13',
                                           ('app-arch/xz-utils-5.0.2',
                                            'sys-devel/binutils-2.20.1')
                                       ]),
            # Test asap install of PDEPEND for bug #180045.
            ResolverPlaygroundTestCase(
                [
                    "kde-base/kmines", "kde-base/kdnssd", "kde-base/kdelibs",
                    "app-arch/xz-utils"
                ],
                success=True,
                all_permutations=True,
                ambiguous_merge_order=True,
                merge_order_assertions=(
                    ('dev-util/pkgconfig-0.25-r2',
                     'kde-misc/kdnssd-avahi-0.1.2'),
                    ('kde-misc/kdnssd-avahi-0.1.2',
                     'kde-base/libkdegames-3.5.7'),
                    ('kde-misc/kdnssd-avahi-0.1.2', 'kde-base/kdnssd-3.5.7'),
                    ('kde-base/libkdegames-3.5.7', 'kde-base/kmines-3.5.7'),
                ),
                mergelist=[
                    ('kde-base/kdelibs-3.5.7', 'dev-util/pkgconfig-0.25-r2',
                     'kde-misc/kdnssd-avahi-0.1.2', 'app-arch/xz-utils-5.0.2',
                     'kde-base/libkdegames-3.5.7', 'kde-base/kdnssd-3.5.7',
                     'kde-base/kmines-3.5.7')
                ]),
            # Test satisfied circular DEPEND/RDEPEND with one := operator.
            # Both deps are already satisfied by installed packages, but
            # the := dep is given higher priority in merge order.
            ResolverPlaygroundTestCase(
                [
                    "media-libs/mesa", "x11-drivers/xf86-video-fbdev",
                    "x11-base/xorg-server"
                ],
                success=True,
                all_permutations=True,
                mergelist=[
                    'x11-base/xorg-server-1.14.1', 'media-libs/mesa-9.1.3',
                    'x11-drivers/xf86-video-fbdev-0.5.0-r1'
                ]),
            # Test prioritization of the find_smallest_cycle function, which should
            # minimize the use of installed packages to break cycles. If installed
            # packages must be used to break cycles, then it should prefer to do this
            # for runtime dependencies over buildtime dependencies. If a package needs
            # to be uninstalled in order to solve a blocker, then it should prefer to
            # do this before it uses an installed package to break a cycle.
            ResolverPlaygroundTestCase(
                [
                    "app-misc/some-app-a", "app-misc/some-app-b",
                    "app-misc/some-app-c", "app-misc/circ-buildtime-a",
                    "app-misc/blocker-buildtime-unbuilt-a", "media-libs/mesa",
                    "x11-base/xorg-server", "app-misc/circ-direct-a",
                    "app-misc/circ-direct-b", "app-misc/circ-satisfied-a",
                    "app-misc/circ-satisfied-b", "app-misc/circ-satisfied-c"
                ],
                success=True,
                mergelist=[
                    'app-misc/circ-post-runtime-a-1',
                    'app-misc/circ-post-runtime-c-1',
                    'app-misc/circ-post-runtime-b-1', 'app-misc/some-app-b-1',
                    'app-misc/circ-runtime-a-1', 'app-misc/circ-runtime-b-1',
                    'app-misc/circ-runtime-c-1', 'app-misc/some-app-a-1',
                    'app-misc/blocker-buildtime-unbuilt-a-1',
                    '[uninstall]app-misc/installed-blocker-a-1',
                    '!app-misc/installed-blocker-a',
                    'app-misc/circ-direct-a-1', 'app-misc/circ-direct-b-1',
                    'x11-base/xorg-server-1.14.1', 'media-libs/mesa-9.1.3',
                    'app-misc/circ-buildtime-a-1',
                    'app-misc/circ-buildtime-b-1',
                    'app-misc/circ-buildtime-c-1', 'app-misc/some-app-c-1',
                    'app-misc/circ-satisfied-a-1',
                    'app-misc/circ-satisfied-b-1',
                    'app-misc/circ-satisfied-c-1'
                ]),
        )

        playground = ResolverPlayground(ebuilds=ebuilds, installed=installed)
        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()
示例#32
0
    def testSonameSlotConflictMassRebuild(self):
        """
		Bug 486580
		Before this bug was fixed, emerge would backtrack for each
		package that needs a rebuild. This could cause it to hit the
		backtrack limit and not rebuild all needed packages.
		"""
        binpkgs = {
            "app-misc/A-1": {
                "DEPEND": "app-misc/B",
                "RDEPEND": "app-misc/B",
                "REQUIRES": "x86_32: libB-2.so",
            },
            "app-misc/B-1": {
                "SLOT": "1",
                "PROVIDES": "x86_32: libB-1.so",
            },
            "app-misc/B-2": {
                "SLOT": "2",
                "PROVIDES": "x86_32: libB-2.so",
            },
        }

        installed = {
            "app-misc/B-1": {
                "SLOT": "1",
                "PROVIDES": "x86_32: libB-1.so",
            },
        }

        expected_mergelist = ['[binary]app-misc/A-1', '[binary]app-misc/B-2']

        for i in range(5):
            binpkgs["app-misc/C%sC-1" % i] = {
                "DEPEND": "app-misc/B",
                "RDEPEND": "app-misc/B",
                "REQUIRES": "x86_32: libB-2.so",
            }

            installed["app-misc/C%sC-1" % i] = {
                "DEPEND": "app-misc/B",
                "RDEPEND": "app-misc/B",
                "REQUIRES": "x86_32: libB-1.so",
            }
            for x in ("DEPEND", "RDEPEND"):
                binpkgs["app-misc/A-1"][x] += " app-misc/C%sC" % i

            expected_mergelist.append("[binary]app-misc/C%sC-1" % i)

        test_cases = (ResolverPlaygroundTestCase(
            ["app-misc/A"],
            ignore_mergelist_order=True,
            all_permutations=True,
            options={
                "--backtrack": 3,
                "--deep": True,
                "--ignore-soname-deps": "n",
                "--update": True,
                "--usepkgonly": True,
            },
            success=True,
            mergelist=expected_mergelist), )

        world = []

        playground = ResolverPlayground(binpkgs=binpkgs,
                                        installed=installed,
                                        world=world,
                                        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.debug = False
            playground.cleanup()
示例#33
0
	def testAutounmaskMultilibUse(self):

		self.todo = True

		ebuilds = {
			"x11-proto/xextproto-7.2.1-r1": {
				"EAPI": "5",
				"IUSE": "abi_x86_32 abi_x86_64",
			},
			"x11-libs/libXaw-1.0.11-r2": {
				"EAPI": "5",
				"IUSE": "abi_x86_32 abi_x86_64",
				"RDEPEND": "x11-proto/xextproto[abi_x86_32(-)?,abi_x86_64(-)?]"
			},
			"app-emulation/emul-linux-x86-xlibs-20130224-r2": {
				"EAPI": "5",
				"RDEPEND": "x11-libs/libXaw[abi_x86_32]"
			},
			"games-util/steam-client-meta-0-r20130514": {
				"EAPI": "5",
				"RDEPEND": "app-emulation/emul-linux-x86-xlibs"
			}
		}

		installed = {
			"x11-proto/xextproto-7.2.1-r1": {
				"EAPI": "5",
				"IUSE": "abi_x86_32 abi_x86_64",
				"USE": "abi_x86_32 abi_x86_64"
			},
			"x11-libs/libXaw-1.0.11-r2": {
				"EAPI": "5",
				"IUSE": "abi_x86_32 abi_x86_64",
				"RDEPEND": "x11-proto/xextproto[abi_x86_32(-)?,abi_x86_64(-)?]",
				"USE": "abi_x86_32 abi_x86_64"
			},
			"app-emulation/emul-linux-x86-xlibs-20130224-r2": {
				"EAPI": "5",
				"RDEPEND": "x11-libs/libXaw[abi_x86_32]"
			},
			"games-util/steam-client-meta-0-r20130514": {
				"EAPI": "5",
				"RDEPEND": "app-emulation/emul-linux-x86-xlibs"
			}
		}

		user_config = {
			#"make.conf" : ("USE=\"abi_x86_32 abi_x86_64\"",)
			"make.conf" : ("USE=\"abi_x86_64\"",)
		}

		world = ("games-util/steam-client-meta",)

		test_cases = (

				# Test autounmask solving of multilib use deps for bug #481628.
				# We would like it to suggest some USE changes, but instead it
				# currently fails with a SLOT conflict.

				ResolverPlaygroundTestCase(
					["x11-proto/xextproto", "x11-libs/libXaw"],
					options = {"--oneshot": True, "--autounmask": True,
						"--backtrack": 30},
					mergelist = ["x11-proto/xextproto-7.2.1-r1", "x11-libs/libXaw-1.0.11-r2"],
					success = True),
			)

		playground = ResolverPlayground(ebuilds=ebuilds, installed=installed,
			user_config=user_config, world=world, 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()
示例#34
0
    def testSonameSlotConflictUpdate(self):

        binpkgs = {
            "app-text/podofo-0.9.2": {
                "RDEPEND": "dev-util/boost-build",
            },
            "dev-cpp/libcmis-0.3.1": {
                "DEPEND": "dev-libs/boost",
                "RDEPEND": "dev-libs/boost",
                "REQUIRES": "x86_32: libboost-1.53.so",
            },
            "dev-libs/boost-1.53.0": {
                "PROVIDES": "x86_32: libboost-1.53.so",
                "RDEPEND": "=dev-util/boost-build-1.53.0",
            },
            "dev-libs/boost-1.52.0": {
                "PROVIDES": "x86_32: libboost-1.52.so",
                "RDEPEND": "=dev-util/boost-build-1.52.0",
            },
            "dev-util/boost-build-1.53.0": {},
            "dev-util/boost-build-1.52.0": {},
        }

        installed = {
            "app-text/podofo-0.9.2": {
                "RDEPEND": "dev-util/boost-build",
            },
            "dev-cpp/libcmis-0.3.1": {
                "DEPEND": "dev-libs/boost",
                "RDEPEND": "dev-libs/boost",
                "REQUIRES": "x86_32: libboost-1.52.so",
            },
            "dev-util/boost-build-1.52.0": {},
            "dev-libs/boost-1.52.0": {
                "PROVIDES": "x86_32: libboost-1.52.so",
                "RDEPEND": "=dev-util/boost-build-1.52.0",
            },
        }

        world = [
            "dev-cpp/libcmis",
            "dev-libs/boost",
            "app-text/podofo",
        ]

        test_cases = (
            ResolverPlaygroundTestCase(
                world,
                all_permutations=True,
                options={
                    "--deep": True,
                    "--ignore-soname-deps": "n",
                    "--update": True,
                    "--usepkgonly": True,
                },
                success=True,
                mergelist=[
                    "[binary]dev-util/boost-build-1.53.0",
                    "[binary]dev-libs/boost-1.53.0",
                    "[binary]dev-cpp/libcmis-0.3.1",
                ],
            ),
            ResolverPlaygroundTestCase(
                world,
                all_permutations=True,
                options={
                    "--deep": True,
                    "--ignore-soname-deps": "y",
                    "--update": True,
                    "--usepkgonly": True,
                },
                success=True,
                mergelist=[
                    "[binary]dev-util/boost-build-1.53.0",
                    "[binary]dev-libs/boost-1.53.0",
                ],
            ),
        )

        playground = ResolverPlayground(binpkgs=binpkgs,
                                        installed=installed,
                                        world=world,
                                        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.debug = False
            playground.cleanup()
	def testVirtualMinimizeChildren(self):
		ebuilds = {
			'app-misc/bar-1': {
				'EAPI': '6',
				'RDEPEND': 'virtual/foo'
			},
			'virtual/foo-1': {
				'EAPI': '6',
				'RDEPEND': '|| ( app-misc/A app-misc/B ) || ( app-misc/B app-misc/C )'
			},
			'app-misc/A-1': {
				'EAPI': '6',
			},
			'app-misc/B-1': {
				'EAPI': '6',
			},
			'app-misc/C-1': {
				'EAPI': '6',
			},
		}

		test_cases = (
			# Test bug 632026, where we want to minimize the number of
			# packages chosen to satisfy overlapping || deps like
			# "|| ( foo bar ) || ( bar baz )".
			ResolverPlaygroundTestCase(
				['app-misc/bar'],
				success=True,
				mergelist=[
					'app-misc/B-1',
					'virtual/foo-1',
					'app-misc/bar-1',
				],
			),
		)

		playground = ResolverPlayground(debug=False,
			ebuilds=ebuilds)

		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.debug = False
			playground.cleanup()

		# If app-misc/A and app-misc/C are installed then
		# that choice should be preferred over app-misc/B.
		installed = {
			'app-misc/A-1': {
				'EAPI': '6',
			},
			'app-misc/C-1': {
				'EAPI': '6',
			},
		}

		test_cases = (
			ResolverPlaygroundTestCase(
				['app-misc/bar'],
				success=True,
				mergelist=[
					'virtual/foo-1',
					'app-misc/bar-1',
				],
			),
		)

		playground = ResolverPlayground(debug=False,
			ebuilds=ebuilds, installed=installed)

		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.debug = False
			playground.cleanup()
示例#36
0
    def testSonameConflictMissedUpdate(self):

        binpkgs = {
            "dev-lang/ocaml-4.02.1": {
                "EAPI": "5",
                "PROVIDES": "x86_32: libocaml-4.02.1.so",
            },
            "dev-lang/ocaml-4.01.0": {
                "EAPI": "5",
                "PROVIDES": "x86_32: libocaml-4.01.0.so",
            },
            "dev-ml/lablgl-1.05": {
                "DEPEND": (">=dev-lang/ocaml-3.10.2 "
                           "|| ( dev-ml/labltk <dev-lang/ocaml-4.02 )"),
                "RDEPEND": (">=dev-lang/ocaml-3.10.2 "
                            "|| ( dev-ml/labltk <dev-lang/ocaml-4.02 )"),
                "REQUIRES":
                "x86_32: libocaml-4.02.1.so",
            },
            "dev-ml/labltk-8.06.0": {
                "EAPI": "5",
                "SLOT": "0/8.06.0",
                "DEPEND": ">=dev-lang/ocaml-4.02",
                "RDEPEND": ">=dev-lang/ocaml-4.02",
                "REQUIRES": "x86_32: libocaml-4.02.1.so",
            },
        }

        installed = {
            "dev-lang/ocaml-4.01.0": {
                "EAPI": "5",
                "PROVIDES": "x86_32: libocaml-4.01.0.so",
            },
            "dev-ml/lablgl-1.05": {
                "DEPEND": (">=dev-lang/ocaml-3.10.2 "
                           "|| ( dev-ml/labltk <dev-lang/ocaml-4.02 )"),
                "RDEPEND": (">=dev-lang/ocaml-3.10.2 "
                            "|| ( dev-ml/labltk <dev-lang/ocaml-4.02 )"),
                "REQUIRES":
                "x86_32: libocaml-4.01.0.so",
            },
        }

        world = (
            "dev-lang/ocaml",
            "dev-ml/lablgl",
        )

        test_cases = (
            # bug #531656: If an ocaml update is desirable,
            # then we need to pull in dev-ml/labltk.
            ResolverPlaygroundTestCase(
                ["@world"],
                options={
                    "--deep": True,
                    "--ignore-soname-deps": "n",
                    "--update": True,
                    "--usepkgonly": True,
                },
                success=True,
                mergelist=[
                    "[binary]dev-lang/ocaml-4.02.1",
                    "[binary]dev-ml/labltk-8.06.0",
                    "[binary]dev-ml/lablgl-1.05",
                ],
            ), )

        for binpkg_format in SUPPORTED_GENTOO_BINPKG_FORMATS:
            with self.subTest(binpkg_format=binpkg_format):
                print(colorize("HILITE", binpkg_format), end=" ... ")
                sys.stdout.flush()
                playground = ResolverPlayground(
                    debug=False,
                    binpkgs=binpkgs,
                    installed=installed,
                    world=world,
                    user_config={
                        "make.conf": ('BINPKG_FORMAT="%s"' % binpkg_format, ),
                    },
                )
                try:
                    for test_case in test_cases:
                        playground.run_TestCase(test_case)
                        self.assertEqual(test_case.test_success, True,
                                         test_case.fail_msg)
                finally:
                    # Disable debug so that cleanup works.
                    playground.debug = False
                    playground.cleanup()
示例#37
0
    def testWholeSlot(self):
        ebuilds = {
            "sys-libs/db-4.8": {
                "SLOT": "4.8"
            },
            "sys-libs/db-4.7": {
                "SLOT": "4.7"
            },
            "app-office/libreoffice-3.5.4.2": {
                "EAPI": "4-slot-abi",
                "DEPEND": ">=sys-libs/db-4:=",
                "RDEPEND": ">=sys-libs/db-4:="
            },
        }
        binpkgs = {
            "sys-libs/db-4.8": {
                "SLOT": "4.8"
            },
            "sys-libs/db-4.7": {
                "SLOT": "4.7"
            },
            "app-office/libreoffice-3.5.4.2": {
                "EAPI": "4-slot-abi",
                "DEPEND": ">=sys-libs/db-4:4.7/4.7=",
                "RDEPEND": ">=sys-libs/db-4:4.7/4.7="
            },
        }
        installed = {
            "sys-libs/db-4.7": {
                "SLOT": "4.7"
            },
            "app-office/libreoffice-3.5.4.2": {
                "EAPI": "4-slot-abi",
                "DEPEND": ">=sys-libs/db-4:4.7/4.7=",
                "RDEPEND": ">=sys-libs/db-4:4.7/4.7="
            },
        }

        world = ["app-office/libreoffice"]

        test_cases = (
            ResolverPlaygroundTestCase(["sys-libs/db"],
                                       options={"--oneshot": True},
                                       success=True,
                                       mergelist=[
                                           "sys-libs/db-4.8",
                                           "app-office/libreoffice-3.5.4.2"
                                       ]),
            ResolverPlaygroundTestCase(["sys-libs/db"],
                                       options={
                                           "--oneshot": True,
                                           "--ignore-built-slot-operator-deps":
                                           "y"
                                       },
                                       success=True,
                                       mergelist=["sys-libs/db-4.8"]),
            ResolverPlaygroundTestCase(["sys-libs/db"],
                                       options={
                                           "--oneshot": True,
                                           "--usepkg": True
                                       },
                                       success=True,
                                       mergelist=[
                                           "[binary]sys-libs/db-4.8",
                                           "app-office/libreoffice-3.5.4.2"
                                       ]),
            ResolverPlaygroundTestCase(["sys-libs/db"],
                                       options={
                                           "--oneshot": True,
                                           "--usepkgonly": True
                                       },
                                       success=True,
                                       mergelist=["[binary]sys-libs/db-4.8"]),
            ResolverPlaygroundTestCase(["sys-libs/db"],
                                       options={
                                           "--oneshot": True,
                                           "--rebuild-if-new-slot": "n"
                                       },
                                       success=True,
                                       mergelist=["sys-libs/db-4.8"]),
            ResolverPlaygroundTestCase(["@world"],
                                       options={
                                           "--update": True,
                                           "--deep": True
                                       },
                                       success=True,
                                       mergelist=[
                                           "sys-libs/db-4.8",
                                           "app-office/libreoffice-3.5.4.2"
                                       ]),
            ResolverPlaygroundTestCase(["@world"],
                                       options={
                                           "--update": True,
                                           "--deep": True,
                                           "--usepkg": True
                                       },
                                       success=True,
                                       mergelist=[
                                           "[binary]sys-libs/db-4.8",
                                           "app-office/libreoffice-3.5.4.2"
                                       ]),
            ResolverPlaygroundTestCase(
                ["@world"],
                options={
                    "--update": True,
                    "--deep": True,
                    "--usepkg": True,
                    "--ignore-built-slot-operator-deps": "y"
                },
                success=True,
                mergelist=["[binary]sys-libs/db-4.8"]),
            ResolverPlaygroundTestCase(["@world"],
                                       options={
                                           "--update": True,
                                           "--deep": True,
                                           "--usepkgonly": True
                                       },
                                       success=True,
                                       mergelist=[]),
            ResolverPlaygroundTestCase(
                ["@world"],
                options={
                    "--update": True,
                    "--deep": True,
                    "--usepkgonly": True,
                    "--ignore-built-slot-operator-deps": "y"
                },
                success=True,
                mergelist=["[binary]sys-libs/db-4.8"]),
            ResolverPlaygroundTestCase(["@world"],
                                       options={
                                           "--update": True,
                                           "--deep": True,
                                           "--rebuild-if-new-slot": "n"
                                       },
                                       success=True,
                                       mergelist=[]),
        )

        playground = ResolverPlayground(ebuilds=ebuilds,
                                        binpkgs=binpkgs,
                                        installed=installed,
                                        world=world,
                                        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()
示例#38
0
    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()
示例#39
0
    def testRequiredUSE(self):
        """
		Only simple REQUIRED_USE values here. The parser is tested under in dep/testCheckRequiredUse
		"""

        ebuilds = {
            "dev-libs/A-1": {
                "EAPI": "4",
                "IUSE": "foo bar",
                "REQUIRED_USE": "|| ( foo bar )"
            },
            "dev-libs/A-2": {
                "EAPI": "4",
                "IUSE": "foo +bar",
                "REQUIRED_USE": "|| ( foo bar )"
            },
            "dev-libs/A-3": {
                "EAPI": "4",
                "IUSE": "+foo bar",
                "REQUIRED_USE": "|| ( foo bar )"
            },
            "dev-libs/A-4": {
                "EAPI": "4",
                "IUSE": "+foo +bar",
                "REQUIRED_USE": "|| ( foo bar )"
            },
            "dev-libs/A-5": {
                "EAPI": "4",
                "IUSE": "+foo +bar",
                "REQUIRED_USE": "|| ( )"
            },
            "dev-libs/B-1": {
                "EAPI": "4",
                "IUSE": "foo bar",
                "REQUIRED_USE": "^^ ( foo bar )"
            },
            "dev-libs/B-2": {
                "EAPI": "4",
                "IUSE": "foo +bar",
                "REQUIRED_USE": "^^ ( foo bar )"
            },
            "dev-libs/B-3": {
                "EAPI": "4",
                "IUSE": "+foo bar",
                "REQUIRED_USE": "^^ ( foo bar )"
            },
            "dev-libs/B-4": {
                "EAPI": "4",
                "IUSE": "+foo +bar",
                "REQUIRED_USE": "^^ ( foo bar )"
            },
            "dev-libs/B-5": {
                "EAPI": "4",
                "IUSE": "+foo +bar",
                "REQUIRED_USE": "^^ ( )"
            },
            "dev-libs/C-1": {
                "EAPI": "4",
                "IUSE": "+foo bar",
                "REQUIRED_USE": "foo? ( !bar )"
            },
            "dev-libs/C-2": {
                "EAPI": "4",
                "IUSE": "+foo +bar",
                "REQUIRED_USE": "foo? ( !bar )"
            },
            "dev-libs/C-3": {
                "EAPI": "4",
                "IUSE": "+foo +bar",
                "REQUIRED_USE": "foo? ( bar )"
            },
            "dev-libs/C-4": {
                "EAPI": "4",
                "IUSE": "+foo bar",
                "REQUIRED_USE": "foo? ( bar )"
            },
            "dev-libs/C-5": {
                "EAPI": "4",
                "IUSE": "foo bar",
                "REQUIRED_USE": "foo? ( bar )"
            },
            "dev-libs/C-6": {
                "EAPI": "4",
                "IUSE": "foo +bar",
                "REQUIRED_USE": "foo? ( bar )"
            },
            "dev-libs/C-7": {
                "EAPI": "4",
                "IUSE": "foo +bar",
                "REQUIRED_USE": "!foo? ( bar )"
            },
            "dev-libs/C-8": {
                "EAPI": "4",
                "IUSE": "+foo +bar",
                "REQUIRED_USE": "!foo? ( bar )"
            },
            "dev-libs/C-9": {
                "EAPI": "4",
                "IUSE": "+foo bar",
                "REQUIRED_USE": "!foo? ( bar )"
            },
            "dev-libs/C-10": {
                "EAPI": "4",
                "IUSE": "foo bar",
                "REQUIRED_USE": "!foo? ( bar )"
            },
            "dev-libs/C-11": {
                "EAPI": "4",
                "IUSE": "foo bar",
                "REQUIRED_USE": "!foo? ( !bar )"
            },
            "dev-libs/C-12": {
                "EAPI": "4",
                "IUSE": "foo +bar",
                "REQUIRED_USE": "!foo? ( !bar )"
            },
            "dev-libs/C-13": {
                "EAPI": "4",
                "IUSE": "+foo +bar",
                "REQUIRED_USE": "!foo? ( !bar )"
            },
            "dev-libs/C-14": {
                "EAPI": "4",
                "IUSE": "+foo bar",
                "REQUIRED_USE": "!foo? ( !bar )"
            },
            "dev-libs/D-1": {
                "EAPI": "4",
                "IUSE": "+w +x +y z",
                "REQUIRED_USE": "w? ( x || ( y z ) )"
            },
            "dev-libs/D-2": {
                "EAPI": "4",
                "IUSE": "+w +x +y +z",
                "REQUIRED_USE": "w? ( x || ( y z ) )"
            },
            "dev-libs/D-3": {
                "EAPI": "4",
                "IUSE": "+w +x y z",
                "REQUIRED_USE": "w? ( x || ( y z ) )"
            },
            "dev-libs/D-4": {
                "EAPI": "4",
                "IUSE": "+w x +y +z",
                "REQUIRED_USE": "w? ( x || ( y z ) )"
            },
            "dev-libs/D-5": {
                "EAPI": "4",
                "IUSE": "w x y z",
                "REQUIRED_USE": "w? ( x || ( y z ) )"
            },
            "dev-libs/E-1": {
                "EAPI": "5",
                "IUSE": "foo bar",
                "REQUIRED_USE": "?? ( foo bar )"
            },
            "dev-libs/E-2": {
                "EAPI": "5",
                "IUSE": "foo +bar",
                "REQUIRED_USE": "?? ( foo bar )"
            },
            "dev-libs/E-3": {
                "EAPI": "5",
                "IUSE": "+foo bar",
                "REQUIRED_USE": "?? ( foo bar )"
            },
            "dev-libs/E-4": {
                "EAPI": "5",
                "IUSE": "+foo +bar",
                "REQUIRED_USE": "?? ( foo bar )"
            },
            "dev-libs/E-5": {
                "EAPI": "5",
                "IUSE": "+foo +bar",
                "REQUIRED_USE": "?? ( )"
            },
            "dev-libs/F-1": {
                "EAPI": "7",
                "IUSE": "+foo +bar",
                "REQUIRED_USE": "|| ( )"
            },
            "dev-libs/F-2": {
                "EAPI": "7",
                "IUSE": "+foo +bar",
                "REQUIRED_USE": "^^ ( )"
            },
            "dev-libs/F-3": {
                "EAPI": "7",
                "IUSE": "+foo +bar",
                "REQUIRED_USE": "?? ( )"
            },
        }

        test_cases = (
            ResolverPlaygroundTestCase(["=dev-libs/A-1"], success=False),
            ResolverPlaygroundTestCase(["=dev-libs/A-2"],
                                       success=True,
                                       mergelist=["dev-libs/A-2"]),
            ResolverPlaygroundTestCase(["=dev-libs/A-3"],
                                       success=True,
                                       mergelist=["dev-libs/A-3"]),
            ResolverPlaygroundTestCase(["=dev-libs/A-4"],
                                       success=True,
                                       mergelist=["dev-libs/A-4"]),
            ResolverPlaygroundTestCase(["=dev-libs/A-5"],
                                       success=True,
                                       mergelist=["dev-libs/A-5"]),
            ResolverPlaygroundTestCase(["=dev-libs/B-1"], success=False),
            ResolverPlaygroundTestCase(["=dev-libs/B-2"],
                                       success=True,
                                       mergelist=["dev-libs/B-2"]),
            ResolverPlaygroundTestCase(["=dev-libs/B-3"],
                                       success=True,
                                       mergelist=["dev-libs/B-3"]),
            ResolverPlaygroundTestCase(["=dev-libs/B-4"], success=False),
            ResolverPlaygroundTestCase(["=dev-libs/B-5"],
                                       success=True,
                                       mergelist=["dev-libs/B-5"]),
            ResolverPlaygroundTestCase(["=dev-libs/C-1"],
                                       success=True,
                                       mergelist=["dev-libs/C-1"]),
            ResolverPlaygroundTestCase(["=dev-libs/C-2"], success=False),
            ResolverPlaygroundTestCase(["=dev-libs/C-3"],
                                       success=True,
                                       mergelist=["dev-libs/C-3"]),
            ResolverPlaygroundTestCase(["=dev-libs/C-4"], success=False),
            ResolverPlaygroundTestCase(["=dev-libs/C-5"],
                                       success=True,
                                       mergelist=["dev-libs/C-5"]),
            ResolverPlaygroundTestCase(["=dev-libs/C-6"],
                                       success=True,
                                       mergelist=["dev-libs/C-6"]),
            ResolverPlaygroundTestCase(["=dev-libs/C-7"],
                                       success=True,
                                       mergelist=["dev-libs/C-7"]),
            ResolverPlaygroundTestCase(["=dev-libs/C-8"],
                                       success=True,
                                       mergelist=["dev-libs/C-8"]),
            ResolverPlaygroundTestCase(["=dev-libs/C-9"],
                                       success=True,
                                       mergelist=["dev-libs/C-9"]),
            ResolverPlaygroundTestCase(["=dev-libs/C-10"], success=False),
            ResolverPlaygroundTestCase(["=dev-libs/C-11"],
                                       success=True,
                                       mergelist=["dev-libs/C-11"]),
            ResolverPlaygroundTestCase(["=dev-libs/C-12"], success=False),
            ResolverPlaygroundTestCase(["=dev-libs/C-13"],
                                       success=True,
                                       mergelist=["dev-libs/C-13"]),
            ResolverPlaygroundTestCase(["=dev-libs/C-14"],
                                       success=True,
                                       mergelist=["dev-libs/C-14"]),
            ResolverPlaygroundTestCase(["=dev-libs/D-1"],
                                       success=True,
                                       mergelist=["dev-libs/D-1"]),
            ResolverPlaygroundTestCase(["=dev-libs/D-2"],
                                       success=True,
                                       mergelist=["dev-libs/D-2"]),
            ResolverPlaygroundTestCase(["=dev-libs/D-3"], success=False),
            ResolverPlaygroundTestCase(["=dev-libs/D-4"], success=False),
            ResolverPlaygroundTestCase(["=dev-libs/D-5"],
                                       success=True,
                                       mergelist=["dev-libs/D-5"]),
            ResolverPlaygroundTestCase(["=dev-libs/E-1"],
                                       success=True,
                                       mergelist=["dev-libs/E-1"]),
            ResolverPlaygroundTestCase(["=dev-libs/E-2"],
                                       success=True,
                                       mergelist=["dev-libs/E-2"]),
            ResolverPlaygroundTestCase(["=dev-libs/E-3"],
                                       success=True,
                                       mergelist=["dev-libs/E-3"]),
            ResolverPlaygroundTestCase(["=dev-libs/E-4"], success=False),
            ResolverPlaygroundTestCase(["=dev-libs/E-5"],
                                       success=True,
                                       mergelist=["dev-libs/E-5"]),
            ResolverPlaygroundTestCase(["=dev-libs/F-1"], success=False),
            ResolverPlaygroundTestCase(["=dev-libs/F-2"], success=False),
            ResolverPlaygroundTestCase(["=dev-libs/F-3"],
                                       success=True,
                                       mergelist=["dev-libs/F-3"]),
        )

        playground = ResolverPlayground(ebuilds=ebuilds)
        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()
示例#40
0
    def testAutounmask(self):

        ebuilds = {
            #ebuilds to test use changes
            "dev-libs/A-1": {
                "SLOT": 1,
                "DEPEND": "dev-libs/B[foo]",
                "EAPI": 2
            },
            "dev-libs/A-2": {
                "SLOT": 2,
                "DEPEND": "dev-libs/B[bar]",
                "EAPI": 2
            },
            "dev-libs/B-1": {
                "DEPEND": "foo? ( dev-libs/C ) bar? ( dev-libs/D )",
                "IUSE": "foo bar"
            },
            "dev-libs/C-1": {},
            "dev-libs/D-1": {},

            #ebuilds to test if we allow changing of masked or forced flags
            "dev-libs/E-1": {
                "SLOT": 1,
                "DEPEND": "dev-libs/F[masked-flag]",
                "EAPI": 2
            },
            "dev-libs/E-2": {
                "SLOT": 2,
                "DEPEND": "dev-libs/G[-forced-flag]",
                "EAPI": 2
            },
            "dev-libs/F-1": {
                "IUSE": "masked-flag"
            },
            "dev-libs/G-1": {
                "IUSE": "forced-flag"
            },

            #ebuilds to test keyword changes
            "app-misc/Z-1": {
                "KEYWORDS": "~x86",
                "DEPEND": "app-misc/Y"
            },
            "app-misc/Y-1": {
                "KEYWORDS": "~x86"
            },
            "app-misc/W-1": {},
            "app-misc/W-2": {
                "KEYWORDS": "~x86"
            },
            "app-misc/V-1": {
                "KEYWORDS": "~x86",
                "DEPEND": ">=app-misc/W-2"
            },

            #ebuilds to test mask and keyword changes
            "app-text/A-1": {},
            "app-text/B-1": {
                "KEYWORDS": "~x86"
            },
            "app-text/C-1": {
                "KEYWORDS": ""
            },
            "app-text/D-1": {
                "KEYWORDS": "~x86"
            },
            "app-text/D-2": {
                "KEYWORDS": ""
            },

            #ebuilds for mixed test for || dep handling
            "sci-libs/K-1": {
                "DEPEND":
                " || ( sci-libs/L[bar] || ( sci-libs/M sci-libs/P ) )",
                "EAPI": 2
            },
            "sci-libs/K-2": {
                "DEPEND":
                " || ( sci-libs/L[bar] || ( sci-libs/P sci-libs/M ) )",
                "EAPI": 2
            },
            "sci-libs/K-3": {
                "DEPEND":
                " || ( sci-libs/M || ( sci-libs/L[bar] sci-libs/P ) )",
                "EAPI": 2
            },
            "sci-libs/K-4": {
                "DEPEND":
                " || ( sci-libs/M || ( sci-libs/P sci-libs/L[bar] ) )",
                "EAPI": 2
            },
            "sci-libs/K-5": {
                "DEPEND":
                " || ( sci-libs/P || ( sci-libs/L[bar] sci-libs/M ) )",
                "EAPI": 2
            },
            "sci-libs/K-6": {
                "DEPEND":
                " || ( sci-libs/P || ( sci-libs/M sci-libs/L[bar] ) )",
                "EAPI": 2
            },
            "sci-libs/K-7": {
                "DEPEND": " || ( sci-libs/M sci-libs/L[bar] )",
                "EAPI": 2
            },
            "sci-libs/K-8": {
                "DEPEND": " || ( sci-libs/L[bar] sci-libs/M )",
                "EAPI": 2
            },
            "sci-libs/L-1": {
                "IUSE": "bar"
            },
            "sci-libs/M-1": {
                "KEYWORDS": "~x86"
            },
            "sci-libs/P-1": {},

            #ebuilds to test these nice "required by cat/pkg[foo]" messages
            "dev-util/Q-1": {
                "DEPEND": "foo? ( dev-util/R[bar] )",
                "IUSE": "+foo",
                "EAPI": 2
            },
            "dev-util/Q-2": {
                "RDEPEND": "!foo? ( dev-util/R[bar] )",
                "IUSE": "foo",
                "EAPI": 2
            },
            "dev-util/R-1": {
                "IUSE": "bar"
            },

            #ebuilds to test interaction with REQUIRED_USE
            "app-portage/A-1": {
                "DEPEND": "app-portage/B[foo]",
                "EAPI": 2
            },
            "app-portage/A-2": {
                "DEPEND": "app-portage/B[foo=]",
                "IUSE": "+foo",
                "REQUIRED_USE": "foo",
                "EAPI": "4"
            },
            "app-portage/B-1": {
                "IUSE": "foo +bar",
                "REQUIRED_USE": "^^ ( foo bar )",
                "EAPI": "4"
            },
            "app-portage/C-1": {
                "IUSE": "+foo +bar",
                "REQUIRED_USE": "^^ ( foo bar )",
                "EAPI": "4"
            },
        }

        test_cases = (
            #Test USE changes.
            #The simple case.
            ResolverPlaygroundTestCase(["dev-libs/A:1"],
                                       options={"--autounmask": "n"},
                                       success=False),
            ResolverPlaygroundTestCase(
                ["dev-libs/A:1"],
                options={"--autounmask": True},
                success=False,
                mergelist=["dev-libs/C-1", "dev-libs/B-1", "dev-libs/A-1"],
                use_changes={"dev-libs/B-1": {
                    "foo": True
                }}),

            #Make sure we restart if needed.
            ResolverPlaygroundTestCase(
                ["dev-libs/A:1", "dev-libs/B"],
                options={
                    "--autounmask": True,
                    "--autounmask-backtrack": "y"
                },
                all_permutations=True,
                success=False,
                mergelist=["dev-libs/C-1", "dev-libs/B-1", "dev-libs/A-1"],
                use_changes={"dev-libs/B-1": {
                    "foo": True
                }}),

            # With --autounmask-backtrack=y:
            #[ebuild  N     ] dev-libs/C-1
            #[ebuild  N     ] dev-libs/B-1  USE="foo -bar"
            #[ebuild  N     ] dev-libs/A-1
            #
            #The following USE changes are necessary to proceed:
            # (see "package.use" in the portage(5) man page for more details)
            ## required by dev-libs/A-1::test_repo
            ## required by dev-libs/A:1 (argument)
            #>=dev-libs/B-1 foo

            # Without --autounmask-backtrack=y:
            #[ebuild  N     ] dev-libs/B-1  USE="foo -bar"
            #[ebuild  N     ] dev-libs/A-1
            #
            #The following USE changes are necessary to proceed:
            # (see "package.use" in the portage(5) man page for more details)
            ## required by dev-libs/A-1::test_repo
            ## required by dev-libs/A:1 (argument)
            #>=dev-libs/B-1 foo
            ResolverPlaygroundTestCase(
                ["dev-libs/A:1", "dev-libs/A:2", "dev-libs/B"],
                options={
                    "--autounmask": True,
                    "--autounmask-backtrack": "y"
                },
                all_permutations=True,
                success=False,
                mergelist=[
                    "dev-libs/D-1", "dev-libs/C-1", "dev-libs/B-1",
                    "dev-libs/A-1", "dev-libs/A-2"
                ],
                ignore_mergelist_order=True,
                use_changes={"dev-libs/B-1": {
                    "foo": True,
                    "bar": True
                }}),

            # With --autounmask-backtrack=y:
            #[ebuild  N     ] dev-libs/C-1
            #[ebuild  N     ] dev-libs/D-1
            #[ebuild  N     ] dev-libs/B-1  USE="bar foo"
            #[ebuild  N     ] dev-libs/A-2
            #[ebuild  N     ] dev-libs/A-1
            #
            #The following USE changes are necessary to proceed:
            # (see "package.use" in the portage(5) man page for more details)
            ## required by dev-libs/A-2::test_repo
            ## required by dev-libs/A:2 (argument)
            #>=dev-libs/B-1 bar foo

            # Without --autounmask-backtrack=y:
            #[ebuild  N     ] dev-libs/B-1  USE="bar foo"
            #[ebuild  N     ] dev-libs/A-1
            #[ebuild  N     ] dev-libs/A-2
            #
            #The following USE changes are necessary to proceed:
            # (see "package.use" in the portage(5) man page for more details)
            ## required by dev-libs/A-1::test_repo
            ## required by dev-libs/A:1 (argument)
            #>=dev-libs/B-1 foo bar

            # NOTE: The --autounmask-backtrack=n behavior is acceptable, but
            # it would be nicer if it added the dev-libs/C-1 and dev-libs/D-1
            # deps to the depgraph without backtracking. It could add two
            # instances of dev-libs/B-1 to the graph with different USE flags,
            # and then use _solve_non_slot_operator_slot_conflicts to eliminate
            # the redundant instance.

            #Test keywording.
            #The simple case.
            ResolverPlaygroundTestCase(["app-misc/Z"],
                                       options={"--autounmask": "n"},
                                       success=False),
            ResolverPlaygroundTestCase(
                ["app-misc/Z"],
                options={"--autounmask": True},
                success=False,
                mergelist=["app-misc/Y-1", "app-misc/Z-1"],
                unstable_keywords=["app-misc/Y-1", "app-misc/Z-1"]),

            #Make sure that the backtracking for slot conflicts handles our mess.
            ResolverPlaygroundTestCase(
                ["=app-misc/V-1", "app-misc/W"],
                options={"--autounmask": True},
                all_permutations=True,
                success=False,
                mergelist=["app-misc/W-2", "app-misc/V-1"],
                unstable_keywords=["app-misc/W-2", "app-misc/V-1"]),

            #Mixed testing
            #Make sure we don't change use for something in a || dep if there is another choice
            #that needs no change.
            ResolverPlaygroundTestCase(
                ["=sci-libs/K-1"],
                options={"--autounmask": True},
                success=True,
                mergelist=["sci-libs/P-1", "sci-libs/K-1"]),
            ResolverPlaygroundTestCase(
                ["=sci-libs/K-2"],
                options={"--autounmask": True},
                success=True,
                mergelist=["sci-libs/P-1", "sci-libs/K-2"]),
            ResolverPlaygroundTestCase(
                ["=sci-libs/K-3"],
                options={"--autounmask": True},
                success=True,
                mergelist=["sci-libs/P-1", "sci-libs/K-3"]),
            ResolverPlaygroundTestCase(
                ["=sci-libs/K-4"],
                options={"--autounmask": True},
                success=True,
                mergelist=["sci-libs/P-1", "sci-libs/K-4"]),
            ResolverPlaygroundTestCase(
                ["=sci-libs/K-5"],
                options={"--autounmask": True},
                success=True,
                mergelist=["sci-libs/P-1", "sci-libs/K-5"]),
            ResolverPlaygroundTestCase(
                ["=sci-libs/K-6"],
                options={"--autounmask": True},
                success=True,
                mergelist=["sci-libs/P-1", "sci-libs/K-6"]),

            #Make sure we prefer use changes over keyword changes.
            ResolverPlaygroundTestCase(
                ["=sci-libs/K-7"],
                options={"--autounmask": True},
                success=False,
                mergelist=["sci-libs/L-1", "sci-libs/K-7"],
                use_changes={"sci-libs/L-1": {
                    "bar": True
                }}),
            ResolverPlaygroundTestCase(
                ["=sci-libs/K-8"],
                options={"--autounmask": True},
                success=False,
                mergelist=["sci-libs/L-1", "sci-libs/K-8"],
                use_changes={"sci-libs/L-1": {
                    "bar": True
                }}),

            #Test these nice "required by cat/pkg[foo]" messages.
            ResolverPlaygroundTestCase(
                ["=dev-util/Q-1"],
                options={"--autounmask": True},
                success=False,
                mergelist=["dev-util/R-1", "dev-util/Q-1"],
                use_changes={"dev-util/R-1": {
                    "bar": True
                }}),
            ResolverPlaygroundTestCase(
                ["=dev-util/Q-2"],
                options={"--autounmask": True},
                success=False,
                mergelist=["dev-util/R-1", "dev-util/Q-2"],
                use_changes={"dev-util/R-1": {
                    "bar": True
                }}),

            #Test interaction with REQUIRED_USE.
            ResolverPlaygroundTestCase(["=app-portage/A-1"],
                                       options={"--autounmask": True},
                                       use_changes=None,
                                       success=False),
            ResolverPlaygroundTestCase(["=app-portage/A-2"],
                                       options={"--autounmask": True},
                                       use_changes=None,
                                       success=False),
            ResolverPlaygroundTestCase(["=app-portage/C-1"],
                                       options={"--autounmask": True},
                                       use_changes=None,
                                       success=False),

            #Make sure we don't change masked/forced flags.
            ResolverPlaygroundTestCase(["dev-libs/E:1"],
                                       options={"--autounmask": True},
                                       use_changes=None,
                                       success=False),
            ResolverPlaygroundTestCase(["dev-libs/E:2"],
                                       options={"--autounmask": True},
                                       use_changes=None,
                                       success=False),

            #Test mask and keyword changes.
            ResolverPlaygroundTestCase(["app-text/A"],
                                       options={"--autounmask": True},
                                       success=False,
                                       mergelist=["app-text/A-1"],
                                       needed_p_mask_changes=["app-text/A-1"]),
            ResolverPlaygroundTestCase(["app-text/B"],
                                       options={"--autounmask": True},
                                       success=False,
                                       mergelist=["app-text/B-1"],
                                       unstable_keywords=["app-text/B-1"],
                                       needed_p_mask_changes=["app-text/B-1"]),
            ResolverPlaygroundTestCase(["app-text/C"],
                                       options={"--autounmask": True},
                                       success=False,
                                       mergelist=["app-text/C-1"],
                                       unstable_keywords=["app-text/C-1"],
                                       needed_p_mask_changes=["app-text/C-1"]),
            #Make sure unstable keyword is preferred over missing keyword
            ResolverPlaygroundTestCase(["app-text/D"],
                                       options={"--autounmask": True},
                                       success=False,
                                       mergelist=["app-text/D-1"],
                                       unstable_keywords=["app-text/D-1"]),
            #Test missing keyword
            ResolverPlaygroundTestCase(["=app-text/D-2"],
                                       options={"--autounmask": True},
                                       success=False,
                                       mergelist=["app-text/D-2"],
                                       unstable_keywords=["app-text/D-2"]))

        profile = {
            "use.mask": ("masked-flag", ),
            "use.force": ("forced-flag", ),
            "package.mask": (
                "app-text/A",
                "app-text/B",
                "app-text/C",
            ),
        }

        playground = ResolverPlayground(ebuilds=ebuilds, profile=profile)
        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()
示例#41
0
    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()
示例#42
0
    def testAutounmaskAndSets(self):

        ebuilds = {
            #ebuilds to test use changes
            "dev-libs/A-1": {},
            "dev-libs/A-2": {
                "KEYWORDS": "~x86"
            },
            "dev-libs/B-1": {
                "DEPEND": "dev-libs/A"
            },
            "dev-libs/C-1": {
                "DEPEND": ">=dev-libs/A-2"
            },
            "dev-libs/D-1": {
                "DEPEND": "dev-libs/A"
            },
        }

        world_sets = ["@test-set"]
        sets = {
            "test-set": (
                "dev-libs/A",
                "dev-libs/B",
                "dev-libs/C",
                "dev-libs/D",
            ),
        }

        test_cases = (
            #Test USE changes.
            #The simple case.
            ResolverPlaygroundTestCase(
                ["dev-libs/B", "dev-libs/C", "dev-libs/D"],
                all_permutations=True,
                options={"--autounmask": "y"},
                mergelist=[
                    "dev-libs/A-2", "dev-libs/B-1", "dev-libs/C-1",
                    "dev-libs/D-1"
                ],
                ignore_mergelist_order=True,
                unstable_keywords=["dev-libs/A-2"],
                success=False),
            ResolverPlaygroundTestCase(["@test-set"],
                                       all_permutations=True,
                                       options={"--autounmask": "y"},
                                       mergelist=[
                                           "dev-libs/A-2", "dev-libs/B-1",
                                           "dev-libs/C-1", "dev-libs/D-1"
                                       ],
                                       ignore_mergelist_order=True,
                                       unstable_keywords=["dev-libs/A-2"],
                                       success=False),
            ResolverPlaygroundTestCase(["@world"],
                                       all_permutations=True,
                                       options={"--autounmask": "y"},
                                       mergelist=[
                                           "dev-libs/A-2", "dev-libs/B-1",
                                           "dev-libs/C-1", "dev-libs/D-1"
                                       ],
                                       ignore_mergelist_order=True,
                                       unstable_keywords=["dev-libs/A-2"],
                                       success=False),
        )

        playground = ResolverPlayground(ebuilds=ebuilds,
                                        world_sets=world_sets,
                                        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()
示例#43
0
    def testAutounmaskForLicenses(self):

        ebuilds = {
            "dev-libs/A-1": {
                "LICENSE": "TEST"
            },
            "dev-libs/B-1": {
                "LICENSE": "TEST",
                "IUSE": "foo",
                "KEYWORDS": "~x86"
            },
            "dev-libs/C-1": {
                "DEPEND": "dev-libs/B[foo]",
                "EAPI": 2
            },
            "dev-libs/D-1": {
                "DEPEND": "dev-libs/E dev-libs/F",
                "LICENSE": "TEST"
            },
            "dev-libs/E-1": {
                "LICENSE": "TEST"
            },
            "dev-libs/E-2": {
                "LICENSE": "TEST"
            },
            "dev-libs/F-1": {
                "DEPEND": "=dev-libs/E-1",
                "LICENSE": "TEST"
            },
            "dev-java/sun-jdk-1.6.0.32": {
                "LICENSE": "TEST",
                "KEYWORDS": "~x86"
            },
            "dev-java/sun-jdk-1.6.0.31": {
                "LICENSE": "TEST",
                "KEYWORDS": "x86"
            },
        }

        test_cases = (
            ResolverPlaygroundTestCase(["=dev-libs/A-1"],
                                       options={"--autounmask": 'n'},
                                       success=False),
            ResolverPlaygroundTestCase(
                ["=dev-libs/A-1"],
                options={"--autounmask": True},
                success=False,
                mergelist=["dev-libs/A-1"],
                license_changes={"dev-libs/A-1": set(["TEST"])}),

            #Test license+keyword+use change at once.
            ResolverPlaygroundTestCase(
                ["=dev-libs/C-1"],
                options={"--autounmask": True},
                success=False,
                mergelist=["dev-libs/B-1", "dev-libs/C-1"],
                license_changes={"dev-libs/B-1": set(["TEST"])},
                unstable_keywords=["dev-libs/B-1"],
                use_changes={"dev-libs/B-1": {
                    "foo": True
                }}),

            #Test license with backtracking.
            ResolverPlaygroundTestCase(
                ["=dev-libs/D-1"],
                options={"--autounmask": True},
                success=False,
                mergelist=["dev-libs/E-1", "dev-libs/F-1", "dev-libs/D-1"],
                license_changes={
                    "dev-libs/D-1": set(["TEST"]),
                    "dev-libs/E-1": set(["TEST"]),
                    "dev-libs/E-2": set(["TEST"]),
                    "dev-libs/F-1": set(["TEST"])
                }),

            #Test license only for bug #420847
            ResolverPlaygroundTestCase(
                ["dev-java/sun-jdk"],
                options={"--autounmask": True},
                success=False,
                mergelist=["dev-java/sun-jdk-1.6.0.31"],
                license_changes={"dev-java/sun-jdk-1.6.0.31": set(["TEST"])}),
        )

        playground = ResolverPlayground(ebuilds=ebuilds)
        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()
示例#44
0
    def testAutounmask(self):

        ebuilds = {
            #ebuilds to test use changes
            "dev-libs/A-1": {
                "SLOT": 1,
                "DEPEND": "dev-libs/B[foo]",
                "EAPI": 2
            },
            "dev-libs/A-2": {
                "SLOT": 2,
                "DEPEND": "dev-libs/B[bar]",
                "EAPI": 2
            },
            "dev-libs/B-1": {
                "DEPEND": "foo? ( dev-libs/C ) bar? ( dev-libs/D )",
                "IUSE": "foo bar"
            },
            "dev-libs/C-1": {},
            "dev-libs/D-1": {},

            #ebuilds to test if we allow changing of masked or forced flags
            "dev-libs/E-1": {
                "SLOT": 1,
                "DEPEND": "dev-libs/F[masked-flag]",
                "EAPI": 2
            },
            "dev-libs/E-2": {
                "SLOT": 2,
                "DEPEND": "dev-libs/G[-forced-flag]",
                "EAPI": 2
            },
            "dev-libs/F-1": {
                "IUSE": "masked-flag"
            },
            "dev-libs/G-1": {
                "IUSE": "forced-flag"
            },

            #ebuilds to test keyword changes
            "app-misc/Z-1": {
                "KEYWORDS": "~x86",
                "DEPEND": "app-misc/Y"
            },
            "app-misc/Y-1": {
                "KEYWORDS": "~x86"
            },
            "app-misc/W-1": {},
            "app-misc/W-2": {
                "KEYWORDS": "~x86"
            },
            "app-misc/V-1": {
                "KEYWORDS": "~x86",
                "DEPEND": ">=app-misc/W-2"
            },

            #ebuilds to test mask and keyword changes
            "app-text/A-1": {},
            "app-text/B-1": {
                "KEYWORDS": "~x86"
            },
            "app-text/C-1": {
                "KEYWORDS": ""
            },
            "app-text/D-1": {
                "KEYWORDS": "~x86"
            },
            "app-text/D-2": {
                "KEYWORDS": ""
            },

            #ebuilds for mixed test for || dep handling
            "sci-libs/K-1": {
                "DEPEND":
                " || ( sci-libs/L[bar] || ( sci-libs/M sci-libs/P ) )",
                "EAPI": 2
            },
            "sci-libs/K-2": {
                "DEPEND":
                " || ( sci-libs/L[bar] || ( sci-libs/P sci-libs/M ) )",
                "EAPI": 2
            },
            "sci-libs/K-3": {
                "DEPEND":
                " || ( sci-libs/M || ( sci-libs/L[bar] sci-libs/P ) )",
                "EAPI": 2
            },
            "sci-libs/K-4": {
                "DEPEND":
                " || ( sci-libs/M || ( sci-libs/P sci-libs/L[bar] ) )",
                "EAPI": 2
            },
            "sci-libs/K-5": {
                "DEPEND":
                " || ( sci-libs/P || ( sci-libs/L[bar] sci-libs/M ) )",
                "EAPI": 2
            },
            "sci-libs/K-6": {
                "DEPEND":
                " || ( sci-libs/P || ( sci-libs/M sci-libs/L[bar] ) )",
                "EAPI": 2
            },
            "sci-libs/K-7": {
                "DEPEND": " || ( sci-libs/M sci-libs/L[bar] )",
                "EAPI": 2
            },
            "sci-libs/K-8": {
                "DEPEND": " || ( sci-libs/L[bar] sci-libs/M )",
                "EAPI": 2
            },
            "sci-libs/L-1": {
                "IUSE": "bar"
            },
            "sci-libs/M-1": {
                "KEYWORDS": "~x86"
            },
            "sci-libs/P-1": {},

            #ebuilds to test these nice "required by cat/pkg[foo]" messages
            "dev-util/Q-1": {
                "DEPEND": "foo? ( dev-util/R[bar] )",
                "IUSE": "+foo",
                "EAPI": 2
            },
            "dev-util/Q-2": {
                "RDEPEND": "!foo? ( dev-util/R[bar] )",
                "IUSE": "foo",
                "EAPI": 2
            },
            "dev-util/R-1": {
                "IUSE": "bar"
            },

            #ebuilds to test interaction with REQUIRED_USE
            "app-portage/A-1": {
                "DEPEND": "app-portage/B[foo]",
                "EAPI": 2
            },
            "app-portage/A-2": {
                "DEPEND": "app-portage/B[foo=]",
                "IUSE": "+foo",
                "REQUIRED_USE": "foo",
                "EAPI": "4"
            },
            "app-portage/B-1": {
                "IUSE": "foo +bar",
                "REQUIRED_USE": "^^ ( foo bar )",
                "EAPI": "4"
            },
            "app-portage/C-1": {
                "IUSE": "+foo +bar",
                "REQUIRED_USE": "^^ ( foo bar )",
                "EAPI": "4"
            },
        }

        test_cases = (
            #Test USE changes.
            #The simple case.
            ResolverPlaygroundTestCase(["dev-libs/A:1"],
                                       options={"--autounmask": "n"},
                                       success=False),
            ResolverPlaygroundTestCase(
                ["dev-libs/A:1"],
                options={"--autounmask": True},
                success=False,
                mergelist=["dev-libs/C-1", "dev-libs/B-1", "dev-libs/A-1"],
                use_changes={"dev-libs/B-1": {
                    "foo": True
                }}),

            #Make sure we restart if needed.
            ResolverPlaygroundTestCase(
                ["dev-libs/A:1", "dev-libs/B"],
                options={"--autounmask": True},
                all_permutations=True,
                success=False,
                mergelist=["dev-libs/C-1", "dev-libs/B-1", "dev-libs/A-1"],
                use_changes={"dev-libs/B-1": {
                    "foo": True
                }}),
            ResolverPlaygroundTestCase(
                ["dev-libs/A:1", "dev-libs/A:2", "dev-libs/B"],
                options={"--autounmask": True},
                all_permutations=True,
                success=False,
                mergelist=[
                    "dev-libs/D-1", "dev-libs/C-1", "dev-libs/B-1",
                    "dev-libs/A-1", "dev-libs/A-2"
                ],
                ignore_mergelist_order=True,
                use_changes={"dev-libs/B-1": {
                    "foo": True,
                    "bar": True
                }}),

            #Test keywording.
            #The simple case.
            ResolverPlaygroundTestCase(["app-misc/Z"],
                                       options={"--autounmask": "n"},
                                       success=False),
            ResolverPlaygroundTestCase(
                ["app-misc/Z"],
                options={"--autounmask": True},
                success=False,
                mergelist=["app-misc/Y-1", "app-misc/Z-1"],
                unstable_keywords=["app-misc/Y-1", "app-misc/Z-1"]),

            #Make sure that the backtracking for slot conflicts handles our mess.
            ResolverPlaygroundTestCase(
                ["=app-misc/V-1", "app-misc/W"],
                options={"--autounmask": True},
                all_permutations=True,
                success=False,
                mergelist=["app-misc/W-2", "app-misc/V-1"],
                unstable_keywords=["app-misc/W-2", "app-misc/V-1"]),

            #Mixed testing
            #Make sure we don't change use for something in a || dep if there is another choice
            #that needs no change.
            ResolverPlaygroundTestCase(
                ["=sci-libs/K-1"],
                options={"--autounmask": True},
                success=True,
                mergelist=["sci-libs/P-1", "sci-libs/K-1"]),
            ResolverPlaygroundTestCase(
                ["=sci-libs/K-2"],
                options={"--autounmask": True},
                success=True,
                mergelist=["sci-libs/P-1", "sci-libs/K-2"]),
            ResolverPlaygroundTestCase(
                ["=sci-libs/K-3"],
                options={"--autounmask": True},
                success=True,
                mergelist=["sci-libs/P-1", "sci-libs/K-3"]),
            ResolverPlaygroundTestCase(
                ["=sci-libs/K-4"],
                options={"--autounmask": True},
                success=True,
                mergelist=["sci-libs/P-1", "sci-libs/K-4"]),
            ResolverPlaygroundTestCase(
                ["=sci-libs/K-5"],
                options={"--autounmask": True},
                success=True,
                mergelist=["sci-libs/P-1", "sci-libs/K-5"]),
            ResolverPlaygroundTestCase(
                ["=sci-libs/K-6"],
                options={"--autounmask": True},
                success=True,
                mergelist=["sci-libs/P-1", "sci-libs/K-6"]),

            #Make sure we prefer use changes over keyword changes.
            ResolverPlaygroundTestCase(
                ["=sci-libs/K-7"],
                options={"--autounmask": True},
                success=False,
                mergelist=["sci-libs/L-1", "sci-libs/K-7"],
                use_changes={"sci-libs/L-1": {
                    "bar": True
                }}),
            ResolverPlaygroundTestCase(
                ["=sci-libs/K-8"],
                options={"--autounmask": True},
                success=False,
                mergelist=["sci-libs/L-1", "sci-libs/K-8"],
                use_changes={"sci-libs/L-1": {
                    "bar": True
                }}),

            #Test these nice "required by cat/pkg[foo]" messages.
            ResolverPlaygroundTestCase(
                ["=dev-util/Q-1"],
                options={"--autounmask": True},
                success=False,
                mergelist=["dev-util/R-1", "dev-util/Q-1"],
                use_changes={"dev-util/R-1": {
                    "bar": True
                }}),
            ResolverPlaygroundTestCase(
                ["=dev-util/Q-2"],
                options={"--autounmask": True},
                success=False,
                mergelist=["dev-util/R-1", "dev-util/Q-2"],
                use_changes={"dev-util/R-1": {
                    "bar": True
                }}),

            #Test interaction with REQUIRED_USE.
            ResolverPlaygroundTestCase(["=app-portage/A-1"],
                                       options={"--autounmask": True},
                                       use_changes=None,
                                       success=False),
            ResolverPlaygroundTestCase(["=app-portage/A-2"],
                                       options={"--autounmask": True},
                                       use_changes=None,
                                       success=False),
            ResolverPlaygroundTestCase(["=app-portage/C-1"],
                                       options={"--autounmask": True},
                                       use_changes=None,
                                       success=False),

            #Make sure we don't change masked/forced flags.
            ResolverPlaygroundTestCase(["dev-libs/E:1"],
                                       options={"--autounmask": True},
                                       use_changes=None,
                                       success=False),
            ResolverPlaygroundTestCase(["dev-libs/E:2"],
                                       options={"--autounmask": True},
                                       use_changes=None,
                                       success=False),

            #Test mask and keyword changes.
            ResolverPlaygroundTestCase(["app-text/A"],
                                       options={"--autounmask": True},
                                       success=False,
                                       mergelist=["app-text/A-1"],
                                       needed_p_mask_changes=["app-text/A-1"]),
            ResolverPlaygroundTestCase(["app-text/B"],
                                       options={"--autounmask": True},
                                       success=False,
                                       mergelist=["app-text/B-1"],
                                       unstable_keywords=["app-text/B-1"],
                                       needed_p_mask_changes=["app-text/B-1"]),
            ResolverPlaygroundTestCase(["app-text/C"],
                                       options={"--autounmask": True},
                                       success=False,
                                       mergelist=["app-text/C-1"],
                                       unstable_keywords=["app-text/C-1"],
                                       needed_p_mask_changes=["app-text/C-1"]),
            #Make sure unstable keyword is preferred over missing keyword
            ResolverPlaygroundTestCase(["app-text/D"],
                                       options={"--autounmask": True},
                                       success=False,
                                       mergelist=["app-text/D-1"],
                                       unstable_keywords=["app-text/D-1"]),
            #Test missing keyword
            ResolverPlaygroundTestCase(["=app-text/D-2"],
                                       options={"--autounmask": True},
                                       success=False,
                                       mergelist=["app-text/D-2"],
                                       unstable_keywords=["app-text/D-2"]))

        profile = {
            "use.mask": ("masked-flag", ),
            "use.force": ("forced-flag", ),
            "package.mask": (
                "app-text/A",
                "app-text/B",
                "app-text/C",
            ),
        }

        playground = ResolverPlayground(ebuilds=ebuilds, profile=profile)
        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 testRuntimeCycleMergeOrder(self):
        ebuilds = {
            'app-misc/plugins-consumer-1': {
                'EAPI': '6',
                'DEPEND': 'app-misc/plugin-b:=',
                'RDEPEND': 'app-misc/plugin-b:=',
            },
            'app-misc/plugin-b-1': {
                'EAPI': '6',
                'RDEPEND': 'app-misc/runtime-cycle-b',
                'PDEPEND': 'app-misc/plugins-consumer',
            },
            'app-misc/runtime-cycle-b-1': {
                'RDEPEND': 'app-misc/plugin-b app-misc/branch-b',
            },
            'app-misc/branch-b-1': {
                'RDEPEND': 'app-misc/leaf-b app-misc/branch-c',
            },
            'app-misc/leaf-b-1': {},
            'app-misc/branch-c-1': {
                'RDEPEND': 'app-misc/runtime-cycle-c app-misc/runtime-c',
            },
            'app-misc/runtime-cycle-c-1': {
                'RDEPEND': 'app-misc/branch-c',
            },
            'app-misc/runtime-c-1': {
                'RDEPEND': 'app-misc/branch-d',
            },
            'app-misc/branch-d-1': {
                'RDEPEND': 'app-misc/leaf-d app-misc/branch-e',
            },
            'app-misc/branch-e-1': {
                'RDEPEND': 'app-misc/leaf-e',
            },
            'app-misc/leaf-d-1': {},
            'app-misc/leaf-e-1': {},
        }

        test_cases = (ResolverPlaygroundTestCase(
            ['app-misc/plugin-b'],
            success=True,
            ambiguous_merge_order=True,
            mergelist=[
                ('app-misc/leaf-b-1', 'app-misc/leaf-d-1',
                 'app-misc/leaf-e-1'),
                ('app-misc/branch-d-1', 'app-misc/branch-e-1'),
                'app-misc/runtime-c-1',
                ('app-misc/runtime-cycle-c-1', 'app-misc/branch-c-1'),
                'app-misc/branch-b-1',
                ('app-misc/runtime-cycle-b-1', 'app-misc/plugin-b-1'),
                'app-misc/plugins-consumer-1',
            ],
        ), )

        playground = ResolverPlayground(ebuilds=ebuilds)
        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()
示例#46
0
    def testLicenseMaskedVirtualSlotUpdate(self):

        ebuilds = {
            "dev-java/oracle-jdk-bin-1.7.0": {
                "SLOT": "1.7",
                "LICENSE": "TEST"
            },
            "dev-java/sun-jdk-1.6.0": {
                "SLOT": "1.6",
                "LICENSE": "TEST"
            },
            "dev-java/icedtea-6.1.10.3": {
                "SLOT": "6"
            },
            "app-misc/java-app-1": {
                "RDEPEND": ">=virtual/jdk-1.6.0"
            },
            "virtual/jdk-1.6.0": {
                "SLOT": "1.6",
                "RDEPEND":
                "|| ( =dev-java/icedtea-6* =dev-java/sun-jdk-1.6.0* )"
            },
            "virtual/jdk-1.7.0": {
                "SLOT": "1.7",
                "RDEPEND": "|| ( =dev-java/oracle-jdk-bin-1.7.0* )"
            },
        }

        installed = {
            "app-misc/java-app-1": {
                "RDEPEND": ">=virtual/jdk-1.6.0"
            },
            "dev-java/icedtea-6.1.10.3": {
                "SLOT": "6"
            },
            "virtual/jdk-1.6.0": {
                "SLOT": "1.6",
                "RDEPEND":
                "|| ( =dev-java/icedtea-6* =dev-java/sun-jdk-1.6.0* )"
            },
        }

        world = ("app-misc/java-app", )

        test_cases = (
            # Bug #382557 - Don't pull in the virtual/jdk-1.7.0 slot update
            # since its dependencies can only be satisfied by a package that
            # is masked by license.
            ResolverPlaygroundTestCase(["@world"],
                                       options={
                                           "--update": True,
                                           "--deep": True
                                       },
                                       success=True,
                                       mergelist=[]), )

        playground = ResolverPlayground(ebuilds=ebuilds,
                                        installed=installed,
                                        world=world)
        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()
示例#47
0
    def testSlotCollision(self):

        ebuilds = {
            "dev-libs/A-1": {
                "PDEPEND": "foo? ( dev-libs/B )",
                "IUSE": "foo"
            },
            "dev-libs/B-1": {
                "IUSE": "foo"
            },
            "dev-libs/C-1": {
                "DEPEND": "dev-libs/A[foo]",
                "EAPI": 2
            },
            "dev-libs/D-1": {
                "DEPEND": "dev-libs/A[foo=] dev-libs/B[foo=]",
                "IUSE": "foo",
                "EAPI": 2
            },
            "dev-libs/E-1": {},
            "dev-libs/E-2": {
                "IUSE": "foo"
            },
            "app-misc/Z-1": {},
            "app-misc/Z-2": {},
            "app-misc/Y-1": {
                "DEPEND": "=app-misc/Z-1"
            },
            "app-misc/Y-2": {
                "DEPEND": ">app-misc/Z-1"
            },
            "app-misc/X-1": {
                "DEPEND": "=app-misc/Z-2"
            },
            "app-misc/X-2": {
                "DEPEND": "<app-misc/Z-2"
            },
            "sci-libs/K-1": {
                "IUSE": "+foo",
                "EAPI": 1
            },
            "sci-libs/L-1": {
                "DEPEND": "sci-libs/K[-foo]",
                "EAPI": 2
            },
            "sci-libs/M-1": {
                "DEPEND": "sci-libs/K[foo=]",
                "IUSE": "+foo",
                "EAPI": 2
            },
            "sci-libs/Q-1": {
                "SLOT": "1",
                "IUSE": "+bar foo",
                "EAPI": 1
            },
            "sci-libs/Q-2": {
                "SLOT": "2",
                "IUSE": "+bar +foo",
                "EAPI": 2,
                "PDEPEND": "sci-libs/Q:1[bar?,foo?]"
            },
            "sci-libs/P-1": {
                "DEPEND": "sci-libs/Q:1[foo=]",
                "IUSE": "foo",
                "EAPI": 2
            },
            "sys-libs/A-1": {
                "RDEPEND": "foo? ( sys-libs/J[foo=] )",
                "IUSE": "+foo",
                "EAPI": "4"
            },
            "sys-libs/B-1": {
                "RDEPEND": "bar? ( sys-libs/J[bar=] )",
                "IUSE": "+bar",
                "EAPI": "4"
            },
            "sys-libs/C-1": {
                "RDEPEND": "sys-libs/J[bar]",
                "EAPI": "4"
            },
            "sys-libs/D-1": {
                "RDEPEND": "sys-libs/J[bar?]",
                "IUSE": "bar",
                "EAPI": "4"
            },
            "sys-libs/E-1": {
                "RDEPEND": "sys-libs/J[foo(+)?]",
                "IUSE": "+foo",
                "EAPI": "4"
            },
            "sys-libs/F-1": {
                "RDEPEND": "sys-libs/J[foo(+)]",
                "EAPI": "4"
            },
            "sys-libs/J-1": {
                "IUSE": "+foo",
                "EAPI": "4"
            },
            "sys-libs/J-2": {
                "IUSE": "+bar",
                "EAPI": "4"
            },
            "app-misc/A-1": {
                "IUSE": "foo +bar",
                "REQUIRED_USE": "^^ ( foo bar )",
                "EAPI": "4"
            },
            "app-misc/B-1": {
                "DEPEND": "=app-misc/A-1[foo=]",
                "IUSE": "foo",
                "EAPI": 2
            },
            "app-misc/C-1": {
                "DEPEND": "=app-misc/A-1[foo]",
                "EAPI": 2
            },
            "app-misc/E-1": {
                "RDEPEND": "dev-libs/E[foo?]",
                "IUSE": "foo",
                "EAPI": "2"
            },
            "app-misc/F-1": {
                "RDEPEND": "=dev-libs/E-1",
                "IUSE": "foo",
                "EAPI": "2"
            },
            "dev-lang/perl-5.12": {
                "SLOT": "0/5.12",
                "EAPI": "4-slot-abi"
            },
            "dev-lang/perl-5.16": {
                "SLOT": "0/5.16",
                "EAPI": "4-slot-abi"
            },
        }
        installed = {
            "dev-libs/A-1": {
                "PDEPEND": "foo? ( dev-libs/B )",
                "IUSE": "foo",
                "USE": "foo"
            },
            "dev-libs/B-1": {
                "IUSE": "foo",
                "USE": "foo"
            },
            "dev-libs/C-1": {
                "DEPEND": "dev-libs/A[foo]",
                "EAPI": 2
            },
            "dev-libs/D-1": {
                "DEPEND": "dev-libs/A[foo=] dev-libs/B[foo=]",
                "IUSE": "foo",
                "USE": "foo",
                "EAPI": 2
            },
            "sci-libs/K-1": {
                "IUSE": "foo",
                "USE": ""
            },
            "sci-libs/L-1": {
                "DEPEND": "sci-libs/K[-foo]"
            },
            "sci-libs/Q-1": {
                "SLOT": "1",
                "IUSE": "+bar +foo",
                "USE": "bar foo",
                "EAPI": 1
            },
            "sci-libs/Q-2": {
                "SLOT": "2",
                "IUSE": "+bar +foo",
                "USE": "bar foo",
                "EAPI": 2,
                "PDEPEND": "sci-libs/Q:1[bar?,foo?]"
            },
            "app-misc/A-1": {
                "IUSE": "+foo bar",
                "USE": "foo",
                "REQUIRED_USE": "^^ ( foo bar )",
                "EAPI": "4"
            },
        }

        test_cases = (
            #A qt-*[qt3support] like mess.
            ResolverPlaygroundTestCase(
                ["dev-libs/A", "dev-libs/B", "dev-libs/C", "dev-libs/D"],
                options={"--autounmask": 'n'},
                success=False,
                mergelist=[
                    "dev-libs/A-1", "dev-libs/B-1", "dev-libs/C-1",
                    "dev-libs/D-1"
                ],
                ignore_mergelist_order=True,
                slot_collision_solutions=[{
                    "dev-libs/A-1": {
                        "foo": True
                    },
                    "dev-libs/D-1": {
                        "foo": True
                    }
                }]),
            ResolverPlaygroundTestCase(
                [
                    "sys-libs/A", "sys-libs/B", "sys-libs/C", "sys-libs/D",
                    "sys-libs/E", "sys-libs/F"
                ],
                options={"--autounmask": 'n'},
                success=False,
                ignore_mergelist_order=True,
                slot_collision_solutions=[],
                mergelist=[
                    'sys-libs/J-2', 'sys-libs/J-1', 'sys-libs/A-1',
                    'sys-libs/B-1', 'sys-libs/C-1', 'sys-libs/D-1',
                    'sys-libs/E-1', 'sys-libs/F-1'
                ],
            ),

            #A version based conflicts, nothing we can do.
            ResolverPlaygroundTestCase(["=app-misc/X-1", "=app-misc/Y-1"],
                                       success=False,
                                       mergelist=[
                                           "app-misc/Z-1", "app-misc/Z-2",
                                           "app-misc/X-1", "app-misc/Y-1"
                                       ],
                                       ignore_mergelist_order=True,
                                       slot_collision_solutions=[]),
            ResolverPlaygroundTestCase(["=app-misc/X-2", "=app-misc/Y-2"],
                                       success=False,
                                       mergelist=[
                                           "app-misc/Z-1", "app-misc/Z-2",
                                           "app-misc/X-2", "app-misc/Y-2"
                                       ],
                                       ignore_mergelist_order=True,
                                       slot_collision_solutions=[]),
            ResolverPlaygroundTestCase(["=app-misc/E-1", "=app-misc/F-1"],
                                       success=False,
                                       mergelist=[
                                           "dev-libs/E-1", "dev-libs/E-2",
                                           "app-misc/E-1", "app-misc/F-1"
                                       ],
                                       ignore_mergelist_order=True,
                                       slot_collision_solutions=[]),

            # sub-slot
            ResolverPlaygroundTestCase(
                [
                    "dev-lang/perl:0/5.12", "dev-lang/perl:0/5.16",
                    "=dev-lang/perl-5.12*"
                ],
                success=False,
                mergelist=["dev-lang/perl-5.12", "dev-lang/perl-5.16"],
                ignore_mergelist_order=True,
                slot_collision_solutions=[]),

            #Simple cases.
            ResolverPlaygroundTestCase(
                ["sci-libs/L", "sci-libs/M"],
                success=False,
                mergelist=["sci-libs/L-1", "sci-libs/M-1", "sci-libs/K-1"],
                ignore_mergelist_order=True,
                slot_collision_solutions=[{
                    "sci-libs/K-1": {
                        "foo": False
                    },
                    "sci-libs/M-1": {
                        "foo": False
                    }
                }]),

            #Avoid duplicates.
            ResolverPlaygroundTestCase(
                ["sci-libs/P", "sci-libs/Q:2"],
                success=False,
                options={
                    "--update": True,
                    "--complete-graph": True,
                    "--autounmask": 'n'
                },
                mergelist=["sci-libs/P-1", "sci-libs/Q-1"],
                ignore_mergelist_order=True,
                all_permutations=True,
                slot_collision_solutions=[{
                    "sci-libs/Q-1": {
                        "foo": True
                    },
                    "sci-libs/P-1": {
                        "foo": True
                    }
                }]),
        )
        # NOTE: For this test case, ResolverPlaygroundTestCase attributes
        # vary randomly between runs, so it's expected to fail randomly.
        #Conflict with REQUIRED_USE
        #ResolverPlaygroundTestCase(
        #	["=app-misc/C-1", "=app-misc/B-1"],
        #	all_permutations = True,
        #	slot_collision_solutions = None,
        #	use_changes={"app-misc/A-1": {"foo": True}},
        #	mergelist = ["app-misc/A-1", "app-misc/C-1", "app-misc/B-1"],
        #	ignore_mergelist_order = True,
        #	success = False),
        #)

        playground = ResolverPlayground(ebuilds=ebuilds, installed=installed)
        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()
示例#48
0
    def testVirtualSlotDepclean(self):

        ebuilds = {
            "dev-java/oracle-jdk-bin-1.7.0": {
                "SLOT": "1.7",
                "LICENSE": "TEST"
            },
            "dev-java/sun-jdk-1.6.0": {
                "SLOT": "1.6",
                "LICENSE": "TEST"
            },
            "dev-java/icedtea-6.1.10.3": {
                "SLOT": "6"
            },
            "dev-java/icedtea-7": {
                "SLOT": "7"
            },
            "app-misc/java-app-1": {
                "RDEPEND": ">=virtual/jdk-1.6.0"
            },
            "virtual/jdk-1.6.0": {
                "SLOT": "1.6",
                "RDEPEND":
                "|| ( =dev-java/icedtea-6* =dev-java/sun-jdk-1.6.0* )"
            },
            "virtual/jdk-1.7.0": {
                "SLOT":
                "1.7",
                "RDEPEND":
                "|| ( =dev-java/icedtea-7* =dev-java/oracle-jdk-bin-1.7.0* )"
            },
        }

        installed = {
            "app-misc/java-app-1": {
                "RDEPEND": ">=virtual/jdk-1.6.0"
            },
            "dev-java/icedtea-6.1.10.3": {
                "SLOT": "6"
            },
            "dev-java/icedtea-7": {
                "SLOT": "7"
            },
            "virtual/jdk-1.6.0": {
                "SLOT": "1.6",
                "RDEPEND":
                "|| ( =dev-java/icedtea-6* =dev-java/sun-jdk-1.6.0* )"
            },
            "virtual/jdk-1.7.0": {
                "SLOT":
                "1.7",
                "RDEPEND":
                "|| ( =dev-java/icedtea-7* =dev-java/oracle-jdk-bin-1.7.0* )"
            },
        }

        world = (
            "virtual/jdk:1.6",
            "app-misc/java-app",
        )

        test_cases = (
            # Make sure that depclean doesn't remove a new slot even though
            # it is redundant in the sense that the older slot will satisfy
            # all dependencies.
            ResolverPlaygroundTestCase([],
                                       options={"--depclean": True},
                                       success=True,
                                       cleanlist=[]),

            # Prune redundant lower slots, even if they are in world.
            ResolverPlaygroundTestCase(
                [],
                options={"--prune": True},
                success=True,
                cleanlist=['virtual/jdk-1.6.0', 'dev-java/icedtea-6.1.10.3']),
        )

        playground = ResolverPlayground(ebuilds=ebuilds,
                                        installed=installed,
                                        world=world)
        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()
示例#49
0
    def testSubSlot(self):
        ebuilds = {
            "dev-libs/icu-49": {
                "EAPI": "4-slot-abi",
                "SLOT": "0/49"
            },
            "dev-libs/icu-4.8": {
                "EAPI": "4-slot-abi",
                "SLOT": "0/48"
            },
            "dev-libs/libxml2-2.7.8": {
                "EAPI": "4-slot-abi",
                "DEPEND": "dev-libs/icu:=",
                "RDEPEND": "dev-libs/icu:="
            },
        }
        binpkgs = {
            "dev-libs/icu-49": {
                "EAPI": "4-slot-abi",
                "SLOT": "0/49"
            },
            "dev-libs/icu-4.8": {
                "EAPI": "4-slot-abi",
                "SLOT": "0/48"
            },
            "dev-libs/libxml2-2.7.8": {
                "EAPI": "4-slot-abi",
                "DEPEND": "dev-libs/icu:0/48=",
                "RDEPEND": "dev-libs/icu:0/48="
            },
        }
        installed = {
            "dev-libs/icu-4.8": {
                "EAPI": "4-slot-abi",
                "SLOT": "0/48"
            },
            "dev-libs/libxml2-2.7.8": {
                "EAPI": "4-slot-abi",
                "DEPEND": "dev-libs/icu:0/48=",
                "RDEPEND": "dev-libs/icu:0/48="
            },
        }

        world = ["dev-libs/libxml2"]

        test_cases = (
            ResolverPlaygroundTestCase(
                ["dev-libs/icu"],
                options={"--oneshot": True},
                success=True,
                mergelist=["dev-libs/icu-49", "dev-libs/libxml2-2.7.8"]),
            ResolverPlaygroundTestCase(["dev-libs/icu"],
                                       options={
                                           "--oneshot": True,
                                           "--ignore-built-slot-operator-deps":
                                           "y"
                                       },
                                       success=True,
                                       mergelist=["dev-libs/icu-49"]),
            ResolverPlaygroundTestCase(["dev-libs/icu"],
                                       options={
                                           "--oneshot": True,
                                           "--usepkg": True
                                       },
                                       success=True,
                                       mergelist=[
                                           "[binary]dev-libs/icu-49",
                                           "dev-libs/libxml2-2.7.8"
                                       ]),
            ResolverPlaygroundTestCase(["dev-libs/icu"],
                                       options={
                                           "--oneshot": True,
                                           "--usepkgonly": True
                                       },
                                       success=True,
                                       mergelist=["[binary]dev-libs/icu-4.8"]),
            ResolverPlaygroundTestCase(
                ["dev-libs/icu"],
                options={
                    "--oneshot": True,
                    "--usepkgonly": True,
                    "--ignore-built-slot-operator-deps": "y"
                },
                success=True,
                mergelist=["[binary]dev-libs/icu-49"]),
            ResolverPlaygroundTestCase(
                ["@world"],
                options={
                    "--update": True,
                    "--deep": True
                },
                success=True,
                mergelist=["dev-libs/icu-49", "dev-libs/libxml2-2.7.8"]),
            ResolverPlaygroundTestCase(
                ["@world"],
                options={
                    "--update": True,
                    "--deep": True,
                    "--ignore-built-slot-operator-deps": "y"
                },
                success=True,
                mergelist=["dev-libs/icu-49"]),
            ResolverPlaygroundTestCase(["@world"],
                                       options={
                                           "--update": True,
                                           "--deep": True,
                                           "--usepkg": True
                                       },
                                       success=True,
                                       mergelist=[
                                           "[binary]dev-libs/icu-49",
                                           "dev-libs/libxml2-2.7.8"
                                       ]),
            ResolverPlaygroundTestCase(["@world"],
                                       options={
                                           "--update": True,
                                           "--deep": True,
                                           "--usepkgonly": True
                                       },
                                       success=True,
                                       mergelist=[]),
            ResolverPlaygroundTestCase(
                ["@world"],
                options={
                    "--update": True,
                    "--deep": True,
                    "--usepkgonly": True,
                    "--ignore-built-slot-operator-deps": "y"
                },
                success=True,
                mergelist=["[binary]dev-libs/icu-49"]),
        )

        playground = ResolverPlayground(ebuilds=ebuilds,
                                        binpkgs=binpkgs,
                                        installed=installed,
                                        world=world,
                                        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()
示例#50
0
    def testVirtualSubslotUpdate(self):

        ebuilds = {
            "virtual/pypy-2.3.1": {
                "EAPI":
                "5",
                "SLOT":
                "0/2.3",
                "RDEPEND":
                "|| ( >=dev-python/pypy-2.3.1:0/2.3 >=dev-python/pypy-bin-2.3.1:0/2.3 ) "
            },
            "virtual/pypy-2.4.0": {
                "EAPI":
                "5",
                "SLOT":
                "0/2.4",
                "RDEPEND":
                "|| ( >=dev-python/pypy-2.4.0:0/2.4 >=dev-python/pypy-bin-2.4.0:0/2.4 ) "
            },
            "dev-python/pypy-2.3.1": {
                "EAPI": "5",
                "SLOT": "0/2.3"
            },
            "dev-python/pypy-2.4.0": {
                "EAPI": "5",
                "SLOT": "0/2.4"
            },
            "dev-python/pygments-1.6_p20140324-r1": {
                "EAPI": "5",
                "DEPEND": "virtual/pypy:0="
            }
        }

        installed = {
            "virtual/pypy-2.3.1": {
                "EAPI":
                "5",
                "SLOT":
                "0/2.3",
                "RDEPEND":
                "|| ( >=dev-python/pypy-2.3.1:0/2.3 >=dev-python/pypy-bin-2.3.1:0/2.3 ) "
            },
            "dev-python/pypy-2.3.1": {
                "EAPI": "5",
                "SLOT": "0/2.3"
            },
            "dev-python/pygments-1.6_p20140324-r1": {
                "EAPI": "5",
                "DEPEND": "virtual/pypy:0/2.3=",
                "RDEPEND": "virtual/pypy:0/2.3=",
            }
        }

        world = ["dev-python/pygments"]

        test_cases = (
            # bug 526160 - test for missed pypy sub-slot update
            ResolverPlaygroundTestCase(
                ["@world"],
                options={
                    "--update": True,
                    "--deep": True,
                    "--dynamic-deps": "y"
                },
                success=True,
                mergelist=[
                    'dev-python/pypy-2.4.0', 'virtual/pypy-2.4.0',
                    'dev-python/pygments-1.6_p20140324-r1'
                ]),

            # Repeat above test, but with --dynamic-deps disabled.
            ResolverPlaygroundTestCase(
                ["@world"],
                options={
                    "--update": True,
                    "--deep": True,
                    "--dynamic-deps": "n"
                },
                success=True,
                mergelist=[
                    'dev-python/pypy-2.4.0', 'virtual/pypy-2.4.0',
                    'dev-python/pygments-1.6_p20140324-r1'
                ]),
        )

        playground = ResolverPlayground(debug=False,
                                        ebuilds=ebuilds,
                                        installed=installed,
                                        world=world)
        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()
示例#51
0
    def testWholeSlotSubSlotMix(self):
        ebuilds = {
            "dev-libs/glib-1.2.10": {
                "SLOT": "1"
            },
            "dev-libs/glib-2.30.2": {
                "EAPI": "4-slot-abi",
                "SLOT": "2/2.30"
            },
            "dev-libs/glib-2.32.3": {
                "EAPI": "4-slot-abi",
                "SLOT": "2/2.32"
            },
            "dev-libs/dbus-glib-0.98": {
                "EAPI": "4-slot-abi",
                "DEPEND": "dev-libs/glib:2=",
                "RDEPEND": "dev-libs/glib:2="
            },
        }
        binpkgs = {
            "dev-libs/glib-1.2.10": {
                "SLOT": "1"
            },
            "dev-libs/glib-2.30.2": {
                "EAPI": "4-slot-abi",
                "SLOT": "2/2.30"
            },
            "dev-libs/glib-2.32.3": {
                "EAPI": "4-slot-abi",
                "SLOT": "2/2.32"
            },
            "dev-libs/dbus-glib-0.98": {
                "EAPI": "4-slot-abi",
                "DEPEND": "dev-libs/glib:2/2.30=",
                "RDEPEND": "dev-libs/glib:2/2.30="
            },
        }
        installed = {
            "dev-libs/glib-1.2.10": {
                "EAPI": "4-slot-abi",
                "SLOT": "1"
            },
            "dev-libs/glib-2.30.2": {
                "EAPI": "4-slot-abi",
                "SLOT": "2/2.30"
            },
            "dev-libs/dbus-glib-0.98": {
                "EAPI": "4-slot-abi",
                "DEPEND": "dev-libs/glib:2/2.30=",
                "RDEPEND": "dev-libs/glib:2/2.30="
            },
        }

        world = ["dev-libs/glib:1", "dev-libs/dbus-glib"]

        test_cases = (
            ResolverPlaygroundTestCase(
                ["dev-libs/glib"],
                options={"--oneshot": True},
                success=True,
                mergelist=["dev-libs/glib-2.32.3", "dev-libs/dbus-glib-0.98"]),
            ResolverPlaygroundTestCase(["dev-libs/glib"],
                                       options={
                                           "--oneshot": True,
                                           "--ignore-built-slot-operator-deps":
                                           "y"
                                       },
                                       success=True,
                                       mergelist=["dev-libs/glib-2.32.3"]),
            ResolverPlaygroundTestCase(["dev-libs/glib"],
                                       options={
                                           "--oneshot": True,
                                           "--usepkg": True
                                       },
                                       success=True,
                                       mergelist=[
                                           "[binary]dev-libs/glib-2.32.3",
                                           "dev-libs/dbus-glib-0.98"
                                       ]),
            ResolverPlaygroundTestCase(
                ["dev-libs/glib"],
                options={
                    "--oneshot": True,
                    "--usepkgonly": True
                },
                success=True,
                mergelist=["[binary]dev-libs/glib-2.30.2"]),
            ResolverPlaygroundTestCase(
                ["dev-libs/glib"],
                options={
                    "--oneshot": True,
                    "--usepkgonly": True,
                    "--ignore-built-slot-operator-deps": "y"
                },
                success=True,
                mergelist=["[binary]dev-libs/glib-2.32.3"]),
            ResolverPlaygroundTestCase(
                ["@world"],
                options={
                    "--update": True,
                    "--deep": True
                },
                success=True,
                mergelist=["dev-libs/glib-2.32.3", "dev-libs/dbus-glib-0.98"]),
            ResolverPlaygroundTestCase(
                ["@world"],
                options={
                    "--update": True,
                    "--deep": True,
                    "--ignore-built-slot-operator-deps": "y"
                },
                success=True,
                mergelist=["dev-libs/glib-2.32.3"]),
            ResolverPlaygroundTestCase(["@world"],
                                       options={
                                           "--update": True,
                                           "--deep": True,
                                           "--usepkg": True
                                       },
                                       success=True,
                                       mergelist=[
                                           "[binary]dev-libs/glib-2.32.3",
                                           "dev-libs/dbus-glib-0.98"
                                       ]),
            ResolverPlaygroundTestCase(["@world"],
                                       options={
                                           "--update": True,
                                           "--deep": True,
                                           "--usepkgonly": True
                                       },
                                       success=True,
                                       mergelist=[]),
            ResolverPlaygroundTestCase(
                ["@world"],
                options={
                    "--update": True,
                    "--deep": True,
                    "--usepkgonly": True,
                    "--ignore-built-slot-operator-deps": "y"
                },
                success=True,
                mergelist=["[binary]dev-libs/glib-2.32.3"]),
        )

        playground = ResolverPlayground(ebuilds=ebuilds,
                                        binpkgs=binpkgs,
                                        installed=installed,
                                        world=world,
                                        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()
示例#52
0
    def testSubSlot(self):
        ebuilds = {
            "dev-libs/icu-4.8": {"EAPI": "5", "SLOT": "0/48"},
            "dev-libs/libxml2-2.7.8": {
                "EAPI": "5",
                "DEPEND": "dev-libs/icu:=",
                "RDEPEND": "dev-libs/icu:=",
            },
        }
        binpkgs = {
            "dev-libs/icu-49": {"EAPI": "5", "SLOT": "0/49"},
            "dev-libs/icu-4.8": {"EAPI": "5", "SLOT": "0/48"},
            "dev-libs/libxml2-2.7.8": {
                "EAPI": "5",
                "DEPEND": "dev-libs/icu:0/49=",
                "RDEPEND": "dev-libs/icu:0/49=",
            },
        }
        installed = {
            "dev-libs/icu-49": {"EAPI": "5", "SLOT": "0/49"},
            "dev-libs/libxml2-2.7.8": {
                "EAPI": "5",
                "DEPEND": "dev-libs/icu:0/49=",
                "RDEPEND": "dev-libs/icu:0/49=",
            },
        }

        world = ["dev-libs/libxml2"]

        test_cases = (
            ResolverPlaygroundTestCase(
                ["dev-libs/icu"],
                options={"--oneshot": True},
                success=True,
                mergelist=["dev-libs/icu-4.8", "dev-libs/libxml2-2.7.8"],
            ),
            ResolverPlaygroundTestCase(
                ["dev-libs/icu"],
                options={"--oneshot": True, "--ignore-built-slot-operator-deps": "y"},
                success=True,
                mergelist=["dev-libs/icu-4.8"],
            ),
            ResolverPlaygroundTestCase(
                ["dev-libs/icu"],
                options={"--oneshot": True, "--usepkg": True},
                success=True,
                mergelist=["[binary]dev-libs/icu-4.8", "dev-libs/libxml2-2.7.8"],
            ),
            ResolverPlaygroundTestCase(
                ["dev-libs/icu"],
                options={"--oneshot": True, "--usepkgonly": True},
                success=True,
                mergelist=["[binary]dev-libs/icu-49"],
            ),
            ResolverPlaygroundTestCase(
                ["@world"],
                options={"--update": True, "--deep": True},
                success=True,
                mergelist=["dev-libs/icu-4.8", "dev-libs/libxml2-2.7.8"],
            ),
            ResolverPlaygroundTestCase(
                ["@world"],
                options={
                    "--update": True,
                    "--deep": True,
                    "--ignore-built-slot-operator-deps": "y",
                },
                success=True,
                mergelist=["dev-libs/icu-4.8"],
            ),
            ResolverPlaygroundTestCase(
                ["@world"],
                options={"--update": True, "--deep": True, "--usepkg": True},
                success=True,
                mergelist=["[binary]dev-libs/icu-4.8", "dev-libs/libxml2-2.7.8"],
            ),
            ResolverPlaygroundTestCase(
                ["@world"],
                options={"--update": True, "--deep": True, "--usepkgonly": True},
                success=True,
                mergelist=[],
            ),
        )

        for binpkg_format in SUPPORTED_GENTOO_BINPKG_FORMATS:
            with self.subTest(binpkg_format=binpkg_format):
                print(colorize("HILITE", binpkg_format), end=" ... ")
                sys.stdout.flush()
                playground = ResolverPlayground(
                    ebuilds=ebuilds,
                    binpkgs=binpkgs,
                    installed=installed,
                    world=world,
                    debug=False,
                    user_config={
                        "make.conf": ('BINPKG_FORMAT="%s"' % binpkg_format,),
                    },
                )

                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()
示例#53
0
    def testSonameSkipUpdate(self):

        binpkgs = {
            "app-misc/A-1": {
                "RDEPEND": "dev-libs/B",
                "DEPEND": "dev-libs/B",
                "REQUIRES": "x86_32: libB.so.1",
            },
            "dev-libs/B-2": {
                "PROVIDES": "x86_32: libB.so.2",
            },
            "dev-libs/B-1": {
                "PROVIDES": "x86_32: libB.so.1",
            },
        }

        installed = {
            "app-misc/A-1": {
                "RDEPEND": "dev-libs/B",
                "DEPEND": "dev-libs/B",
                "REQUIRES": "x86_32: libB.so.1",
            },
            "dev-libs/B-1": {
                "PROVIDES": "x86_32: libB.so.1",
            },
        }

        world = ("app-misc/A", )

        test_cases = (
            # Test that --ignore-soname-deps allows the upgrade,
            # even though it will break an soname dependency of
            # app-misc/A-1.
            ResolverPlaygroundTestCase(
                ["@world"],
                options={
                    "--deep": True,
                    "--ignore-soname-deps": "y",
                    "--update": True,
                    "--usepkgonly": True,
                },
                success=True,
                mergelist=[
                    "[binary]dev-libs/B-2",
                ],
            ),
            # Test that upgrade to B-2 is skipped with --usepkgonly
            # because it will break an soname dependency that
            # cannot be satisfied by the available binary packages.
            ResolverPlaygroundTestCase(
                ["@world"],
                options={
                    "--deep": True,
                    "--ignore-soname-deps": "n",
                    "--update": True,
                    "--usepkgonly": True,
                },
                success=True,
                mergelist=[],
            ),
        )

        for binpkg_format in SUPPORTED_GENTOO_BINPKG_FORMATS:
            with self.subTest(binpkg_format=binpkg_format):
                print(colorize("HILITE", binpkg_format), end=" ... ")
                sys.stdout.flush()
                playground = ResolverPlayground(
                    debug=False,
                    binpkgs=binpkgs,
                    installed=installed,
                    world=world,
                    user_config={
                        "make.conf": ('BINPKG_FORMAT="%s"' % binpkg_format, ),
                    },
                )
                try:
                    for test_case in test_cases:
                        playground.run_TestCase(test_case)
                        self.assertEqual(test_case.test_success, True,
                                         test_case.fail_msg)
                finally:
                    # Disable debug so that cleanup works.
                    playground.debug = False
                    playground.cleanup()
示例#54
0
    def testSonameSlotConflictReinstall(self):

        binpkgs = {
            "app-misc/A-1": {
                "PROVIDES": "x86_32: libA-1.so",
            },
            "app-misc/A-2": {
                "PROVIDES": "x86_32: libA-2.so",
            },
            "app-misc/B-0": {
                "DEPEND": "app-misc/A",
                "RDEPEND": "app-misc/A",
                "REQUIRES": "x86_32: libA-2.so",
            },
            "app-misc/C-0": {
                "EAPI": "5",
                "DEPEND": "<app-misc/A-2",
                "RDEPEND": "<app-misc/A-2"
            },
            "app-misc/D-1": {
                "PROVIDES": "x86_32: libD-1.so",
            },
            "app-misc/D-2": {
                "PROVIDES": "x86_32: libD-2.so",
            },
            "app-misc/E-0": {
                "DEPEND": "app-misc/D",
                "RDEPEND": "app-misc/D",
                "REQUIRES": "x86_32: libD-2.so",
            },
        }

        installed = {
            "app-misc/A-1": {
                "PROVIDES": "x86_32: libA-1.so",
            },
            "app-misc/B-0": {
                "DEPEND": "app-misc/A",
                "RDEPEND": "app-misc/A",
                "REQUIRES": "x86_32: libA-1.so",
            },
            "app-misc/C-0": {
                "DEPEND": "<app-misc/A-2",
                "RDEPEND": "<app-misc/A-2"
            },
            "app-misc/D-1": {
                "PROVIDES": "x86_32: libD-1.so",
            },
            "app-misc/E-0": {
                "DEPEND": "app-misc/D",
                "RDEPEND": "app-misc/D",
                "REQUIRES": "x86_32: libD-1.so",
            },
        }

        world = ["app-misc/B", "app-misc/C", "app-misc/E"]

        test_cases = (

            # Test bug #439688, where a slot conflict prevents an
            # upgrade and we don't want to trigger unnecessary rebuilds.
            ResolverPlaygroundTestCase(
                ["@world"],
                options={
                    "--deep": True,
                    "--ignore-soname-deps": "n",
                    "--update": True,
                    "--usepkgonly": True,
                    "--backtrack": 10,
                },
                success=True,
                mergelist=["[binary]app-misc/D-2", "[binary]app-misc/E-0"]), )

        playground = ResolverPlayground(binpkgs=binpkgs,
                                        installed=installed,
                                        world=world,
                                        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.debug = False
            playground.cleanup()
	def testVirtualPackageManager(self):
		ebuilds = {
			'app-admin/perl-cleaner-2.25': {
				'RDEPEND': '''
					|| (
						( sys-apps/portage app-portage/portage-utils )
						sys-apps/pkgcore
						sys-apps/paludis
					)'''
			},
			'app-portage/portage-utils-0.64': {},
			'sys-apps/paludis-2.6.0': {},
			'sys-apps/portage-2.3.19-r1': {},
			'virtual/package-manager-0': {
				'RDEPEND': '''
					|| (
						sys-apps/portage
						sys-apps/paludis
						sys-apps/pkgcore
					)'''
			},
		}

		test_cases = (
			# Test bug 645002, where paludis was selected to satisfy a
			# perl-cleaner dependency because that choice contained fewer
			# packages than the ( portage portage-utils ) choice which
			# should have been preferred according to the order of
			# choices specified in the ebuild.
			ResolverPlaygroundTestCase(
				[
					'app-admin/perl-cleaner',
					'virtual/package-manager',
				],
				all_permutations=True,
				success=True,
				ambiguous_merge_order=True,
				mergelist=(
					(
						'sys-apps/portage-2.3.19-r1',
						'app-portage/portage-utils-0.64',
						'app-admin/perl-cleaner-2.25',
						'virtual/package-manager-0',
					),
				)
			),
			# Test paludis preference. In this case, if paludis is not
			# included in the argument atoms then the result varies
			# depending on whether the app-admin/perl-cleaner or
			# virtual/package-manager dependencies are evaluated first!
			# Therefore, include paludis in the argument atoms.
			ResolverPlaygroundTestCase(
				[
					'app-admin/perl-cleaner',
					'virtual/package-manager',
					'sys-apps/paludis',
				],
				all_permutations=True,
				success=True,
				ambiguous_merge_order=True,
				mergelist=(
					'sys-apps/paludis-2.6.0',
					(
						'app-admin/perl-cleaner-2.25',
						'virtual/package-manager-0',
					),
				)
			),
		)

		playground = ResolverPlayground(debug=False, ebuilds=ebuilds)

		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.debug = False
			playground.cleanup()
示例#56
0
    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()
示例#57
0
    def testChangedDeps(self):

        ebuilds = {
            "app-misc/A-0": {
                "DEPEND": "app-misc/B",
                "RDEPEND": "app-misc/B",
            },
            "app-misc/B-0": {}
        }

        binpkgs = {
            "app-misc/A-0": {},
        }

        installed = {
            "app-misc/A-0": {},
        }

        world = ("app-misc/A", )

        test_cases = (

            # --dynamic-deps=n causes the original deps to be respected
            ResolverPlaygroundTestCase(
                ["@world"],
                success=True,
                options={
                    "--update": True,
                    "--deep": True,
                    "--dynamic-deps": "n",
                    "--usepkg": True,
                },
                mergelist=[]),

            # --dynamic-deps causes app-misc/B to get pulled in
            ResolverPlaygroundTestCase(["@world"],
                                       success=True,
                                       options={
                                           "--update": True,
                                           "--deep": True,
                                           "--usepkg": True,
                                       },
                                       mergelist=["app-misc/B-0"]),

            # --changed-deps causes app-misc/A to be rebuilt
            ResolverPlaygroundTestCase(
                ["@world"],
                success=True,
                options={
                    "--update": True,
                    "--deep": True,
                    "--changed-deps": "y",
                    "--usepkg": True,
                },
                mergelist=["app-misc/B-0", "app-misc/A-0"]),

            # --usepkgonly prevents automatic --binpkg-changed-deps
            ResolverPlaygroundTestCase(["app-misc/A"],
                                       success=True,
                                       options={
                                           "--changed-deps": "y",
                                           "--usepkgonly": True,
                                       },
                                       mergelist=["[binary]app-misc/A-0"]),

            # Test automatic --binpkg-changed-deps, which cases the
            # binpkg with stale deps to be ignored (with warning
            # message)
            ResolverPlaygroundTestCase(
                ["app-misc/A"],
                success=True,
                options={
                    "--usepkg": True,
                },
                mergelist=["app-misc/B-0", "app-misc/A-0"]),
        )
        test_cases = (

            # Forcibly disable --binpkg-changed-deps, which causes
            # --changed-deps to be overridden by --binpkg-changed-deps
            ResolverPlaygroundTestCase(
                ["app-misc/A"],
                success=True,
                options={
                    "--binpkg-changed-deps": "n",
                    "--changed-deps": "y",
                    "--usepkg": True,
                },
                mergelist=["[binary]app-misc/A-0"]), )

        playground = ResolverPlayground(debug=False,
                                        ebuilds=ebuilds,
                                        binpkgs=binpkgs,
                                        installed=installed,
                                        world=world)
        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()
示例#58
0
    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 testAutounmaskUseBacktrack(self):
        ebuilds = {
            'dev-libs/A-1': {
                'EAPI': '6',
                'RDEPEND': 'dev-libs/C',
            },
            'dev-libs/A-2': {
                'EAPI': '6',
                'RDEPEND': 'dev-libs/C[y]',
            },
            'dev-libs/A-3': {
                'EAPI': '6',
                'RDEPEND': 'dev-libs/C',
            },
            'dev-libs/B-1': {
                'EAPI': '6',
                'RDEPEND': '<dev-libs/A-3',
            },
            'dev-libs/C-1': {
                'EAPI': '6',
                'IUSE': 'x y z',
            },
            'dev-libs/D-1': {
                'EAPI': '6',
                'RDEPEND': '>=dev-libs/A-2 dev-libs/C[x]',
            },
        }

        installed = {
            'dev-libs/A-1': {
                'EAPI': '6',
                'RDEPEND': 'dev-libs/C',
            },
            'dev-libs/B-1': {
                'EAPI': '6',
                'RDEPEND': '<dev-libs/A-3',
            },
            'dev-libs/C-1': {
                'EAPI': '6',
                'IUSE': 'x y z',
            },
        }

        world = ['dev-libs/B']

        test_cases = (
            # Test bug 632598, where autounmask USE changes triggered
            # unnecessary backtracking. The following case should
            # require a --backtrack setting no larger than 2.
            ResolverPlaygroundTestCase(
                ['dev-libs/D'],
                options={
                    '--autounmask-backtrack': 'y',
                    '--backtrack': 2,
                },
                success=False,
                ambiguous_merge_order=True,
                mergelist=[
                    ('dev-libs/C-1', 'dev-libs/A-2'),
                    'dev-libs/D-1',
                ],
                use_changes={'dev-libs/C-1': {
                    'y': True,
                    'x': True
                }},
            ), )

        playground = ResolverPlayground(ebuilds=ebuilds,
                                        installed=installed,
                                        world=world)

        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()
示例#60
0
    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()