summaryrefslogtreecommitdiffstats
path: root/meta/lib/oeqa/selftest/context.py
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2023-09-21 17:49:25 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2023-09-22 07:45:17 +0100
commit7e6514b28b71f86fa911338e31ec4b284eb8fe46 (patch)
tree39252ae53c371cc47bc9ba1da1f412f7d19bbdbd /meta/lib/oeqa/selftest/context.py
parentfbaa7da33b497088aa352f6cb8dbc02327310cd6 (diff)
downloadpoky-7e6514b28b71f86fa911338e31ec4b284eb8fe46.tar.gz
oeqa: Streamline oe-selftest startup time
"bitbake -e" executions from get_bb_var calls are slow and slow down oe-selftest startup. Rationalise the code to avoid them and minimise the number of "parsing" locations we use by caching key variables and passing them around more. This was particularly problematic with oe-selftest -j usage since it would have multiple bitbake -e executions per process making parallel usage particularly slow. (From OE-Core rev: 3689cadeb07d76e66f97d890e844f899f69666fe) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/lib/oeqa/selftest/context.py')
-rw-r--r--meta/lib/oeqa/selftest/context.py35
1 files changed, 21 insertions, 14 deletions
diff --git a/meta/lib/oeqa/selftest/context.py b/meta/lib/oeqa/selftest/context.py
index 16486e7eb9..5a09aeedff 100644
--- a/meta/lib/oeqa/selftest/context.py
+++ b/meta/lib/oeqa/selftest/context.py
@@ -35,12 +35,13 @@ def get_oeselftest_metadata(args):
35 return result 35 return result
36 36
37class NonConcurrentTestSuite(unittest.TestSuite): 37class NonConcurrentTestSuite(unittest.TestSuite):
38 def __init__(self, suite, processes, setupfunc, removefunc): 38 def __init__(self, suite, processes, setupfunc, removefunc, bb_vars):
39 super().__init__([suite]) 39 super().__init__([suite])
40 self.processes = processes 40 self.processes = processes
41 self.suite = suite 41 self.suite = suite
42 self.setupfunc = setupfunc 42 self.setupfunc = setupfunc
43 self.removefunc = removefunc 43 self.removefunc = removefunc
44 self.bb_vars = bb_vars
44 45
45 def run(self, result): 46 def run(self, result):
46 (builddir, newbuilddir) = self.setupfunc("-st", None, self.suite) 47 (builddir, newbuilddir) = self.setupfunc("-st", None, self.suite)
@@ -79,16 +80,15 @@ class OESelftestTestContext(OETestContext):
79 else: 80 else:
80 self.removebuilddir = removebuilddir 81 self.removebuilddir = removebuilddir
81 82
83 def set_variables(self, vars):
84 self.bb_vars = vars
85
82 def setup_builddir(self, suffix, selftestdir, suite): 86 def setup_builddir(self, suffix, selftestdir, suite):
83 # Get SSTATE_DIR from the parent build dir 87 sstatedir = self.bb_vars['SSTATE_DIR']
84 with bb.tinfoil.Tinfoil(tracking=True) as tinfoil:
85 tinfoil.prepare(quiet=2, config_only=True)
86 d = tinfoil.config_data
87 sstatedir = str(d.getVar('SSTATE_DIR'))
88 88
89 builddir = os.environ['BUILDDIR'] 89 builddir = os.environ['BUILDDIR']
90 if not selftestdir: 90 if not selftestdir:
91 selftestdir = get_test_layer() 91 selftestdir = get_test_layer(self.bb_vars['BBLAYERS'])
92 if self.newbuilddir: 92 if self.newbuilddir:
93 newbuilddir = os.path.join(self.newbuilddir, 'build' + suffix) 93 newbuilddir = os.path.join(self.newbuilddir, 'build' + suffix)
94 else: 94 else:
@@ -155,9 +155,9 @@ class OESelftestTestContext(OETestContext):
155 if processes: 155 if processes:
156 from oeqa.core.utils.concurrencytest import ConcurrentTestSuite 156 from oeqa.core.utils.concurrencytest import ConcurrentTestSuite
157 157
158 return ConcurrentTestSuite(suites, processes, self.setup_builddir, self.removebuilddir) 158 return ConcurrentTestSuite(suites, processes, self.setup_builddir, self.removebuilddir, self.bb_vars)
159 else: 159 else:
160 return NonConcurrentTestSuite(suites, processes, self.setup_builddir, self.removebuilddir) 160 return NonConcurrentTestSuite(suites, processes, self.setup_builddir, self.removebuilddir, self.bb_vars)
161 161
162 def runTests(self, processes=None, machine=None, skips=[]): 162 def runTests(self, processes=None, machine=None, skips=[]):
163 if machine: 163 if machine:
@@ -270,7 +270,7 @@ class OESelftestTestContextExecutor(OETestContextExecutor):
270 270
271 builddir = os.environ.get("BUILDDIR") 271 builddir = os.environ.get("BUILDDIR")
272 self.tc_kwargs['init']['config_paths'] = {} 272 self.tc_kwargs['init']['config_paths'] = {}
273 self.tc_kwargs['init']['config_paths']['testlayer_path'] = get_test_layer() 273 self.tc_kwargs['init']['config_paths']['testlayer_path'] = get_test_layer(bbvars["BBLAYERS"])
274 self.tc_kwargs['init']['config_paths']['builddir'] = builddir 274 self.tc_kwargs['init']['config_paths']['builddir'] = builddir
275 self.tc_kwargs['init']['config_paths']['localconf'] = os.path.join(builddir, "conf/local.conf") 275 self.tc_kwargs['init']['config_paths']['localconf'] = os.path.join(builddir, "conf/local.conf")
276 self.tc_kwargs['init']['config_paths']['bblayers'] = os.path.join(builddir, "conf/bblayers.conf") 276 self.tc_kwargs['init']['config_paths']['bblayers'] = os.path.join(builddir, "conf/bblayers.conf")
@@ -310,10 +310,10 @@ class OESelftestTestContextExecutor(OETestContextExecutor):
310 meta_selftestdir = os.path.join( 310 meta_selftestdir = os.path.join(
311 self.tc.td["BBLAYERS_FETCH_DIR"], 'meta-selftest') 311 self.tc.td["BBLAYERS_FETCH_DIR"], 'meta-selftest')
312 if os.path.isdir(meta_selftestdir): 312 if os.path.isdir(meta_selftestdir):
313 runCmd("bitbake-layers add-layer %s" %meta_selftestdir) 313 runCmd("bitbake-layers add-layer %s" % meta_selftestdir)
314 # reload data is needed because a meta-selftest layer was add 314 # reload data is needed because a meta-selftest layer was add
315 self.tc.td = get_bb_vars() 315 self.tc.td = get_bb_vars()
316 self.tc.config_paths['testlayer_path'] = get_test_layer() 316 self.tc.config_paths['testlayer_path'] = get_test_layer(self.tc.td["BBLAYERS"])
317 else: 317 else:
318 self.tc.logger.error("could not locate meta-selftest in:\n%s" % meta_selftestdir) 318 self.tc.logger.error("could not locate meta-selftest in:\n%s" % meta_selftestdir)
319 raise OEQAPreRun 319 raise OEQAPreRun
@@ -351,8 +351,15 @@ class OESelftestTestContextExecutor(OETestContextExecutor):
351 351
352 _add_layer_libs() 352 _add_layer_libs()
353 353
354 self.tc.logger.info("Running bitbake -e to test the configuration is valid/parsable") 354 self.tc.logger.info("Checking base configuration is valid/parsable")
355 runCmd("bitbake -e") 355
356 with bb.tinfoil.Tinfoil(tracking=True) as tinfoil:
357 tinfoil.prepare(quiet=2, config_only=True)
358 d = tinfoil.config_data
359 vars = {}
360 vars['SSTATE_DIR'] = str(d.getVar('SSTATE_DIR'))
361 vars['BBLAYERS'] = str(d.getVar('BBLAYERS'))
362 self.tc.set_variables(vars)
356 363
357 def get_json_result_dir(self, args): 364 def get_json_result_dir(self, args):
358 json_result_dir = os.path.join(self.tc.td["LOG_DIR"], 'oeqa') 365 json_result_dir = os.path.join(self.tc.td["LOG_DIR"], 'oeqa')