aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/portage/tests/dbapi/test_auxdb.py')
-rw-r--r--lib/portage/tests/dbapi/test_auxdb.py123
1 files changed, 79 insertions, 44 deletions
diff --git a/lib/portage/tests/dbapi/test_auxdb.py b/lib/portage/tests/dbapi/test_auxdb.py
index 41ca4936b..aac6ce361 100644
--- a/lib/portage/tests/dbapi/test_auxdb.py
+++ b/lib/portage/tests/dbapi/test_auxdb.py
@@ -1,6 +1,9 @@
-# Copyright 2020-2021 Gentoo Authors
+# Copyright 2020-2024 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
+import functools
+import multiprocessing
+
from portage.tests import TestCase
from portage.tests.resolver.ResolverPlayground import ResolverPlayground
from portage.util.futures import asyncio
@@ -13,7 +16,7 @@ class AuxdbTestCase(TestCase):
from portage.cache.anydbm import database
except ImportError:
self.skipTest("dbm import failed")
- self._test_mod("portage.cache.anydbm.database", multiproc=False)
+ self._test_mod("portage.cache.anydbm.database", multiproc=False, picklable=True)
def test_flat_hash_md5(self):
self._test_mod("portage.cache.flat_hash.md5_database")
@@ -26,9 +29,9 @@ class AuxdbTestCase(TestCase):
import sqlite3
except ImportError:
self.skipTest("sqlite3 import failed")
- self._test_mod("portage.cache.sqlite.database")
+ self._test_mod("portage.cache.sqlite.database", picklable=True)
- def _test_mod(self, auxdbmodule, multiproc=True):
+ def _test_mod(self, auxdbmodule, multiproc=True, picklable=True):
ebuilds = {
"cat/A-1": {
"EAPI": "7",
@@ -48,7 +51,7 @@ class AuxdbTestCase(TestCase):
"foo": ("inherit bar",),
"bar": (
"EXPORT_FUNCTIONS src_prepare",
- 'DEPEND="{}"'.format(eclass_depend),
+ f'DEPEND="{eclass_depend}"',
"bar_src_prepare() { default; }",
),
}
@@ -56,60 +59,92 @@ class AuxdbTestCase(TestCase):
playground = ResolverPlayground(
ebuilds=ebuilds,
eclasses=eclasses,
- user_config={"modules": ("portdbapi.auxdbmodule = %s" % auxdbmodule,)},
+ user_config={"modules": (f"portdbapi.auxdbmodule = {auxdbmodule}",)},
)
- portdb = playground.trees[playground.eroot]["porttree"].dbapi
+ try:
+ portdb = playground.trees[playground.eroot]["porttree"].dbapi
+ metadata_keys = ["DEFINED_PHASES", "DEPEND", "EAPI", "INHERITED"]
+
+ test_func = functools.partial(
+ self._run_test_mod_async, ebuilds, metadata_keys, portdb
+ )
+
+ results = test_func()
+
+ self._compare_results(
+ ebuilds, eclass_defined_phases, eclass_depend, ebuild_inherited, results
+ )
- def test_func():
loop = asyncio._wrap_loop()
- return loop.run_until_complete(
- self._test_mod_async(
+ picklable_or_fork = picklable or multiprocessing.get_start_method == "fork"
+ if picklable_or_fork:
+ results = loop.run_until_complete(
+ loop.run_in_executor(ForkExecutor(), test_func)
+ )
+
+ self._compare_results(
ebuilds,
- ebuild_inherited,
eclass_defined_phases,
eclass_depend,
- portdb,
+ ebuild_inherited,
+ results,
)
- )
- self.assertTrue(test_func())
+ auxdb = portdb.auxdb[portdb.getRepositoryPath("test_repo")]
+ cpv = next(iter(ebuilds))
- loop = asyncio._wrap_loop()
- self.assertTrue(
- loop.run_until_complete(loop.run_in_executor(ForkExecutor(), test_func))
- )
-
- auxdb = portdb.auxdb[portdb.getRepositoryPath("test_repo")]
- cpv = next(iter(ebuilds))
-
- def modify_auxdb():
- metadata = auxdb[cpv]
- metadata["RESTRICT"] = "test"
- try:
- del metadata["_eclasses_"]
- except KeyError:
- pass
- auxdb[cpv] = metadata
+ modify_auxdb = functools.partial(self._modify_auxdb, auxdb, cpv)
- if multiproc:
- loop.run_until_complete(loop.run_in_executor(ForkExecutor(), modify_auxdb))
- else:
- modify_auxdb()
+ if multiproc and picklable_or_fork:
+ loop.run_until_complete(
+ loop.run_in_executor(ForkExecutor(), modify_auxdb)
+ )
+ else:
+ modify_auxdb()
- self.assertEqual(auxdb[cpv]["RESTRICT"], "test")
+ self.assertEqual(auxdb[cpv]["RESTRICT"], "test")
+ finally:
+ playground.cleanup()
- async def _test_mod_async(
- self, ebuilds, ebuild_inherited, eclass_defined_phases, eclass_depend, portdb
+ def _compare_results(
+ self, ebuilds, eclass_defined_phases, eclass_depend, ebuild_inherited, results
):
+ for cpv, metadata in ebuilds.items():
+ self.assertEqual(results[cpv]["DEFINED_PHASES"], eclass_defined_phases)
+ self.assertEqual(results[cpv]["DEPEND"], eclass_depend)
+ self.assertEqual(results[cpv]["EAPI"], metadata["EAPI"])
+ self.assertEqual(
+ frozenset(results[cpv]["INHERITED"].split()), ebuild_inherited
+ )
+ @staticmethod
+ def _run_test_mod_async(ebuilds, metadata_keys, portdb):
+ loop = asyncio._wrap_loop()
+ return loop.run_until_complete(
+ AuxdbTestCase._test_mod_async(
+ ebuilds,
+ metadata_keys,
+ portdb,
+ )
+ )
+
+ @staticmethod
+ async def _test_mod_async(ebuilds, metadata_keys, portdb):
+ results = {}
for cpv, metadata in ebuilds.items():
- defined_phases, depend, eapi, inherited = await portdb.async_aux_get(
- cpv, ["DEFINED_PHASES", "DEPEND", "EAPI", "INHERITED"]
+ results[cpv] = dict(
+ zip(metadata_keys, await portdb.async_aux_get(cpv, metadata_keys))
)
- self.assertEqual(defined_phases, eclass_defined_phases)
- self.assertEqual(depend, eclass_depend)
- self.assertEqual(eapi, metadata["EAPI"])
- self.assertEqual(frozenset(inherited.split()), ebuild_inherited)
- return True
+ return results
+
+ @staticmethod
+ def _modify_auxdb(auxdb, cpv):
+ metadata = auxdb[cpv]
+ metadata["RESTRICT"] = "test"
+ try:
+ del metadata["_eclasses_"]
+ except KeyError:
+ pass
+ auxdb[cpv] = metadata