aboutsummaryrefslogtreecommitdiff
blob: c8db65d3458162c650cce1b94151d8d1c00efe90 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# Copyright 2020-2021 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
from portage.util.futures import asyncio
from portage.util.futures.executor.fork import ForkExecutor


class AuxdbTestCase(TestCase):

	def test_anydbm(self):
		try:
			from portage.cache.anydbm import database
		except ImportError:
			self.skipTest('dbm import failed')
		self._test_mod('portage.cache.anydbm.database', multiproc=False)

	def test_flat_hash_md5(self):
		self._test_mod('portage.cache.flat_hash.md5_database')

	def test_volatile(self):
		self._test_mod('portage.cache.volatile.database', multiproc=False)

	def test_sqite(self):
		try:
			import sqlite3
		except ImportError:
			self.skipTest('sqlite3 import failed')
		self._test_mod('portage.cache.sqlite.database')

	def _test_mod(self, auxdbmodule, multiproc=True):
		ebuilds = {
			"cat/A-1": {
				"EAPI": "7",
				"MISC_CONTENT": "inherit foo",
			},
			"cat/B-1": {
				"EAPI": "7",
				"MISC_CONTENT": "inherit foo",
			},
		}

		ebuild_inherited = frozenset(["bar", "foo"])
		eclass_defined_phases = "prepare"
		eclass_depend = "bar/foo"

		eclasses = {
			"foo": (
				"inherit bar",
			),
			"bar": (
				"EXPORT_FUNCTIONS src_prepare",
				"DEPEND=\"{}\"".format(eclass_depend),
				"bar_src_prepare() { default; }",
			),
		}

		playground = ResolverPlayground(ebuilds=ebuilds, eclasses=eclasses,
			user_config={'modules': ('portdbapi.auxdbmodule = %s' % auxdbmodule,)})

		portdb = playground.trees[playground.eroot]["porttree"].dbapi

		def test_func():
			loop = asyncio._wrap_loop()
			return loop.run_until_complete(self._test_mod_async(
				ebuilds, ebuild_inherited, eclass_defined_phases, eclass_depend, portdb))

		self.assertTrue(test_func())

		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

		if multiproc:
			loop.run_until_complete(loop.run_in_executor(ForkExecutor(), modify_auxdb))
		else:
			modify_auxdb()

		self.assertEqual(auxdb[cpv]['RESTRICT'], 'test')

	async def _test_mod_async(self, ebuilds, ebuild_inherited, eclass_defined_phases, eclass_depend, portdb):

		for cpv, metadata in ebuilds.items():
			defined_phases, depend, eapi, inherited = await portdb.async_aux_get(cpv, ['DEFINED_PHASES', 'DEPEND', 'EAPI', 'INHERITED'])
			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