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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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 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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
def testManifest(self): distfiles = { 'B-2.tar.bz2': b'binary\0content', 'C-2.zip': b'binary\0content', 'C-2.tar.bz2': b'binary\0content', } ebuilds = { "dev-libs/A-1::old_repo": {}, "dev-libs/A-2::new_repo": {}, "dev-libs/B-2::new_repo": { "SRC_URI": "B-2.tar.bz2" }, "dev-libs/C-2::new_repo": { "SRC_URI": "C-2.zip C-2.tar.bz2" }, } repo_configs = { "new_repo": { "layout.conf": ("profile-formats = pms", "thin-manifests = true", "manifest-hashes = SHA256 SHA512 WHIRLPOOL", "manifest-required-hashes = SHA512", "# use implicit masters"), } } test_cases = ( ResolverPlaygroundTestCase(["=dev-libs/A-1"], mergelist=["dev-libs/A-1"], success=True), ResolverPlaygroundTestCase(["=dev-libs/A-2"], mergelist=["dev-libs/A-2"], success=True), ) playground = ResolverPlayground(ebuilds=ebuilds, repo_configs=repo_configs, distfiles=distfiles) settings = playground.settings new_repo_config = settings.repositories["new_repo"] old_repo_config = settings.repositories["old_repo"] self.assertTrue( len(new_repo_config.masters) > 0, "new_repo has no default master") self.assertEqual( new_repo_config.masters[0].location, playground.settings.repositories["test_repo"].location, "new_repo default master is not test_repo") self.assertEqual(new_repo_config.thin_manifest, True, "new_repo_config.thin_manifest != True") new_manifest_file = os.path.join(new_repo_config.location, "dev-libs", "A", "Manifest") self.assertNotExists(new_manifest_file) new_manifest_file = os.path.join(new_repo_config.location, "dev-libs", "B", "Manifest") f = open(new_manifest_file) self.assertEqual(len(list(f)), 1) f.close() new_manifest_file = os.path.join(new_repo_config.location, "dev-libs", "C", "Manifest") f = open(new_manifest_file) self.assertEqual(len(list(f)), 2) f.close() old_manifest_file = os.path.join(old_repo_config.location, "dev-libs", "A", "Manifest") f = open(old_manifest_file) self.assertEqual(len(list(f)), 1) f.close() try: for test_case in test_cases: playground.run_TestCase(test_case) self.assertEqual(test_case.test_success, True, test_case.fail_msg) finally: playground.cleanup()
def 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()
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()
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()