aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYiFei Zhu <zhuyifei1999@gmail.com>2023-06-13 01:08:51 -0700
committerSam James <sam@gentoo.org>2023-06-16 04:34:46 +0100
commitff457f742b513a65e6609054e5310f8beee488ec (patch)
tree53ce18e4f85ac4d11cdba545db9654dd01ed3b00
parentdepgraph: Don't ignore downgrades as missed_updates (diff)
downloadportage-ff457f74.tar.gz
portage-ff457f74.tar.bz2
portage-ff457f74.zip
tests: resolver: Test the broken behavior of Perl rebuild bug
Bug: https://bugs.gentoo.org/463976 Bug: https://bugs.gentoo.org/592880 Bug: https://bugs.gentoo.org/596664 Bug: https://bugs.gentoo.org/631490 Bug: https://bugs.gentoo.org/764365 Bug: https://bugs.gentoo.org/793992 Signed-off-by: YiFei Zhu <zhuyifei1999@gmail.com> Signed-off-by: Sam James <sam@gentoo.org>
-rw-r--r--lib/portage/tests/resolver/test_perl_rebuild_bug.py121
1 files changed, 121 insertions, 0 deletions
diff --git a/lib/portage/tests/resolver/test_perl_rebuild_bug.py b/lib/portage/tests/resolver/test_perl_rebuild_bug.py
new file mode 100644
index 000000000..928fd47d7
--- /dev/null
+++ b/lib/portage/tests/resolver/test_perl_rebuild_bug.py
@@ -0,0 +1,121 @@
+# Copyright 2023 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 PerlRebuildBugTestCase(TestCase):
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+
+ def testPerlRebuildBug(self):
+ """
+ The infamous Perl rebuild bug.
+
+ A non-slotted build-time dependency cycle is created by:
+ dev-lang/perl -> sys-libs/zlib -> sys-devel/automake -> dev-lang/perl
+ Everything else depends on this cycle.
+
+ Bug in solving for smallest cycle causes slot in RDEPEND of
+ dev-perl/Locale-gettext to be ignored, so all dependencies other than
+ perl's >=sys-libs/zlib-1.2.12 are satisfied by already-installed
+ packages. dev-perl/Locale-gettext and sys-devel/automake become leaves
+ of the depgraph after satisfied packages are ignored. They become
+ emerged first. This causes an issue because dev-perl/Locale-gettext is
+ now built before the slot upgrade of dev-lang/perl.
+ """
+ ebuilds = {
+ "dev-lang/perl-5.36.0-r2": {
+ "EAPI": "5",
+ "DEPEND": ">=sys-libs/zlib-1.2.12",
+ "RDEPEND": ">=sys-libs/zlib-1.2.12",
+ "SLOT": "0/5.36",
+ },
+ "dev-perl/Locale-gettext-1.70.0-r1": {
+ "EAPI": "5",
+ "DEPEND": "dev-lang/perl",
+ "RDEPEND": "dev-lang/perl:=",
+ },
+ "sys-apps/help2man-1.49.3": {
+ "EAPI": "5",
+ "DEPEND": "dev-lang/perl dev-perl/Locale-gettext",
+ "RDEPEND": "dev-lang/perl dev-perl/Locale-gettext",
+ },
+ "sys-devel/automake-1.16.5": {
+ "EAPI": "5",
+ "DEPEND": "dev-lang/perl",
+ "RDEPEND": "dev-lang/perl",
+ },
+ "sys-libs/zlib-1.2.13-r1": {
+ "EAPI": "5",
+ "DEPEND": "sys-devel/automake",
+ },
+ }
+
+ installed = {
+ "dev-lang/perl-5.34.0-r3": {
+ "EAPI": "5",
+ "DEPEND": "sys-libs/zlib",
+ "RDEPEND": "sys-libs/zlib",
+ "SLOT": "0/5.34",
+ },
+ "dev-perl/Locale-gettext-1.70.0-r1": {
+ "EAPI": "5",
+ "DEPEND": "dev-lang/perl",
+ "RDEPEND": "dev-lang/perl:0/5.34=",
+ },
+ "sys-apps/help2man-1.48.5": {
+ "EAPI": "5",
+ "DEPEND": "dev-lang/perl dev-perl/Locale-gettext",
+ "RDEPEND": "dev-lang/perl dev-perl/Locale-gettext",
+ },
+ "sys-devel/automake-1.16.4": {
+ "EAPI": "5",
+ "DEPEND": "dev-lang/perl",
+ "RDEPEND": "dev-lang/perl",
+ },
+ "sys-libs/zlib-1.2.11-r4": {
+ "EAPI": "5",
+ "DEPEND": "sys-devel/automake",
+ },
+ }
+
+ world = ["sys-apps/help2man"]
+
+ test_cases = (
+ ResolverPlaygroundTestCase(
+ ["@world"],
+ options={"--deep": True, "--update": True, "--verbose": True},
+ success=True,
+ ambiguous_merge_order=True,
+ merge_order_assertions=(
+ (
+ "dev-perl/Locale-gettext-1.70.0-r1",
+ "dev-lang/perl-5.36.0-r2",
+ ),
+ ),
+ mergelist=[
+ "dev-perl/Locale-gettext-1.70.0-r1",
+ "sys-devel/automake-1.16.5",
+ "sys-libs/zlib-1.2.13-r1",
+ "dev-lang/perl-5.36.0-r2",
+ "sys-apps/help2man-1.49.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()