diff options
Diffstat (limited to 'lib/portage/tests/dbapi/test_auxdb.py')
-rw-r--r-- | lib/portage/tests/dbapi/test_auxdb.py | 123 |
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 |