aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2020-11-27 17:57:14 -0800
committerZac Medico <zmedico@gentoo.org>2020-11-28 12:50:13 -0800
commitb991f23ad915d1fc37088f11ca855c8c8374f5ae (patch)
tree80ac54946ea4f3a63efac8877645d76bdaf7a121 /lib/portage/tests
parentbacktracking: fix virtual choices for circular deps (bug 757306) (diff)
downloadportage-b991f23ad915d1fc37088f11ca855c8c8374f5ae.tar.gz
portage-b991f23ad915d1fc37088f11ca855c8c8374f5ae.tar.bz2
portage-b991f23ad915d1fc37088f11ca855c8c8374f5ae.zip
Allow a package to replace its own buildtime dependency
If a package has a buildtime dependency on a previous version that it will replace, then do not treat it as a slot conflict. This solves inappropriate behavior for dev-lang/rust[system-bootstrap]. This requires adjustments to package selection logic in several locations, in order to ensure that an installed package instance will be selected to satisfy a buildtime dependency when appropriate. Dependencies of the installed package will be entirely ignored, but that has already been the case when using installed package to break cycles, as discussed in bug 199856. Bug: https://bugs.gentoo.org/756793 Bug: https://bugs.gentoo.org/756961 Signed-off-by: Zac Medico <zmedico@gentoo.org>
Diffstat (limited to 'lib/portage/tests')
-rw-r--r--lib/portage/tests/resolver/test_circular_choices_rust.py94
1 files changed, 94 insertions, 0 deletions
diff --git a/lib/portage/tests/resolver/test_circular_choices_rust.py b/lib/portage/tests/resolver/test_circular_choices_rust.py
new file mode 100644
index 000000000..612f76c48
--- /dev/null
+++ b/lib/portage/tests/resolver/test_circular_choices_rust.py
@@ -0,0 +1,94 @@
+# Copyright 2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+from portage.tests import TestCase
+from portage.tests.resolver.ResolverPlayground import (
+ ResolverPlayground,
+ ResolverPlaygroundTestCase,
+)
+
+
+class CircularRustTestCase(TestCase):
+ def testCircularPypyExe(self):
+
+ ebuilds = {
+ "dev-lang/rust-1.47.0-r2": {
+ "EAPI": "7",
+ "SLOT": "stable/1.47",
+ "BDEPEND": "|| ( =dev-lang/rust-1.46* =dev-lang/rust-bin-1.46* =dev-lang/rust-1.47* =dev-lang/rust-bin-1.47* )",
+ },
+ "dev-lang/rust-1.46.0": {
+ "EAPI": "7",
+ "SLOT": "stable/1.46",
+ "BDEPEND": "|| ( =dev-lang/rust-1.45* =dev-lang/rust-bin-1.45* =dev-lang/rust-1.46* =dev-lang/rust-bin-1.46* )",
+ },
+ "dev-lang/rust-bin-1.47.0": {
+ "EAPI": "7",
+ },
+ "dev-lang/rust-bin-1.46.0": {
+ "EAPI": "7",
+ },
+ }
+
+ installed = {
+ "dev-lang/rust-1.46.0": {
+ "EAPI": "7",
+ "SLOT": "stable/1.46",
+ "BDEPEND": "|| ( =dev-lang/rust-1.45* =dev-lang/rust-bin-1.45* =dev-lang/rust-1.46* =dev-lang/rust-bin-1.46* )",
+ },
+ }
+
+ test_cases = (
+ # Test bug 756961, where a circular dependency was reported
+ # when a package would replace its own builtime dependency.
+ # This needs to be tested with and without --update, since
+ # that affects package selection logic significantly,
+ # expecially for packages given as arguments.
+ ResolverPlaygroundTestCase(
+ ["=dev-lang/rust-1.46*"],
+ mergelist=["dev-lang/rust-1.46.0"],
+ success=True,
+ ),
+ ResolverPlaygroundTestCase(
+ ["=dev-lang/rust-1.46*"],
+ options={"--update": True},
+ mergelist=[],
+ success=True,
+ ),
+ ResolverPlaygroundTestCase(
+ ["=dev-lang/rust-1.46*"],
+ options={"--deep": True, "--update": True},
+ mergelist=[],
+ success=True,
+ ),
+ ResolverPlaygroundTestCase(
+ ["dev-lang/rust"],
+ mergelist=["dev-lang/rust-1.47.0-r2"],
+ success=True,
+ ),
+ ResolverPlaygroundTestCase(
+ ["dev-lang/rust"],
+ options={"--update": True},
+ mergelist=["dev-lang/rust-1.47.0-r2"],
+ success=True,
+ ),
+ ResolverPlaygroundTestCase(
+ ["@world"],
+ options={"--deep": True, "--update": True},
+ mergelist=["dev-lang/rust-1.47.0-r2"],
+ success=True,
+ ),
+ )
+
+ world = ["dev-lang/rust"]
+
+ 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.debug = False
+ playground.cleanup()