oeqa core and oe-selftest threaded enablement
v2 cover oeqa core and oe-selftest threaded enablement
The v2 address comments did by Patrick about add better explanation on the commit messages and some typos.
Other interesting information to add is that with this series we will able to execute oe-selftest in around half [1] of the original time [2], (9406.782s vs 17303.014s).
[1] https://bugzilla.yoctoproject.org/attachment.cgi?id=3863
[2] https://bugzilla.yoctoproject.org/attachment.cgi?id=3864
This series is to enable oe-selftest threaded runs along some fixes,
* Implementation of main/end thread usage in oeqa threaded
* Adaptation of oe-selftest cases to be able to run in threaded env, ** Usage of own build directory by Test class.
** Mark the test modules that are enabled to run into a thread. ** Split some test modules because aren't support run into a thread
due to bitbake/tinfoil constraints.
The oe-selftest script now has an cmdline option (-t) to enable threaded runs, by default is set to 1, this needs to be set manually because depending on HW resources available can cause ran out of cpu/memory.
By default the oe-selftest cases runs on the main thread and uses the main build directory for compatibility purposes.
The following changes since commit 81498aac9560fbeaeb58eaada32ce80e0ea51628:
yocto-project-qs: Updated Next Steps list (2017-07-12 00:28:16 +0100)
are available in the git repository at:
git://git.yoctoproject.org/poky-contrib alimon/oe_selftest_threaded
http://git.yoctoproject.org/cgit.cgi/poky-contrib/log/?h=alimon/oe_selftest_threaded
Aníbal Limón (29):
oeqa/core/loader: Switch method definition for _make_failed_test oeqa/selftest/{context,case}: Handle KeyboardInterrupt/SIGINT and
SIGTERM
selftest/cases/package: Call parent setUpClass method bb/tinfoil: run_command handle busy status in bitbake server oe/copy_buildsystem: check_sstate_task_list also pop BBPATH from env oeqa/core/threaded: Enable support to use the main thread oeqa/core/threaded: Add support to run into a thread at end of
execution
oeqa/core/threaded: logSummary add skipped tests info oeqa/core/tests: Update test_loader threaded to cover main thread
usage
oeqa/selftest/{case,context}: Add builddir by test class and context oeqa/selftest/case: Add wrappers to utils.commands modules oeqa/selftest/case: Creates meta-selftest layer per class oeqa/selftest/case: tearDown extra commands print what actually fails oeqa/selftest/case: Support bitbake memres mode in per build directory oeqa/selftest/cases: Use testlayer_path instead of call
get_test_layer()
oeqa/selftest/cases: Use builddir from class instead of get from
environment
oeqa/selftest/cases: Use wrapper methods from OESelfTestCase class oeqa/selftest/cases: imagefeatures enable threaded runs oeqa/selftest/cases: runqemu enable threaded runs oeqa/selftest/cases: runtime enable threaded runs oeqa/selftest/cases: eSDK enable threaded runs oeqa/selftest/cases: devtool enable threaded runs oeqa/selftest/cases: recipetool enable for threaded runs oeqa/selftest/cases: Move devtool deploy test case to own module selftest/cases/devtool{,end}: Move update/finish_modify tests to its
own module
seltest/cases/devtool: Build dbus on test_devtool_add_git_local
argparse_oe: Add int_positive type
oeqa/selftest/context: Enable support for threaded runs oeqa/selftest/cases: systemd_boot enable threaded runs
bitbake/lib/bb/tinfoil.py | 23 +- .../lib/oeqa/selftest/cases/systemd_boot.py | 26 +- meta/lib/oe/copy_buildsystem.py | 1 + meta/lib/oeqa/core/loader.py | 4 +- meta/lib/oeqa/core/tests/test_loader.py | 17 +- meta/lib/oeqa/core/threaded.py | 169 +++- meta/lib/oeqa/selftest/case.py | 251 ++++- .../lib/oeqa/selftest/cases/_sstatetests_noauto.py | 23 +- meta/lib/oeqa/selftest/cases/archiver.py | 21 +- meta/lib/oeqa/selftest/cases/bblayers.py | 45 +- meta/lib/oeqa/selftest/cases/bbtests.py | 103 +- meta/lib/oeqa/selftest/cases/buildhistory.py | 9 +- meta/lib/oeqa/selftest/cases/buildoptions.py | 51 +- meta/lib/oeqa/selftest/cases/containerimage.py | 9 +- meta/lib/oeqa/selftest/cases/devtool.py | 1014 +++++--------------- meta/lib/oeqa/selftest/cases/devtool_deploy.py | 93 ++ meta/lib/oeqa/selftest/cases/devtool_end.py | 506 ++++++++++ meta/lib/oeqa/selftest/cases/distrodata.py | 7 +- meta/lib/oeqa/selftest/cases/eSDK.py | 61 +- meta/lib/oeqa/selftest/cases/image_typedep.py | 8 +- meta/lib/oeqa/selftest/cases/imagefeatures.py | 78 +- meta/lib/oeqa/selftest/cases/imagefeatures_boot.py | 63 ++ meta/lib/oeqa/selftest/cases/layerappend.py | 22 +- meta/lib/oeqa/selftest/cases/liboe.py | 13 +- meta/lib/oeqa/selftest/cases/lic_checksum.py | 8 +- meta/lib/oeqa/selftest/cases/manifest.py | 13 +- meta/lib/oeqa/selftest/cases/oelib/buildhistory.py | 7 +- meta/lib/oeqa/selftest/cases/oescripts.py | 5 +- meta/lib/oeqa/selftest/cases/package.py | 12 +- meta/lib/oeqa/selftest/cases/pkgdata.py | 73 +- meta/lib/oeqa/selftest/cases/prservice.py | 19 +- meta/lib/oeqa/selftest/cases/recipetool.py | 105 +- meta/lib/oeqa/selftest/cases/runqemu.py | 7 +- meta/lib/oeqa/selftest/cases/runtime_test.py | 225 +---- .../lib/oeqa/selftest/cases/runtime_test_export.py | 104 ++ .../oeqa/selftest/cases/runtime_test_postinsts.py | 114 +++ meta/lib/oeqa/selftest/cases/signing.py | 40 +- meta/lib/oeqa/selftest/cases/sstate.py | 5 +- meta/lib/oeqa/selftest/cases/sstatetests.py | 51 +- meta/lib/oeqa/selftest/context.py | 137 ++- scripts/lib/argparse_oe.py | 7 + 41 files changed, 1997 insertions(+), 1552 deletions(-) create mode 100644 meta/lib/oeqa/selftest/cases/devtool_deploy.py create mode 100644 meta/lib/oeqa/selftest/cases/devtool_end.py create mode 100644 meta/lib/oeqa/selftest/cases/imagefeatures_boot.py create mode 100644 meta/lib/oeqa/selftest/cases/runtime_test_export.py create mode 100644 meta/lib/oeqa/selftest/cases/runtime_test_postinsts.py
Signature · 1 line
2.11.0
PATCH v2 1/29 oeqa/core/loader: Switch method definition for _make_failed_test
This was a mistake of me to define wrong what methods needs to be defined by certain python version.
See rev d8380d098a290510b442a7abd2dd5a50cabf5844.
--- meta/lib/oeqa/core/loader.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
meta/lib/oeqa/core/loader.py +2 -2
@@ -13,7 +13,7 @@ from oeqa.core.decorator import decoratorClasses, OETestDecorator, \ OETestFilter, OETestDiscover if sys.version_info >= (3,4,4): - def _make_failed_test(classname, methodname, exception, suiteClass): + def _make_failed_test(classname, exception, suiteClass): """ When loading tests, the unittest framework stores any exceptions and displays them only when the 'run' method is called.
@@ -23,7 +23,7 @@ if sys.version_info >= (3,4,4): """ raise exception else: - def _make_failed_test(classname, exception, suiteClass): + def _make_failed_test(classname, methodname, exception, suiteClass): raise exception unittest.loader._make_failed_test = _make_failed_test
Signature · 1 line
2.11.0
PATCH v2 2/29 oeqa/selftest/{context, case}: Handle KeyboardInterrupt/SIGINT and SIGTERM
In reply to Aníbal LimónIn order to avoid corrupt local.conf and bblayers.conf adds signal handler for SIGTERM and use try/finally (KeyboardIntrrupt) block to restore previously backuped configuration.
[YOCTO #11650]
--- meta/lib/oeqa/selftest/case.py | 36 +++++++------ meta/lib/oeqa/selftest/context.py | 107 +++++++++++++++++++++++++++----------- 2 files changed, 97 insertions(+), 46 deletions(-)
meta/lib/oeqa/selftest/case.py +21 -15
@@ -13,28 +13,34 @@ from oeqa.utils.commands import runCmd, bitbake, get_bb_var from oeqa.core.case import OETestCase class OESelftestTestCase(OETestCase): - builddir = os.environ.get("BUILDDIR") or "" - localconf_path = os.path.join(builddir, "conf/local.conf") - localconf_backup = os.path.join(builddir, "conf/local.bk") - testinc_path = os.path.join(builddir, "conf/selftest.inc") - local_bblayers_path = os.path.join(builddir, "conf/bblayers.conf") - local_bblayers_backup = os.path.join(builddir, "conf/bblayers.bk") - testinc_bblayers_path = os.path.join(builddir, "conf/bblayers.inc") - machineinc_path = os.path.join(builddir, "conf/machine.inc") - def __init__(self, methodName="runTest"): self._extra_tear_down_commands = [] - self._track_for_cleanup = [ - self.testinc_path, self.testinc_bblayers_path, - self.machineinc_path, self.localconf_backup, - self.local_bblayers_backup] - super(OESelftestTestCase, self).__init__(methodName) @classmethod def setUpClass(cls): super(OESelftestTestCase, cls).setUpClass() - cls.testlayer_path = cls.tc.testlayer_path + + cls.testlayer_path = cls.tc.config_paths['testlayer_path'] + cls.builddir = cls.tc.config_paths['builddir'] + + cls.localconf_path = cls.tc.config_paths['localconf'] + cls.localconf_backup = cls.tc.config_paths['localconf_class_backup'] + cls.local_bblayers_path = cls.tc.config_paths['bblayers'] + cls.local_bblayers_backup = cls.tc.config_paths['bblayers_class_backup'] + + cls.testinc_path = os.path.join(cls.tc.config_paths['builddir'], + "conf/selftest.inc") + cls.testinc_bblayers_path = os.path.join(cls.tc.config_paths['builddir'], + "conf/bblayers.inc") + cls.machineinc_path = os.path.join(cls.tc.config_paths['builddir'], + "conf/machine.inc") + + cls._track_for_cleanup = [ + cls.testinc_path, cls.testinc_bblayers_path, + cls.machineinc_path, cls.localconf_backup, + cls.local_bblayers_backup] + cls.add_include() @classmethod
meta/lib/oeqa/selftest/context.py +76 -31
150 lines not on this page · raw message
Signature · 1 line
2.11.0
PATCH v2 3/29 selftest/cases/package: Call parent setUpClass method
In reply to Aníbal LimónSince config paths are now passed in Test context the setUpClass method is expected to be call.
--- meta/lib/oeqa/selftest/cases/package.py | 2 ++ 1 file changed, 2 insertions(+)
meta/lib/oeqa/selftest/cases/package.py +2 -0
@@ -17,6 +17,8 @@ class VersionOrdering(OESelftestTestCase): @classmethod def setUpClass(cls): + super().setUpClass() + # Build the tools we need and populate a sysroot bitbake("dpkg-native opkg-native rpm-native python3-native") bitbake("build-sysroots -c build_native_sysroot")
Signature · 1 line
2.11.0
PATCH v2 4/29 bb/tinfoil: run_command handle busy status in bitbake server
In reply to Aníbal LimónWhen tinfoil request a command to bitbake is handled in async manner [1], sometimes is this ends on return a Busy status.
This is a workaround a needs to be fixed in proper manner inside bitbake code.
For example when running clientComplete and buildFile is on progress,
ERROR: Function failed: base_do_unpack
Traceback (most recent call last):
File "/home/alimon/repos/poky/scripts/lib/devtool/standard.py", line
797, in modify
initial_rev = _extract_source(srctree, args.keep_temp, args.branch,
False, rd, tinfoil)
File "/home/alimon/repos/poky/scripts/lib/devtool/standard.py", line
562, in _extract_source
runtask(fn, 'unpack')
File "/home/alimon/repos/poky/scripts/lib/devtool/standard.py", line
552, in runtask
raise DevtoolError('Task do_%s failed' % task)
devtool.DevtoolError: Task do_unpack failed
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/alimon/repos/poky/scripts/devtool", line 351, in <module>
ret = main()
File "/home/alimon/repos/poky/scripts/devtool", line 338, in main
ret = args.func(args, config, basepath, workspace)
File "/home/alimon/repos/poky/scripts/lib/devtool/standard.py", line
864, in modify
tinfoil.shutdown()
File "/home/alimon/repos/poky/bitbake/lib/bb/tinfoil.py", line 427, in
shutdown
self.run_command('clientComplete')
File "/home/alimon/repos/poky/bitbake/lib/bb/tinfoil.py", line 320, in
run_command
raise TinfoilCommandFailed(result[1])
bb.tinfoil.TinfoilCommandFailed: Busy (buildFile in progress)
--- bitbake/lib/bb/tinfoil.py | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-)
bitbake/lib/bb/tinfoil.py +19 -4
@@ -21,6 +21,7 @@ import os import sys import atexit import re +import time from collections import OrderedDict, defaultdict import bb.cache
@@ -298,7 +299,7 @@ class Tinfoil: config_params = TinfoilConfigParameters(config_only=False) self.run_actions(config_params) - def run_command(self, command, *params): + def run_command(self, command, *params, ntries=0): """ Run a command on the server (as implemented in bb.command). Note that there are two types of command - synchronous and
@@ -315,9 +316,23 @@ class Tinfoil: commandline = [command] if params: commandline.extend(params) - result = self.server_connection.connection.runCommand(commandline) - if result[1]: + + # XXX: Tinfoil commands are run by Cooker in async mode so gives + # some time to get done. + result = None + while True: + result = self.server_connection.connection.runCommand(commandline) + if not result[1]: + break + elif ntries == 0: + break + elif 'Busy' in result[1]: + ntries = ntries - 1 + time.sleep(1) + continue + raise TinfoilCommandFailed(result[1]) + return result[0] def set_event_mask(self, eventlist):
@@ -424,7 +439,7 @@ class Tinfoil: def shutdown(self): if self.server_connection: - self.run_command('clientComplete') + self.run_command('clientComplete', ntries=1) _server_connections.remove(self.server_connection) bb.event.ui_queue = [] self.server_connection.terminate()
Signature · 1 line
2.11.0
PATCH v2 5/29 oe/copy_buildsystem: check_sstate_task_list also pop BBPATH from env
In reply to Aníbal LimónThe BBPATH environment could be set and can make a failure when try to build an extensible sdk because it will look the bitbake.lock file in the original build folder.
Example:
$ export BBPATH=`pwd` $ bitbake core-image-minimal -c populate_sdk_ext
ERROR: bitbake failed:
ERROR: Only one copy of bitbake should be run against a build directory
ERROR: core-image-minimal-1.0-r0 do_populate_sdk_ext: Function failed:copy_buildsystem
--- meta/lib/oe/copy_buildsystem.py | 1 + 1 file changed, 1 insertion(+)
meta/lib/oe/copy_buildsystem.py +1 -0
@@ -239,6 +239,7 @@ def check_sstate_task_list(d, targets, filteroutfile, cmdprefix='', cwd=None, lo cmd = "%sBB_SETSCENE_ENFORCE=1 PSEUDO_DISABLED=1 oe-check-sstate %s -s -o %s %s" % (cmdprefix, targets, filteroutfile, logparam) env = dict(d.getVar('BB_ORIGENV', False)) env.pop('BUILDDIR', '') + env.pop('BBPATH', '') pathitems = env['PATH'].split(':') env['PATH'] = ':'.join([item for item in pathitems if not item.endswith('/bitbake/bin')]) bb.process.run(cmd, stderr=subprocess.STDOUT, env=env, cwd=cwd, executable='/bin/bash')
Signature · 1 line
2.11.0
PATCH v2 6/29 oeqa/core/threaded: Enable support to use the main thread
In reply to Aníbal LimónSome test cases needs to be executed by the main thread for several resons, this implmentation enables usage of the main thread to execute suites.
The rules are if some test case request by test class attr _main_thread it will be executed, if no tests are scheduled to be executed into the main thread the algorithm with take the first suite in the pool, finallay this will avoid thread usage if only one suite needs to be executed.
--- meta/lib/oeqa/core/threaded.py | 104 ++++++++++++++++++++++++++++++++--------- 1 file changed, 83 insertions(+), 21 deletions(-)
meta/lib/oeqa/core/threaded.py +83 -21
@@ -27,9 +27,42 @@ class OETestLoaderThreaded(OETestLoader): self.process_num = min(multiprocessing.cpu_count(), len(suite._tests)) - suites = [] - for _ in range(self.process_num): - suites.append(self.suiteClass()) + suites = {} + suites['main'] = self.suiteClass() + suites['pool'] = [] + for _ in range(self.process_num - 1): + suites['pool'].append(self.suiteClass()) + + def _add_to_main_thread(main_suite, case, depends): + """ + Some test cases needs to be run into the main + thread for several resons. + + A test case that needs to run in the main thread + can be for specific set via test class _main_thread + attr or because is on the same module or for a dependency + reason. + """ + + if hasattr(case.__class__, '_main_thread') and \ + case.__class__._main_thread or \ + self.process_num == 1: + main_suite.addTest(case) + return True + + for c in main_suite._tests: + if case.__module__ == c.__module__: + main_suite.addTest(case) + return True + + if case.id() in depends: + case_depends = depends[case.id()] + for c in main_suite._tests: + if c.id() in case_depends: + main_suite.addTest(case) + return True + + return False def _search_for_module_idx(suites, case): """
@@ -37,8 +70,7 @@ class OETestLoaderThreaded(OETestLoader): in the same thread because PyUnit keeps track of setUp{Module, Class,} and tearDown{Module, Class,}. """ - - for idx in range(self.process_num): + for idx in range(self.process_num - 1): suite = suites[idx] for c in suite._tests: if case.__module__ == c.__module__:
@@ -53,7 +85,7 @@ class OETestLoaderThreaded(OETestLoader): of dependant test to figure out if skip or not. """ - for idx in range(self.process_num): + for idx in range(self.process_num - 1): suite = suites[idx] for case in suite._tests:
@@ -62,6 +94,11 @@ class OETestLoaderThreaded(OETestLoader): return -1 def _get_best_idx(suites): + """ + The best index is selected to the suite that has + minor test cases to run. + """ + sizes = [len(suite._tests) for suite in suites] return sizes.index(min(sizes))
@@ -71,27 +108,35 @@ class OETestLoaderThreaded(OETestLoader): if isinstance(case, TestSuite): _fill_suites(case) else: - idx = _search_for_module_idx(suites, case) - depends = {} if 'depends' in self.tc._registry: depends = self.tc._registry['depends'] + if _add_to_main_thread(suites['main'], case, depends): + continue + + # Get the best index in the suite pool to add the case + idx = _search_for_module_idx(suites['pool'], case) if idx == -1 and case.id() in depends: case_depends = depends[case.id()] - idx = _search_for_depend_idx(suites, case_depends) - + idx = _search_for_depend_idx(suites['pool'], case_depends) if idx == -1: - idx = _get_best_idx(suites) + idx = _get_best_idx(suites['pool']) + suites['pool'][idx].addTest(case) - suites[idx].addTest(case) _fill_suites(suite) - suites_tmp = suites - suites = [] + # clean suites in pool without test cases + suites_tmp = suites['pool'] + suites['pool'] = [] for suite in suites_tmp: if len(suite._tests) > 0: - suites.append(suite) + suites['pool'].append(suite) + + # if the main suite doesn't have test cases + # use the first element of the suites pool + if not len(suites['main']._tests): + suites['main'] = suites['pool'].pop(0) return suites
@@ -251,16 +296,33 @@ class OETestRunnerThreaded(OETestRunner): def run(self, suites): result = OETestResultThreaded(self.tc) - pool = _ThreadedPool(len(suites), len(suites), stream=self.stream, - result=result) - for s in suites: - pool.add_task(super(OETestRunnerThreaded, self).run, s) - pool.start() - pool.wait_completion() + pool = None + if suites['pool']: + thread_no = len(suites['pool']) + pool = _ThreadedPool(thread_no, thread_no, stream=self.stream, + result=result) + for s in suites['pool']: + pool.add_task(super(OETestRunnerThreaded, self).run, s) + pool.start() + + run_start_time = time.time() + rc = super(OETestRunnerThreaded, self).run(suites['main']) + run_end_time = time.time() + result.addResult(rc, run_start_time, run_end_time) + self.stream.finish() + + if pool: + pool.wait_completion() result._fill_tc_results() return result + def list_tests(self, suite, display_type): + suite['pool'].insert(0, suite['main']) + + return super(OETestRunnerThreaded, self).list_tests( + suite['pool'], display_type) + class OETestContextThreaded(OETestContext): loaderClass = OETestLoaderThreaded runnerClass = OETestRunnerThreaded
Signature · 1 line
2.11.0
PATCH v2 7/29 oeqa/core/threaded: Add support to run into a thread at end of execution
In reply to Aníbal LimónSome test cases aren't allowed to run into a multi-thread environment so add the posibility to run those tests at end of execution.
--- meta/lib/oeqa/core/threaded.py | 102 +++++++++++++++++++++++++++++++---------- 1 file changed, 78 insertions(+), 24 deletions(-)
meta/lib/oeqa/core/threaded.py +78 -24
@@ -30,18 +30,35 @@ class OETestLoaderThreaded(OETestLoader): suites = {} suites['main'] = self.suiteClass() suites['pool'] = [] + suites['end'] = self.suiteClass() for _ in range(self.process_num - 1): suites['pool'].append(self.suiteClass()) + def _add_by_module_or_dep(suite, case, depends): + """ + A test case that needs to run into the same thread + because is on the same module or for dependency + reasons. + """ + + for c in suite._tests: + if case.__module__ == c.__module__: + suite.addTest(case) + return True + + if case.id() in depends: + case_depends = depends[case.id()] + for c in suite._tests: + if c.id() in case_depends: + suite.addTest(case) + return True + + return False + def _add_to_main_thread(main_suite, case, depends): """ Some test cases needs to be run into the main - thread for several resons. - - A test case that needs to run in the main thread - can be for specific set via test class _main_thread - attr or because is on the same module or for a dependency - reason. + thread by request. """ if hasattr(case.__class__, '_main_thread') and \
@@ -50,19 +67,20 @@ class OETestLoaderThreaded(OETestLoader): main_suite.addTest(case) return True - for c in main_suite._tests: - if case.__module__ == c.__module__: - main_suite.addTest(case) - return True + return _add_by_module_or_dep(main_suite, case, depends) - if case.id() in depends: - case_depends = depends[case.id()] - for c in main_suite._tests: - if c.id() in case_depends: - main_suite.addTest(case) - return True + def _add_to_end_thread(end_suite, case, depends): + """ + Some test cases needs to be run into at end of + execution into the main by request. + """ + if hasattr(case.__class__, '_end_thread') and \ + case.__class__._end_thread or \ + self.process_num == 1: + end_suite.addTest(case) + return True - return False + return _add_by_module_or_dep(end_suite, case, depends) def _search_for_module_idx(suites, case): """
@@ -112,6 +130,9 @@ class OETestLoaderThreaded(OETestLoader): if 'depends' in self.tc._registry: depends = self.tc._registry['depends'] + if _add_to_end_thread(suites['end'], case, depends): + continue + if _add_to_main_thread(suites['main'], case, depends): continue
@@ -135,7 +156,7 @@ class OETestLoaderThreaded(OETestLoader): # if the main suite doesn't have test cases # use the first element of the suites pool - if not len(suites['main']._tests): + if not len(suites['main']._tests) and len(suites['pool']): suites['main'] = suites['pool'].pop(0) return suites
@@ -268,6 +289,12 @@ class _ThreadedPool: self.tasks = queue.Queue(num_tasks) self.workers = [] + self.stream = stream + self.result = result + + self.end_task = None + self.end_worker = None + for _ in range(num_workers): worker = _Worker(self.tasks, result, stream) self.workers.append(worker)
@@ -280,12 +307,25 @@ class _ThreadedPool: """Add a task to the queue""" self.tasks.put((func, args, kargs)) + def add_end_task(self, func, *args, **kwargs): + """Add a task to be executed at end""" + + self.end_task = queue.Queue(1) + self.end_task.put((func, args, kwargs)) + self.end_worker = _Worker(self.end_task, self.result, + self.stream) + def wait_completion(self): """Wait for completion of all the tasks in the queue""" self.tasks.join() for worker in self.workers: worker.join() + if self.end_task: + self.end_worker.start() + self.end_task.join() + self.end_worker.join() + class OETestRunnerThreaded(OETestRunner): streamLoggerClass = OEStreamLoggerThreaded
@@ -293,32 +333,46 @@ class OETestRunnerThreaded(OETestRunner): super(OETestRunnerThreaded, self).__init__(tc, *args, **kwargs) self.resultclass = OETestResultThreadedInternal # XXX: XML reporting overrides at __init__ + def _run_main_thread(self, suite, result): + if len(suite._tests): + run_start_time = time.time() + rc = super(OETestRunnerThreaded, self).run(suite) + run_end_time = time.time() + result.addResult(rc, run_start_time, run_end_time) + self.stream.finish() + def run(self, suites): result = OETestResultThreaded(self.tc) pool = None + if suites['pool']: thread_no = len(suites['pool']) pool = _ThreadedPool(thread_no, thread_no, stream=self.stream, result=result) for s in suites['pool']: pool.add_task(super(OETestRunnerThreaded, self).run, s) - pool.start() - run_start_time = time.time() - rc = super(OETestRunnerThreaded, self).run(suites['main']) - run_end_time = time.time() - result.addResult(rc, run_start_time, run_end_time) - self.stream.finish() + if len(suites['end']._tests): + if not pool: + pool = _ThreadedPool(0, 0, stream=self.stream, + result=result) + pool.add_end_task(super(OETestRunnerThreaded, self).run, + suites['end']) if pool: + pool.start() + self._run_main_thread(suites['main'], result) + if pool: pool.wait_completion() + result._fill_tc_results() return result def list_tests(self, suite, display_type): suite['pool'].insert(0, suite['main']) + suite['pool'].append(suite['end']) return super(OETestRunnerThreaded, self).list_tests( suite['pool'], display_type)
Signature · 1 line
2.11.0
PATCH v2 8/29 oeqa/core/threaded: logSummary add skipped tests info
In reply to Aníbal Limón--- meta/lib/oeqa/core/threaded.py | 11 +++++++++++ 1 file changed, 11 insertions(+)
meta/lib/oeqa/core/threaded.py +11 -0
@@ -234,6 +234,14 @@ class OETestResultThreaded(object): self._results[tid]['result'].wasSuccessful() return wasSuccessful + def getSkippedTests(self): + skipped = 0 + + for tid in self._results.keys(): + skipped = skipped + len(self.tc._results[tid]['skipped']) + + return skipped + def stop(self): for tid in self._results.keys(): self._results[tid]['result'].stop()
@@ -248,6 +256,9 @@ class OETestResultThreaded(object): msg = "%s - OK - All required tests passed" % component else: msg = "%s - FAIL - Required tests failed" % component + skipped = self.getSkippedTests() + if skipped: + msg += " (skipped=%d)" % skipped self.tc.logger.info(msg) def logDetails(self):
Signature · 1 line
2.11.0
PATCH v2 9/29 oeqa/core/tests: Update test_loader threaded to cover main thread usage
In reply to Aníbal Limón--- meta/lib/oeqa/core/tests/test_loader.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-)
meta/lib/oeqa/core/tests/test_loader.py +10 -7
@@ -88,25 +88,28 @@ class TestLoader(TestBase): self.cases_path = [os.path.join(self.cases_path, 'loader', 'threaded')] tc = self._testLoaderThreaded() - self.assertEqual(len(tc.suites), 3, "Expected to be 3 suites") + self.assertTrue(len(tc.suites['main']._tests), + "Expected to have tests in main suite") + self.assertEqual(len(tc.suites['pool']), 2, + "Expected to be 2 suites in pool") case_ids = ['threaded.ThreadedTest.test_threaded_no_depends', 'threaded.ThreadedTest2.test_threaded_same_module', 'threaded_depends.ThreadedTest3.test_threaded_depends'] - for case in tc.suites[0]._tests: + for case in tc.suites['main']._tests: self.assertEqual(case.id(), - case_ids[tc.suites[0]._tests.index(case)]) + case_ids[tc.suites['main']._tests.index(case)]) case_ids = ['threaded_alone.ThreadedTestAlone.test_threaded_alone'] - for case in tc.suites[1]._tests: + for case in tc.suites['pool'][0]._tests: self.assertEqual(case.id(), - case_ids[tc.suites[1]._tests.index(case)]) + case_ids[tc.suites['pool'][0]._tests.index(case)]) case_ids = ['threaded_module.ThreadedTestModule.test_threaded_module', 'threaded_module.ThreadedTestModule2.test_threaded_module2'] - for case in tc.suites[2]._tests: + for case in tc.suites['pool'][1]._tests: self.assertEqual(case.id(), - case_ids[tc.suites[2]._tests.index(case)]) + case_ids[tc.suites['pool'][1]._tests.index(case)]) self.cases_path = cases_path
Signature · 1 line
2.11.0
PATCH v2 10/29 oeqa/selftest/{case, context}: Add builddir by test class and context
In reply to Aníbal LimónThe build directory by Test class will enable to use several instances of bitbake in parallel to enable oe-selftest threaded runs.
[YOCTO #11429]
--- meta/lib/oeqa/selftest/case.py | 97 ++++++++++++++++++++++++++++----------- meta/lib/oeqa/selftest/context.py | 4 ++ 2 files changed, 74 insertions(+), 27 deletions(-)
meta/lib/oeqa/selftest/case.py +70 -27
@@ -13,28 +13,73 @@ from oeqa.utils.commands import runCmd, bitbake, get_bb_var from oeqa.core.case import OETestCase class OESelftestTestCase(OETestCase): + _use_own_builddir = False + _main_thread = True + _end_thread = False + def __init__(self, methodName="runTest"): self._extra_tear_down_commands = [] super(OESelftestTestCase, self).__init__(methodName) @classmethod + def _setUpBuildDir(cls): + if cls._use_own_builddir: + cls.builddir = os.path.join(cls.tc.config_paths['base_builddir'], + cls.__module__, cls.__name__) + + cls.localconf_path = os.path.join(cls.builddir, "conf/local.conf") + cls.localconf_backup = os.path.join(cls.builddir, + "conf/local.conf.bk") + cls.local_bblayers_path = os.path.join(cls.builddir, + "conf/bblayers.conf") + cls.local_bblayers_backup = os.path.join(cls.builddir, + "conf/bblayers.conf.bk") + else: + cls.builddir = cls.tc.config_paths['builddir'] + cls.localconf_path = cls.tc.config_paths['localconf'] + cls.localconf_backup = cls.tc.config_paths['localconf_class_backup'] + cls.local_bblayers_path = cls.tc.config_paths['bblayers'] + cls.local_bblayers_backup = \ + cls.tc.config_paths['bblayers_class_backup'] + + cls.testinc_path = os.path.join(cls.builddir, "conf/selftest.inc") + cls.testinc_bblayers_path = os.path.join(cls.builddir, + "conf/bblayers.inc") + cls.machineinc_path = os.path.join(cls.builddir, "conf/machine.inc") + + # creates a custom build directory for every test class + if not os.path.exists(cls.builddir): + os.makedirs(cls.builddir) + + builddir_conf = os.path.join(cls.builddir, 'conf') + origdir_conf = os.path.join(cls.tc.config_paths['builddir'], 'conf') + shutil.copytree(origdir_conf, builddir_conf) + + ftools.append_file(cls.localconf_path, "# added by oe-selftest base class") + + # shares original sstate_dir across build directories to speed up + sstate_line = "SSTATE_DIR=\"%s\"" % cls.td['SSTATE_DIR'] + ftools.append_file(cls.localconf_path, sstate_line) + + # shares original dl_dir across build directories to avoid additional + # network usage + dldir_line = "DL_DIR=\"%s\"" % cls.td['DL_DIR'] + ftools.append_file(cls.localconf_path, dldir_line) + + # use the same value of threads for BB_NUMBER_THREADS/PARALLEL_MAKE + # to avoid ran out resources (cpu/memory) + if hasattr(cls.tc.loader, 'process_num'): + ftools.append_file(cls.localconf_path, "BB_NUMBER_THREADS?=\"%d\"" % + cls.tc.loader.process_num) + ftools.append_file(cls.localconf_path, "PARALLEL_MAKE?=\"-j %d\"" % + cls.tc.loader.process_num) + + @classmethod def setUpClass(cls): super(OESelftestTestCase, cls).setUpClass() cls.testlayer_path = cls.tc.config_paths['testlayer_path'] - cls.builddir = cls.tc.config_paths['builddir'] - - cls.localconf_path = cls.tc.config_paths['localconf'] - cls.localconf_backup = cls.tc.config_paths['localconf_class_backup'] - cls.local_bblayers_path = cls.tc.config_paths['bblayers'] - cls.local_bblayers_backup = cls.tc.config_paths['bblayers_class_backup'] - - cls.testinc_path = os.path.join(cls.tc.config_paths['builddir'], - "conf/selftest.inc") - cls.testinc_bblayers_path = os.path.join(cls.tc.config_paths['builddir'], - "conf/bblayers.inc") - cls.machineinc_path = os.path.join(cls.tc.config_paths['builddir'], - "conf/machine.inc") + cls._setUpBuildDir() cls._track_for_cleanup = [ cls.testinc_path, cls.testinc_bblayers_path,
@@ -52,35 +97,31 @@ class OESelftestTestCase(OETestCase): @classmethod def add_include(cls): if "#include added by oe-selftest" \ - not in ftools.read_file(os.path.join(cls.builddir, "conf/local.conf")): - cls.logger.info("Adding: \"include selftest.inc\" in %s" % os.path.join(cls.builddir, "conf/local.conf")) - ftools.append_file(os.path.join(cls.builddir, "conf/local.conf"), \ + not in ftools.read_file(cls.localconf_path): + ftools.append_file(cls.localconf_path, \ "\n#include added by oe-selftest\ninclude machine.inc\ninclude selftest.inc") if "#include added by oe-selftest" \ - not in ftools.read_file(os.path.join(cls.builddir, "conf/bblayers.conf")): - cls.logger.info("Adding: \"include bblayers.inc\" in bblayers.conf") - ftools.append_file(os.path.join(cls.builddir, "conf/bblayers.conf"), \ + not in ftools.read_file(cls.local_bblayers_path): + ftools.append_file(cls.local_bblayers_path, \ "\n#include added by oe-selftest\ninclude bblayers.inc") @classmethod def remove_include(cls): if "#include added by oe-selftest.py" \ - in ftools.read_file(os.path.join(cls.builddir, "conf/local.conf")): - cls.logger.info("Removing the include from local.conf") - ftools.remove_from_file(os.path.join(cls.builddir, "conf/local.conf"), \ + in ftools.read_file(cls.localconf_path): + ftools.remove_from_file(cls.localconf_path, \ "\n#include added by oe-selftest.py\ninclude machine.inc\ninclude selftest.inc") if "#include added by oe-selftest.py" \ - in ftools.read_file(os.path.join(cls.builddir, "conf/bblayers.conf")): - cls.logger.info("Removing the include from bblayers.conf") - ftools.remove_from_file(os.path.join(cls.builddir, "conf/bblayers.conf"), \ + in ftools.read_file(cls.local_bblayers_path): + ftools.remove_from_file(cls.local_bblayers_path, \ "\n#include added by oe-selftest.py\ninclude bblayers.inc") @classmethod def remove_inc_files(cls): try: - os.remove(os.path.join(cls.builddir, "conf/selftest.inc")) + os.remove(cls.testinc_path) for root, _, files in os.walk(cls.testlayer_path): for f in files: if f == 'test_recipe.inc':
@@ -96,7 +137,7 @@ class OESelftestTestCase(OETestCase): def setUp(self): super(OESelftestTestCase, self).setUp() - os.chdir(self.builddir) + # Check if local.conf or bblayers.conf files backup exists # from a previous failed test and restore them if os.path.isfile(self.localconf_backup) or os.path.isfile(
@@ -239,6 +280,7 @@ to ensure accurate results.") except OSError as e: if e.errno != errno.ENOENT: raise + def write_bblayers_config(self, data): """Write to <builddir>/conf/bblayers.inc""" self.logger.debug("Writing to: %s\n%s\n" % (self.testinc_bblayers_path, data))
@@ -269,4 +311,5 @@ to ensure accurate results.") def assertNotExists(self, expr, msg=None): if os.path.exists(expr): msg = self._formatMessage(msg, "%s exists when it should not" % safe_repr(expr)) + raise self.failureException(msg)
meta/lib/oeqa/selftest/context.py +4 -0
@@ -8,6 +8,7 @@ import sys import imp import signal from shutil import copyfile +import tempfile from random import choice import oeqa
@@ -133,6 +134,9 @@ class OESelftestTestContextExecutor(OETestContextExecutor): copyfile(self.tc_kwargs['init']['config_paths']['bblayers'], self.tc_kwargs['init']['config_paths']['bblayers_backup']) + self.tc_kwargs['init']['config_paths']['base_builddir'] = \ + tempfile.mkdtemp(prefix='build-selftest-', dir=builddir) + def _pre_run(self): def _check_required_env_variables(vars): for var in vars:
Signature · 1 line
2.11.0
PATCH v2 11/29 oeqa/selftest/case: Add wrappers to utils.commands modules
In reply to Aníbal LimónThis wrappers are for be able to use a custom build directory per Test class, there is a function to modify the environment setting BUILDDIR, BBPATH and CWD.
The oeqa.utils.commands module could be removed when other selftests (refkit, etc) are adapted to use this wrappers methods (get_bb_var{,s}, bitbake, runCmd).
The remaining command (oeqa.utils) to provide a wrapper is runqemu, this has other issue because bitbake/tinfoil are expected to run into the main thread (signal handling, etc).
--- meta/lib/oeqa/selftest/case.py | 96 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 94 insertions(+), 2 deletions(-)
meta/lib/oeqa/selftest/case.py +94 -2
@@ -6,10 +6,11 @@ import os import shutil import glob import errno +import re from unittest.util import safe_repr import oeqa.utils.ftools as ftools -from oeqa.utils.commands import runCmd, bitbake, get_bb_var +from oeqa.utils.commands import runCmd, bitbake, get_bb_env, get_bb_var, get_bb_vars from oeqa.core.case import OETestCase class OESelftestTestCase(OETestCase):
@@ -197,7 +198,7 @@ to ensure accurate results.") if self._extra_tear_down_commands: failed_extra_commands = [] for command in self._extra_tear_down_commands: - result = runCmd(command, ignore_status=True) + result = self.runCmd(command, ignore_status=True) if not result.status == 0: failed_extra_commands.append(command) if failed_extra_commands:
@@ -313,3 +314,94 @@ to ensure accurate results.") msg = self._formatMessage(msg, "%s exists when it should not" % safe_repr(expr)) raise self.failureException(msg) + + # utils commands to run on it's on builddir + @classmethod + def _env_own_builddir(cls, **kwargs): + env = None + + if 'env' in kwargs: + env = kwargs['env'] + + if not 'BUILDDIR' in env: + env['BUILDDIR'] = cls.builddir + if not 'BBPATH' in env: + env['BBPATH'] = cls.builddir + + else: + env = os.environ.copy() + env['BUILDDIR'] = cls.builddir + env['BBPATH'] = cls.builddir + + kwargs['env'] = env + + # XXX: tinfoil doesn't honor BBPATH bblayers and tinfoil test + # modules uses it + if not 'cwd' in kwargs: + kwargs['cwd'] = cls.builddir + + # XXX: uncomment for debugging purposes + #kwargs['output_log'] = cls.logger + + return kwargs + + @classmethod + def runCmd(cls, *args, **kwargs): + kwargs = cls._env_own_builddir(**kwargs) + return runCmd(*args, **kwargs) + + @classmethod + def bitbake(cls, *args, **kwargs): + kwargs = cls._env_own_builddir(**kwargs) + return bitbake(*args, **kwargs) + + @classmethod + def get_bb_env(cls, target=None, postconfig=None): + if target: + return cls.bitbake("-e %s" % target, postconfig=postconfig).output + else: + return cls.bitbake("-e", postconfig=postconfig).output + + @classmethod + def get_bb_vars(cls, variables=None, target=None, postconfig=None): + """Get values of multiple bitbake variables""" + bbenv = cls.get_bb_env(target, postconfig=postconfig) + + if variables is not None: + variables = variables.copy() + var_re = re.compile(r'^(export )?(?P<var>\w+(_.*)?)="(?P<value>.*)"$') + unset_re = re.compile(r'^unset (?P<var>\w+)$') + lastline = None + values = {} + for line in bbenv.splitlines(): + match = var_re.match(line) + val = None + if match: + val = match.group('value') + else: + match = unset_re.match(line) + if match: + # Handle [unexport] variables + if lastline.startswith('# "'): + val = lastline.split('"')[1] + if val: + var = match.group('var') + if variables is None: + values[var] = val + else: + if var in variables: + values[var] = val + variables.remove(var) + # Stop after all required variables have been found + if not variables: + break + lastline = line + if variables: + # Fill in missing values + for var in variables: + values[var] = None + return values + + @classmethod + def get_bb_var(cls, var, target=None, postconfig=None): + return cls.get_bb_vars([var], target, postconfig)[var]
Signature · 1 line
2.11.0
PATCH v2 12/29 oeqa/selftest/case: Creates meta-selftest layer per class
In reply to Aníbal LimónThe meta-selftest layer is used by test cases to modify meta data but in a threaded environment two test cases can modify the meta data causing errors because the signatures will change.
--- meta/lib/oeqa/selftest/case.py | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-)
meta/lib/oeqa/selftest/case.py +31 -3
@@ -7,6 +7,7 @@ import shutil import glob import errno import re +import subprocess from unittest.util import safe_repr import oeqa.utils.ftools as ftools
@@ -24,6 +25,8 @@ class OESelftestTestCase(OETestCase): @classmethod def _setUpBuildDir(cls): + cls.orig_testlayer_path = cls.tc.config_paths['testlayer_path'] + if cls._use_own_builddir: cls.builddir = os.path.join(cls.tc.config_paths['base_builddir'], cls.__module__, cls.__name__)
@@ -35,14 +38,23 @@ class OESelftestTestCase(OETestCase): "conf/bblayers.conf") cls.local_bblayers_backup = os.path.join(cls.builddir, "conf/bblayers.conf.bk") + + cls.base_testlayer_path = os.path.join(cls.builddir, + 'layers') + cls.testlayer_path = os.path.join(cls.base_testlayer_path, + os.path.basename(cls.orig_testlayer_path)) else: cls.builddir = cls.tc.config_paths['builddir'] + cls.localconf_path = cls.tc.config_paths['localconf'] cls.localconf_backup = cls.tc.config_paths['localconf_class_backup'] cls.local_bblayers_path = cls.tc.config_paths['bblayers'] cls.local_bblayers_backup = \ cls.tc.config_paths['bblayers_class_backup'] + cls.base_testlayer_path = os.path.dirname(cls.orig_testlayer_path) + cls.testlayer_path = cls.orig_testlayer_path + cls.testinc_path = os.path.join(cls.builddir, "conf/selftest.inc") cls.testinc_bblayers_path = os.path.join(cls.builddir, "conf/bblayers.inc")
@@ -53,8 +65,11 @@ class OESelftestTestCase(OETestCase): os.makedirs(cls.builddir) builddir_conf = os.path.join(cls.builddir, 'conf') - origdir_conf = os.path.join(cls.tc.config_paths['builddir'], 'conf') - shutil.copytree(origdir_conf, builddir_conf) + os.makedirs(builddir_conf) + shutil.copyfile(cls.tc.config_paths['localconf_backup'], + os.path.join(builddir_conf, 'local.conf')) + shutil.copyfile(cls.tc.config_paths['bblayers_backup'], + os.path.join(builddir_conf, 'bblayers.conf')) ftools.append_file(cls.localconf_path, "# added by oe-selftest base class")
@@ -75,11 +90,24 @@ class OESelftestTestCase(OETestCase): ftools.append_file(cls.localconf_path, "PARALLEL_MAKE?=\"-j %d\"" % cls.tc.loader.process_num) + # copy meta-selftest per class to avoid races when changing meta-data + # and init git repository because some tests review the repo status + os.makedirs(cls.base_testlayer_path) + shutil.copytree(cls.orig_testlayer_path, cls.testlayer_path) + cls.runCmd("git init; git add *; git commit -a -m 'initial'", + cwd=cls.testlayer_path) + + # XXX: sometimes meta-selftest isn't on bblayers at first backup + try: + cls.runCmd("bitbake-layers remove-layer %s" % cls.orig_testlayer_path) + except: + pass + cls.runCmd("bitbake-layers add-layer %s" % cls.testlayer_path) + @classmethod def setUpClass(cls): super(OESelftestTestCase, cls).setUpClass() - cls.testlayer_path = cls.tc.config_paths['testlayer_path'] cls._setUpBuildDir() cls._track_for_cleanup = [
Signature · 1 line
2.11.0
PATCH v2 13/29 oeqa/selftest/case: tearDown extra commands print what actually fails
In reply to Aníbal LimónIts better to have the output to see what actually fails in a command that is aim to execute at end of a test case.
--- meta/lib/oeqa/selftest/case.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
meta/lib/oeqa/selftest/case.py +9 -4
@@ -224,13 +224,18 @@ to ensure accurate results.") def tearDown(self): if self._extra_tear_down_commands: - failed_extra_commands = [] + failed_extra_commands = {} for command in self._extra_tear_down_commands: result = self.runCmd(command, ignore_status=True) - if not result.status == 0: - failed_extra_commands.append(command) + if not result.status == 0: + failed_extra_commands[command] = result if failed_extra_commands: - self.logger.warning("tearDown commands have failed: %s" % ', '.join(map(str, failed_extra_commands))) + self.logger.warning("%s: tearDown commands have failed" % \ + self.id()) + for cmd in failed_extra_commands: + result = failed_extra_commands[cmd] + self.logger.warning("%s: %s\n%s" % (self.id(), cmd, + result.output)) self.logger.debug("Trying to move on.") self._extra_tear_down_commands = []
Signature · 1 line
2.11.0
PATCH v2 14/29 oeqa/selftest/case: Support bitbake memres mode in per build directory
In reply to Aníbal LimónIf BBSERVER is set on the environment the bitbake is set to be used as a memres, so starts an bitbake server per TestClass.
--- meta/lib/oeqa/selftest/case.py | 9 +++++++++ 1 file changed, 9 insertions(+)
meta/lib/oeqa/selftest/case.py +9 -0
@@ -97,6 +97,12 @@ class OESelftestTestCase(OETestCase): cls.runCmd("git init; git add *; git commit -a -m 'initial'", cwd=cls.testlayer_path) + if cls._use_own_builddir and 'BBSERVER' in os.environ: + env = os.environ.copy() + del env['BBSERVER'] + result = cls.runCmd('bitbake --server-only -t xmlrpc -B localhost:-1', + env=env) + # XXX: sometimes meta-selftest isn't on bblayers at first backup try: cls.runCmd("bitbake-layers remove-layer %s" % cls.orig_testlayer_path)
@@ -119,6 +125,9 @@ class OESelftestTestCase(OETestCase): @classmethod def tearDownClass(cls): + if cls._use_own_builddir and 'BBSERVER' in os.environ: + cls.runCmd('bitbake --kill-server') + cls.remove_include() cls.remove_inc_files() super(OESelftestTestCase, cls).tearDownClass()
Signature · 1 line
2.11.0
PATCH v2 15/29 oeqa/selftest/cases: Use testlayer_path instead of call get_test_layer()
In reply to Aníbal LimónThe testlayer_path is set at init of selftest so isn't need to call every time get_test_layer to get it.
--- meta/lib/oeqa/selftest/cases/_sstatetests_noauto.py | 2 +- meta/lib/oeqa/selftest/cases/devtool.py | 4 ++-- meta/lib/oeqa/selftest/cases/oescripts.py | 2 +- meta/lib/oeqa/selftest/cases/sstate.py | 2 +- meta/lib/oeqa/selftest/cases/sstatetests.py | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-)
meta/lib/oeqa/selftest/cases/_sstatetests_noauto.py +1 -1
@@ -2,7 +2,7 @@ import os import shutil import oeqa.utils.ftools as ftools -from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_test_layer +from oeqa.utils.commands import runCmd, bitbake, get_bb_var from oeqa.selftest.cases.sstate import SStateBase
meta/lib/oeqa/selftest/cases/devtool.py +2 -2
@@ -8,7 +8,7 @@ import fnmatch import oeqa.utils.ftools as ftools from oeqa.selftest.case import OESelftestTestCase from oeqa.utils.commands import runCmd, bitbake, get_bb_var, create_temp_layer -from oeqa.utils.commands import get_bb_vars, runqemu, get_test_layer +from oeqa.utils.commands import get_bb_vars, runqemu from oeqa.core.decorator.oeid import OETestID class DevtoolBase(OESelftestTestCase):
@@ -1530,7 +1530,7 @@ class DevtoolTests(DevtoolBase): # Ensure the recipe is where we think it should be (so that cleanup doesn't trash things) self.assertIn('/meta/', recipedir) relpth = os.path.relpath(recipedir, os.path.join(get_bb_var('COREBASE'), 'meta')) - appenddir = os.path.join(get_test_layer(), relpth) + appenddir = os.path.join(self.testlayer_path, relpth) self.track_for_cleanup(appenddir) # Try finish to the original layer self.add_command_to_tearDown('rm -rf %s ; cd %s ; git checkout %s' % (recipedir, os.path.dirname(recipedir), recipedir))
meta/lib/oeqa/selftest/cases/oescripts.py +1 -1
@@ -1,6 +1,6 @@ from oeqa.selftest.case import OESelftestTestCase from oeqa.selftest.cases.buildhistory import BuildhistoryBase -from oeqa.utils.commands import Command, runCmd, bitbake, get_bb_var, get_test_layer +from oeqa.utils.commands import Command, runCmd, bitbake, get_bb_var from oeqa.core.decorator.oeid import OETestID class BuildhistoryDiffTests(BuildhistoryBase):
meta/lib/oeqa/selftest/cases/sstate.py +1 -1
@@ -6,7 +6,7 @@ import shutil import oeqa.utils.ftools as ftools from oeqa.selftest.case import OESelftestTestCase -from oeqa.utils.commands import runCmd, bitbake, get_bb_vars, get_test_layer +from oeqa.utils.commands import runCmd, bitbake, get_bb_vars class SStateBase(OESelftestTestCase):
meta/lib/oeqa/selftest/cases/sstatetests.py +1 -1
@@ -4,7 +4,7 @@ import glob import subprocess from oeqa.selftest.case import OESelftestTestCase -from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_test_layer +from oeqa.utils.commands import runCmd, bitbake, get_bb_var from oeqa.selftest.cases.sstate import SStateBase from oeqa.core.decorator.oeid import OETestID
Signature · 1 line
2.11.0
PATCH v2 16/29 oeqa/selftest/cases: Use builddir from class instead of get from environment
In reply to Aníbal LimónNow the build directory is setup by Test class, so the builddir attr points to the actual BUILDDIR instead of get from environment.
--- meta/lib/oeqa/selftest/cases/_sstatetests_noauto.py | 7 +++---- meta/lib/oeqa/selftest/cases/bbtests.py | 4 ++-- meta/lib/oeqa/selftest/cases/eSDK.py | 2 +- meta/lib/oeqa/selftest/cases/signing.py | 2 +- 4 files changed, 7 insertions(+), 8 deletions(-)
meta/lib/oeqa/selftest/cases/_sstatetests_noauto.py +3 -4
@@ -11,7 +11,6 @@ class RebuildFromSState(SStateBase): @classmethod def setUpClass(self): super(RebuildFromSState, self).setUpClass() - self.builddir = os.path.join(os.environ.get('BUILDDIR')) def get_dep_targets(self, primary_targets): found_targets = []
@@ -24,16 +23,16 @@ class RebuildFromSState(SStateBase): os.mkdir(builddir) self.track_for_cleanup(builddir) os.mkdir(os.path.join(builddir, 'conf')) - shutil.copyfile(os.path.join(os.environ.get('BUILDDIR'), 'conf/local.conf'), os.path.join(builddir, 'conf/local.conf')) + shutil.copyfile(self.localconf_path, os.path.join(builddir, 'conf/local.conf')) config = {} config['default_sstate_dir'] = "SSTATE_DIR ?= \"${TOPDIR}/sstate-cache\"" config['null_sstate_mirrors'] = "SSTATE_MIRRORS = \"\"" config['default_tmp_dir'] = "TMPDIR = \"${TOPDIR}/tmp\"" for key in config: ftools.append_file(os.path.join(builddir, 'conf/selftest.inc'), config[key]) - shutil.copyfile(os.path.join(os.environ.get('BUILDDIR'), 'conf/bblayers.conf'), os.path.join(builddir, 'conf/bblayers.conf')) + shutil.copyfile(self.local_bblayers_path, os.path.join(builddir, 'conf/bblayers.conf')) try: - shutil.copyfile(os.path.join(os.environ.get('BUILDDIR'), 'conf/auto.conf'), os.path.join(builddir, 'conf/auto.conf')) + shutil.copyfile(self.autoconf_path, os.path.join(builddir, 'conf/auto.conf')) except: pass
meta/lib/oeqa/selftest/cases/bbtests.py +2 -2
@@ -22,8 +22,8 @@ class BitbakeTests(OESelftestTestCase): @OETestID(790) def test_run_bitbake_from_dir_2(self): my_env = os.environ.copy() - my_env['BBPATH'] = my_env['BUILDDIR'] - os.chdir(os.path.dirname(os.environ['BUILDDIR'])) + my_env['BBPATH'] = self.builddir + os.chdir(os.path.dirname(self.builddir)) self.assertEqual(bitbake('-e', env=my_env).status, 0, msg = "bitbake couldn't run from builddir") @OETestID(806)
meta/lib/oeqa/selftest/cases/eSDK.py +1 -1
@@ -49,7 +49,7 @@ class oeSDKExtSelfTest(OESelftestTestCase): @staticmethod def update_configuration(cls, image, tmpdir_eSDKQA, env_eSDK, ext_sdk_path): - sstate_dir = os.path.join(os.environ['BUILDDIR'], 'sstate-cache') + sstate_dir = os.path.join(cls.builddir, 'sstate-cache') oeSDKExtSelfTest.generate_eSDK(cls.image)
meta/lib/oeqa/selftest/cases/signing.py +1 -1
@@ -105,7 +105,7 @@ class Signing(OESelftestTestCase): test_recipe = 'ed' - builddir = os.environ.get('BUILDDIR') + builddir = self.builddir sstatedir = os.path.join(builddir, 'test-sstate') self.add_command_to_tearDown('bitbake -c clean %s' % test_recipe)
Signature · 1 line
2.11.0
PATCH v2 17/29 oeqa/selftest/cases: Use wrapper methods from OESelfTestCase class
In reply to Aníbal LimónIn order to support threaded runs in oe-selftest cases, there is a need to use wrapper methods that takes into account the current builddir by Test class.
--- .../lib/oeqa/selftest/cases/_sstatetests_noauto.py | 16 ++-- meta/lib/oeqa/selftest/cases/archiver.py | 21 +++-- meta/lib/oeqa/selftest/cases/bblayers.py | 45 ++++----- meta/lib/oeqa/selftest/cases/bbtests.py | 101 +++++++++++---------- meta/lib/oeqa/selftest/cases/buildhistory.py | 9 +- meta/lib/oeqa/selftest/cases/buildoptions.py | 51 ++++++----- meta/lib/oeqa/selftest/cases/containerimage.py | 9 +- meta/lib/oeqa/selftest/cases/distrodata.py | 7 +- meta/lib/oeqa/selftest/cases/image_typedep.py | 8 +- meta/lib/oeqa/selftest/cases/layerappend.py | 22 ++--- meta/lib/oeqa/selftest/cases/liboe.py | 13 +-- meta/lib/oeqa/selftest/cases/lic_checksum.py | 8 +- meta/lib/oeqa/selftest/cases/manifest.py | 13 +-- meta/lib/oeqa/selftest/cases/oelib/buildhistory.py | 7 +- meta/lib/oeqa/selftest/cases/oescripts.py | 5 +- meta/lib/oeqa/selftest/cases/package.py | 10 +- meta/lib/oeqa/selftest/cases/pkgdata.py | 73 +++++++-------- meta/lib/oeqa/selftest/cases/prservice.py | 19 ++-- meta/lib/oeqa/selftest/cases/signing.py | 38 ++++---- meta/lib/oeqa/selftest/cases/sstate.py | 5 +- meta/lib/oeqa/selftest/cases/sstatetests.py | 51 ++++++----- 21 files changed, 273 insertions(+), 258 deletions(-)
meta/lib/oeqa/selftest/cases/_sstatetests_noauto.py +6 -10
@@ -2,19 +2,15 @@ import os import shutil import oeqa.utils.ftools as ftools -from oeqa.utils.commands import runCmd, bitbake, get_bb_var from oeqa.selftest.cases.sstate import SStateBase - class RebuildFromSState(SStateBase): - - @classmethod - def setUpClass(self): - super(RebuildFromSState, self).setUpClass() + _use_own_builddir = True + _main_thread = False def get_dep_targets(self, primary_targets): found_targets = [] - bitbake("-g " + ' '.join(map(str, primary_targets))) + self.bitbake("-g " + ' '.join(map(str, primary_targets))) with open(os.path.join(self.builddir, 'pn-buildlist'), 'r') as pnfile: found_targets = pnfile.read().splitlines() return found_targets
@@ -59,7 +55,7 @@ class RebuildFromSState(SStateBase): rebuild_targets = primary_targets self.configure_builddir(buildA) - runCmd((". %s/oe-init-build-env %s && " % (get_bb_var('COREBASE'), buildA)) + 'bitbake ' + ' '.join(map(str, primary_targets)), shell=True, executable='/bin/bash') + self.runCmd((". %s/oe-init-build-env %s && " % (self.get_bb_var('COREBASE'), buildA)) + 'bitbake ' + ' '.join(map(str, primary_targets)), shell=True, executable='/bin/bash') self.hardlink_tree(os.path.join(buildA, 'sstate-cache'), os.path.join(self.builddir, 'sstate-cache-buildA')) shutil.rmtree(buildA)
@@ -69,13 +65,13 @@ class RebuildFromSState(SStateBase): self.configure_builddir(buildB) self.hardlink_tree(os.path.join(self.builddir, 'sstate-cache-buildA'), os.path.join(buildB, 'sstate-cache')) - result_cleansstate = runCmd((". %s/oe-init-build-env %s && " % (get_bb_var('COREBASE'), buildB)) + 'bitbake -ccleansstate ' + target, ignore_status=True, shell=True, executable='/bin/bash') + result_cleansstate = self.runCmd((". %s/oe-init-build-env %s && " % (self.get_bb_var('COREBASE'), buildB)) + 'bitbake -ccleansstate ' + target, ignore_status=True, shell=True, executable='/bin/bash') if not result_cleansstate.status == 0: failed_cleansstate.append(target) shutil.rmtree(buildB) continue - result_build = runCmd((". %s/oe-init-build-env %s && " % (get_bb_var('COREBASE'), buildB)) + 'bitbake ' + target, ignore_status=True, shell=True, executable='/bin/bash') + result_build = self.runCmd((". %s/oe-init-build-env %s && " % (self.get_bb_var('COREBASE'), buildB)) + 'bitbake ' + target, ignore_status=True, shell=True, executable='/bin/bash') if not result_build.status == 0: failed_rebuild.append(target)
meta/lib/oeqa/selftest/cases/archiver.py +11 -10
@@ -1,10 +1,11 @@ import os import glob -from oeqa.utils.commands import bitbake, get_bb_vars from oeqa.selftest.case import OESelftestTestCase from oeqa.core.decorator.oeid import OETestID class Archiver(OESelftestTestCase): + _use_own_builddir = True + _main_thread = False @OETestID(1345) def test_archiver_allows_to_filter_on_recipe_name(self):
@@ -26,10 +27,10 @@ class Archiver(OESelftestTestCase): features += 'COPYLEFT_PN_EXCLUDE = "%s"\n' % exclude_recipe self.write_config(features) - bitbake('-c clean %s %s' % (include_recipe, exclude_recipe)) - bitbake("-c deploy_archives %s %s" % (include_recipe, exclude_recipe)) + self.bitbake('-c clean %s %s' % (include_recipe, exclude_recipe)) + self.bitbake("-c deploy_archives %s %s" % (include_recipe, exclude_recipe)) - bb_vars = get_bb_vars(['DEPLOY_DIR_SRC', 'TARGET_SYS']) + bb_vars = self.get_bb_vars(['DEPLOY_DIR_SRC', 'TARGET_SYS']) src_path = os.path.join(bb_vars['DEPLOY_DIR_SRC'], bb_vars['TARGET_SYS']) # Check that include_recipe was included
@@ -58,10 +59,10 @@ class Archiver(OESelftestTestCase): features += 'COPYLEFT_RECIPE_TYPES = "target"\n' self.write_config(features) - bitbake('-c clean %s %s' % (target_recipe, native_recipe)) - bitbake("%s -c deploy_archives %s" % (target_recipe, native_recipe)) + self.bitbake('-c clean %s %s' % (target_recipe, native_recipe)) + self.bitbake("%s -c deploy_archives %s" % (target_recipe, native_recipe)) - bb_vars = get_bb_vars(['DEPLOY_DIR_SRC', 'TARGET_SYS', 'BUILD_SYS']) + bb_vars = self.get_bb_vars(['DEPLOY_DIR_SRC', 'TARGET_SYS', 'BUILD_SYS']) src_path_target = os.path.join(bb_vars['DEPLOY_DIR_SRC'], bb_vars['TARGET_SYS']) src_path_native = os.path.join(bb_vars['DEPLOY_DIR_SRC'], bb_vars['BUILD_SYS'])
@@ -95,10 +96,10 @@ class Archiver(OESelftestTestCase): features += 'COPYLEFT_PN_EXCLUDE = "%s"\n' % target_recipes[1] self.write_config(features) - bitbake('-c clean %s %s' % (' '.join(target_recipes), ' '.join(native_recipes))) - bitbake('-c deploy_archives %s %s' % (' '.join(target_recipes), ' '.join(native_recipes))) + self.bitbake('-c clean %s %s' % (' '.join(target_recipes), ' '.join(native_recipes))) + self.bitbake('-c deploy_archives %s %s' % (' '.join(target_recipes), ' '.join(native_recipes))) - bb_vars = get_bb_vars(['DEPLOY_DIR_SRC', 'TARGET_SYS', 'BUILD_SYS']) + bb_vars = self.get_bb_vars(['DEPLOY_DIR_SRC', 'TARGET_SYS', 'BUILD_SYS']) src_path_target = os.path.join(bb_vars['DEPLOY_DIR_SRC'], bb_vars['TARGET_SYS']) src_path_native = os.path.join(bb_vars['DEPLOY_DIR_SRC'], bb_vars['BUILD_SYS'])
meta/lib/oeqa/selftest/cases/bblayers.py +23 -22
109 lines not on this page · raw message
meta/lib/oeqa/selftest/cases/bbtests.py +53 -48
271 lines not on this page · raw message
meta/lib/oeqa/selftest/cases/buildhistory.py +3 -6
@@ -3,13 +3,10 @@ import re import datetime from oeqa.selftest.case import OESelftestTestCase -from oeqa.utils.commands import bitbake, get_bb_vars - class BuildhistoryBase(OESelftestTestCase): - def config_buildhistory(self, tmp_bh_location=False): - bb_vars = get_bb_vars(['USER_CLASSES', 'INHERIT']) + bb_vars = self.get_bb_vars(['USER_CLASSES', 'INHERIT']) if (not 'buildhistory' in bb_vars['USER_CLASSES']) and (not 'buildhistory' in bb_vars['INHERIT']): add_buildhistory_config = 'INHERIT += "buildhistory"\nBUILDHISTORY_COMMIT = "1"' self.append_config(add_buildhistory_config)
@@ -30,8 +27,8 @@ class BuildhistoryBase(OESelftestTestCase): self.append_config(global_config) self.append_recipeinc(target, target_config) - bitbake("-cclean %s" % target) - result = bitbake(target, ignore_status=True) + self.bitbake("-cclean %s" % target) + result = self.bitbake(target, ignore_status=True) self.remove_config(global_config) self.remove_recipeinc(target, target_config)
meta/lib/oeqa/selftest/cases/buildoptions.py +26 -25
148 lines not on this page · raw message
meta/lib/oeqa/selftest/cases/containerimage.py +5 -4
@@ -1,7 +1,6 @@ import os from oeqa.selftest.case import OESelftestTestCase -from oeqa.utils.commands import bitbake, get_bb_vars, runCmd from oeqa.core.decorator.oeid import OETestID # This test builds an image with using the "container" IMAGE_FSTYPE, and
@@ -18,6 +17,8 @@ from oeqa.core.decorator.oeid import OETestID # default other than what is in ROOTFS_BOOTSTRAP_INSTALL. # class ContainerImageTests(OESelftestTestCase): + _use_own_builddir = True + _main_thread = False # Verify that when specifying a IMAGE_TYPEDEP_ of the form "foo.bar" that # the conversion type bar gets added as a dep as well
@@ -41,7 +42,7 @@ PACKAGE_CLASSES = "package_ipk" IMAGE_FEATURES = "" """) - bbvars = get_bb_vars(['bindir', 'sysconfdir', 'localstatedir', + bbvars = self.get_bb_vars(['bindir', 'sysconfdir', 'localstatedir', 'DEPLOY_DIR_IMAGE', 'IMAGE_LINK_NAME'], target='container-test-image') expected_files = [
@@ -75,11 +76,11 @@ IMAGE_FEATURES = "" expected_files = sorted(expected_files) # Build the image of course - bitbake('container-test-image') + self.bitbake('container-test-image') image = os.path.join(bbvars['DEPLOY_DIR_IMAGE'], bbvars['IMAGE_LINK_NAME'] + '.tar.bz2') # Ensure the files in the image are what we expect - result = runCmd("tar tf {} | sort".format(image), shell=True) + result = self.runCmd("tar tf {} | sort".format(image), shell=True) self.assertEqual(result.output.split('\n'), expected_files)
meta/lib/oeqa/selftest/cases/distrodata.py +4 -3
@@ -1,9 +1,10 @@ from oeqa.selftest.case import OESelftestTestCase -from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_bb_vars from oeqa.utils.decorators import testcase from oeqa.utils.ftools import write_file class Distrodata(OESelftestTestCase): + _use_own_builddir = True + _main_thread = False @classmethod def setUpClass(cls):
@@ -21,8 +22,8 @@ class Distrodata(OESelftestTestCase): feature += 'LICENSE_FLAGS_WHITELIST += " commercial"\n' self.write_config(feature) - bitbake('-c checkpkg world') - checkpkg_result = open(os.path.join(get_bb_var("LOG_DIR"), "checkpkg.csv")).readlines()[1:] + self.bitbake('-c checkpkg world') + checkpkg_result = open(os.path.join(self.get_bb_var("LOG_DIR"), "checkpkg.csv")).readlines()[1:] exceptions = [exc.strip() for exc in open(self.exceptions_path).readlines()] failed_upstream_checks = [pkg_data[0] for pkg_data in [pkg_line.split('\t') for pkg_line in checkpkg_result] if pkg_data[11] == ''] regressed_failures = set(failed_upstream_checks) - set(exceptions)
meta/lib/oeqa/selftest/cases/image_typedep.py +5 -3
@@ -1,10 +1,11 @@ import os from oeqa.selftest.case import OESelftestTestCase -from oeqa.utils.commands import bitbake from oeqa.core.decorator.oeid import OETestID class ImageTypeDepTests(OESelftestTestCase): + _use_own_builddir = True + _main_thread = False # Verify that when specifying a IMAGE_TYPEDEP_ of the form "foo.bar" that # the conversion type bar gets added as a dep as well
@@ -27,8 +28,9 @@ inherit image """) # First get the dependency that should exist for bz2, it will look # like CONVERSION_DEPENDS_bz2="somedep" - result = bitbake('-e emptytest') + result = self.bitbake('-e emptytest') + dep = '' for line in result.output.split('\n'): if line.startswith('CONVERSION_DEPENDS_bz2'): dep = line.split('=')[1].strip('"')
@@ -36,7 +38,7 @@ inherit image # Now get the dependency task list and check for the expected task # dependency - bitbake('-g emptytest') + self.bitbake('-g emptytest') taskdependsfile = os.path.join(self.builddir, 'task-depends.dot') dep = dep + ".do_populate_sysroot"
meta/lib/oeqa/selftest/cases/layerappend.py +11 -11
@@ -1,11 +1,13 @@ import os from oeqa.selftest.case import OESelftestTestCase -from oeqa.utils.commands import runCmd, bitbake, get_bb_var import oeqa.utils.ftools as ftools from oeqa.core.decorator.oeid import OETestID class LayerAppendTests(OESelftestTestCase): + _use_own_builddir = True + _main_thread = False + layerconf = """ # We have a conf and classes directory, append to BBPATH BBPATH .= ":${LAYERDIR}"
@@ -51,10 +53,8 @@ SRC_URI_append += "file://appendtest.txt" @OETestID(1196) def test_layer_appends(self): - corebase = get_bb_var("COREBASE") - for l in ["0", "1", "2"]: - layer = os.path.join(corebase, "meta-layertest" + l) + layer = os.path.join(self.builddir, "meta-layertest" + l) self.assertFalse(os.path.exists(layer)) os.mkdir(layer) os.mkdir(layer + "/conf")
@@ -78,18 +78,18 @@ SRC_URI_append += "file://appendtest.txt" f.write("Layer 2 test") self.track_for_cleanup(layer) - self.layerappend = "BBLAYERS += \"{0}/meta-layertest0 {0}/meta-layertest1 {0}/meta-layertest2\"".format(corebase) + self.layerappend = "BBLAYERS += \"{0}/meta-layertest0 {0}/meta-layertest1 {0}/meta-layertest2\"".format(self.builddir) ftools.append_file(self.builddir + "/conf/bblayers.conf", self.layerappend) - stagingdir = get_bb_var("SYSROOT_DESTDIR", "layerappendtest") - bitbake("layerappendtest") + stagingdir = self.get_bb_var("SYSROOT_DESTDIR", "layerappendtest") + self.bitbake("layerappendtest") data = ftools.read_file(stagingdir + "/appendtest.txt") self.assertEqual(data, "Layer 2 test") - os.remove(corebase + "/meta-layertest2/recipes-test/layerappendtest/appendtest.txt") - bitbake("layerappendtest") + os.remove(self.builddir + "/meta-layertest2/recipes-test/layerappendtest/appendtest.txt") + self.bitbake("layerappendtest") data = ftools.read_file(stagingdir + "/appendtest.txt") self.assertEqual(data, "Layer 1 test") - with open(corebase + "/meta-layertest2/recipes-test/layerappendtest/appendtest.txt", "w") as f: + with open(self.builddir + "/meta-layertest2/recipes-test/layerappendtest/appendtest.txt", "w") as f: f.write("Layer 2 test") - bitbake("layerappendtest") + self.bitbake("layerappendtest") data = ftools.read_file(stagingdir + "/appendtest.txt") self.assertEqual(data, "Layer 2 test")
meta/lib/oeqa/selftest/cases/liboe.py +7 -6
@@ -1,15 +1,16 @@ from oeqa.selftest.case import OESelftestTestCase from oeqa.core.decorator.oeid import OETestID -from oeqa.utils.commands import get_bb_var, get_bb_vars, bitbake, runCmd import oe.path import os class LibOE(OESelftestTestCase): + _use_own_builddir = True + _main_thread = False @classmethod def setUpClass(cls): super(LibOE, cls).setUpClass() - cls.tmp_dir = get_bb_var('TMPDIR') + cls.tmp_dir = cls.get_bb_var('TMPDIR') @OETestID(1635) def test_copy_tree_special(self):
@@ -54,20 +55,20 @@ class LibOE(OESelftestTestCase): testfilename = 'testxattr' # ensure we have setfattr available - bitbake("attr-native") + self.bitbake("attr-native") - bb_vars = get_bb_vars(['SYSROOT_DESTDIR', 'bindir'], 'attr-native') + bb_vars = self.get_bb_vars(['SYSROOT_DESTDIR', 'bindir'], 'attr-native') destdir = bb_vars['SYSROOT_DESTDIR'] bindir = bb_vars['bindir'] bindir = destdir + bindir # create a file with xattr and copy it open(oe.path.join(src, testfilename), 'w+b').close() - runCmd('%s/setfattr -n user.oetest -v "testing liboe" %s' % (bindir, oe.path.join(src, testfilename))) + self.runCmd('%s/setfattr -n user.oetest -v "testing liboe" %s' % (bindir, oe.path.join(src, testfilename))) oe.path.copytree(src, dst) # ensure file in dest has user.oetest xattr - result = runCmd('%s/getfattr -n user.oetest %s' % (bindir, oe.path.join(dst, testfilename))) + result = self.runCmd('%s/getfattr -n user.oetest %s' % (bindir, oe.path.join(dst, testfilename))) self.assertIn('user.oetest="testing liboe"', result.output, 'Extended attribute not sert in dst') oe.path.remove(testloc)
meta/lib/oeqa/selftest/cases/lic_checksum.py +4 -4
@@ -2,11 +2,11 @@ import os import tempfile from oeqa.selftest.case import OESelftestTestCase -from oeqa.utils.commands import bitbake -from oeqa.utils import CommandError from oeqa.core.decorator.oeid import OETestID class LicenseTests(OESelftestTestCase): + _use_own_builddir = True + _main_thread = False # Verify that changing a license file that has an absolute path causes # the license qa to fail due to a mismatched md5sum.
@@ -24,12 +24,12 @@ INHIBIT_DEFAULT_DEPS = "1" LIC_FILES_CHKSUM = "file://%s;md5=d41d8cd98f00b204e9800998ecf8427e" SRC_URI = "file://%s;md5=d41d8cd98f00b204e9800998ecf8427e" """ % (lic_path, lic_path)) - result = bitbake(bitbake_cmd) + result = self.bitbake(bitbake_cmd) with open(lic_path, "w") as f: f.write("data") self.write_config("INHERIT_remove = \"report-error\"") - result = bitbake(bitbake_cmd, ignore_status=True) + result = self.bitbake(bitbake_cmd, ignore_status=True) if error_msg not in result.output: raise AssertionError(result.output)
meta/lib/oeqa/selftest/cases/manifest.py +7 -6
@@ -1,7 +1,6 @@ import os from oeqa.selftest.case import OESelftestTestCase -from oeqa.utils.commands import get_bb_var, get_bb_vars, bitbake from oeqa.core.decorator.oeid import OETestID class ManifestEntry:
@@ -12,6 +11,8 @@ class ManifestEntry: class VerifyManifest(OESelftestTestCase): '''Tests for the manifest files and contents of an image''' + _use_own_builddir = True + _main_thread = False @classmethod def check_manifest_entries(self, manifest, path):
@@ -37,7 +38,7 @@ class VerifyManifest(OESelftestTestCase): @classmethod def get_dir_from_bb_var(self, bb_var, target = None): target == self.buildtarget if target == None else target - directory = get_bb_var(bb_var, target); + directory = self.get_bb_var(bb_var, target); if not directory or not os.path.isdir(directory): self.logger.debug("{}: {} points to {} when target = {}"\ .format(self.classname, bb_var, directory, target))
@@ -53,7 +54,7 @@ class VerifyManifest(OESelftestTestCase): self.logger.info("{}: doing bitbake {} as a prerequisite of the test"\ .format(self.classname, self.buildtarget)) - if bitbake(self.buildtarget).status: + if self.bitbake(self.buildtarget).status: self.logger.debug("{} Failed to setup {}"\ .format(self.classname, self.buildtarget)) self.skipTest("{}: Cannot setup testing scenario"\
@@ -69,7 +70,7 @@ class VerifyManifest(OESelftestTestCase): bbargs = sdktask + ' ' + self.buildtarget self.logger.debug("{}: doing bitbake {} as a prerequisite of the test"\ .format(self.classname, bbargs)) - if bitbake(bbargs).status: + if self.bitbake(bbargs).status: self.logger.debug("{} Failed to bitbake {}"\ .format(self.classname, bbargs)) self.skipTest("{}: Cannot setup testing scenario"\
@@ -84,7 +85,7 @@ class VerifyManifest(OESelftestTestCase): try: mdir = self.get_dir_from_bb_var('SDK_DEPLOY', self.buildtarget) for k in d_target.keys(): - bb_vars = get_bb_vars(['SDK_NAME', 'SDK_VERSION'], self.buildtarget) + bb_vars = self.get_bb_vars(['SDK_NAME', 'SDK_VERSION'], self.buildtarget) mfilename[k] = "{}-toolchain-{}.{}.manifest".format( bb_vars['SDK_NAME'], bb_vars['SDK_VERSION'],
@@ -134,7 +135,7 @@ class VerifyManifest(OESelftestTestCase): try: mdir = self.get_dir_from_bb_var('DEPLOY_DIR_IMAGE', self.buildtarget) - mfilename = get_bb_var("IMAGE_LINK_NAME", self.buildtarget)\ + mfilename = self.get_bb_var("IMAGE_LINK_NAME", self.buildtarget)\ + ".manifest" mpath = os.path.join(mdir, mfilename) if not os.path.isfile(mpath): raise IOError
meta/lib/oeqa/selftest/cases/oelib/buildhistory.py +5 -2
@@ -1,15 +1,18 @@ import os from oeqa.selftest.case import OESelftestTestCase import tempfile -from oeqa.utils.commands import get_bb_var from oeqa.core.decorator.oeid import OETestID +from git import Repo +from oe.buildhistory_analysis import blob_to_dict, compare_dict_blobs class TestBlobParsing(OESelftestTestCase): + _use_own_builddir = True + _main_thread = False def setUp(self): import time self.repo_path = tempfile.mkdtemp(prefix='selftest-buildhistory', - dir=get_bb_var('TOPDIR')) + dir=self.get_bb_var('TOPDIR')) try: from git import Repo
meta/lib/oeqa/selftest/cases/oescripts.py +3 -2
@@ -1,15 +1,16 @@ from oeqa.selftest.case import OESelftestTestCase from oeqa.selftest.cases.buildhistory import BuildhistoryBase -from oeqa.utils.commands import Command, runCmd, bitbake, get_bb_var from oeqa.core.decorator.oeid import OETestID class BuildhistoryDiffTests(BuildhistoryBase): + _use_own_builddir = True + _main_thread = False @OETestID(295) def test_buildhistory_diff(self): target = 'xcursor-transparent-theme' self.run_buildhistory_operation(target, target_config="PR = \"r1\"", change_bh_location=True) self.run_buildhistory_operation(target, target_config="PR = \"r0\"", change_bh_location=False, expect_error=True) - result = runCmd("buildhistory-diff -p %s" % get_bb_var('BUILDHISTORY_DIR')) + result = self.runCmd("buildhistory-diff -p %s" % self.get_bb_var('BUILDHISTORY_DIR')) expected_output = 'PR changed from "r1" to "r0"' self.assertTrue(expected_output in result.output, msg="Did not find expected output: %s" % result.output)
meta/lib/oeqa/selftest/cases/package.py +6 -4
@@ -1,10 +1,12 @@ from oeqa.selftest.case import OESelftestTestCase from oeqa.core.decorator.oeid import OETestID -from oeqa.utils.commands import bitbake, get_bb_vars import subprocess, os import oe.path class VersionOrdering(OESelftestTestCase): + _use_own_builddir = True + _main_thread = False + # version1, version2, sort order tests = ( ("1.0", "1.0", 0),
@@ -20,11 +22,11 @@ class VersionOrdering(OESelftestTestCase): super().setUpClass() # Build the tools we need and populate a sysroot - bitbake("dpkg-native opkg-native rpm-native python3-native") - bitbake("build-sysroots -c build_native_sysroot") + cls.bitbake("dpkg-native opkg-native rpm-native python3-native") + cls.bitbake("build-sysroots -c build_native_sysroot") # Get the paths so we can point into the sysroot correctly - vars = get_bb_vars(["STAGING_DIR", "BUILD_ARCH", "bindir_native", "libdir_native"]) + vars = cls.get_bb_vars(["STAGING_DIR", "BUILD_ARCH", "bindir_native", "libdir_native"]) cls.staging = oe.path.join(vars["STAGING_DIR"], vars["BUILD_ARCH"]) cls.bindir = oe.path.join(cls.staging, vars["bindir_native"]) cls.libdir = oe.path.join(cls.staging, vars["libdir_native"])
meta/lib/oeqa/selftest/cases/pkgdata.py +37 -36
210 lines not on this page · raw message
meta/lib/oeqa/selftest/cases/prservice.py +10 -9
@@ -5,16 +5,17 @@ import datetime import oeqa.utils.ftools as ftools from oeqa.selftest.case import OESelftestTestCase -from oeqa.utils.commands import runCmd, bitbake, get_bb_var from oeqa.core.decorator.oeid import OETestID from oeqa.utils.network import get_free_port class BitbakePrTests(OESelftestTestCase): + _use_own_builddir = True + _main_thread = False @classmethod def setUpClass(cls): super(BitbakePrTests, cls).setUpClass() - cls.pkgdata_dir = get_bb_var('PKGDATA_DIR') + cls.pkgdata_dir = cls.get_bb_var('PKGDATA_DIR') def get_pr_version(self, package_name): package_data_file = os.path.join(self.pkgdata_dir, 'runtime', package_name)
@@ -24,7 +25,7 @@ class BitbakePrTests(OESelftestTestCase): return int(find_pr.group(1)) def get_task_stamp(self, package_name, recipe_task): - stampdata = get_bb_var('STAMP', target=package_name).split('/') + stampdata = self.get_bb_var('STAMP', target=package_name).split('/') prefix = stampdata[-1] package_stamps_path = "/".join(stampdata[:-1]) stamps = []
@@ -39,7 +40,7 @@ class BitbakePrTests(OESelftestTestCase): def increment_package_pr(self, package_name): inc_data = "do_package_append() {\n bb.build.exec_func('do_test_prserv', d)\n}\ndo_test_prserv() {\necho \"The current date is: %s\"\n}" % datetime.datetime.now() self.write_recipeinc(package_name, inc_data) - res = bitbake(package_name, ignore_status=True) + res = self.bitbake(package_name, ignore_status=True) self.delete_recipeinc(package_name) self.assertEqual(res.status, 0, msg=res.output) self.assertTrue("NOTE: Started PRServer with DBfile" in res.output, msg=res.output)
@@ -71,15 +72,15 @@ class BitbakePrTests(OESelftestTestCase): pr_1 = self.get_pr_version(package_name) exported_db_path = os.path.join(self.builddir, 'export.inc') - export_result = runCmd("bitbake-prserv-tool export %s" % exported_db_path, ignore_status=True) + export_result = self.runCmd("bitbake-prserv-tool export %s" % exported_db_path, ignore_status=True) self.assertEqual(export_result.status, 0, msg="PR Service database export failed: %s" % export_result.output) if replace_current_db: - current_db_path = os.path.join(get_bb_var('PERSISTENT_DIR'), 'prserv.sqlite3') + current_db_path = os.path.join(self.get_bb_var('PERSISTENT_DIR'), 'prserv.sqlite3') self.assertTrue(os.path.exists(current_db_path), msg="Path to current PR Service database is invalid: %s" % current_db_path) os.remove(current_db_path) - import_result = runCmd("bitbake-prserv-tool import %s" % exported_db_path, ignore_status=True) + import_result = self.runCmd("bitbake-prserv-tool import %s" % exported_db_path, ignore_status=True) os.remove(exported_db_path) self.assertEqual(import_result.status, 0, msg="PR Service database import failed: %s" % import_result.output)
@@ -124,8 +125,8 @@ class BitbakePrTests(OESelftestTestCase): def test_stopping_prservice_message(self): port = get_free_port() - runCmd('bitbake-prserv --host localhost --port %s --loglevel=DEBUG --start' % port) - ret = runCmd('bitbake-prserv --host localhost --port %s --loglevel=DEBUG --stop' % port) + self.runCmd('bitbake-prserv --host localhost --port %s --loglevel=DEBUG --start' % port) + ret = self.runCmd('bitbake-prserv --host localhost --port %s --loglevel=DEBUG --stop' % port) self.assertEqual(ret.status, 0)
meta/lib/oeqa/selftest/cases/signing.py +19 -19
@@ -1,5 +1,4 @@ from oeqa.selftest.case import OESelftestTestCase -from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_bb_vars import os import glob import re
@@ -8,8 +7,9 @@ import tempfile from oeqa.core.decorator.oeid import OETestID from oeqa.utils.ftools import write_file - class Signing(OESelftestTestCase): + _use_own_builddir = True + _main_thread = False gpg_dir = "" pub_key_path = ""
@@ -28,7 +28,7 @@ class Signing(OESelftestTestCase): cls.pub_key_path = os.path.join(cls.testlayer_path, 'files', 'signing', "key.pub") cls.secret_key_path = os.path.join(cls.testlayer_path, 'files', 'signing', "key.secret") - runCmd('gpg --batch --homedir %s --import %s %s' % (cls.gpg_dir, cls.pub_key_path, cls.secret_key_path)) + cls.runCmd('gpg --batch --homedir %s --import %s %s' % (cls.gpg_dir, cls.pub_key_path, cls.secret_key_path)) @OETestID(1362) def test_signing_packages(self):
@@ -43,7 +43,7 @@ class Signing(OESelftestTestCase): """ import oe.packagedata - package_classes = get_bb_var('PACKAGE_CLASSES') + package_classes = self.get_bb_var('PACKAGE_CLASSES') if 'package_rpm' not in package_classes: self.skipTest('This test requires RPM Packaging.')
@@ -56,13 +56,13 @@ class Signing(OESelftestTestCase): self.write_config(feature) - bitbake('-c clean %s' % test_recipe) - bitbake('-f -c package_write_rpm %s' % test_recipe) + self.bitbake('-c clean %s' % test_recipe) + self.bitbake('-f -c package_write_rpm %s' % test_recipe) self.add_command_to_tearDown('bitbake -c clean %s' % test_recipe) needed_vars = ['PKGDATA_DIR', 'DEPLOY_DIR_RPM', 'PACKAGE_ARCH', 'STAGING_BINDIR_NATIVE'] - bb_vars = get_bb_vars(needed_vars, test_recipe) + bb_vars = self.get_bb_vars(needed_vars, test_recipe) pkgdatadir = bb_vars['PKGDATA_DIR'] pkgdata = oe.packagedata.read_pkgdatafile(pkgdatadir + "/runtime/ed") if 'PKGE' in pkgdata:
@@ -78,10 +78,10 @@ class Signing(OESelftestTestCase): # Use a temporary rpmdb rpmdb = tempfile.mkdtemp(prefix='oeqa-rpmdb') - runCmd('%s/rpmkeys --define "_dbpath %s" --import %s' % + self.runCmd('%s/rpmkeys --define "_dbpath %s" --import %s' % (staging_bindir_native, rpmdb, self.pub_key_path)) - ret = runCmd('%s/rpmkeys --define "_dbpath %s" --checksig %s' % + ret = self.runCmd('%s/rpmkeys --define "_dbpath %s" --checksig %s' % (staging_bindir_native, rpmdb, pkg_deploy)) # tmp/deploy/rpm/i586/ed-1.9-r0.i586.rpm: rsa sha1 md5 OK self.assertIn('rsa sha1 (md5) pgp md5 OK', ret.output, 'Package signed incorrectly.')
@@ -89,8 +89,8 @@ class Signing(OESelftestTestCase): #Check that an image can be built from signed packages self.add_command_to_tearDown('bitbake -c clean core-image-minimal') - bitbake('-c clean core-image-minimal') - bitbake('core-image-minimal') + self.bitbake('-c clean core-image-minimal') + self.bitbake('core-image-minimal') @OETestID(1382)
@@ -121,8 +121,8 @@ class Signing(OESelftestTestCase): self.write_config(feature) - bitbake('-c clean %s' % test_recipe) - bitbake(test_recipe) + self.bitbake('-c clean %s' % test_recipe) + self.bitbake(test_recipe) recipe_sig = glob.glob(sstatedir + '/*/*:ed:*_package.tgz.sig') recipe_tgz = glob.glob(sstatedir + '/*/*:ed:*_package.tgz')
@@ -130,7 +130,7 @@ class Signing(OESelftestTestCase): self.assertEqual(len(recipe_sig), 1, 'Failed to find .sig file.') self.assertEqual(len(recipe_tgz), 1, 'Failed to find .tgz file.') - ret = runCmd('gpg --homedir %s --verify %s %s' % (self.gpg_dir, recipe_sig[0], recipe_tgz[0])) + ret = self.runCmd('gpg --homedir %s --verify %s %s' % (self.gpg_dir, recipe_sig[0], recipe_tgz[0])) # gpg: Signature made Thu 22 Oct 2015 01:45:09 PM EEST using RSA key ID 61EEFB30 # gpg: Good signature from "testuser (nocomment) <[email protected]>" self.assertIn('gpg: Good signature from', ret.output, 'Package signed incorrectly.')
@@ -153,19 +153,19 @@ class LockedSignatures(OESelftestTestCase): self.add_command_to_tearDown('rm -f %s' % os.path.join(self.builddir, locked_sigs_file)) - bitbake(test_recipe) + self.bitbake(test_recipe) # Generate locked sigs include file - bitbake('-S none %s' % test_recipe) + self.bitbake('-S none %s' % test_recipe) feature = 'require %s\n' % locked_sigs_file feature += 'SIGGEN_LOCKEDSIGS_TASKSIG_CHECK = "warn"\n' self.write_config(feature) # Build a locked recipe - bitbake(test_recipe) + self.bitbake(test_recipe) # Make a change that should cause the locked task signature to change - recipe_append_file = test_recipe + '_' + get_bb_var('PV', test_recipe) + '.bbappend' + recipe_append_file = test_recipe + '_' + self.get_bb_var('PV', test_recipe) + '.bbappend' recipe_append_path = os.path.join(self.testlayer_path, 'recipes-test', test_recipe, recipe_append_file) feature = 'SUMMARY += "test locked signature"\n'
@@ -175,7 +175,7 @@ class LockedSignatures(OESelftestTestCase): self.add_command_to_tearDown('rm -rf %s' % os.path.join(self.testlayer_path, 'recipes-test', test_recipe)) # Build the recipe again - ret = bitbake(test_recipe) + ret = self.bitbake(test_recipe) # Verify you get the warning and that the real task *isn't* run (i.e. the locked signature has worked) patt = r'WARNING: The %s:do_package sig is computed to be \S+, but the sig is locked to \S+ in SIGGEN_LOCKEDSIGS\S+' % test_recipe
meta/lib/oeqa/selftest/cases/sstate.py +2 -3
@@ -6,7 +6,6 @@ import shutil import oeqa.utils.ftools as ftools from oeqa.selftest.case import OESelftestTestCase -from oeqa.utils.commands import runCmd, bitbake, get_bb_vars class SStateBase(OESelftestTestCase):
@@ -16,7 +15,7 @@ class SStateBase(OESelftestTestCase): self.temp_sstate_location = None needed_vars = ['SSTATE_DIR', 'NATIVELSBSTRING', 'TCLIBC', 'TUNE_ARCH', 'TOPDIR', 'TARGET_VENDOR', 'TARGET_OS'] - bb_vars = get_bb_vars(needed_vars) + bb_vars = self.get_bb_vars(needed_vars) self.sstate_path = bb_vars['SSTATE_DIR'] self.hostdistro = bb_vars['NATIVELSBSTRING'] self.tclibc = bb_vars['TCLIBC']
@@ -35,7 +34,7 @@ class SStateBase(OESelftestTestCase): config_temp_sstate = "SSTATE_DIR = \"%s\"" % temp_sstate_path self.append_config(config_temp_sstate) self.track_for_cleanup(temp_sstate_path) - bb_vars = get_bb_vars(['SSTATE_DIR', 'NATIVELSBSTRING']) + bb_vars = self.get_bb_vars(['SSTATE_DIR', 'NATIVELSBSTRING']) self.sstate_path = bb_vars['SSTATE_DIR'] self.hostdistro = bb_vars['NATIVELSBSTRING'] self.distro_specific_sstate = os.path.join(self.sstate_path, self.hostdistro)
meta/lib/oeqa/selftest/cases/sstatetests.py +26 -25
166 lines not on this page · raw message
Signature · 1 line
2.11.0
PATCH v2 18/29 oeqa/selftest/cases: imagefeatures enable threaded runs
In reply to Aníbal Limón- Change to use wrapper methos from OESelfTestCase.
- Move tests that use runqemu to its own module because it needs tinfoil and run in the main thread.
--- meta/lib/oeqa/selftest/cases/imagefeatures.py | 78 +++------------------- meta/lib/oeqa/selftest/cases/imagefeatures_boot.py | 63 +++++++++++++++++ 2 files changed, 73 insertions(+), 68 deletions(-) create mode 100644 meta/lib/oeqa/selftest/cases/imagefeatures_boot.py
meta/lib/oeqa/selftest/cases/imagefeatures.py +10 -68
@@ -1,69 +1,11 @@ +import os + from oeqa.selftest.case import OESelftestTestCase -from oeqa.utils.commands import runCmd, bitbake, get_bb_var, runqemu from oeqa.core.decorator.oeid import OETestID -from oeqa.utils.sshcontrol import SSHControl -import os class ImageFeatures(OESelftestTestCase): - - test_user = 'tester' - root_user = 'root' - - @OETestID(1107) - def test_non_root_user_can_connect_via_ssh_without_password(self): - """ - Summary: Check if non root user can connect via ssh without password - Expected: 1. Connection to the image via ssh using root user without providing a password should be allowed. - 2. Connection to the image via ssh using tester user without providing a password should be allowed. - Product: oe-core - Author: Ionut Chisanovici <[email protected]> - AutomatedBy: Daniel Istrate <[email protected]> - """ - - features = 'EXTRA_IMAGE_FEATURES = "ssh-server-openssh empty-root-password allow-empty-password"\n' - features += 'INHERIT += "extrausers"\n' - features += 'EXTRA_USERS_PARAMS = "useradd -p \'\' {}; usermod -s /bin/sh {};"'.format(self.test_user, self.test_user) - self.write_config(features) - - # Build a core-image-minimal - bitbake('core-image-minimal') - - with runqemu("core-image-minimal") as qemu: - # Attempt to ssh with each user into qemu with empty password - for user in [self.root_user, self.test_user]: - ssh = SSHControl(ip=qemu.ip, logfile=qemu.sshlog, user=user) - status, output = ssh.run("true") - self.assertEqual(status, 0, 'ssh to user %s failed with %s' % (user, output)) - - @OETestID(1115) - def test_all_users_can_connect_via_ssh_without_password(self): - """ - Summary: Check if all users can connect via ssh without password - Expected: 1. Connection to the image via ssh using root user without providing a password should NOT be allowed. - 2. Connection to the image via ssh using tester user without providing a password should be allowed. - Product: oe-core - Author: Ionut Chisanovici <[email protected]> - AutomatedBy: Daniel Istrate <[email protected]> - """ - - features = 'EXTRA_IMAGE_FEATURES = "ssh-server-openssh allow-empty-password"\n' - features += 'INHERIT += "extrausers"\n' - features += 'EXTRA_USERS_PARAMS = "useradd -p \'\' {}; usermod -s /bin/sh {};"'.format(self.test_user, self.test_user) - self.write_config(features) - - # Build a core-image-minimal - bitbake('core-image-minimal') - - with runqemu("core-image-minimal") as qemu: - # Attempt to ssh with each user into qemu with empty password - for user in [self.root_user, self.test_user]: - ssh = SSHControl(ip=qemu.ip, logfile=qemu.sshlog, user=user) - status, output = ssh.run("true") - if user == 'root': - self.assertNotEqual(status, 0, 'ssh to user root was allowed when it should not have been') - else: - self.assertEqual(status, 0, 'ssh to user tester failed with %s' % output) - + _use_own_builddir = True + _main_thread = False @OETestID(1116) def test_clutter_image_can_be_built(self):
@@ -76,7 +18,7 @@ class ImageFeatures(OESelftestTestCase): """ # Build a core-image-clutter - bitbake('core-image-clutter') + self.bitbake('core-image-clutter') @OETestID(1117) def test_wayland_support_in_image(self):
@@ -89,12 +31,12 @@ class ImageFeatures(OESelftestTestCase): AutomatedBy: Daniel Istrate <[email protected]> """ - distro_features = get_bb_var('DISTRO_FEATURES') + distro_features = self.get_bb_var('DISTRO_FEATURES') if not ('opengl' in distro_features and 'wayland' in distro_features): self.skipTest('neither opengl nor wayland present on DISTRO_FEATURES so core-image-weston cannot be built') # Build a core-image-weston - bitbake('core-image-weston') + self.bitbake('core-image-weston') @OETestID(1497) def test_bmap(self):
@@ -110,10 +52,10 @@ class ImageFeatures(OESelftestTestCase): self.write_config(features) image_name = 'core-image-minimal' - bitbake(image_name) + self.bitbake(image_name) - deploy_dir_image = get_bb_var('DEPLOY_DIR_IMAGE') - link_name = get_bb_var('IMAGE_LINK_NAME', image_name) + deploy_dir_image = self.get_bb_var('DEPLOY_DIR_IMAGE') + link_name = self.get_bb_var('IMAGE_LINK_NAME', image_name) image_path = os.path.join(deploy_dir_image, "%s.ext4" % link_name) bmap_path = "%s.bmap" % image_path
meta/lib/oeqa/selftest/cases/imagefeatures_boot.py new file +63 -0
63 lines not on this page · raw message
Signature · 1 line
2.11.0
PATCH v2 19/29 oeqa/selftest/cases: runqemu enable threaded runs
In reply to Aníbal Limón- Update to use wrappers {bitbake,get_bb_var} from OESelftestTestCase class.
- Run into the main thread because it needs tinfoil to run.
--- meta/lib/oeqa/selftest/cases/runqemu.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
meta/lib/oeqa/selftest/cases/runqemu.py +3 -4
@@ -6,12 +6,11 @@ import re import logging from oeqa.selftest.case import OESelftestTestCase -from oeqa.utils.commands import bitbake, runqemu, get_bb_var +from oeqa.utils.commands import runqemu from oeqa.core.decorator.oeid import OETestID class RunqemuTests(OESelftestTestCase): """Runqemu test class""" - image_is_ready = False deploy_dir_image = ''
@@ -37,8 +36,8 @@ SYSLINUX_TIMEOUT = "10" ) if not RunqemuTests.image_is_ready: - RunqemuTests.deploy_dir_image = get_bb_var('DEPLOY_DIR_IMAGE') - bitbake(self.recipe) + RunqemuTests.deploy_dir_image = self.get_bb_var('DEPLOY_DIR_IMAGE') + self.bitbake(self.recipe) RunqemuTests.image_is_ready = True @OETestID(2001)
Signature · 1 line
2.11.0
PATCH v2 20/29 oeqa/selftest/cases: runtime enable threaded runs
In reply to Aníbal Limón- Use wrappers from OESelfTestCase for runCmd, bitbake, etc.
- Split into tree modules because runtime_test_export and runtime_test_postinsts uses runqemu/tinfoil and needs to be executed into the main thread.
--- meta/lib/oeqa/selftest/cases/runtime_test.py | 225 +-------------------- .../lib/oeqa/selftest/cases/runtime_test_export.py | 104 ++++++++++ .../oeqa/selftest/cases/runtime_test_postinsts.py | 114 +++++++++++ 3 files changed, 226 insertions(+), 217 deletions(-) create mode 100644 meta/lib/oeqa/selftest/cases/runtime_test_export.py create mode 100644 meta/lib/oeqa/selftest/cases/runtime_test_postinsts.py
meta/lib/oeqa/selftest/cases/runtime_test.py +8 -217
@@ -1,110 +1,9 @@ from oeqa.selftest.case import OESelftestTestCase -from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_bb_vars, runqemu from oeqa.core.decorator.oeid import OETestID -import os -import re - -class TestExport(OESelftestTestCase): - - @classmethod - def tearDownClass(cls): - runCmd("rm -rf /tmp/sdk") - super(TestExport, cls).tearDownClass() - - @OETestID(1499) - def test_testexport_basic(self): - """ - Summary: Check basic testexport functionality with only ping test enabled. - Expected: 1. testexport directory must be created. - 2. runexported.py must run without any error/exception. - 3. ping test must succeed. - Product: oe-core - Author: Mariano Lopez <[email protected]> - """ - - features = 'INHERIT += "testexport"\n' - # These aren't the actual IP addresses but testexport class needs something defined - features += 'TEST_SERVER_IP = "192.168.7.1"\n' - features += 'TEST_TARGET_IP = "192.168.7.1"\n' - features += 'TEST_SUITES = "ping"\n' - self.write_config(features) - - # Build tesexport for core-image-minimal - bitbake('core-image-minimal') - bitbake('-c testexport core-image-minimal') - - testexport_dir = get_bb_var('TEST_EXPORT_DIR', 'core-image-minimal') - - # Verify if TEST_EXPORT_DIR was created - isdir = os.path.isdir(testexport_dir) - self.assertEqual(True, isdir, 'Failed to create testexport dir: %s' % testexport_dir) - - with runqemu('core-image-minimal') as qemu: - # Attempt to run runexported.py to perform ping test - test_path = os.path.join(testexport_dir, "oe-test") - data_file = os.path.join(testexport_dir, 'data', 'testdata.json') - manifest = os.path.join(testexport_dir, 'data', 'manifest') - cmd = ("%s runtime --test-data-file %s --packages-manifest %s " - "--target-ip %s --server-ip %s --quiet" - % (test_path, data_file, manifest, qemu.ip, qemu.server_ip)) - result = runCmd(cmd) - # Verify ping test was succesful - self.assertEqual(0, result.status, 'oe-test runtime returned a non 0 status') - - @OETestID(1641) - def test_testexport_sdk(self): - """ - Summary: Check sdk functionality for testexport. - Expected: 1. testexport directory must be created. - 2. SDK tarball must exists. - 3. Uncompressing of tarball must succeed. - 4. Check if the SDK directory is added to PATH. - 5. Run tar from the SDK directory. - Product: oe-core - Author: Mariano Lopez <[email protected]> - """ - - features = 'INHERIT += "testexport"\n' - # These aren't the actual IP addresses but testexport class needs something defined - features += 'TEST_SERVER_IP = "192.168.7.1"\n' - features += 'TEST_TARGET_IP = "192.168.7.1"\n' - features += 'TEST_SUITES = "ping"\n' - features += 'TEST_EXPORT_SDK_ENABLED = "1"\n' - features += 'TEST_EXPORT_SDK_PACKAGES = "nativesdk-tar"\n' - self.write_config(features) - - # Build tesexport for core-image-minimal - bitbake('core-image-minimal') - bitbake('-c testexport core-image-minimal') - - needed_vars = ['TEST_EXPORT_DIR', 'TEST_EXPORT_SDK_DIR', 'TEST_EXPORT_SDK_NAME'] - bb_vars = get_bb_vars(needed_vars, 'core-image-minimal') - testexport_dir = bb_vars['TEST_EXPORT_DIR'] - sdk_dir = bb_vars['TEST_EXPORT_SDK_DIR'] - sdk_name = bb_vars['TEST_EXPORT_SDK_NAME'] - - # Check for SDK - tarball_name = "%s.sh" % sdk_name - tarball_path = os.path.join(testexport_dir, sdk_dir, tarball_name) - msg = "Couldn't find SDK tarball: %s" % tarball_path - self.assertEqual(os.path.isfile(tarball_path), True, msg) - - # Extract SDK and run tar from SDK - result = runCmd("%s -y -d /tmp/sdk" % tarball_path) - self.assertEqual(0, result.status, "Couldn't extract SDK") - - env_script = result.output.split()[-1] - result = runCmd(". %s; which tar" % env_script, shell=True) - self.assertEqual(0, result.status, "Couldn't setup SDK environment") - is_sdk_tar = True if "/tmp/sdk" in result.output else False - self.assertTrue(is_sdk_tar, "Couldn't setup SDK environment") - - tar_sdk = result.output - result = runCmd("%s --version" % tar_sdk) - self.assertEqual(0, result.status, "Couldn't run tar from SDK") - class TestImage(OESelftestTestCase): + _use_own_builddir = True + _main_thread = False @OETestID(1644) def test_testimage_install(self):
@@ -115,7 +14,7 @@ class TestImage(OESelftestTestCase): Product: oe-core Author: Mariano Lopez <[email protected]> """ - if get_bb_var('DISTRO') == 'poky-tiny': + if self.get_bb_var('DISTRO') == 'poky-tiny': self.skipTest('core-image-full-cmdline not buildable for poky-tiny') features = 'INHERIT += "testimage"\n'
@@ -123,8 +22,8 @@ class TestImage(OESelftestTestCase): self.write_config(features) # Build core-image-sato and testimage - bitbake('core-image-full-cmdline socat') - bitbake('-c testimage core-image-full-cmdline') + self.bitbake('core-image-full-cmdline socat') + self.bitbake('-c testimage core-image-full-cmdline') @OETestID(1883) def test_testimage_dnf(self):
@@ -134,7 +33,7 @@ class TestImage(OESelftestTestCase): Product: oe-core Author: Alexander Kanavin <[email protected]> """ - if get_bb_var('DISTRO') == 'poky-tiny': + if self.get_bb_var('DISTRO') == 'poky-tiny': self.skipTest('core-image-full-cmdline not buildable for poky-tiny') features = 'INHERIT += "testimage"\n'
@@ -147,113 +46,5 @@ class TestImage(OESelftestTestCase): self.write_config(features) # Build core-image-sato and testimage - bitbake('core-image-full-cmdline socat') - bitbake('-c testimage core-image-full-cmdline') - -class Postinst(OESelftestTestCase): - @OETestID(1540) - def test_verify_postinst(self): - """ - Summary: The purpose of this test is to verify the execution order of postinst Bugzilla ID: [5319] - Expected : - 1. Compile a minimal image. - 2. The compiled image will add the created layer with the recipes postinst[ abdpt] - 3. Run qemux86 - 4. Validate the task execution order - Author: Francisco Pedraza <[email protected]> - """ - features = 'INHERIT += "testimage"\n' - features += 'CORE_IMAGE_EXTRA_INSTALL += "postinst-at-rootfs \ -postinst-delayed-a \ -postinst-delayed-b \ -postinst-delayed-d \ -postinst-delayed-p \ -postinst-delayed-t \ -"\n' - self.write_config(features) - - bitbake('core-image-minimal -f ') - - postinst_list = ['100-postinst-at-rootfs', - '101-postinst-delayed-a', - '102-postinst-delayed-b', - '103-postinst-delayed-d', - '104-postinst-delayed-p', - '105-postinst-delayed-t'] - path_workdir = get_bb_var('WORKDIR','core-image-minimal') - workspacedir = 'testimage/qemu_boot_log' - workspacedir = os.path.join(path_workdir, workspacedir) - rexp = re.compile("^Running postinst .*/(?P<postinst>.*)\.\.\.$") - with runqemu('core-image-minimal') as qemu: - with open(workspacedir) as f: - found = False - idx = 0 - for line in f.readlines(): - line = line.strip().replace("^M","") - if not line: # To avoid empty lines - continue - m = rexp.search(line) - if m: - self.assertEqual(postinst_list[idx], m.group('postinst'), "Fail") - idx = idx+1 - found = True - elif found: - self.assertEqual(idx, len(postinst_list), "Not found all postinsts") - break - - @OETestID(1545) - def test_postinst_rootfs_and_boot(self): - """ - Summary: The purpose of this test case is to verify Post-installation - scripts are called when rootfs is created and also test - that script can be delayed to run at first boot. - Dependencies: NA - Steps: 1. Add proper configuration to local.conf file - 2. Build a "core-image-minimal" image - 3. Verify that file created by postinst_rootfs recipe is - present on rootfs dir. - 4. Boot the image created on qemu and verify that the file - created by postinst_boot recipe is present on image. - Expected: The files are successfully created during rootfs and boot - time for 3 different package managers: rpm,ipk,deb and - for initialization managers: sysvinit and systemd. - - """ - file_rootfs_name = "this-was-created-at-rootfstime" - fileboot_name = "this-was-created-at-first-boot" - rootfs_pkg = 'postinst-at-rootfs' - boot_pkg = 'postinst-delayed-a' - #Step 1 - common_features = 'MACHINE = "qemux86"\n' - common_features += 'CORE_IMAGE_EXTRA_INSTALL += "%s %s "\n'% (rootfs_pkg, boot_pkg) - common_features += 'IMAGE_FEATURES += "ssh-server-openssh"\n' - for init_manager in ("sysvinit", "systemd"): - #for sysvinit no extra configuration is needed, - features = '' - if (init_manager is "systemd"): - features += 'DISTRO_FEATURES_append = " systemd"\n' - features += 'VIRTUAL-RUNTIME_init_manager = "systemd"\n' - features += 'DISTRO_FEATURES_BACKFILL_CONSIDERED = "sysvinit"\n' - features += 'VIRTUAL-RUNTIME_initscripts = ""\n' - for classes in ("package_rpm package_deb package_ipk", - "package_deb package_rpm package_ipk", - "package_ipk package_deb package_rpm"): - features += 'PACKAGE_CLASSES = "%s"\n' % classes - self.write_config(common_features + features) - - #Step 2 - bitbake('core-image-minimal') - - #Step 3 - file_rootfs_created = os.path.join(get_bb_var('IMAGE_ROOTFS',"core-image-minimal"), - file_rootfs_name) - found = os.path.isfile(file_rootfs_created) - self.assertTrue(found, "File %s was not created at rootfs time by %s" % \ - (file_rootfs_name, rootfs_pkg)) - - #Step 4 - testcommand = 'ls /etc/'+fileboot_name - with runqemu('core-image-minimal') as qemu: - sshargs = '-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' - result = runCmd('ssh %s root@%s %s' % (sshargs, qemu.ip, testcommand)) - self.assertEqual(result.status, 0, 'File %s was not created at firts boot'% fileboot_name) + self.bitbake('core-image-full-cmdline socat') + self.bitbake('-c testimage core-image-full-cmdline')
meta/lib/oeqa/selftest/cases/runtime_test_export.py new file +104 -0
104 lines not on this page · raw message
meta/lib/oeqa/selftest/cases/runtime_test_postinsts.py new file +114 -0
114 lines not on this page · raw message
Signature · 1 line
2.11.0
PATCH v2 21/29 oeqa/selftest/cases: eSDK enable threaded runs
In reply to Aníbal Limón- Change some staticmethods to classmethods to be able access wrappers from OESelfTestCase.
- Remove unused method update_configuration.
--- meta/lib/oeqa/selftest/cases/eSDK.py | 61 +++++++++++------------------------- 1 file changed, 19 insertions(+), 42 deletions(-)
meta/lib/oeqa/selftest/cases/eSDK.py +19 -42
@@ -4,7 +4,6 @@ import os import glob from oeqa.core.decorator.oeid import OETestID from oeqa.selftest.case import OESelftestTestCase -from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_bb_vars class oeSDKExtSelfTest(OESelftestTestCase): """
@@ -12,16 +11,15 @@ class oeSDKExtSelfTest(OESelftestTestCase): # This code is planned to be part of the automation for eSDK containig # Install libraries and headers, image generation binary feeds, sdk-update. """ - - @staticmethod - def get_esdk_environment(env_eSDK, tmpdir_eSDKQA): + @classmethod + def get_esdk_environment(cls, env_eSDK, tmpdir_eSDKQA): # XXX: at this time use the first env need to investigate # what environment load oe-selftest, i586, x86_64 pattern = os.path.join(tmpdir_eSDKQA, 'environment-setup-*') return glob.glob(pattern)[0] - @staticmethod - def run_esdk_cmd(env_eSDK, tmpdir_eSDKQA, cmd, postconfig=None, **options): + @classmethod + def run_esdk_cmd(cls, env_eSDK, tmpdir_eSDKQA, cmd, postconfig=None, **options): if postconfig: esdk_conf_file = os.path.join(tmpdir_eSDKQA, 'conf', 'local.conf') with open(esdk_conf_file, 'a+') as f:
@@ -31,57 +29,37 @@ class oeSDKExtSelfTest(OESelftestTestCase): if not 'shell' in options: options['shell'] = True - runCmd("cd %s; . %s; %s" % (tmpdir_eSDKQA, env_eSDK, cmd), **options) + cls.runCmd("cd %s; . %s; %s" % (tmpdir_eSDKQA, env_eSDK, cmd), **options) - @staticmethod - def generate_eSDK(image): + @classmethod + def generate_eSDK(cls, image): pn_task = '%s -c populate_sdk_ext' % image - bitbake(pn_task) + cls.bitbake(pn_task) - @staticmethod - def get_eSDK_toolchain(image): + @classmethod + def get_eSDK_toolchain(cls, image): pn_task = '%s -c populate_sdk_ext' % image - bb_vars = get_bb_vars(['SDK_DEPLOY', 'TOOLCHAINEXT_OUTPUTNAME'], pn_task) + bb_vars = cls.get_bb_vars(['SDK_DEPLOY', 'TOOLCHAINEXT_OUTPUTNAME'], pn_task) sdk_deploy = bb_vars['SDK_DEPLOY'] toolchain_name = bb_vars['TOOLCHAINEXT_OUTPUTNAME'] return os.path.join(sdk_deploy, toolchain_name + '.sh') - @staticmethod - def update_configuration(cls, image, tmpdir_eSDKQA, env_eSDK, ext_sdk_path): - sstate_dir = os.path.join(cls.builddir, 'sstate-cache') - - oeSDKExtSelfTest.generate_eSDK(cls.image) - - cls.ext_sdk_path = oeSDKExtSelfTest.get_eSDK_toolchain(cls.image) - runCmd("%s -y -d \"%s\"" % (cls.ext_sdk_path, cls.tmpdir_eSDKQA)) - - cls.env_eSDK = oeSDKExtSelfTest.get_esdk_environment('', cls.tmpdir_eSDKQA) - - sstate_config=""" -SDK_LOCAL_CONF_WHITELIST = "SSTATE_MIRRORS" -SSTATE_MIRRORS = "file://.* file://%s/PATH" -CORE_IMAGE_EXTRA_INSTALL = "perl" - """ % sstate_dir - - with open(os.path.join(cls.tmpdir_eSDKQA, 'conf', 'local.conf'), 'a+') as f: - f.write(sstate_config) - @classmethod def setUpClass(cls): super(oeSDKExtSelfTest, cls).setUpClass() cls.tmpdir_eSDKQA = tempfile.mkdtemp(prefix='eSDKQA') - sstate_dir = get_bb_var('SSTATE_DIR') + sstate_dir = cls.get_bb_var('SSTATE_DIR') cls.image = 'core-image-minimal' - oeSDKExtSelfTest.generate_eSDK(cls.image) + cls.generate_eSDK(cls.image) # Install eSDK - cls.ext_sdk_path = oeSDKExtSelfTest.get_eSDK_toolchain(cls.image) - runCmd("%s -y -d \"%s\"" % (cls.ext_sdk_path, cls.tmpdir_eSDKQA)) + cls.ext_sdk_path = cls.get_eSDK_toolchain(cls.image) + cls.runCmd("%s -y -d \"%s\"" % (cls.ext_sdk_path, cls.tmpdir_eSDKQA)) - cls.env_eSDK = oeSDKExtSelfTest.get_esdk_environment('', cls.tmpdir_eSDKQA) + cls.env_eSDK = cls.get_esdk_environment('', cls.tmpdir_eSDKQA) # Configure eSDK to use sstate mirror from poky sstate_config="""
@@ -99,13 +77,12 @@ SSTATE_MIRRORS = "file://.* file://%s/PATH" @OETestID(1602) def test_install_libraries_headers(self): pn_sstate = 'bc' - bitbake(pn_sstate) + self.bitbake(pn_sstate) cmd = "devtool sdk-install %s " % pn_sstate - oeSDKExtSelfTest.run_esdk_cmd(self.env_eSDK, self.tmpdir_eSDKQA, cmd) + self.run_esdk_cmd(self.env_eSDK, self.tmpdir_eSDKQA, cmd) @OETestID(1603) def test_image_generation_binary_feeds(self): image = 'core-image-minimal' cmd = "devtool build-image %s" % image - oeSDKExtSelfTest.run_esdk_cmd(self.env_eSDK, self.tmpdir_eSDKQA, cmd) - + self.run_esdk_cmd(self.env_eSDK, self.tmpdir_eSDKQA, cmd)
Signature · 1 line
2.11.0
PATCH v2 22/29 oeqa/selftest/cases: devtool enable threaded runs
In reply to Aníbal Limón- Add new class DevtoolCommon to split devtool suite into other modules.
- Change to use wrappers from OESelfTest class (runCmd, bitbake).
- When remove workspacedir using bitbake-layers use full path because now has it own builddir.
- Add a build of xz-native because some tests needs it to decompress tarballs and is supposed to be provided, see bug [YOCTO #11474].
--- meta/lib/oeqa/selftest/cases/devtool.py | 644 ++++++++++++++++---------------- 1 file changed, 325 insertions(+), 319 deletions(-)
meta/lib/oeqa/selftest/cases/devtool.py +325 -319
@@ -6,13 +6,12 @@ import glob import fnmatch import oeqa.utils.ftools as ftools +from oeqa.utils.commands import create_temp_layer, runqemu + from oeqa.selftest.case import OESelftestTestCase -from oeqa.utils.commands import runCmd, bitbake, get_bb_var, create_temp_layer -from oeqa.utils.commands import get_bb_vars, runqemu from oeqa.core.decorator.oeid import OETestID class DevtoolBase(OESelftestTestCase): - def _test_recipe_contents(self, recipefile, checkvars, checkinherits): with open(recipefile, 'r') as f: invar = None
@@ -62,7 +61,7 @@ class DevtoolBase(OESelftestTestCase): self.assertIn(inherit, inherits, 'Missing inherit of %s' % inherit) def _check_bbappend(self, testrecipe, recipefile, appenddir): - result = runCmd('bitbake-layers show-appends', cwd=self.builddir) + result = self.runCmd('bitbake-layers show-appends', cwd=self.builddir) resultlines = result.output.splitlines() inrecipe = False bbappends = []
@@ -88,7 +87,7 @@ class DevtoolBase(OESelftestTestCase): create_temp_layer(templayerdir, templayername, priority, recipepathspec) if addlayer: self.add_command_to_tearDown('bitbake-layers remove-layer %s || true' % templayerdir) - result = runCmd('bitbake-layers add-layer %s' % templayerdir, cwd=self.builddir) + result = self.runCmd('bitbake-layers add-layer %s' % templayerdir, cwd=self.builddir) def _process_ls_output(self, output): """
@@ -114,47 +113,54 @@ class DevtoolBase(OESelftestTestCase): return filelist -class DevtoolTests(DevtoolBase): - +class DevtoolCommon(DevtoolBase): @classmethod def setUpClass(cls): - super(DevtoolTests, cls).setUpClass() - bb_vars = get_bb_vars(['TOPDIR', 'SSTATE_DIR']) + super(DevtoolCommon, cls).setUpClass() + bb_vars = cls.get_bb_vars(['TOPDIR', 'SSTATE_DIR']) cls.original_sstate = bb_vars['SSTATE_DIR'] cls.devtool_sstate = os.path.join(bb_vars['TOPDIR'], 'sstate_devtool') cls.sstate_conf = 'SSTATE_DIR = "%s"\n' % cls.devtool_sstate cls.sstate_conf += ('SSTATE_MIRRORS += "file://.* file:///%s/PATH"\n' % cls.original_sstate) + # XXX: some test cases needs xz-native to unpack like mdadm recipes + # and it is supposed to be provided + cls.bitbake("xz-native") + @classmethod def tearDownClass(cls): cls.logger.debug('Deleting devtool sstate cache on %s' % cls.devtool_sstate) - runCmd('rm -rf %s' % cls.devtool_sstate) - super(DevtoolTests, cls).tearDownClass() + cls.runCmd('rm -rf %s' % cls.devtool_sstate) + super(DevtoolCommon, cls).tearDownClass() def setUp(self): """Test case setup function""" - super(DevtoolTests, self).setUp() + super(DevtoolCommon, self).setUp() self.workspacedir = os.path.join(self.builddir, 'workspace') self.assertTrue(not os.path.exists(self.workspacedir), 'This test cannot be run with a workspace directory ' 'under the build directory') self.append_config(self.sstate_conf) +class DevtoolTests(DevtoolCommon): + _use_own_builddir = True + _main_thread = False + def _check_src_repo(self, repo_dir): """Check srctree git repository""" self.assertTrue(os.path.isdir(os.path.join(repo_dir, '.git')), 'git repository for external source tree not found') - result = runCmd('git status --porcelain', cwd=repo_dir) + result = self.runCmd('git status --porcelain', cwd=repo_dir) self.assertEqual(result.output.strip(), "", 'Created git repo is not clean') - result = runCmd('git symbolic-ref HEAD', cwd=repo_dir) + result = self.runCmd('git symbolic-ref HEAD', cwd=repo_dir) self.assertEqual(result.output.strip(), "refs/heads/devtool", 'Wrong branch in git repo') def _check_repo_status(self, repo_dir, expected_status): """Check the worktree status of a repository""" - result = runCmd('git status . --porcelain', + result = self.runCmd('git status . --porcelain', cwd=repo_dir) for line in result.output.splitlines(): for ind, (f_status, fn_re) in enumerate(expected_status):
@@ -171,21 +177,21 @@ class DevtoolTests(DevtoolBase): @OETestID(1158) def test_create_workspace(self): # Check preconditions - result = runCmd('bitbake-layers show-layers') + result = self.runCmd('bitbake-layers show-layers') self.assertTrue('/workspace' not in result.output, 'This test cannot be run with a workspace layer in bblayers.conf') # Try creating a workspace layer with a specific path tempdir = tempfile.mkdtemp(prefix='devtoolqa') self.track_for_cleanup(tempdir) - result = runCmd('devtool create-workspace %s' % tempdir) + result = self.runCmd('devtool create-workspace %s' % tempdir) self.assertTrue(os.path.isfile(os.path.join(tempdir, 'conf', 'layer.conf')), msg = "No workspace created. devtool output: %s " % result.output) - result = runCmd('bitbake-layers show-layers') + result = self.runCmd('bitbake-layers show-layers') self.assertIn(tempdir, result.output) # Try creating a workspace layer with the default path self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') - result = runCmd('devtool create-workspace') + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) + result = self.runCmd('devtool create-workspace') self.assertTrue(os.path.isfile(os.path.join(self.workspacedir, 'conf', 'layer.conf')), msg = "No workspace created. devtool output: %s " % result.output) - result = runCmd('bitbake-layers show-layers') + result = self.runCmd('bitbake-layers show-layers') self.assertNotIn(tempdir, result.output) self.assertIn(self.workspacedir, result.output)
@@ -195,25 +201,25 @@ class DevtoolTests(DevtoolBase): tempdir = tempfile.mkdtemp(prefix='devtoolqa') self.track_for_cleanup(tempdir) url = 'http://www.ivarch.com/programs/sources/pv-1.5.3.tar.bz2' - result = runCmd('wget %s' % url, cwd=tempdir) - result = runCmd('tar xfv pv-1.5.3.tar.bz2', cwd=tempdir) + result = self.runCmd('wget %s' % url, cwd=tempdir) + result = self.runCmd('tar xfv pv-1.5.3.tar.bz2', cwd=tempdir) srcdir = os.path.join(tempdir, 'pv-1.5.3') self.assertTrue(os.path.isfile(os.path.join(srcdir, 'configure')), 'Unable to find configure script in source directory') # Test devtool add self.track_for_cleanup(self.workspacedir) self.add_command_to_tearDown('bitbake -c cleansstate pv') - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') - result = runCmd('devtool add pv %s' % srcdir) + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) + result = self.runCmd('devtool add pv %s' % srcdir) self.assertExists(os.path.join(self.workspacedir, 'conf', 'layer.conf'), 'Workspace directory not created') # Test devtool status - result = runCmd('devtool status') + result = self.runCmd('devtool status') self.assertIn('pv', result.output) self.assertIn(srcdir, result.output) # Clean up anything in the workdir/sysroot/sstate cache (have to do this *after* devtool add since the recipe only exists then) - bitbake('pv -c cleansstate') + self.bitbake('pv -c cleansstate') # Test devtool build - result = runCmd('devtool build pv') - bb_vars = get_bb_vars(['D', 'bindir'], 'pv') + result = self.runCmd('devtool build pv') + bb_vars = self.get_bb_vars(['D', 'bindir'], 'pv') installdir = bb_vars['D'] self.assertTrue(installdir, 'Could not query installdir variable') bindir = bb_vars['bindir']
@@ -233,22 +239,22 @@ class DevtoolTests(DevtoolBase): url = 'https://git.yoctoproject.org/git/dbus-wait' # Force fetching to "noname" subdir so we verify we're picking up the name from autoconf # instead of the directory name - result = runCmd('git clone %s noname' % url, cwd=tempdir) + result = self.runCmd('git clone %s noname' % url, cwd=tempdir) srcdir = os.path.join(tempdir, 'noname') - result = runCmd('git reset --hard %s' % srcrev, cwd=srcdir) + result = self.runCmd('git reset --hard %s' % srcrev, cwd=srcdir) self.assertTrue(os.path.isfile(os.path.join(srcdir, 'configure.ac')), 'Unable to find configure script in source directory') # Test devtool add self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) # Don't specify a name since we should be able to auto-detect it - result = runCmd('devtool add %s' % srcdir) + result = self.runCmd('devtool add %s' % srcdir) self.assertExists(os.path.join(self.workspacedir, 'conf', 'layer.conf'), 'Workspace directory not created') # Check the recipe name is correct - recipefile = get_bb_var('FILE', pn) + recipefile = self.get_bb_var('FILE', pn) self.assertIn('%s_git.bb' % pn, recipefile, 'Recipe file incorrectly named') self.assertIn(recipefile, result.output) # Test devtool status - result = runCmd('devtool status') + result = self.runCmd('devtool status') self.assertIn(pn, result.output) self.assertIn(srcdir, result.output) self.assertIn(recipefile, result.output)
@@ -269,42 +275,42 @@ class DevtoolTests(DevtoolBase): self.track_for_cleanup(tempdir) version = '1.1' url = 'https://www.intra2net.com/en/developer/libftdi/download/libftdi1-%s.tar.bz2' % version - result = runCmd('wget %s' % url, cwd=tempdir) - result = runCmd('tar xfv libftdi1-%s.tar.bz2' % version, cwd=tempdir) + result = self.runCmd('wget %s' % url, cwd=tempdir) + result = self.runCmd('tar xfv libftdi1-%s.tar.bz2' % version, cwd=tempdir) srcdir = os.path.join(tempdir, 'libftdi1-%s' % version) self.assertTrue(os.path.isfile(os.path.join(srcdir, 'CMakeLists.txt')), 'Unable to find CMakeLists.txt in source directory') # Test devtool add (and use -V so we test that too) self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') - result = runCmd('devtool add libftdi %s -V %s' % (srcdir, version)) + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) + result = self.runCmd('devtool add libftdi %s -V %s' % (srcdir, version)) self.assertExists(os.path.join(self.workspacedir, 'conf', 'layer.conf'), 'Workspace directory not created') # Test devtool status - result = runCmd('devtool status') + result = self.runCmd('devtool status') self.assertIn('libftdi', result.output) self.assertIn(srcdir, result.output) # Clean up anything in the workdir/sysroot/sstate cache (have to do this *after* devtool add since the recipe only exists then) - bitbake('libftdi -c cleansstate') + self.bitbake('libftdi -c cleansstate') # libftdi's python/CMakeLists.txt is a bit broken, so let's just disable it # There's also the matter of it installing cmake files to a path we don't # normally cover, which triggers the installed-vs-shipped QA test we have # within do_package recipefile = '%s/recipes/libftdi/libftdi_%s.bb' % (self.workspacedir, version) - result = runCmd('recipetool setvar %s EXTRA_OECMAKE -- \'-DPYTHON_BINDINGS=OFF -DLIBFTDI_CMAKE_CONFIG_DIR=${datadir}/cmake/Modules\'' % recipefile) + result = self.runCmd('recipetool setvar %s EXTRA_OECMAKE -- \'-DPYTHON_BINDINGS=OFF -DLIBFTDI_CMAKE_CONFIG_DIR=${datadir}/cmake/Modules\'' % recipefile) with open(recipefile, 'a') as f: f.write('\nFILES_${PN}-dev += "${datadir}/cmake/Modules"\n') # We don't have the ability to pick up this dependency automatically yet... f.write('\nDEPENDS += "libusb1"\n') f.write('\nTESTLIBOUTPUT = "${COMPONENTS_DIR}/${TUNE_PKGARCH}/${PN}/${libdir}"\n') # Test devtool build - result = runCmd('devtool build libftdi') - bb_vars = get_bb_vars(['TESTLIBOUTPUT', 'STAMP'], 'libftdi') + result = self.runCmd('devtool build libftdi') + bb_vars = self.get_bb_vars(['TESTLIBOUTPUT', 'STAMP'], 'libftdi') staging_libdir = bb_vars['TESTLIBOUTPUT'] self.assertTrue(staging_libdir, 'Could not query TESTLIBOUTPUT variable') self.assertTrue(os.path.isfile(os.path.join(staging_libdir, 'libftdi1.so.2.1.0')), "libftdi binary not found in STAGING_LIBDIR. Output of devtool build libftdi %s" % result.output) # Test devtool reset stampprefix = bb_vars['STAMP'] - result = runCmd('devtool reset libftdi') - result = runCmd('devtool status') + result = self.runCmd('devtool reset libftdi') + result = self.runCmd('devtool status') self.assertNotIn('libftdi', result.output) self.assertTrue(stampprefix, 'Unable to get STAMP value for recipe libftdi') matches = glob.glob(stampprefix + '*')
@@ -323,34 +329,34 @@ class DevtoolTests(DevtoolBase): # Test devtool add self.track_for_cleanup(self.workspacedir) self.add_command_to_tearDown('bitbake -c cleansstate %s' % testrecipe) - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') - result = runCmd('devtool add %s %s -f %s' % (testrecipe, srcdir, url)) + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) + result = self.runCmd('devtool add %s %s -f %s' % (testrecipe, srcdir, url)) self.assertExists(os.path.join(self.workspacedir, 'conf', 'layer.conf'), 'Workspace directory not created. %s' % result.output) self.assertTrue(os.path.isfile(os.path.join(srcdir, 'setup.py')), 'Unable to find setup.py in source directory') self.assertTrue(os.path.isdir(os.path.join(srcdir, '.git')), 'git repository for external source tree was not created') # Test devtool status - result = runCmd('devtool status') + result = self.runCmd('devtool status') self.assertIn(testrecipe, result.output) self.assertIn(srcdir, result.output) # Check recipe - recipefile = get_bb_var('FILE', testrecipe) + recipefile = self.get_bb_var('FILE', testrecipe) self.assertIn('%s_%s.bb' % (testrecipe, testver), recipefile, 'Recipe file incorrectly named') checkvars = {} checkvars['S'] = '${WORKDIR}/MarkupSafe-${PV}' checkvars['SRC_URI'] = url.replace(testver, '${PV}') self._test_recipe_contents(recipefile, checkvars, []) # Try with version specified - result = runCmd('devtool reset -n %s' % testrecipe) + result = self.runCmd('devtool reset -n %s' % testrecipe) shutil.rmtree(srcdir) fakever = '1.9' - result = runCmd('devtool add %s %s -f %s -V %s' % (testrecipe, srcdir, url, fakever)) + result = self.runCmd('devtool add %s %s -f %s -V %s' % (testrecipe, srcdir, url, fakever)) self.assertTrue(os.path.isfile(os.path.join(srcdir, 'setup.py')), 'Unable to find setup.py in source directory') # Test devtool status - result = runCmd('devtool status') + result = self.runCmd('devtool status') self.assertIn(testrecipe, result.output) self.assertIn(srcdir, result.output) # Check recipe - recipefile = get_bb_var('FILE', testrecipe) + recipefile = self.get_bb_var('FILE', testrecipe) self.assertIn('%s_%s.bb' % (testrecipe, fakever), recipefile, 'Recipe file incorrectly named') checkvars = {} checkvars['S'] = '${WORKDIR}/MarkupSafe-%s' % testver
@@ -368,16 +374,16 @@ class DevtoolTests(DevtoolBase): # Test devtool add self.track_for_cleanup(self.workspacedir) self.add_command_to_tearDown('bitbake -c cleansstate %s' % testrecipe) - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') - result = runCmd('devtool add %s %s -a -f %s' % (testrecipe, srcdir, url)) + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) + result = self.runCmd('devtool add %s %s -a -f %s' % (testrecipe, srcdir, url)) self.assertExists(os.path.join(self.workspacedir, 'conf', 'layer.conf'), 'Workspace directory not created: %s' % result.output) self.assertTrue(os.path.isfile(os.path.join(srcdir, 'imraa', 'imraa.c')), 'Unable to find imraa/imraa.c in source directory') # Test devtool status - result = runCmd('devtool status') + result = self.runCmd('devtool status') self.assertIn(testrecipe, result.output) self.assertIn(srcdir, result.output) # Check recipe - recipefile = get_bb_var('FILE', testrecipe) + recipefile = self.get_bb_var('FILE', testrecipe) self.assertIn('_git.bb', recipefile, 'Recipe file incorrectly named') checkvars = {} checkvars['S'] = '${WORKDIR}/git'
@@ -386,17 +392,17 @@ class DevtoolTests(DevtoolBase): checkvars['SRCREV'] = '${AUTOREV}' self._test_recipe_contents(recipefile, checkvars, []) # Try with revision and version specified - result = runCmd('devtool reset -n %s' % testrecipe) + result = self.runCmd('devtool reset -n %s' % testrecipe) shutil.rmtree(srcdir) url_rev = '%s;rev=%s' % (url, checkrev) - result = runCmd('devtool add %s %s -f "%s" -V 1.5' % (testrecipe, srcdir, url_rev)) + result = self.runCmd('devtool add %s %s -f "%s" -V 1.5' % (testrecipe, srcdir, url_rev)) self.assertTrue(os.path.isfile(os.path.join(srcdir, 'imraa', 'imraa.c')), 'Unable to find imraa/imraa.c in source directory') # Test devtool status - result = runCmd('devtool status') + result = self.runCmd('devtool status') self.assertIn(testrecipe, result.output) self.assertIn(srcdir, result.output) # Check recipe - recipefile = get_bb_var('FILE', testrecipe) + recipefile = self.get_bb_var('FILE', testrecipe) self.assertIn('_git.bb', recipefile, 'Recipe file incorrectly named') checkvars = {} checkvars['S'] = '${WORKDIR}/git'
@@ -416,17 +422,17 @@ class DevtoolTests(DevtoolBase): srcdir = os.path.join(self.workspacedir, 'sources', testrecipe) # Test devtool add self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') - result = runCmd('devtool add %s' % url) + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) + result = self.runCmd('devtool add %s' % url) self.assertExists(os.path.join(self.workspacedir, 'conf', 'layer.conf'), 'Workspace directory not created. %s' % result.output) self.assertTrue(os.path.isfile(os.path.join(srcdir, 'configure')), 'Unable to find configure script in source directory') self.assertTrue(os.path.isdir(os.path.join(srcdir, '.git')), 'git repository for external source tree was not created') # Test devtool status - result = runCmd('devtool status') + result = self.runCmd('devtool status') self.assertIn(testrecipe, result.output) self.assertIn(srcdir, result.output) # Check recipe - recipefile = get_bb_var('FILE', testrecipe) + recipefile = self.get_bb_var('FILE', testrecipe) self.assertIn('%s_%s.bb' % (testrecipe, testver), recipefile, 'Recipe file incorrectly named') checkvars = {} checkvars['S'] = None
@@ -440,21 +446,21 @@ class DevtoolTests(DevtoolBase): tempdir = tempfile.mkdtemp(prefix='devtoolqa') self.track_for_cleanup(tempdir) self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) self.add_command_to_tearDown('bitbake -c clean mdadm') - result = runCmd('devtool modify mdadm -x %s' % tempdir) + result = self.runCmd('devtool modify mdadm -x %s' % tempdir) self.assertExists(os.path.join(tempdir, 'Makefile'), 'Extracted source could not be found') self.assertExists(os.path.join(self.workspacedir, 'conf', 'layer.conf'), 'Workspace directory not created') matches = glob.glob(os.path.join(self.workspacedir, 'appends', 'mdadm_*.bbappend')) self.assertTrue(matches, 'bbappend not created %s' % result.output) # Test devtool status - result = runCmd('devtool status') + result = self.runCmd('devtool status') self.assertIn('mdadm', result.output) self.assertIn(tempdir, result.output) self._check_src_repo(tempdir) - bitbake('mdadm -C unpack') + self.bitbake('mdadm -C unpack') def check_line(checkfile, expected, message, present=True): # Check for $expected, on a line on its own, in checkfile.
@@ -465,7 +471,7 @@ class DevtoolTests(DevtoolBase): self.assertNotIn(expected + '\n', f, message) modfile = os.path.join(tempdir, 'mdadm.8.in') - bb_vars = get_bb_vars(['PKGD', 'mandir'], 'mdadm') + bb_vars = self.get_bb_vars(['PKGD', 'mandir'], 'mdadm') pkgd = bb_vars['PKGD'] self.assertTrue(pkgd, 'Could not query PKGD variable') mandir = bb_vars['mandir']
@@ -475,20 +481,20 @@ class DevtoolTests(DevtoolBase): check_line(modfile, 'Linux Software RAID', 'Could not find initial string') check_line(modfile, 'antique pin sardine', 'Unexpectedly found replacement string', present=False) - result = runCmd("sed -i 's!^Linux Software RAID$!antique pin sardine!' %s" % modfile) + result = self.runCmd("sed -i 's!^Linux Software RAID$!antique pin sardine!' %s" % modfile) check_line(modfile, 'antique pin sardine', 'mdadm.8.in file not modified (sed failed)') - bitbake('mdadm -c package') + self.bitbake('mdadm -c package') check_line(manfile, 'antique pin sardine', 'man file not modified. man searched file path: %s' % manfile) - result = runCmd('git checkout -- %s' % modfile, cwd=tempdir) + result = self.runCmd('git checkout -- %s' % modfile, cwd=tempdir) check_line(modfile, 'Linux Software RAID', 'man .in file not restored (git failed)') - bitbake('mdadm -c package') + self.bitbake('mdadm -c package') check_line(manfile, 'Linux Software RAID', 'man file not updated. man searched file path: %s' % manfile) - result = runCmd('devtool reset mdadm') - result = runCmd('devtool status') + result = self.runCmd('devtool reset mdadm') + result = self.runCmd('devtool status') self.assertNotIn('mdadm', result.output) @OETestID(1620)
@@ -501,7 +507,7 @@ class DevtoolTests(DevtoolBase): self.assertNotExists(f) # Clean up anything in the workdir/sysroot/sstate cache - bitbake('mdadm m4 -c cleansstate') + self.bitbake('mdadm m4 -c cleansstate') # Try modifying a recipe tempdir_mdadm = tempfile.mkdtemp(prefix='devtoolqa') tempdir_m4 = tempfile.mkdtemp(prefix='devtoolqa')
@@ -510,27 +516,27 @@ class DevtoolTests(DevtoolBase): self.track_for_cleanup(tempdir_m4) self.track_for_cleanup(builddir_m4) self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) self.add_command_to_tearDown('bitbake -c clean mdadm m4') self.write_recipeinc('m4', 'EXTERNALSRC_BUILD = "%s"\ndo_clean() {\n\t:\n}\n' % builddir_m4) try: - runCmd('devtool modify mdadm -x %s' % tempdir_mdadm) - runCmd('devtool modify m4 -x %s' % tempdir_m4) + self.runCmd('devtool modify mdadm -x %s' % tempdir_mdadm) + self.runCmd('devtool modify m4 -x %s' % tempdir_m4) assertNoFile(tempdir_mdadm, 'mdadm') assertNoFile(builddir_m4, 'src/m4') - result = bitbake('m4 -e') - result = bitbake('mdadm m4 -c compile') + result = self.bitbake('m4 -e') + result = self.bitbake('mdadm m4 -c compile') self.assertEqual(result.status, 0) assertFile(tempdir_mdadm, 'mdadm') assertFile(builddir_m4, 'src/m4') # Check that buildclean task exists and does call make clean - bitbake('mdadm m4 -c buildclean') + self.bitbake('mdadm m4 -c buildclean') assertNoFile(tempdir_mdadm, 'mdadm') assertNoFile(builddir_m4, 'src/m4') - bitbake('mdadm m4 -c compile') + self.bitbake('mdadm m4 -c compile') assertFile(tempdir_mdadm, 'mdadm') assertFile(builddir_m4, 'src/m4') - bitbake('mdadm m4 -c clean') + self.bitbake('mdadm m4 -c clean') # Check that buildclean task is run before clean for B == S assertNoFile(tempdir_mdadm, 'mdadm') # Check that buildclean task is not run before clean for B != S
@@ -544,11 +550,11 @@ class DevtoolTests(DevtoolBase): tempdir = tempfile.mkdtemp(prefix='devtoolqa') self.track_for_cleanup(tempdir) self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) testrecipes = 'perf kernel-devsrc package-index core-image-minimal meta-toolchain packagegroup-core-sdk meta-ide-support'.split() # Find actual name of gcc-source since it now includes the version - crude, but good enough for this purpose - result = runCmd('bitbake-layers show-recipes gcc-source*') + result = self.runCmd('bitbake-layers show-recipes gcc-source*') for line in result.output.splitlines(): # just match those lines that contain a real target m = re.match('(?P<recipe>^[a-zA-Z0-9.-]+)(?P<colon>:$)', line)
@@ -556,14 +562,14 @@ class DevtoolTests(DevtoolBase): testrecipes.append(m.group('recipe')) for testrecipe in testrecipes: # Check it's a valid recipe - bitbake('%s -e' % testrecipe) + self.bitbake('%s -e' % testrecipe) # devtool extract should fail - result = runCmd('devtool extract %s %s' % (testrecipe, os.path.join(tempdir, testrecipe)), ignore_status=True) + result = self.runCmd('devtool extract %s %s' % (testrecipe, os.path.join(tempdir, testrecipe)), ignore_status=True) self.assertNotEqual(result.status, 0, 'devtool extract on %s should have failed. devtool output: %s' % (testrecipe, result.output)) self.assertNotIn('Fetching ', result.output, 'devtool extract on %s should have errored out before trying to fetch' % testrecipe) self.assertIn('ERROR: ', result.output, 'devtool extract on %s should have given an ERROR' % testrecipe) # devtool modify should fail - result = runCmd('devtool modify %s -x %s' % (testrecipe, os.path.join(tempdir, testrecipe)), ignore_status=True) + result = self.runCmd('devtool modify %s -x %s' % (testrecipe, os.path.join(tempdir, testrecipe)), ignore_status=True) self.assertNotEqual(result.status, 0, 'devtool modify on %s should have failed. devtool output: %s' % (testrecipe, result.output)) self.assertIn('ERROR: ', result.output, 'devtool modify on %s should have given an ERROR' % testrecipe)
@@ -575,22 +581,22 @@ class DevtoolTests(DevtoolBase): tempdir = tempfile.mkdtemp(prefix='devtoolqa') self.track_for_cleanup(tempdir) self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) bbclassextended = False inheritnative = False testrecipes = 'mtools-native apt-native desktop-file-utils-native'.split() for testrecipe in testrecipes: - checkextend = 'native' in (get_bb_var('BBCLASSEXTEND', testrecipe) or '').split() + checkextend = 'native' in (self.get_bb_var('BBCLASSEXTEND', testrecipe) or '').split() if not bbclassextended: bbclassextended = checkextend if not inheritnative: inheritnative = not checkextend - result = runCmd('devtool modify %s -x %s' % (testrecipe, os.path.join(tempdir, testrecipe))) + result = self.runCmd('devtool modify %s -x %s' % (testrecipe, os.path.join(tempdir, testrecipe))) self.assertNotIn('ERROR: ', result.output, 'ERROR in devtool modify output: %s' % result.output) - result = runCmd('devtool build %s' % testrecipe) + result = self.runCmd('devtool build %s' % testrecipe) self.assertNotIn('ERROR: ', result.output, 'ERROR in devtool build output: %s' % result.output) - result = runCmd('devtool reset %s' % testrecipe) + result = self.runCmd('devtool reset %s' % testrecipe) self.assertNotIn('ERROR: ', result.output, 'ERROR in devtool reset output: %s' % result.output) self.assertTrue(bbclassextended, 'None of these recipes are BBCLASSEXTENDed to native - need to adjust testrecipes list: %s' % ', '.join(testrecipes))
@@ -601,35 +607,35 @@ class DevtoolTests(DevtoolBase): def test_devtool_modify_git(self): # Check preconditions testrecipe = 'mkelfimage' - src_uri = get_bb_var('SRC_URI', testrecipe) + src_uri = self.get_bb_var('SRC_URI', testrecipe) self.assertIn('git://', src_uri, 'This test expects the %s recipe to be a git recipe' % testrecipe) # Clean up anything in the workdir/sysroot/sstate cache - bitbake('%s -c cleansstate' % testrecipe) + self.bitbake('%s -c cleansstate' % testrecipe) # Try modifying a recipe tempdir = tempfile.mkdtemp(prefix='devtoolqa') self.track_for_cleanup(tempdir) self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) self.add_command_to_tearDown('bitbake -c clean %s' % testrecipe) - result = runCmd('devtool modify %s -x %s' % (testrecipe, tempdir)) + result = self.runCmd('devtool modify %s -x %s' % (testrecipe, tempdir)) self.assertExists(os.path.join(tempdir, 'Makefile'), 'Extracted source could not be found') self.assertExists(os.path.join(self.workspacedir, 'conf', 'layer.conf'), 'Workspace directory not created. devtool output: %s' % result.output) matches = glob.glob(os.path.join(self.workspacedir, 'appends', 'mkelfimage_*.bbappend')) self.assertTrue(matches, 'bbappend not created') # Test devtool status - result = runCmd('devtool status') + result = self.runCmd('devtool status') self.assertIn(testrecipe, result.output) self.assertIn(tempdir, result.output) # Check git repo self._check_src_repo(tempdir) # Try building - bitbake(testrecipe) + self.bitbake(testrecipe) @OETestID(1167) def test_devtool_modify_localfiles(self): # Check preconditions testrecipe = 'lighttpd' - src_uri = (get_bb_var('SRC_URI', testrecipe) or '').split() + src_uri = (self.get_bb_var('SRC_URI', testrecipe) or '').split() foundlocal = False for item in src_uri: if item.startswith('file://') and '.patch' not in item:
@@ -637,24 +643,24 @@ class DevtoolTests(DevtoolBase): break self.assertTrue(foundlocal, 'This test expects the %s recipe to fetch local files and it seems that it no longer does' % testrecipe) # Clean up anything in the workdir/sysroot/sstate cache - bitbake('%s -c cleansstate' % testrecipe) + self.bitbake('%s -c cleansstate' % testrecipe) # Try modifying a recipe tempdir = tempfile.mkdtemp(prefix='devtoolqa') self.track_for_cleanup(tempdir) self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) self.add_command_to_tearDown('bitbake -c clean %s' % testrecipe) - result = runCmd('devtool modify %s -x %s' % (testrecipe, tempdir)) + result = self.runCmd('devtool modify %s -x %s' % (testrecipe, tempdir)) self.assertExists(os.path.join(tempdir, 'configure.ac'), 'Extracted source could not be found') self.assertExists(os.path.join(self.workspacedir, 'conf', 'layer.conf'), 'Workspace directory not created') matches = glob.glob(os.path.join(self.workspacedir, 'appends', '%s_*.bbappend' % testrecipe)) self.assertTrue(matches, 'bbappend not created') # Test devtool status - result = runCmd('devtool status') + result = self.runCmd('devtool status') self.assertIn(testrecipe, result.output) self.assertIn(tempdir, result.output) # Try building - bitbake(testrecipe) + self.bitbake(testrecipe) @OETestID(1378) def test_devtool_modify_virtual(self):
@@ -664,14 +670,14 @@ class DevtoolTests(DevtoolBase): tempdir = tempfile.mkdtemp(prefix='devtoolqa') self.track_for_cleanup(tempdir) self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') - result = runCmd('devtool modify %s -x %s' % (virtrecipe, tempdir)) + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) + result = self.runCmd('devtool modify %s -x %s' % (virtrecipe, tempdir)) self.assertExists(os.path.join(tempdir, 'Makefile.am'), 'Extracted source could not be found') self.assertExists(os.path.join(self.workspacedir, 'conf', 'layer.conf'), 'Workspace directory not created') matches = glob.glob(os.path.join(self.workspacedir, 'appends', '%s_*.bbappend' % realrecipe)) self.assertTrue(matches, 'bbappend not created %s' % result.output) # Test devtool status - result = runCmd('devtool status') + result = self.runCmd('devtool status') self.assertNotIn(virtrecipe, result.output) self.assertIn(realrecipe, result.output) # Check git repo
@@ -683,7 +689,7 @@ class DevtoolTests(DevtoolBase): def test_devtool_update_recipe(self): # Check preconditions testrecipe = 'minicom' - bb_vars = get_bb_vars(['FILE', 'SRC_URI'], testrecipe) + bb_vars = self.get_bb_vars(['FILE', 'SRC_URI'], testrecipe) recipefile = bb_vars['FILE'] src_uri = bb_vars['SRC_URI'] self.assertNotIn('git://', src_uri, 'This test expects the %s recipe to NOT be a git recipe' % testrecipe)
@@ -692,21 +698,21 @@ class DevtoolTests(DevtoolBase): tempdir = tempfile.mkdtemp(prefix='devtoolqa') self.track_for_cleanup(tempdir) self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) # (don't bother with cleaning the recipe on teardown, we won't be building it) # We don't use -x here so that we test the behaviour of devtool modify without it - result = runCmd('devtool modify %s %s' % (testrecipe, tempdir)) + result = self.runCmd('devtool modify %s %s' % (testrecipe, tempdir)) # Check git repo self._check_src_repo(tempdir) # Add a couple of commits # FIXME: this only tests adding, need to also test update and remove - result = runCmd('echo "Additional line" >> README', cwd=tempdir) - result = runCmd('git commit -a -m "Change the README"', cwd=tempdir) - result = runCmd('echo "A new file" > devtool-new-file', cwd=tempdir) - result = runCmd('git add devtool-new-file', cwd=tempdir) - result = runCmd('git commit -m "Add a new file"', cwd=tempdir) + result = self.runCmd('echo "Additional line" >> README', cwd=tempdir) + result = self.runCmd('git commit -a -m "Change the README"', cwd=tempdir) + result = self.runCmd('echo "A new file" > devtool-new-file', cwd=tempdir) + result = self.runCmd('git add devtool-new-file', cwd=tempdir) + result = self.runCmd('git commit -m "Add a new file"', cwd=tempdir) self.add_command_to_tearDown('cd %s; rm %s/*.patch; git checkout %s %s' % (os.path.dirname(recipefile), testrecipe, testrecipe, os.path.basename(recipefile))) - result = runCmd('devtool update-recipe %s' % testrecipe) + result = self.runCmd('devtool update-recipe %s' % testrecipe) expected_status = [(' M', '.*/%s$' % os.path.basename(recipefile)), ('??', '.*/0001-Change-the-README.patch$'), ('??', '.*/0002-Add-a-new-file.patch$')]
@@ -716,7 +722,7 @@ class DevtoolTests(DevtoolBase): def test_devtool_update_recipe_git(self): # Check preconditions testrecipe = 'mtd-utils' - bb_vars = get_bb_vars(['FILE', 'SRC_URI'], testrecipe) + bb_vars = self.get_bb_vars(['FILE', 'SRC_URI'], testrecipe) recipefile = bb_vars['FILE'] src_uri = bb_vars['SRC_URI'] self.assertIn('git://', src_uri, 'This test expects the %s recipe to be a git recipe' % testrecipe)
@@ -730,25 +736,25 @@ class DevtoolTests(DevtoolBase): tempdir = tempfile.mkdtemp(prefix='devtoolqa') self.track_for_cleanup(tempdir) self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) # (don't bother with cleaning the recipe on teardown, we won't be building it) - result = runCmd('devtool modify %s -x %s' % (testrecipe, tempdir)) + result = self.runCmd('devtool modify %s -x %s' % (testrecipe, tempdir)) # Check git repo self._check_src_repo(tempdir) # Add a couple of commits # FIXME: this only tests adding, need to also test update and remove - result = runCmd('echo "# Additional line" >> Makefile.am', cwd=tempdir) - result = runCmd('git commit -a -m "Change the Makefile"', cwd=tempdir) - result = runCmd('echo "A new file" > devtool-new-file', cwd=tempdir) - result = runCmd('git add devtool-new-file', cwd=tempdir) - result = runCmd('git commit -m "Add a new file"', cwd=tempdir) + result = self.runCmd('echo "# Additional line" >> Makefile.am', cwd=tempdir) + result = self.runCmd('git commit -a -m "Change the Makefile"', cwd=tempdir) + result = self.runCmd('echo "A new file" > devtool-new-file', cwd=tempdir) + result = self.runCmd('git add devtool-new-file', cwd=tempdir) + result = self.runCmd('git commit -m "Add a new file"', cwd=tempdir) self.add_command_to_tearDown('cd %s; rm -rf %s; git checkout %s %s' % (os.path.dirname(recipefile), testrecipe, testrecipe, os.path.basename(recipefile))) - result = runCmd('devtool update-recipe -m srcrev %s' % testrecipe) + result = self.runCmd('devtool update-recipe -m srcrev %s' % testrecipe) expected_status = [(' M', '.*/%s$' % os.path.basename(recipefile))] + \ [(' D', '.*/%s$' % patch) for patch in patches] self._check_repo_status(os.path.dirname(recipefile), expected_status) - result = runCmd('git diff %s' % os.path.basename(recipefile), cwd=os.path.dirname(recipefile)) + result = self.runCmd('git diff %s' % os.path.basename(recipefile), cwd=os.path.dirname(recipefile)) addlines = ['SRCREV = ".*"', 'SRC_URI = "git://git.infradead.org/mtd-utils.git"'] srcurilines = src_uri.split() srcurilines[0] = 'SRC_URI = "' + srcurilines[0]
@@ -772,9 +778,9 @@ class DevtoolTests(DevtoolBase): break self.assertTrue(matched, 'Unexpected diff remove line: %s' % line) # Now try with auto mode - runCmd('cd %s; git checkout %s %s' % (os.path.dirname(recipefile), testrecipe, os.path.basename(recipefile))) - result = runCmd('devtool update-recipe %s' % testrecipe) - result = runCmd('git rev-parse --show-toplevel', cwd=os.path.dirname(recipefile)) + self.runCmd('cd %s; git checkout %s %s' % (os.path.dirname(recipefile), testrecipe, os.path.basename(recipefile))) + result = self.runCmd('devtool update-recipe %s' % testrecipe) + result = self.runCmd('git rev-parse --show-toplevel', cwd=os.path.dirname(recipefile)) topleveldir = result.output.strip() relpatchpath = os.path.join(os.path.relpath(os.path.dirname(recipefile), topleveldir), testrecipe) expected_status = [(' M', os.path.relpath(recipefile, topleveldir)),
@@ -786,7 +792,7 @@ class DevtoolTests(DevtoolBase): def test_devtool_update_recipe_append(self): # Check preconditions testrecipe = 'mdadm' - bb_vars = get_bb_vars(['FILE', 'SRC_URI'], testrecipe) + bb_vars = self.get_bb_vars(['FILE', 'SRC_URI'], testrecipe) recipefile = bb_vars['FILE'] src_uri = bb_vars['SRC_URI'] self.assertNotIn('git://', src_uri, 'This test expects the %s recipe to NOT be a git recipe' % testrecipe)
@@ -797,19 +803,19 @@ class DevtoolTests(DevtoolBase): templayerdir = os.path.join(tempdir, 'layer') self.track_for_cleanup(tempdir) self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) # (don't bother with cleaning the recipe on teardown, we won't be building it) - result = runCmd('devtool modify %s -x %s' % (testrecipe, tempsrcdir)) + result = self.runCmd('devtool modify %s -x %s' % (testrecipe, tempsrcdir)) # Check git repo self._check_src_repo(tempsrcdir) # Add a commit - result = runCmd("sed 's!\\(#define VERSION\\W*\"[^\"]*\\)\"!\\1-custom\"!' -i ReadMe.c", cwd=tempsrcdir) - result = runCmd('git commit -a -m "Add our custom version"', cwd=tempsrcdir) + result = self.runCmd("sed 's!\\(#define VERSION\\W*\"[^\"]*\\)\"!\\1-custom\"!' -i ReadMe.c", cwd=tempsrcdir) + result = self.runCmd('git commit -a -m "Add our custom version"', cwd=tempsrcdir) self.add_command_to_tearDown('cd %s; rm -f %s/*.patch; git checkout .' % (os.path.dirname(recipefile), testrecipe)) # Create a temporary layer and add it to bblayers.conf self._create_temp_layer(templayerdir, True, 'selftestupdaterecipe') # Create the bbappend - result = runCmd('devtool update-recipe %s -a %s' % (testrecipe, templayerdir)) + result = self.runCmd('devtool update-recipe %s -a %s' % (testrecipe, templayerdir)) self.assertNotIn('WARNING:', result.output) # Check recipe is still clean self._check_repo_status(os.path.dirname(recipefile), [])
@@ -829,12 +835,12 @@ class DevtoolTests(DevtoolBase): self.assertEqual(expectedlines, f.readlines()) # Check we can run it again and bbappend isn't modified - result = runCmd('devtool update-recipe %s -a %s' % (testrecipe, templayerdir)) + result = self.runCmd('devtool update-recipe %s -a %s' % (testrecipe, templayerdir)) with open(bbappendfile, 'r') as f: self.assertEqual(expectedlines, f.readlines()) # Drop new commit and check patch gets deleted - result = runCmd('git reset HEAD^', cwd=tempsrcdir) - result = runCmd('devtool update-recipe %s -a %s' % (testrecipe, templayerdir)) + result = self.runCmd('git reset HEAD^', cwd=tempsrcdir) + result = self.runCmd('devtool update-recipe %s -a %s' % (testrecipe, templayerdir)) self.assertNotExists(patchfile, 'Patch file not deleted') expectedlines2 = ['FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"\n', '\n']
@@ -842,9 +848,9 @@ class DevtoolTests(DevtoolBase): self.assertEqual(expectedlines2, f.readlines()) # Put commit back and check we can run it if layer isn't in bblayers.conf os.remove(bbappendfile) - result = runCmd('git commit -a -m "Add our custom version"', cwd=tempsrcdir) - result = runCmd('bitbake-layers remove-layer %s' % templayerdir, cwd=self.builddir) - result = runCmd('devtool update-recipe %s -a %s' % (testrecipe, templayerdir)) + result = self.runCmd('git commit -a -m "Add our custom version"', cwd=tempsrcdir) + result = self.runCmd('bitbake-layers remove-layer %s' % templayerdir, cwd=self.builddir) + result = self.runCmd('devtool update-recipe %s -a %s' % (testrecipe, templayerdir)) self.assertIn('WARNING: Specified layer is not currently enabled in bblayers.conf', result.output) self.assertExists(patchfile, 'Patch file not created (with disabled layer)') with open(bbappendfile, 'r') as f:
@@ -855,7 +861,7 @@ class DevtoolTests(DevtoolBase): def test_devtool_update_recipe_append_git(self): # Check preconditions testrecipe = 'mtd-utils' - bb_vars = get_bb_vars(['FILE', 'SRC_URI'], testrecipe) + bb_vars = self.get_bb_vars(['FILE', 'SRC_URI'], testrecipe) recipefile = bb_vars['FILE'] src_uri = bb_vars['SRC_URI'] self.assertIn('git://', src_uri, 'This test expects the %s recipe to be a git recipe' % testrecipe)
@@ -870,14 +876,14 @@ class DevtoolTests(DevtoolBase): templayerdir = os.path.join(tempdir, 'layer') self.track_for_cleanup(tempdir) self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) # (don't bother with cleaning the recipe on teardown, we won't be building it) - result = runCmd('devtool modify %s -x %s' % (testrecipe, tempsrcdir)) + result = self.runCmd('devtool modify %s -x %s' % (testrecipe, tempsrcdir)) # Check git repo self._check_src_repo(tempsrcdir) # Add a commit - result = runCmd('echo "# Additional line" >> Makefile.am', cwd=tempsrcdir) - result = runCmd('git commit -a -m "Change the Makefile"', cwd=tempsrcdir) + result = self.runCmd('echo "# Additional line" >> Makefile.am', cwd=tempsrcdir) + result = self.runCmd('git commit -a -m "Change the Makefile"', cwd=tempsrcdir) self.add_command_to_tearDown('cd %s; rm -f %s/*.patch; git checkout .' % (os.path.dirname(recipefile), testrecipe)) # Create a temporary layer os.makedirs(os.path.join(templayerdir, 'conf'))
@@ -889,9 +895,9 @@ class DevtoolTests(DevtoolBase): f.write('BBFILE_PRIORITY_oeselftesttemplayer = "999"\n') f.write('BBFILE_PATTERN_IGNORE_EMPTY_oeselftesttemplayer = "1"\n') self.add_command_to_tearDown('bitbake-layers remove-layer %s || true' % templayerdir) - result = runCmd('bitbake-layers add-layer %s' % templayerdir, cwd=self.builddir) + result = self.runCmd('bitbake-layers add-layer %s' % templayerdir, cwd=self.builddir) # Create the bbappend - result = runCmd('devtool update-recipe -m srcrev %s -a %s' % (testrecipe, templayerdir)) + result = self.runCmd('devtool update-recipe -m srcrev %s -a %s' % (testrecipe, templayerdir)) self.assertNotIn('WARNING:', result.output) # Check recipe is still clean self._check_repo_status(os.path.dirname(recipefile), [])
@@ -902,7 +908,7 @@ class DevtoolTests(DevtoolBase): self.assertNotExists(os.path.join(appenddir, testrecipe), 'Patch directory should not be created') # Check bbappend contents - result = runCmd('git rev-parse HEAD', cwd=tempsrcdir) + result = self.runCmd('git rev-parse HEAD', cwd=tempsrcdir) expectedlines = set(['SRCREV = "%s"\n' % result.output, '\n', 'SRC_URI = "%s"\n' % git_uri,
@@ -911,14 +917,14 @@ class DevtoolTests(DevtoolBase): self.assertEqual(expectedlines, set(f.readlines())) # Check we can run it again and bbappend isn't modified - result = runCmd('devtool update-recipe -m srcrev %s -a %s' % (testrecipe, templayerdir)) + result = self.runCmd('devtool update-recipe -m srcrev %s -a %s' % (testrecipe, templayerdir)) with open(bbappendfile, 'r') as f: self.assertEqual(expectedlines, set(f.readlines())) # Drop new commit and check SRCREV changes - result = runCmd('git reset HEAD^', cwd=tempsrcdir) - result = runCmd('devtool update-recipe -m srcrev %s -a %s' % (testrecipe, templayerdir)) + result = self.runCmd('git reset HEAD^', cwd=tempsrcdir) + result = self.runCmd('devtool update-recipe -m srcrev %s -a %s' % (testrecipe, templayerdir)) self.assertNotExists(os.path.join(appenddir, testrecipe), 'Patch directory should not be created') - result = runCmd('git rev-parse HEAD', cwd=tempsrcdir) + result = self.runCmd('git rev-parse HEAD', cwd=tempsrcdir) expectedlines = set(['SRCREV = "%s"\n' % result.output, '\n', 'SRC_URI = "%s"\n' % git_uri,
@@ -927,12 +933,12 @@ class DevtoolTests(DevtoolBase): self.assertEqual(expectedlines, set(f.readlines())) # Put commit back and check we can run it if layer isn't in bblayers.conf os.remove(bbappendfile) - result = runCmd('git commit -a -m "Change the Makefile"', cwd=tempsrcdir) - result = runCmd('bitbake-layers remove-layer %s' % templayerdir, cwd=self.builddir) - result = runCmd('devtool update-recipe -m srcrev %s -a %s' % (testrecipe, templayerdir)) + result = self.runCmd('git commit -a -m "Change the Makefile"', cwd=tempsrcdir) + result = self.runCmd('bitbake-layers remove-layer %s' % templayerdir, cwd=self.builddir) + result = self.runCmd('devtool update-recipe -m srcrev %s -a %s' % (testrecipe, templayerdir)) self.assertIn('WARNING: Specified layer is not currently enabled in bblayers.conf', result.output) self.assertNotExists(os.path.join(appenddir, testrecipe), 'Patch directory should not be created') - result = runCmd('git rev-parse HEAD', cwd=tempsrcdir) + result = self.runCmd('git rev-parse HEAD', cwd=tempsrcdir) expectedlines = set(['SRCREV = "%s"\n' % result.output, '\n', 'SRC_URI = "%s"\n' % git_uri,
@@ -945,28 +951,28 @@ class DevtoolTests(DevtoolBase): def test_devtool_update_recipe_local_files(self): """Check that local source files are copied over instead of patched""" testrecipe = 'makedevs' - recipefile = get_bb_var('FILE', testrecipe) + recipefile = self.get_bb_var('FILE', testrecipe) # Setup srctree for modifying the recipe tempdir = tempfile.mkdtemp(prefix='devtoolqa') self.track_for_cleanup(tempdir) self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) # (don't bother with cleaning the recipe on teardown, we won't be # building it) - result = runCmd('devtool modify %s -x %s' % (testrecipe, tempdir)) + result = self.runCmd('devtool modify %s -x %s' % (testrecipe, tempdir)) # Check git repo self._check_src_repo(tempdir) # Try building just to ensure we haven't broken that - bitbake("%s" % testrecipe) + self.bitbake("%s" % testrecipe) # Edit / commit local source - runCmd('echo "/* Foobar */" >> oe-local-files/makedevs.c', cwd=tempdir) - runCmd('echo "Foo" > oe-local-files/new-local', cwd=tempdir) - runCmd('echo "Bar" > new-file', cwd=tempdir) - runCmd('git add new-file', cwd=tempdir) - runCmd('git commit -m "Add new file"', cwd=tempdir) + self.runCmd('echo "/* Foobar */" >> oe-local-files/makedevs.c', cwd=tempdir) + self.runCmd('echo "Foo" > oe-local-files/new-local', cwd=tempdir) + self.runCmd('echo "Bar" > new-file', cwd=tempdir) + self.runCmd('git add new-file', cwd=tempdir) + self.runCmd('git commit -m "Add new file"', cwd=tempdir) self.add_command_to_tearDown('cd %s; git clean -fd .; git checkout .' % os.path.dirname(recipefile)) - runCmd('devtool update-recipe %s' % testrecipe) + self.runCmd('devtool update-recipe %s' % testrecipe) expected_status = [(' M', '.*/%s$' % os.path.basename(recipefile)), (' M', '.*/makedevs/makedevs.c$'), ('??', '.*/makedevs/new-local$'),
@@ -977,36 +983,36 @@ class DevtoolTests(DevtoolBase): def test_devtool_update_recipe_local_files_2(self): """Check local source files support when oe-local-files is in Git""" testrecipe = 'lzo' - recipefile = get_bb_var('FILE', testrecipe) + recipefile = self.get_bb_var('FILE', testrecipe) # Setup srctree for modifying the recipe tempdir = tempfile.mkdtemp(prefix='devtoolqa') self.track_for_cleanup(tempdir) self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') - result = runCmd('devtool modify %s -x %s' % (testrecipe, tempdir)) + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) + result = self.runCmd('devtool modify %s -x %s' % (testrecipe, tempdir)) # Check git repo self._check_src_repo(tempdir) # Add oe-local-files to Git - runCmd('rm oe-local-files/.gitignore', cwd=tempdir) - runCmd('git add oe-local-files', cwd=tempdir) - runCmd('git commit -m "Add local sources"', cwd=tempdir) + self.runCmd('rm oe-local-files/.gitignore', cwd=tempdir) + self.runCmd('git add oe-local-files', cwd=tempdir) + self.runCmd('git commit -m "Add local sources"', cwd=tempdir) # Edit / commit local sources - runCmd('echo "# Foobar" >> oe-local-files/acinclude.m4', cwd=tempdir) - runCmd('git commit -am "Edit existing file"', cwd=tempdir) - runCmd('git rm oe-local-files/run-ptest', cwd=tempdir) - runCmd('git commit -m"Remove file"', cwd=tempdir) - runCmd('echo "Foo" > oe-local-files/new-local', cwd=tempdir) - runCmd('git add oe-local-files/new-local', cwd=tempdir) - runCmd('git commit -m "Add new local file"', cwd=tempdir) - runCmd('echo "Gar" > new-file', cwd=tempdir) - runCmd('git add new-file', cwd=tempdir) - runCmd('git commit -m "Add new file"', cwd=tempdir) + self.runCmd('echo "# Foobar" >> oe-local-files/acinclude.m4', cwd=tempdir) + self.runCmd('git commit -am "Edit existing file"', cwd=tempdir) + self.runCmd('git rm oe-local-files/run-ptest', cwd=tempdir) + self.runCmd('git commit -m"Remove file"', cwd=tempdir) + self.runCmd('echo "Foo" > oe-local-files/new-local', cwd=tempdir) + self.runCmd('git add oe-local-files/new-local', cwd=tempdir) + self.runCmd('git commit -m "Add new local file"', cwd=tempdir) + self.runCmd('echo "Gar" > new-file', cwd=tempdir) + self.runCmd('git add new-file', cwd=tempdir) + self.runCmd('git commit -m "Add new file"', cwd=tempdir) self.add_command_to_tearDown('cd %s; git clean -fd .; git checkout .' % os.path.dirname(recipefile)) # Checkout unmodified file to working copy -> devtool should still pick # the modified version from HEAD - runCmd('git checkout HEAD^ -- oe-local-files/acinclude.m4', cwd=tempdir) - runCmd('devtool update-recipe %s' % testrecipe) + self.runCmd('git checkout HEAD^ -- oe-local-files/acinclude.m4', cwd=tempdir) + self.runCmd('devtool update-recipe %s' % testrecipe) expected_status = [(' M', '.*/%s$' % os.path.basename(recipefile)), (' M', '.*/acinclude.m4$'), (' D', '.*/run-ptest$'),
@@ -1018,19 +1024,19 @@ class DevtoolTests(DevtoolBase): def test_devtool_update_recipe_local_files_3(self): # First, modify the recipe testrecipe = 'devtool-test-localonly' - bb_vars = get_bb_vars(['FILE', 'SRC_URI'], testrecipe) + bb_vars = self.get_bb_vars(['FILE', 'SRC_URI'], testrecipe) recipefile = bb_vars['FILE'] src_uri = bb_vars['SRC_URI'] tempdir = tempfile.mkdtemp(prefix='devtoolqa') self.track_for_cleanup(tempdir) self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) # (don't bother with cleaning the recipe on teardown, we won't be building it) - result = runCmd('devtool modify %s' % testrecipe) + result = self.runCmd('devtool modify %s' % testrecipe) # Modify one file - runCmd('echo "Another line" >> file2', cwd=os.path.join(self.workspacedir, 'sources', testrecipe, 'oe-local-files')) + self.runCmd('echo "Another line" >> file2', cwd=os.path.join(self.workspacedir, 'sources', testrecipe, 'oe-local-files')) self.add_command_to_tearDown('cd %s; rm %s/*; git checkout %s %s' % (os.path.dirname(recipefile), testrecipe, testrecipe, os.path.basename(recipefile))) - result = runCmd('devtool update-recipe %s' % testrecipe) + result = self.runCmd('devtool update-recipe %s' % testrecipe) expected_status = [(' M', '.*/%s/file2$' % testrecipe)] self._check_repo_status(os.path.dirname(recipefile), expected_status)
@@ -1038,27 +1044,27 @@ class DevtoolTests(DevtoolBase): def test_devtool_update_recipe_local_patch_gz(self): # First, modify the recipe testrecipe = 'devtool-test-patch-gz' - if get_bb_var('DISTRO') == 'poky-tiny': + if self.get_bb_var('DISTRO') == 'poky-tiny': self.skipTest("The DISTRO 'poky-tiny' does not provide the dependencies needed by %s" % testrecipe) - bb_vars = get_bb_vars(['FILE', 'SRC_URI'], testrecipe) + bb_vars = self.get_bb_vars(['FILE', 'SRC_URI'], testrecipe) recipefile = bb_vars['FILE'] src_uri = bb_vars['SRC_URI'] tempdir = tempfile.mkdtemp(prefix='devtoolqa') self.track_for_cleanup(tempdir) self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) # (don't bother with cleaning the recipe on teardown, we won't be building it) - result = runCmd('devtool modify %s' % testrecipe) + result = self.runCmd('devtool modify %s' % testrecipe) # Modify one file srctree = os.path.join(self.workspacedir, 'sources', testrecipe) - runCmd('echo "Another line" >> README', cwd=srctree) - runCmd('git commit -a --amend --no-edit', cwd=srctree) + self.runCmd('echo "Another line" >> README', cwd=srctree) + self.runCmd('git commit -a --amend --no-edit', cwd=srctree) self.add_command_to_tearDown('cd %s; rm %s/*; git checkout %s %s' % (os.path.dirname(recipefile), testrecipe, testrecipe, os.path.basename(recipefile))) - result = runCmd('devtool update-recipe %s' % testrecipe) + result = self.runCmd('devtool update-recipe %s' % testrecipe) expected_status = [(' M', '.*/%s/readme.patch.gz$' % testrecipe)] self._check_repo_status(os.path.dirname(recipefile), expected_status) patch_gz = os.path.join(os.path.dirname(recipefile), testrecipe, 'readme.patch.gz') - result = runCmd('file %s' % patch_gz) + result = self.runCmd('file %s' % patch_gz) if 'gzip compressed data' not in result.output: self.fail('New patch file is not gzipped - file reports:\n%s' % result.output)
@@ -1069,15 +1075,15 @@ class DevtoolTests(DevtoolBase): # was also in SRC_URI # First, modify the recipe testrecipe = 'devtool-test-subdir' - bb_vars = get_bb_vars(['FILE', 'SRC_URI'], testrecipe) + bb_vars = self.get_bb_vars(['FILE', 'SRC_URI'], testrecipe) recipefile = bb_vars['FILE'] src_uri = bb_vars['SRC_URI'] tempdir = tempfile.mkdtemp(prefix='devtoolqa') self.track_for_cleanup(tempdir) self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) # (don't bother with cleaning the recipe on teardown, we won't be building it) - result = runCmd('devtool modify %s' % testrecipe) + result = self.runCmd('devtool modify %s' % testrecipe) testfile = os.path.join(self.workspacedir, 'sources', testrecipe, 'testfile') self.assertExists(testfile, 'Extracted source could not be found') with open(testfile, 'r') as f:
@@ -1085,7 +1091,7 @@ class DevtoolTests(DevtoolBase): self.assertEqual(contents, 'Modified version', 'File has apparently not been overwritten as it should have been') # Test devtool update-recipe without modifying any files self.add_command_to_tearDown('cd %s; rm %s/*; git checkout %s %s' % (os.path.dirname(recipefile), testrecipe, testrecipe, os.path.basename(recipefile))) - result = runCmd('devtool update-recipe %s' % testrecipe) + result = self.runCmd('devtool update-recipe %s' % testrecipe) expected_status = [] self._check_repo_status(os.path.dirname(recipefile), expected_status)
@@ -1094,7 +1100,7 @@ class DevtoolTests(DevtoolBase): tempdir = tempfile.mkdtemp(prefix='devtoolqa') # Try devtool extract self.track_for_cleanup(tempdir) - result = runCmd('devtool extract matchbox-terminal %s' % tempdir) + result = self.runCmd('devtool extract matchbox-terminal %s' % tempdir) self.assertExists(os.path.join(tempdir, 'Makefile.am'), 'Extracted source could not be found') # devtool extract shouldn't create the workspace self.assertNotExists(self.workspacedir)
@@ -1105,7 +1111,7 @@ class DevtoolTests(DevtoolBase): tempdir = tempfile.mkdtemp(prefix='devtoolqa') # Try devtool extract self.track_for_cleanup(tempdir) - result = runCmd('devtool extract virtual/make %s' % tempdir) + result = self.runCmd('devtool extract virtual/make %s' % tempdir) self.assertExists(os.path.join(tempdir, 'Makefile.am'), 'Extracted source could not be found') # devtool extract shouldn't create the workspace self.assertNotExists(self.workspacedir)
@@ -1116,21 +1122,21 @@ class DevtoolTests(DevtoolBase): tempdir = tempfile.mkdtemp(prefix='devtoolqa') self.track_for_cleanup(tempdir) self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) testrecipe1 = 'mdadm' testrecipe2 = 'cronie' - result = runCmd('devtool modify -x %s %s' % (testrecipe1, os.path.join(tempdir, testrecipe1))) - result = runCmd('devtool modify -x %s %s' % (testrecipe2, os.path.join(tempdir, testrecipe2))) - result = runCmd('devtool build %s' % testrecipe1) - result = runCmd('devtool build %s' % testrecipe2) - stampprefix1 = get_bb_var('STAMP', testrecipe1) + result = self.runCmd('devtool modify -x %s %s' % (testrecipe1, os.path.join(tempdir, testrecipe1))) + result = self.runCmd('devtool modify -x %s %s' % (testrecipe2, os.path.join(tempdir, testrecipe2))) + result = self.runCmd('devtool build %s' % testrecipe1) + result = self.runCmd('devtool build %s' % testrecipe2) + stampprefix1 = self.get_bb_var('STAMP', testrecipe1) self.assertTrue(stampprefix1, 'Unable to get STAMP value for recipe %s' % testrecipe1) - stampprefix2 = get_bb_var('STAMP', testrecipe2) + stampprefix2 = self.get_bb_var('STAMP', testrecipe2) self.assertTrue(stampprefix2, 'Unable to get STAMP value for recipe %s' % testrecipe2) - result = runCmd('devtool reset -a') + result = self.runCmd('devtool reset -a') self.assertIn(testrecipe1, result.output) self.assertIn(testrecipe2, result.output) - result = runCmd('devtool status') + result = self.runCmd('devtool status') self.assertNotIn(testrecipe1, result.output) self.assertNotIn(testrecipe2, result.output) matches1 = glob.glob(stampprefix1 + '*')
@@ -1147,14 +1153,14 @@ class DevtoolTests(DevtoolBase): # really this has to be done as an oe-selftest test. # # Check preconditions - machine = get_bb_var('MACHINE') + machine = self.get_bb_var('MACHINE') if not machine.startswith('qemu'): self.skipTest('This test only works with qemu machines') if not os.path.exists('/etc/runqemu-nosudo'): self.skipTest('You must set up tap devices with scripts/runqemu-gen-tapdevs before running this test') - result = runCmd('PATH="$PATH:/sbin:/usr/sbin" ip tuntap show', ignore_status=True) + result = self.runCmd('PATH="$PATH:/sbin:/usr/sbin" ip tuntap show', ignore_status=True) if result.status != 0: - result = runCmd('PATH="$PATH:/sbin:/usr/sbin" ifconfig -a', ignore_status=True) + result = self.runCmd('PATH="$PATH:/sbin:/usr/sbin" ifconfig -a', ignore_status=True) if result.status != 0: self.skipTest('Failed to determine if tap devices exist with ifconfig or ip: %s' % result.output) for line in result.output.splitlines():
@@ -1169,41 +1175,41 @@ class DevtoolTests(DevtoolBase): testimage = 'oe-selftest-image' testcommand = '/sbin/mdadm --help' # Build an image to run - bitbake("%s qemu-native qemu-helper-native" % testimage) - deploy_dir_image = get_bb_var('DEPLOY_DIR_IMAGE') + self.bitbake("%s qemu-native qemu-helper-native" % testimage) + deploy_dir_image = self.get_bb_var('DEPLOY_DIR_IMAGE') self.add_command_to_tearDown('bitbake -c clean %s' % testimage) self.add_command_to_tearDown('rm -f %s/%s*' % (deploy_dir_image, testimage)) # Clean recipe so the first deploy will fail - bitbake("%s -c clean" % testrecipe) + self.bitbake("%s -c clean" % testrecipe) # Try devtool modify tempdir = tempfile.mkdtemp(prefix='devtoolqa') self.track_for_cleanup(tempdir) self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) self.add_command_to_tearDown('bitbake -c clean %s' % testrecipe) - result = runCmd('devtool modify %s -x %s' % (testrecipe, tempdir)) + result = self.runCmd('devtool modify %s -x %s' % (testrecipe, tempdir)) # Test that deploy-target at this point fails (properly) - result = runCmd('devtool deploy-target -n %s root@localhost' % testrecipe, ignore_status=True) + result = self.runCmd('devtool deploy-target -n %s root@localhost' % testrecipe, ignore_status=True) self.assertNotEqual(result.output, 0, 'devtool deploy-target should have failed, output: %s' % result.output) self.assertNotIn(result.output, 'Traceback', 'devtool deploy-target should have failed with a proper error not a traceback, output: %s' % result.output) - result = runCmd('devtool build %s' % testrecipe) + result = self.runCmd('devtool build %s' % testrecipe) # First try a dry-run of deploy-target - result = runCmd('devtool deploy-target -n %s root@localhost' % testrecipe) + result = self.runCmd('devtool deploy-target -n %s root@localhost' % testrecipe) self.assertIn(' %s' % testfile, result.output) # Boot the image with runqemu(testimage) as qemu: # Now really test deploy-target - result = runCmd('devtool deploy-target -c %s root@%s' % (testrecipe, qemu.ip)) + result = self.runCmd('devtool deploy-target -c %s root@%s' % (testrecipe, qemu.ip)) # Run a test command to see if it was installed properly sshargs = '-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' - result = runCmd('ssh %s root@%s %s' % (sshargs, qemu.ip, testcommand)) + result = self.runCmd('ssh %s root@%s %s' % (sshargs, qemu.ip, testcommand)) # Check if it deployed all of the files with the right ownership/perms # First look on the host - need to do this under pseudo to get the correct ownership/perms - bb_vars = get_bb_vars(['D', 'FAKEROOTENV', 'FAKEROOTCMD'], testrecipe) + bb_vars = self.get_bb_vars(['D', 'FAKEROOTENV', 'FAKEROOTCMD'], testrecipe) installdir = bb_vars['D'] fakerootenv = bb_vars['FAKEROOTENV'] fakerootcmd = bb_vars['FAKEROOTCMD'] - result = runCmd('%s %s find . -type f -exec ls -l {} \;' % (fakerootenv, fakerootcmd), cwd=installdir) + result = self.runCmd('%s %s find . -type f -exec ls -l {} \;' % (fakerootenv, fakerootcmd), cwd=installdir) filelist1 = self._process_ls_output(result.output) # Now look on the target
@@ -1214,14 +1220,14 @@ class DevtoolTests(DevtoolBase): for line in filelist1: splitline = line.split() f.write(splitline[-1] + '\n') - result = runCmd('cat %s | ssh -q %s root@%s \'xargs ls -l\'' % (tmpfilelist, sshargs, qemu.ip)) + result = self.runCmd('cat %s | ssh -q %s root@%s \'xargs ls -l\'' % (tmpfilelist, sshargs, qemu.ip)) filelist2 = self._process_ls_output(result.output) filelist1.sort(key=lambda item: item.split()[-1]) filelist2.sort(key=lambda item: item.split()[-1]) self.assertEqual(filelist1, filelist2) # Test undeploy-target - result = runCmd('devtool undeploy-target -c %s root@%s' % (testrecipe, qemu.ip)) - result = runCmd('ssh %s root@%s %s' % (sshargs, qemu.ip, testcommand), ignore_status=True) + result = self.runCmd('devtool undeploy-target -c %s root@%s' % (testrecipe, qemu.ip)) + result = self.runCmd('ssh %s root@%s %s' % (sshargs, qemu.ip, testcommand), ignore_status=True) self.assertNotEqual(result, 0, 'undeploy-target did not remove command as it should have') @OETestID(1366)
@@ -1231,22 +1237,22 @@ class DevtoolTests(DevtoolBase): self.assertTrue(not os.path.exists(self.workspacedir), 'This test cannot be run with a workspace directory under the build directory') image = 'core-image-minimal' self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) self.add_command_to_tearDown('bitbake -c clean %s' % image) - bitbake('%s -c clean' % image) + self.bitbake('%s -c clean' % image) # Add target and native recipes to workspace recipes = ['mdadm', 'parted-native'] for recipe in recipes: tempdir = tempfile.mkdtemp(prefix='devtoolqa') self.track_for_cleanup(tempdir) self.add_command_to_tearDown('bitbake -c clean %s' % recipe) - runCmd('devtool modify %s -x %s' % (recipe, tempdir)) + self.runCmd('devtool modify %s -x %s' % (recipe, tempdir)) # Try to build image - result = runCmd('devtool build-image %s' % image) + result = self.runCmd('devtool build-image %s' % image) self.assertNotEqual(result, 0, 'devtool build-image failed') # Check if image contains expected packages - deploy_dir_image = get_bb_var('DEPLOY_DIR_IMAGE') - image_link_name = get_bb_var('IMAGE_LINK_NAME', image) + deploy_dir_image = self.get_bb_var('DEPLOY_DIR_IMAGE') + image_link_name = self.get_bb_var('IMAGE_LINK_NAME', image) reqpkgs = [item for item in recipes if not item.endswith('-native')] with open(os.path.join(deploy_dir_image, image_link_name + '.manifest'), 'r') as f: for line in f:
@@ -1263,23 +1269,23 @@ class DevtoolTests(DevtoolBase): # Check preconditions self.assertTrue(not os.path.exists(self.workspacedir), 'This test cannot be run with a workspace directory under the build directory') self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) # Check parameters - result = runCmd('devtool upgrade -h') + result = self.runCmd('devtool upgrade -h') for param in 'recipename srctree --version -V --branch -b --keep-temp --no-patch'.split(): self.assertIn(param, result.output) # For the moment, we are using a real recipe. recipe = 'devtool-upgrade-test1' version = '1.6.0' - oldrecipefile = get_bb_var('FILE', recipe) + oldrecipefile = self.get_bb_var('FILE', recipe) tempdir = tempfile.mkdtemp(prefix='devtoolqa') self.track_for_cleanup(tempdir) # Check that recipe is not already under devtool control - result = runCmd('devtool status') + result = self.runCmd('devtool status') self.assertNotIn(recipe, result.output) # Check upgrade. Code does not check if new PV is older or newer that current PV, so, it may be that # we are downgrading instead of upgrading. - result = runCmd('devtool upgrade %s %s -V %s' % (recipe, tempdir, version)) + result = self.runCmd('devtool upgrade %s %s -V %s' % (recipe, tempdir, version)) # Check if srctree at least is populated self.assertTrue(len(os.listdir(tempdir)) > 0, 'srctree (%s) should be populated with new (%s) source code' % (tempdir, version)) # Check new recipe subdirectory is present
@@ -1288,7 +1294,7 @@ class DevtoolTests(DevtoolBase): newrecipefile = os.path.join(self.workspacedir, 'recipes', recipe, '%s_%s.bb' % (recipe, version)) self.assertExists(newrecipefile, 'Recipe file should exist after upgrade') # Check devtool status and make sure recipe is present - result = runCmd('devtool status') + result = self.runCmd('devtool status') self.assertIn(recipe, result.output) self.assertIn(tempdir, result.output) # Check recipe got changed as expected
@@ -1298,8 +1304,8 @@ class DevtoolTests(DevtoolBase): newlines = f.readlines() self.assertEqual(desiredlines, newlines) # Check devtool reset recipe - result = runCmd('devtool reset %s -n' % recipe) - result = runCmd('devtool status') + result = self.runCmd('devtool reset %s -n' % recipe) + result = self.runCmd('devtool status') self.assertNotIn(recipe, result.output) self.assertNotExists(os.path.join(self.workspacedir, 'recipes', recipe), 'Recipe directory should not exist after resetting')
@@ -1308,24 +1314,24 @@ class DevtoolTests(DevtoolBase): # Check preconditions self.assertTrue(not os.path.exists(self.workspacedir), 'This test cannot be run with a workspace directory under the build directory') self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) recipe = 'devtool-upgrade-test2' commit = '6cc6077a36fe2648a5f993fe7c16c9632f946517' - oldrecipefile = get_bb_var('FILE', recipe) + oldrecipefile = self.get_bb_var('FILE', recipe) tempdir = tempfile.mkdtemp(prefix='devtoolqa') self.track_for_cleanup(tempdir) # Check that recipe is not already under devtool control - result = runCmd('devtool status') + result = self.runCmd('devtool status') self.assertNotIn(recipe, result.output) # Check upgrade - result = runCmd('devtool upgrade %s %s -S %s' % (recipe, tempdir, commit)) + result = self.runCmd('devtool upgrade %s %s -S %s' % (recipe, tempdir, commit)) # Check if srctree at least is populated self.assertTrue(len(os.listdir(tempdir)) > 0, 'srctree (%s) should be populated with new (%s) source code' % (tempdir, commit)) # Check new recipe file is present newrecipefile = os.path.join(self.workspacedir, 'recipes', recipe, os.path.basename(oldrecipefile)) self.assertExists(newrecipefile, 'Recipe file should exist after upgrade') # Check devtool status and make sure recipe is present - result = runCmd('devtool status') + result = self.runCmd('devtool status') self.assertIn(recipe, result.output) self.assertIn(tempdir, result.output) # Check recipe got changed as expected
@@ -1335,8 +1341,8 @@ class DevtoolTests(DevtoolBase): newlines = f.readlines() self.assertEqual(desiredlines, newlines) # Check devtool reset recipe - result = runCmd('devtool reset %s -n' % recipe) - result = runCmd('devtool status') + result = self.runCmd('devtool reset %s -n' % recipe) + result = self.runCmd('devtool status') self.assertNotIn(recipe, result.output) self.assertNotExists(os.path.join(self.workspacedir, 'recipes', recipe), 'Recipe directory should not exist after resetting')
@@ -1347,10 +1353,10 @@ class DevtoolTests(DevtoolBase): This test executes the selftest-reverse command from meta-selftest.""" self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) s = "Microsoft Made No Profit From Anyone's Zunes Yo" - result = runCmd("devtool --quiet selftest-reverse \"%s\"" % s) + result = self.runCmd("devtool --quiet selftest-reverse \"%s\"" % s) self.assertEqual(result.output, s[::-1]) def _copy_file_with_cleanup(self, srcfile, basedstdir, *paths):
@@ -1371,12 +1377,12 @@ class DevtoolTests(DevtoolBase): """Test that devtool loads only the first found plugin in BBPATH.""" self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) - devtool = runCmd("which devtool") - fromname = runCmd("devtool --quiet pluginfile") + devtool = self.runCmd("which devtool") + fromname = self.runCmd("devtool --quiet pluginfile") srcfile = fromname.output - bbpath = get_bb_var('BBPATH') + bbpath = self.get_bb_var('BBPATH') searchpath = bbpath.split(':') + [os.path.dirname(devtool.output)] plugincontent = [] with open(srcfile) as fh:
@@ -1385,12 +1391,12 @@ class DevtoolTests(DevtoolBase): self.assertIn('meta-selftest', srcfile, 'wrong bbpath plugin found') for path in searchpath: self._copy_file_with_cleanup(srcfile, path, 'lib', 'devtool') - result = runCmd("devtool --quiet count") + result = self.runCmd("devtool --quiet count") self.assertEqual(result.output, '1') - result = runCmd("devtool --quiet multiloaded") + result = self.runCmd("devtool --quiet multiloaded") self.assertEqual(result.output, "no") for path in searchpath: - result = runCmd("devtool --quiet bbdir") + result = self.runCmd("devtool --quiet bbdir") self.assertEqual(result.output, path) os.unlink(os.path.join(result.output, 'lib', 'devtool', 'bbpath.py')) finally:
@@ -1401,32 +1407,32 @@ class DevtoolTests(DevtoolBase): # Check preconditions self.assertTrue(not os.path.exists(self.workspacedir), 'This test cannot be run with a workspace directory under the build directory') self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) # Use a "real" recipe from meta-selftest recipe = 'devtool-upgrade-test1' oldversion = '1.5.3' newversion = '1.6.0' - oldrecipefile = get_bb_var('FILE', recipe) + oldrecipefile = self.get_bb_var('FILE', recipe) recipedir = os.path.dirname(oldrecipefile) - result = runCmd('git status --porcelain .', cwd=recipedir) + result = self.runCmd('git status --porcelain .', cwd=recipedir) if result.output.strip(): self.fail('Recipe directory for %s contains uncommitted changes' % recipe) tempdir = tempfile.mkdtemp(prefix='devtoolqa') self.track_for_cleanup(tempdir) # Check that recipe is not already under devtool control - result = runCmd('devtool status') + result = self.runCmd('devtool status') self.assertNotIn(recipe, result.output) # Do the upgrade - result = runCmd('devtool upgrade %s %s -V %s' % (recipe, tempdir, newversion)) + result = self.runCmd('devtool upgrade %s %s -V %s' % (recipe, tempdir, newversion)) # Check devtool status and make sure recipe is present - result = runCmd('devtool status') + result = self.runCmd('devtool status') self.assertIn(recipe, result.output) self.assertIn(tempdir, result.output) # Make a change to the source - result = runCmd('sed -i \'/^#include "pv.h"/a \\/* Here is a new comment *\\/\' src/pv/number.c', cwd=tempdir) - result = runCmd('git status --porcelain', cwd=tempdir) + result = self.runCmd('sed -i \'/^#include "pv.h"/a \\/* Here is a new comment *\\/\' src/pv/number.c', cwd=tempdir) + result = self.runCmd('git status --porcelain', cwd=tempdir) self.assertIn('M src/pv/number.c', result.output) - result = runCmd('git commit src/pv/number.c -m "Add a comment to the code"', cwd=tempdir) + result = self.runCmd('git commit src/pv/number.c -m "Add a comment to the code"', cwd=tempdir) # Check if patch is there recipedir = os.path.dirname(oldrecipefile) olddir = os.path.join(recipedir, recipe + '-' + oldversion)
@@ -1441,8 +1447,8 @@ class DevtoolTests(DevtoolBase): self.assertIn('/meta-selftest/', recipedir) # Try finish to the original layer self.add_command_to_tearDown('rm -rf %s ; cd %s ; git checkout %s' % (recipedir, os.path.dirname(recipedir), recipedir)) - result = runCmd('devtool finish %s meta-selftest' % recipe) - result = runCmd('devtool status') + result = self.runCmd('devtool finish %s meta-selftest' % recipe) + result = self.runCmd('devtool status') self.assertNotIn(recipe, result.output, 'Recipe should have been reset by finish but wasn\'t') self.assertNotExists(os.path.join(self.workspacedir, 'recipes', recipe), 'Recipe directory should not exist after finish') self.assertNotExists(oldrecipefile, 'Old recipe file should have been deleted but wasn\'t')
@@ -1461,12 +1467,12 @@ class DevtoolTests(DevtoolBase): # Try finish to a different layer - should create a bbappend # This cleanup isn't strictly necessary but do it anyway just in case it goes wrong and writes to here self.add_command_to_tearDown('rm -rf %s ; cd %s ; git checkout %s' % (recipedir, os.path.dirname(recipedir), recipedir)) - oe_core_dir = os.path.join(get_bb_var('COREBASE'), 'meta') + oe_core_dir = os.path.join(self.get_bb_var('COREBASE'), 'meta') newrecipedir = os.path.join(oe_core_dir, 'recipes-test', 'devtool') newrecipefile = os.path.join(newrecipedir, '%s_%s.bb' % (recipe, newversion)) self.track_for_cleanup(newrecipedir) - result = runCmd('devtool finish %s oe-core' % recipe) - result = runCmd('devtool status') + result = self.runCmd('devtool finish %s oe-core' % recipe) + result = self.runCmd('devtool status') self.assertNotIn(recipe, result.output, 'Recipe should have been reset by finish but wasn\'t') self.assertNotExists(os.path.join(self.workspacedir, 'recipes', recipe), 'Recipe directory should not exist after finish') self.assertExists(oldrecipefile, 'Old recipe file should not have been deleted')
@@ -1482,25 +1488,25 @@ class DevtoolTests(DevtoolBase): # Try modifying a recipe self.track_for_cleanup(self.workspacedir) recipe = 'mdadm' - oldrecipefile = get_bb_var('FILE', recipe) + oldrecipefile = self.get_bb_var('FILE', recipe) recipedir = os.path.dirname(oldrecipefile) - result = runCmd('git status --porcelain .', cwd=recipedir) + result = self.runCmd('git status --porcelain .', cwd=recipedir) if result.output.strip(): self.fail('Recipe directory for %s contains uncommitted changes' % recipe) tempdir = tempfile.mkdtemp(prefix='devtoolqa') self.track_for_cleanup(tempdir) - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') - result = runCmd('devtool modify %s %s' % (recipe, tempdir)) + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) + result = self.runCmd('devtool modify %s %s' % (recipe, tempdir)) self.assertExists(os.path.join(tempdir, 'Makefile'), 'Extracted source could not be found') # Test devtool status - result = runCmd('devtool status') + result = self.runCmd('devtool status') self.assertIn(recipe, result.output) self.assertIn(tempdir, result.output) # Make a change to the source - result = runCmd('sed -i \'/^#include "mdadm.h"/a \\/* Here is a new comment *\\/\' maps.c', cwd=tempdir) - result = runCmd('git status --porcelain', cwd=tempdir) + result = self.runCmd('sed -i \'/^#include "mdadm.h"/a \\/* Here is a new comment *\\/\' maps.c', cwd=tempdir) + result = self.runCmd('git status --porcelain', cwd=tempdir) self.assertIn('M maps.c', result.output) - result = runCmd('git commit maps.c -m "Add a comment to the code"', cwd=tempdir) + result = self.runCmd('git commit maps.c -m "Add a comment to the code"', cwd=tempdir) for entry in os.listdir(recipedir): filesdir = os.path.join(recipedir, entry) if os.path.isdir(filesdir):
@@ -1516,8 +1522,8 @@ class DevtoolTests(DevtoolBase): self.assertIn('/meta/', recipedir) # Try finish to the original layer self.add_command_to_tearDown('rm -rf %s ; cd %s ; git checkout %s' % (recipedir, os.path.dirname(recipedir), recipedir)) - result = runCmd('devtool finish %s meta' % recipe) - result = runCmd('devtool status') + result = self.runCmd('devtool finish %s meta' % recipe) + result = self.runCmd('devtool status') self.assertNotIn(recipe, result.output, 'Recipe should have been reset by finish but wasn\'t') self.assertNotExists(os.path.join(self.workspacedir, 'recipes', recipe), 'Recipe directory should not exist after finish') expected_status = [(' M', '.*/%s$' % os.path.basename(oldrecipefile)),
@@ -1529,16 +1535,16 @@ class DevtoolTests(DevtoolBase): recipe, oldrecipefile, recipedir, filesdir = self._setup_test_devtool_finish_modify() # Ensure the recipe is where we think it should be (so that cleanup doesn't trash things) self.assertIn('/meta/', recipedir) - relpth = os.path.relpath(recipedir, os.path.join(get_bb_var('COREBASE'), 'meta')) + relpth = os.path.relpath(recipedir, os.path.join(self.get_bb_var('COREBASE'), 'meta')) appenddir = os.path.join(self.testlayer_path, relpth) self.track_for_cleanup(appenddir) # Try finish to the original layer self.add_command_to_tearDown('rm -rf %s ; cd %s ; git checkout %s' % (recipedir, os.path.dirname(recipedir), recipedir)) - result = runCmd('devtool finish %s meta-selftest' % recipe) - result = runCmd('devtool status') + result = self.runCmd('devtool finish %s meta-selftest' % recipe) + result = self.runCmd('devtool status') self.assertNotIn(recipe, result.output, 'Recipe should have been reset by finish but wasn\'t') self.assertNotExists(os.path.join(self.workspacedir, 'recipes', recipe), 'Recipe directory should not exist after finish') - result = runCmd('git status --porcelain .', cwd=recipedir) + result = self.runCmd('git status --porcelain .', cwd=recipedir) if result.output.strip(): self.fail('Recipe directory for %s contains the following unexpected changes after finish:\n%s' % (recipe, result.output.strip())) recipefn = os.path.splitext(os.path.basename(oldrecipefile))[0]
@@ -1562,7 +1568,7 @@ class DevtoolTests(DevtoolBase): # Check preconditions self.assertTrue(not os.path.exists(self.workspacedir), 'This test cannot be run with a workspace directory under the build directory') self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) # First run devtool add # We already have this recipe in OE-Core, but that doesn't matter
@@ -1571,7 +1577,7 @@ class DevtoolTests(DevtoolBase): recipefile = os.path.join(self.workspacedir, 'recipes', recipename, '%s_%s.bb' % (recipename, recipever)) url = 'http://downloads.yoctoproject.org/mirror/sources/i2c-tools-%s.tar.bz2' % recipever def add_recipe(): - result = runCmd('devtool add %s' % url) + result = self.runCmd('devtool add %s' % url) self.assertExists(recipefile, 'Expected recipe file not created') self.assertExists(os.path.join(self.workspacedir, 'sources', recipename), 'Source directory not created') checkvars = {}
@@ -1583,7 +1589,7 @@ class DevtoolTests(DevtoolBase): newrecipename = 'mynewrecipe' newrecipever = '456' newrecipefile = os.path.join(self.workspacedir, 'recipes', newrecipename, '%s_%s.bb' % (newrecipename, newrecipever)) - result = runCmd('devtool rename %s %s -V %s' % (recipename, newrecipename, newrecipever)) + result = self.runCmd('devtool rename %s %s -V %s' % (recipename, newrecipename, newrecipever)) self.assertExists(newrecipefile, 'Recipe file not renamed') self.assertNotExists(os.path.join(self.workspacedir, 'recipes', recipename), 'Old recipe directory still exists') newsrctree = os.path.join(self.workspacedir, 'sources', newrecipename)
@@ -1593,11 +1599,11 @@ class DevtoolTests(DevtoolBase): checkvars['SRC_URI'] = url self._test_recipe_contents(newrecipefile, checkvars, []) # Try again - change just name this time - result = runCmd('devtool reset -n %s' % newrecipename) + result = self.runCmd('devtool reset -n %s' % newrecipename) shutil.rmtree(newsrctree) add_recipe() newrecipefile = os.path.join(self.workspacedir, 'recipes', newrecipename, '%s_%s.bb' % (newrecipename, recipever)) - result = runCmd('devtool rename %s %s' % (recipename, newrecipename)) + result = self.runCmd('devtool rename %s %s' % (recipename, newrecipename)) self.assertExists(newrecipefile, 'Recipe file not renamed') self.assertNotExists(os.path.join(self.workspacedir, 'recipes', recipename), 'Old recipe directory still exists') self.assertExists(os.path.join(self.workspacedir, 'sources', newrecipename), 'Source directory not renamed')
@@ -1606,11 +1612,11 @@ class DevtoolTests(DevtoolBase): checkvars['SRC_URI'] = url.replace(recipever, '${PV}') self._test_recipe_contents(newrecipefile, checkvars, []) # Try again - change just version this time - result = runCmd('devtool reset -n %s' % newrecipename) + result = self.runCmd('devtool reset -n %s' % newrecipename) shutil.rmtree(newsrctree) add_recipe() newrecipefile = os.path.join(self.workspacedir, 'recipes', recipename, '%s_%s.bb' % (recipename, newrecipever)) - result = runCmd('devtool rename %s -V %s' % (recipename, newrecipever)) + result = self.runCmd('devtool rename %s -V %s' % (recipename, newrecipever)) self.assertExists(newrecipefile, 'Recipe file not renamed') self.assertExists(os.path.join(self.workspacedir, 'sources', recipename), 'Source directory no longer exists') checkvars = {}
@@ -1641,59 +1647,59 @@ class DevtoolTests(DevtoolBase): and modification to the source and configurations are reflected when building the kernel. """ - kernel_provider = get_bb_var('PREFERRED_PROVIDER_virtual/kernel') + kernel_provider = self.get_bb_var('PREFERRED_PROVIDER_virtual/kernel') # Clean up the enviroment - bitbake('%s -c clean' % kernel_provider) + self.bitbake('%s -c clean' % kernel_provider) tempdir = tempfile.mkdtemp(prefix='devtoolqa') self.track_for_cleanup(tempdir) self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer */workspace') + self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) self.add_command_to_tearDown('bitbake -c clean %s' % kernel_provider) #Step 1 #Here is just generated the config file instead of all the kernel to optimize the #time of executing this test case. - bitbake('%s -c configure' % kernel_provider) - bbconfig = os.path.join(get_bb_var('B', kernel_provider),'.config') - buildir= get_bb_var('TOPDIR') + self.bitbake('%s -c configure' % kernel_provider) + bbconfig = os.path.join(self.get_bb_var('B', kernel_provider),'.config') + buildir= self.get_bb_var('TOPDIR') #Step 2 - runCmd('cp %s %s' % (bbconfig, buildir)) + self.runCmd('cp %s %s' % (bbconfig, buildir)) self.assertExists(os.path.join(buildir, '.config'), 'Could not copy .config file from kernel') tmpconfig = os.path.join(buildir, '.config') #Step 3 - bitbake('%s -c clean' % kernel_provider) + self.bitbake('%s -c clean' % kernel_provider) #Step 4.1 - runCmd('devtool modify virtual/kernel -x %s' % tempdir) + self.runCmd('devtool modify virtual/kernel -x %s' % tempdir) self.assertExists(os.path.join(tempdir, 'Makefile'), 'Extracted source could not be found') #Step 4.2 configfile = os.path.join(tempdir,'.config') - diff = runCmd('diff %s %s' % (tmpconfig, configfile)) + diff = self.runCmd('diff %s %s' % (tmpconfig, configfile)) self.assertEqual(0,diff.status,'Kernel .config file is not the same using bitbake and devtool') #Step 4.3 #NOTE: virtual/kernel is mapped to kernel_provider - result = runCmd('devtool build %s' % kernel_provider) + result = self.runCmd('devtool build %s' % kernel_provider) self.assertEqual(0,result.status,'Cannot build kernel using `devtool build`') - kernelfile = os.path.join(get_bb_var('KBUILD_OUTPUT', kernel_provider), 'vmlinux') + kernelfile = os.path.join(self.get_bb_var('KBUILD_OUTPUT', kernel_provider), 'vmlinux') self.assertExists(kernelfile, 'Kernel was not build correctly') #Modify the kernel source modfile = os.path.join(tempdir,'arch/x86/boot/header.S') modstring = "Use a boot loader. Devtool testing." - modapplied = runCmd("sed -i 's/Use a boot loader./%s/' %s" % (modstring, modfile)) + modapplied = self.runCmd("sed -i 's/Use a boot loader./%s/' %s" % (modstring, modfile)) self.assertEqual(0,modapplied.status,'Modification to %s on kernel source failed' % modfile) #Modify the configuration codeconfigfile = os.path.join(tempdir,'.config.new') modconfopt = "CONFIG_SG_POOL=n" - modconf = runCmd("sed -i 's/CONFIG_SG_POOL=y/%s/' %s" % (modconfopt, codeconfigfile)) + modconf = self.runCmd("sed -i 's/CONFIG_SG_POOL=y/%s/' %s" % (modconfopt, codeconfigfile)) self.assertEqual(0,modconf.status,'Modification to %s failed' % codeconfigfile) #Build again kernel with devtool - rebuild = runCmd('devtool build %s' % kernel_provider) + rebuild = self.runCmd('devtool build %s' % kernel_provider) self.assertEqual(0,rebuild.status,'Fail to build kernel after modification of source and config') #Step 4.4 - bzimagename = 'bzImage-' + get_bb_var('KERNEL_VERSION_NAME', kernel_provider) - bzimagefile = os.path.join(get_bb_var('D', kernel_provider),'boot', bzimagename) - checkmodcode = runCmd("grep '%s' %s" % (modstring, bzimagefile)) + bzimagename = 'bzImage-' + self.get_bb_var('KERNEL_VERSION_NAME', kernel_provider) + bzimagefile = os.path.join(self.get_bb_var('D', kernel_provider),'boot', bzimagename) + checkmodcode = self.runCmd("grep '%s' %s" % (modstring, bzimagefile)) self.assertEqual(0,checkmodcode.status,'Modification on kernel source failed') #Step 4.5 - checkmodconfg = runCmd("grep %s %s" % (modconfopt, codeconfigfile)) + checkmodconfg = self.runCmd("grep %s %s" % (modconfopt, codeconfigfile)) self.assertEqual(0,checkmodconfg.status,'Modification to configuration file failed')
Signature · 1 line
2.11.0
PATCH v2 23/29 oeqa/selftest/cases: recipetool enable for threaded runs
In reply to Aníbal Limón- Change to use wrappers from OESelfTestCase.
- Move templayer dir creation to RecipetoolBase class because now every class has its own build folder.
--- meta/lib/oeqa/selftest/cases/recipetool.py | 105 +++++++++++++++-------------- 1 file changed, 54 insertions(+), 51 deletions(-)
meta/lib/oeqa/selftest/cases/recipetool.py +54 -51
@@ -3,30 +3,30 @@ import shutil import tempfile import urllib.parse -from oeqa.utils.commands import runCmd, bitbake, get_bb_var -from oeqa.utils.commands import get_bb_vars, create_temp_layer -from oeqa.core.decorator.oeid import OETestID from oeqa.selftest.cases import devtool +from oeqa.utils.commands import create_temp_layer +from oeqa.core.decorator.oeid import OETestID -templayerdir = None - -def setUpModule(): - global templayerdir - templayerdir = tempfile.mkdtemp(prefix='recipetoolqa') - create_temp_layer(templayerdir, 'selftestrecipetool') - runCmd('bitbake-layers add-layer %s' % templayerdir) - +class RecipetoolBase(devtool.DevtoolBase): + @classmethod + def setUpClass(cls): + super(RecipetoolBase, cls).setUpClass() -def tearDownModule(): - runCmd('bitbake-layers remove-layer %s' % templayerdir, ignore_status=True) - runCmd('rm -rf %s' % templayerdir) + cls.templayerdir = tempfile.mkdtemp(prefix='recipetoolqa') + create_temp_layer(cls.templayerdir, 'selftestrecipetool') + cls.runCmd('bitbake-layers add-layer %s' % cls.templayerdir) + @classmethod + def tearDownClass(cls): + super(RecipetoolBase, cls).tearDownClass() -class RecipetoolBase(devtool.DevtoolBase): + cls.runCmd('bitbake-layers remove-layer %s' % cls.templayerdir, + ignore_status=True) + cls.runCmd('rm -rf %s' % cls.templayerdir) def setUpLocal(self): super(RecipetoolBase, self).setUpLocal() - self.templayerdir = templayerdir + self.tempdir = tempfile.mkdtemp(prefix='recipetoolqa') self.track_for_cleanup(self.tempdir) self.testfile = os.path.join(self.tempdir, 'testfile')
@@ -34,15 +34,15 @@ class RecipetoolBase(devtool.DevtoolBase): f.write('Test file\n') def tearDownLocal(self): - runCmd('rm -rf %s/recipes-*' % self.templayerdir) + self.runCmd('rm -rf %s/recipes-*' % self.templayerdir) super(RecipetoolBase, self).tearDownLocal() def _try_recipetool_appendcmd(self, cmd, testrecipe, expectedfiles, expectedlines=None): - result = runCmd(cmd) + result = self.runCmd(cmd) self.assertNotIn('Traceback', result.output) # Check the bbappend was created and applies properly - recipefile = get_bb_var('FILE', testrecipe) + recipefile = self.get_bb_var('FILE', testrecipe) bbappendfile = self._check_bbappend(testrecipe, recipefile, self.templayerdir) # Check the bbappend contents
@@ -66,14 +66,16 @@ class RecipetoolBase(devtool.DevtoolBase): class RecipetoolTests(RecipetoolBase): + _use_own_builddir = True + _main_thread = False @classmethod def setUpClass(cls): super(RecipetoolTests, cls).setUpClass() # Ensure we have the right data in shlibs/pkgdata cls.logger.info('Running bitbake to generate pkgdata') - bitbake('-c packagedata base-files coreutils busybox selftest-recipetool-appendfile') - bb_vars = get_bb_vars(['COREBASE', 'BBPATH']) + cls.bitbake('-c packagedata base-files coreutils busybox selftest-recipetool-appendfile') + bb_vars = cls.get_bb_vars(['COREBASE', 'BBPATH']) cls.corebase = bb_vars['COREBASE'] cls.bbpath = bb_vars['BBPATH']
@@ -83,7 +85,7 @@ class RecipetoolTests(RecipetoolBase): def _try_recipetool_appendfile_fail(self, destfile, newfile, checkerror): cmd = 'recipetool appendfile %s %s %s' % (self.templayerdir, destfile, newfile) - result = runCmd(cmd, ignore_status=True) + result = self.runCmd(cmd, ignore_status=True) self.assertNotEqual(result.status, 0, 'Command "%s" should have failed but didn\'t' % cmd) self.assertNotIn('Traceback', result.output) for errorstr in checkerror:
@@ -125,7 +127,7 @@ class RecipetoolTests(RecipetoolBase): bbappendfile, _ = self._try_recipetool_appendfile('coreutils', '/bin/ls', self.testfile, '-r coreutils', expectedlines, [testfile2name]) # But file should have copiedfile = os.path.join(os.path.dirname(bbappendfile), 'coreutils', testfile2name) - result = runCmd('diff -q %s %s' % (testfile2, copiedfile), ignore_status=True) + result = self.runCmd('diff -q %s %s' % (testfile2, copiedfile), ignore_status=True) self.assertNotEqual(result.status, 0, 'New file should have been copied but was not %s' % result.output) @OETestID(1178)
@@ -133,7 +135,7 @@ class RecipetoolTests(RecipetoolBase): # Try appending a binary file # /bin/ls can be a symlink to /usr/bin/ls ls = os.path.realpath("/bin/ls") - result = runCmd('recipetool appendfile %s /bin/ls %s -r coreutils' % (self.templayerdir, ls)) + result = self.runCmd('recipetool appendfile %s /bin/ls %s -r coreutils' % (self.templayerdir, ls)) self.assertIn('WARNING: ', result.output) self.assertIn('is a binary', result.output)
@@ -326,7 +328,7 @@ class RecipetoolTests(RecipetoolBase): # Try creating a bbappend in a layer that's not in bblayers.conf and has a different structure exttemplayerdir = os.path.join(self.tempdir, 'extlayer') self._create_temp_layer(exttemplayerdir, False, 'oeselftestextlayer', recipepathspec='metadata/recipes/recipes-*/*') - result = runCmd('recipetool appendfile %s /usr/share/selftest-replaceme-orig %s' % (exttemplayerdir, self.testfile)) + result = self.runCmd('recipetool appendfile %s /usr/share/selftest-replaceme-orig %s' % (exttemplayerdir, self.testfile)) self.assertNotIn('Traceback', result.output) createdfiles = [] for root, _, files in os.walk(exttemplayerdir):
@@ -341,7 +343,7 @@ class RecipetoolTests(RecipetoolBase): def test_recipetool_appendfile_wildcard(self): def try_appendfile_wc(options): - result = runCmd('recipetool appendfile %s /etc/profile %s %s' % (self.templayerdir, self.testfile, options)) + result = self.runCmd('recipetool appendfile %s /etc/profile %s %s' % (self.templayerdir, self.testfile, options)) self.assertNotIn('Traceback', result.output) bbappendfile = None for root, _, files in os.walk(self.templayerdir):
@@ -351,11 +353,11 @@ class RecipetoolTests(RecipetoolBase): break if not bbappendfile: self.fail('No bbappend file created') - runCmd('rm -rf %s/recipes-*' % self.templayerdir) + self.runCmd('rm -rf %s/recipes-*' % self.templayerdir) return bbappendfile # Check without wildcard option - recipefn = os.path.basename(get_bb_var('FILE', 'base-files')) + recipefn = os.path.basename(self.get_bb_var('FILE', 'base-files')) filename = try_appendfile_wc('') self.assertEqual(filename, recipefn.replace('.bb', '.bbappend')) # Now check with wildcard option
@@ -369,7 +371,7 @@ class RecipetoolTests(RecipetoolBase): os.makedirs(tempsrc) recipefile = os.path.join(self.tempdir, 'logrotate_3.8.7.bb') srcuri = 'https://github.com/logrotate/logrotate/archive/r3-8-7.tar.gz' - result = runCmd('recipetool create -o %s %s -x %s' % (recipefile, srcuri, tempsrc)) + result = self.runCmd('recipetool create -o %s %s -x %s' % (recipefile, srcuri, tempsrc)) self.assertTrue(os.path.isfile(recipefile)) checkvars = {} checkvars['LICENSE'] = 'GPLv2'
@@ -381,16 +383,16 @@ class RecipetoolTests(RecipetoolBase): @OETestID(1194) def test_recipetool_create_git(self): - if 'x11' not in get_bb_var('DISTRO_FEATURES'): + if 'x11' not in self.get_bb_var('DISTRO_FEATURES'): self.skipTest('Test requires x11 as distro feature') # Ensure we have the right data in shlibs/pkgdata - bitbake('libpng pango libx11 libxext jpeg libcheck') + self.bitbake('libpng pango libx11 libxext jpeg libcheck') # Try adding a recipe tempsrc = os.path.join(self.tempdir, 'srctree') os.makedirs(tempsrc) recipefile = os.path.join(self.tempdir, 'libmatchbox.bb') srcuri = 'git://git.yoctoproject.org/libmatchbox' - result = runCmd(['recipetool', 'create', '-o', recipefile, srcuri + ";rev=9f7cf8895ae2d39c465c04cc78e918c157420269", '-x', tempsrc]) + result = self.runCmd(['recipetool', 'create', '-o', recipefile, srcuri + ";rev=9f7cf8895ae2d39c465c04cc78e918c157420269", '-x', tempsrc]) self.assertTrue(os.path.isfile(recipefile), 'recipetool did not create recipe file; output:\n%s' % result.output) checkvars = {} checkvars['LICENSE'] = 'LGPLv2.1'
@@ -409,7 +411,7 @@ class RecipetoolTests(RecipetoolBase): os.makedirs(temprecipe) pv = '1.7.3.0' srcuri = 'http://www.dest-unreach.org/socat/download/socat-%s.tar.bz2' % pv - result = runCmd('recipetool create %s -o %s' % (srcuri, temprecipe)) + result = self.runCmd('recipetool create %s -o %s' % (srcuri, temprecipe)) dirlist = os.listdir(temprecipe) if len(dirlist) > 1: self.fail('recipetool created more than just one file; output:\n%s\ndirlist:\n%s' % (result.output, str(dirlist)))
@@ -432,7 +434,7 @@ class RecipetoolTests(RecipetoolBase): os.makedirs(temprecipe) recipefile = os.path.join(temprecipe, 'navit_0.5.0.bb') srcuri = 'http://downloads.sourceforge.net/project/navit/v0.5.0/navit-0.5.0.tar.gz' - result = runCmd('recipetool create -o %s %s' % (temprecipe, srcuri)) + result = self.runCmd('recipetool create -o %s %s' % (temprecipe, srcuri)) self.assertTrue(os.path.isfile(recipefile)) checkvars = {} checkvars['LICENSE'] = set(['Unknown', 'GPLv2', 'LGPLv2'])
@@ -450,7 +452,7 @@ class RecipetoolTests(RecipetoolBase): os.makedirs(temprecipe) recipefile = os.path.join(temprecipe, 'meson_git.bb') srcuri = 'https://github.com/mesonbuild/meson;rev=0.32.0' - result = runCmd(['recipetool', 'create', '-o', temprecipe, srcuri]) + result = self.runCmd(['recipetool', 'create', '-o', temprecipe, srcuri]) self.assertTrue(os.path.isfile(recipefile)) checkvars = {} checkvars['LICENSE'] = set(['Apache-2.0'])
@@ -466,7 +468,7 @@ class RecipetoolTests(RecipetoolBase): pv = '0.32.0' recipefile = os.path.join(temprecipe, 'meson_%s.bb' % pv) srcuri = 'https://github.com/mesonbuild/meson/releases/download/%s/meson-%s.tar.gz' % (pv, pv) - result = runCmd('recipetool create -o %s %s' % (temprecipe, srcuri)) + result = self.runCmd('recipetool create -o %s %s' % (temprecipe, srcuri)) self.assertTrue(os.path.isfile(recipefile)) checkvars = {} checkvars['LICENSE'] = set(['Apache-2.0'])
@@ -481,7 +483,7 @@ class RecipetoolTests(RecipetoolBase): os.makedirs(temprecipe) recipefile = os.path.join(temprecipe, 'matchbox-terminal_git.bb') srcuri = 'http://git.yoctoproject.org/git/matchbox-terminal' - result = runCmd('recipetool create -o %s %s' % (temprecipe, srcuri)) + result = self.runCmd('recipetool create -o %s %s' % (temprecipe, srcuri)) self.assertTrue(os.path.isfile(recipefile)) checkvars = {} checkvars['LICENSE'] = set(['GPLv2'])
@@ -506,8 +508,8 @@ class RecipetoolTests(RecipetoolBase): def test_recipetool_load_plugin(self): """Test that recipetool loads only the first found plugin in BBPATH.""" - recipetool = runCmd("which recipetool") - fromname = runCmd("recipetool --quiet pluginfile") + recipetool = self.runCmd("which recipetool") + fromname = self.runCmd("recipetool --quiet pluginfile") srcfile = fromname.output searchpath = self.bbpath.split(':') + [os.path.dirname(recipetool.output)] plugincontent = []
@@ -517,12 +519,12 @@ class RecipetoolTests(RecipetoolBase): self.assertIn('meta-selftest', srcfile, 'wrong bbpath plugin found') for path in searchpath: self._copy_file_with_cleanup(srcfile, path, 'lib', 'recipetool') - result = runCmd("recipetool --quiet count") + result = self.runCmd("recipetool --quiet count") self.assertEqual(result.output, '1') - result = runCmd("recipetool --quiet multiloaded") + result = self.runCmd("recipetool --quiet multiloaded") self.assertEqual(result.output, "no") for path in searchpath: - result = runCmd("recipetool --quiet bbdir") + result = self.runCmd("recipetool --quiet bbdir") self.assertEqual(result.output, path) os.unlink(os.path.join(result.output, 'lib', 'recipetool', 'bbpath.py')) finally:
@@ -548,16 +550,15 @@ class RecipetoolAppendsrcBase(RecipetoolBase): def _try_recipetool_appendsrcfile_fail(self, testrecipe, newfile, destfile, checkerror): cmd = 'recipetool appendsrcfile %s %s %s %s' % (self.templayerdir, testrecipe, newfile, destfile or '') - result = runCmd(cmd, ignore_status=True) + result = self.runCmd(cmd, ignore_status=True) self.assertNotEqual(result.status, 0, 'Command "%s" should have failed but didn\'t' % cmd) self.assertNotIn('Traceback', result.output) for errorstr in checkerror: self.assertIn(errorstr, result.output) - @staticmethod - def _get_first_file_uri(recipe): + def _get_first_file_uri(self, recipe): '''Return the first file:// in SRC_URI for the specified recipe.''' - src_uri = get_bb_var('SRC_URI', recipe).split() + src_uri = self.get_bb_var('SRC_URI', recipe).split() for uri in src_uri: p = urllib.parse.urlparse(uri) if p.scheme == 'file':
@@ -605,7 +606,7 @@ class RecipetoolAppendsrcBase(RecipetoolBase): self._try_recipetool_appendsrcfiles(testrecipe, newfiles, expectedfiles=expectedfiles, destdir=destdir, options=options) - bb_vars = get_bb_vars(['SRC_URI', 'FILE', 'FILESEXTRAPATHS'], testrecipe) + bb_vars = self.get_bb_vars(['SRC_URI', 'FILE', 'FILESEXTRAPATHS'], testrecipe) src_uri = bb_vars['SRC_URI'].split() for f in expectedfiles: if destdir:
@@ -623,6 +624,8 @@ class RecipetoolAppendsrcBase(RecipetoolBase): class RecipetoolAppendsrcTests(RecipetoolAppendsrcBase): + _use_own_builddir = True + _main_thread = False @OETestID(1273) def test_recipetool_appendsrcfile_basic(self):
@@ -632,7 +635,7 @@ class RecipetoolAppendsrcTests(RecipetoolAppendsrcBase): def test_recipetool_appendsrcfile_basic_wildcard(self): testrecipe = 'base-files' self._test_appendsrcfile(testrecipe, 'a-file', options='-w') - recipefile = get_bb_var('FILE', testrecipe) + recipefile = self.get_bb_var('FILE', testrecipe) bbappendfile = self._check_bbappend(testrecipe, recipefile, self.templayerdir) self.assertEqual(os.path.basename(bbappendfile), '%s_%%.bbappend' % testrecipe)
@@ -647,7 +650,7 @@ class RecipetoolAppendsrcTests(RecipetoolAppendsrcBase): @OETestID(1280) def test_recipetool_appendsrcfile_srcdir_basic(self): testrecipe = 'bash' - bb_vars = get_bb_vars(['S', 'WORKDIR'], testrecipe) + bb_vars = self.get_bb_vars(['S', 'WORKDIR'], testrecipe) srcdir = bb_vars['S'] workdir = bb_vars['WORKDIR'] subdir = os.path.relpath(srcdir, workdir)
@@ -674,13 +677,13 @@ class RecipetoolAppendsrcTests(RecipetoolAppendsrcBase): def test_recipetool_appendsrcfile_replace_file_srcdir(self): testrecipe = 'bash' filepath = 'Makefile.in' - bb_vars = get_bb_vars(['S', 'WORKDIR'], testrecipe) + bb_vars = self.get_bb_vars(['S', 'WORKDIR'], testrecipe) srcdir = bb_vars['S'] workdir = bb_vars['WORKDIR'] subdir = os.path.relpath(srcdir, workdir) self._test_appendsrcfile(testrecipe, filepath, srcdir=subdir) - bitbake('%s:do_unpack' % testrecipe) + self.bitbake('%s:do_unpack' % testrecipe) self.assertEqual(open(self.testfile, 'r').read(), open(os.path.join(srcdir, filepath), 'r').read()) @OETestID(1278)
Signature · 1 line
2.11.0
PATCH v2 24/29 oeqa/selftest/cases: Move devtool deploy test case to own module
In reply to Aníbal LimónThe devtool deploy test case uses runqemu that uses tinfoil so tinfoil requires to run on the main thread.
--- meta/lib/oeqa/selftest/cases/devtool.py | 91 ++----------------------- meta/lib/oeqa/selftest/cases/devtool_deploy.py | 93 ++++++++++++++++++++++++++ 2 files changed, 97 insertions(+), 87 deletions(-) create mode 100644 meta/lib/oeqa/selftest/cases/devtool_deploy.py
meta/lib/oeqa/selftest/cases/devtool.py +4 -87
@@ -6,7 +6,7 @@ import glob import fnmatch import oeqa.utils.ftools as ftools -from oeqa.utils.commands import create_temp_layer, runqemu +from oeqa.utils.commands import create_temp_layer from oeqa.selftest.case import OESelftestTestCase from oeqa.core.decorator.oeid import OETestID
@@ -114,6 +114,9 @@ class DevtoolBase(OESelftestTestCase): class DevtoolCommon(DevtoolBase): + _use_own_builddir = True + _main_thread = False + @classmethod def setUpClass(cls): super(DevtoolCommon, cls).setUpClass()
@@ -1144,92 +1147,6 @@ class DevtoolTests(DevtoolCommon): matches2 = glob.glob(stampprefix2 + '*') self.assertFalse(matches2, 'Stamp files exist for recipe %s that should have been cleaned' % testrecipe2) - @OETestID(1272) - def test_devtool_deploy_target(self): - # NOTE: Whilst this test would seemingly be better placed as a runtime test, - # unfortunately the runtime tests run under bitbake and you can't run - # devtool within bitbake (since devtool needs to run bitbake itself). - # Additionally we are testing build-time functionality as well, so - # really this has to be done as an oe-selftest test. - # - # Check preconditions - machine = self.get_bb_var('MACHINE') - if not machine.startswith('qemu'): - self.skipTest('This test only works with qemu machines') - if not os.path.exists('/etc/runqemu-nosudo'): - self.skipTest('You must set up tap devices with scripts/runqemu-gen-tapdevs before running this test') - result = self.runCmd('PATH="$PATH:/sbin:/usr/sbin" ip tuntap show', ignore_status=True) - if result.status != 0: - result = self.runCmd('PATH="$PATH:/sbin:/usr/sbin" ifconfig -a', ignore_status=True) - if result.status != 0: - self.skipTest('Failed to determine if tap devices exist with ifconfig or ip: %s' % result.output) - for line in result.output.splitlines(): - if line.startswith('tap'): - break - else: - self.skipTest('No tap devices found - you must set up tap devices with scripts/runqemu-gen-tapdevs before running this test') - self.assertTrue(not os.path.exists(self.workspacedir), 'This test cannot be run with a workspace directory under the build directory') - # Definitions - testrecipe = 'mdadm' - testfile = '/sbin/mdadm' - testimage = 'oe-selftest-image' - testcommand = '/sbin/mdadm --help' - # Build an image to run - self.bitbake("%s qemu-native qemu-helper-native" % testimage) - deploy_dir_image = self.get_bb_var('DEPLOY_DIR_IMAGE') - self.add_command_to_tearDown('bitbake -c clean %s' % testimage) - self.add_command_to_tearDown('rm -f %s/%s*' % (deploy_dir_image, testimage)) - # Clean recipe so the first deploy will fail - self.bitbake("%s -c clean" % testrecipe) - # Try devtool modify - tempdir = tempfile.mkdtemp(prefix='devtoolqa') - self.track_for_cleanup(tempdir) - self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) - self.add_command_to_tearDown('bitbake -c clean %s' % testrecipe) - result = self.runCmd('devtool modify %s -x %s' % (testrecipe, tempdir)) - # Test that deploy-target at this point fails (properly) - result = self.runCmd('devtool deploy-target -n %s root@localhost' % testrecipe, ignore_status=True) - self.assertNotEqual(result.output, 0, 'devtool deploy-target should have failed, output: %s' % result.output) - self.assertNotIn(result.output, 'Traceback', 'devtool deploy-target should have failed with a proper error not a traceback, output: %s' % result.output) - result = self.runCmd('devtool build %s' % testrecipe) - # First try a dry-run of deploy-target - result = self.runCmd('devtool deploy-target -n %s root@localhost' % testrecipe) - self.assertIn(' %s' % testfile, result.output) - # Boot the image - with runqemu(testimage) as qemu: - # Now really test deploy-target - result = self.runCmd('devtool deploy-target -c %s root@%s' % (testrecipe, qemu.ip)) - # Run a test command to see if it was installed properly - sshargs = '-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' - result = self.runCmd('ssh %s root@%s %s' % (sshargs, qemu.ip, testcommand)) - # Check if it deployed all of the files with the right ownership/perms - # First look on the host - need to do this under pseudo to get the correct ownership/perms - bb_vars = self.get_bb_vars(['D', 'FAKEROOTENV', 'FAKEROOTCMD'], testrecipe) - installdir = bb_vars['D'] - fakerootenv = bb_vars['FAKEROOTENV'] - fakerootcmd = bb_vars['FAKEROOTCMD'] - result = self.runCmd('%s %s find . -type f -exec ls -l {} \;' % (fakerootenv, fakerootcmd), cwd=installdir) - filelist1 = self._process_ls_output(result.output) - - # Now look on the target - tempdir2 = tempfile.mkdtemp(prefix='devtoolqa') - self.track_for_cleanup(tempdir2) - tmpfilelist = os.path.join(tempdir2, 'files.txt') - with open(tmpfilelist, 'w') as f: - for line in filelist1: - splitline = line.split() - f.write(splitline[-1] + '\n') - result = self.runCmd('cat %s | ssh -q %s root@%s \'xargs ls -l\'' % (tmpfilelist, sshargs, qemu.ip)) - filelist2 = self._process_ls_output(result.output) - filelist1.sort(key=lambda item: item.split()[-1]) - filelist2.sort(key=lambda item: item.split()[-1]) - self.assertEqual(filelist1, filelist2) - # Test undeploy-target - result = self.runCmd('devtool undeploy-target -c %s root@%s' % (testrecipe, qemu.ip)) - result = self.runCmd('ssh %s root@%s %s' % (sshargs, qemu.ip, testcommand), ignore_status=True) - self.assertNotEqual(result, 0, 'undeploy-target did not remove command as it should have') - @OETestID(1366) def test_devtool_build_image(self): """Test devtool build-image plugin"""
meta/lib/oeqa/selftest/cases/devtool_deploy.py new file +93 -0
93 lines not on this page · raw message
Signature · 1 line
2.11.0
PATCH v2 25/29 selftest/cases/devtool{, end}: Move update/finish_modify tests to its own module
In reply to Aníbal LimónThis devtool tests are set to run at end because made changes into the poky repository causing problems (non deteministic meta data) in other execution threads.
--- meta/lib/oeqa/selftest/cases/devtool.py | 545 ++-------------------------- meta/lib/oeqa/selftest/cases/devtool_end.py | 506 ++++++++++++++++++++++++++ 2 files changed, 532 insertions(+), 519 deletions(-) create mode 100644 meta/lib/oeqa/selftest/cases/devtool_end.py
meta/lib/oeqa/selftest/cases/devtool.py +26 -519
@@ -112,6 +112,32 @@ class DevtoolBase(OESelftestTestCase): filelist.append(' '.join(splitline)) return filelist + def _check_src_repo(self, repo_dir): + """Check srctree git repository""" + self.assertTrue(os.path.isdir(os.path.join(repo_dir, '.git')), + 'git repository for external source tree not found') + result = self.runCmd('git status --porcelain', cwd=repo_dir) + self.assertEqual(result.output.strip(), "", + 'Created git repo is not clean') + result = self.runCmd('git symbolic-ref HEAD', cwd=repo_dir) + self.assertEqual(result.output.strip(), "refs/heads/devtool", + 'Wrong branch in git repo') + + def _check_repo_status(self, repo_dir, expected_status): + """Check the worktree status of a repository""" + result = self.runCmd('git status . --porcelain', + cwd=repo_dir) + for line in result.output.splitlines(): + for ind, (f_status, fn_re) in enumerate(expected_status): + if re.match(fn_re, line[3:]): + if f_status != line[:2]: + self.fail('Unexpected status in line: %s' % line) + expected_status.pop(ind) + break + else: + self.fail('Unexpected modified file in line: %s' % line) + if expected_status: + self.fail('Missing file changes: %s' % expected_status) class DevtoolCommon(DevtoolBase): _use_own_builddir = True
@@ -150,33 +176,6 @@ class DevtoolTests(DevtoolCommon): _use_own_builddir = True _main_thread = False - def _check_src_repo(self, repo_dir): - """Check srctree git repository""" - self.assertTrue(os.path.isdir(os.path.join(repo_dir, '.git')), - 'git repository for external source tree not found') - result = self.runCmd('git status --porcelain', cwd=repo_dir) - self.assertEqual(result.output.strip(), "", - 'Created git repo is not clean') - result = self.runCmd('git symbolic-ref HEAD', cwd=repo_dir) - self.assertEqual(result.output.strip(), "refs/heads/devtool", - 'Wrong branch in git repo') - - def _check_repo_status(self, repo_dir, expected_status): - """Check the worktree status of a repository""" - result = self.runCmd('git status . --porcelain', - cwd=repo_dir) - for line in result.output.splitlines(): - for ind, (f_status, fn_re) in enumerate(expected_status): - if re.match(fn_re, line[3:]): - if f_status != line[:2]: - self.fail('Unexpected status in line: %s' % line) - expected_status.pop(ind) - break - else: - self.fail('Unexpected modified file in line: %s' % line) - if expected_status: - self.fail('Missing file changes: %s' % expected_status) - @OETestID(1158) def test_create_workspace(self): # Check preconditions
@@ -687,417 +686,6 @@ class DevtoolTests(DevtoolCommon): self._check_src_repo(tempdir) # This is probably sufficient - - @OETestID(1169) - def test_devtool_update_recipe(self): - # Check preconditions - testrecipe = 'minicom' - bb_vars = self.get_bb_vars(['FILE', 'SRC_URI'], testrecipe) - recipefile = bb_vars['FILE'] - src_uri = bb_vars['SRC_URI'] - self.assertNotIn('git://', src_uri, 'This test expects the %s recipe to NOT be a git recipe' % testrecipe) - self._check_repo_status(os.path.dirname(recipefile), []) - # First, modify a recipe - tempdir = tempfile.mkdtemp(prefix='devtoolqa') - self.track_for_cleanup(tempdir) - self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) - # (don't bother with cleaning the recipe on teardown, we won't be building it) - # We don't use -x here so that we test the behaviour of devtool modify without it - result = self.runCmd('devtool modify %s %s' % (testrecipe, tempdir)) - # Check git repo - self._check_src_repo(tempdir) - # Add a couple of commits - # FIXME: this only tests adding, need to also test update and remove - result = self.runCmd('echo "Additional line" >> README', cwd=tempdir) - result = self.runCmd('git commit -a -m "Change the README"', cwd=tempdir) - result = self.runCmd('echo "A new file" > devtool-new-file', cwd=tempdir) - result = self.runCmd('git add devtool-new-file', cwd=tempdir) - result = self.runCmd('git commit -m "Add a new file"', cwd=tempdir) - self.add_command_to_tearDown('cd %s; rm %s/*.patch; git checkout %s %s' % (os.path.dirname(recipefile), testrecipe, testrecipe, os.path.basename(recipefile))) - result = self.runCmd('devtool update-recipe %s' % testrecipe) - expected_status = [(' M', '.*/%s$' % os.path.basename(recipefile)), - ('??', '.*/0001-Change-the-README.patch$'), - ('??', '.*/0002-Add-a-new-file.patch$')] - self._check_repo_status(os.path.dirname(recipefile), expected_status) - - @OETestID(1172) - def test_devtool_update_recipe_git(self): - # Check preconditions - testrecipe = 'mtd-utils' - bb_vars = self.get_bb_vars(['FILE', 'SRC_URI'], testrecipe) - recipefile = bb_vars['FILE'] - src_uri = bb_vars['SRC_URI'] - self.assertIn('git://', src_uri, 'This test expects the %s recipe to be a git recipe' % testrecipe) - patches = [] - for entry in src_uri.split(): - if entry.startswith('file://') and entry.endswith('.patch'): - patches.append(entry[7:].split(';')[0]) - self.assertGreater(len(patches), 0, 'The %s recipe does not appear to contain any patches, so this test will not be effective' % testrecipe) - self._check_repo_status(os.path.dirname(recipefile), []) - # First, modify a recipe - tempdir = tempfile.mkdtemp(prefix='devtoolqa') - self.track_for_cleanup(tempdir) - self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) - # (don't bother with cleaning the recipe on teardown, we won't be building it) - result = self.runCmd('devtool modify %s -x %s' % (testrecipe, tempdir)) - # Check git repo - self._check_src_repo(tempdir) - # Add a couple of commits - # FIXME: this only tests adding, need to also test update and remove - result = self.runCmd('echo "# Additional line" >> Makefile.am', cwd=tempdir) - result = self.runCmd('git commit -a -m "Change the Makefile"', cwd=tempdir) - result = self.runCmd('echo "A new file" > devtool-new-file', cwd=tempdir) - result = self.runCmd('git add devtool-new-file', cwd=tempdir) - result = self.runCmd('git commit -m "Add a new file"', cwd=tempdir) - self.add_command_to_tearDown('cd %s; rm -rf %s; git checkout %s %s' % (os.path.dirname(recipefile), testrecipe, testrecipe, os.path.basename(recipefile))) - result = self.runCmd('devtool update-recipe -m srcrev %s' % testrecipe) - expected_status = [(' M', '.*/%s$' % os.path.basename(recipefile))] + \ - [(' D', '.*/%s$' % patch) for patch in patches] - self._check_repo_status(os.path.dirname(recipefile), expected_status) - - result = self.runCmd('git diff %s' % os.path.basename(recipefile), cwd=os.path.dirname(recipefile)) - addlines = ['SRCREV = ".*"', 'SRC_URI = "git://git.infradead.org/mtd-utils.git"'] - srcurilines = src_uri.split() - srcurilines[0] = 'SRC_URI = "' + srcurilines[0] - srcurilines.append('"') - removelines = ['SRCREV = ".*"'] + srcurilines - for line in result.output.splitlines(): - if line.startswith('+++') or line.startswith('---'): - continue - elif line.startswith('+'): - matched = False - for item in addlines: - if re.match(item, line[1:].strip()): - matched = True - break - self.assertTrue(matched, 'Unexpected diff add line: %s' % line) - elif line.startswith('-'): - matched = False - for item in removelines: - if re.match(item, line[1:].strip()): - matched = True - break - self.assertTrue(matched, 'Unexpected diff remove line: %s' % line) - # Now try with auto mode - self.runCmd('cd %s; git checkout %s %s' % (os.path.dirname(recipefile), testrecipe, os.path.basename(recipefile))) - result = self.runCmd('devtool update-recipe %s' % testrecipe) - result = self.runCmd('git rev-parse --show-toplevel', cwd=os.path.dirname(recipefile)) - topleveldir = result.output.strip() - relpatchpath = os.path.join(os.path.relpath(os.path.dirname(recipefile), topleveldir), testrecipe) - expected_status = [(' M', os.path.relpath(recipefile, topleveldir)), - ('??', '%s/0001-Change-the-Makefile.patch' % relpatchpath), - ('??', '%s/0002-Add-a-new-file.patch' % relpatchpath)] - self._check_repo_status(os.path.dirname(recipefile), expected_status) - - @OETestID(1170) - def test_devtool_update_recipe_append(self): - # Check preconditions - testrecipe = 'mdadm' - bb_vars = self.get_bb_vars(['FILE', 'SRC_URI'], testrecipe) - recipefile = bb_vars['FILE'] - src_uri = bb_vars['SRC_URI'] - self.assertNotIn('git://', src_uri, 'This test expects the %s recipe to NOT be a git recipe' % testrecipe) - self._check_repo_status(os.path.dirname(recipefile), []) - # First, modify a recipe - tempdir = tempfile.mkdtemp(prefix='devtoolqa') - tempsrcdir = os.path.join(tempdir, 'source') - templayerdir = os.path.join(tempdir, 'layer') - self.track_for_cleanup(tempdir) - self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) - # (don't bother with cleaning the recipe on teardown, we won't be building it) - result = self.runCmd('devtool modify %s -x %s' % (testrecipe, tempsrcdir)) - # Check git repo - self._check_src_repo(tempsrcdir) - # Add a commit - result = self.runCmd("sed 's!\\(#define VERSION\\W*\"[^\"]*\\)\"!\\1-custom\"!' -i ReadMe.c", cwd=tempsrcdir) - result = self.runCmd('git commit -a -m "Add our custom version"', cwd=tempsrcdir) - self.add_command_to_tearDown('cd %s; rm -f %s/*.patch; git checkout .' % (os.path.dirname(recipefile), testrecipe)) - # Create a temporary layer and add it to bblayers.conf - self._create_temp_layer(templayerdir, True, 'selftestupdaterecipe') - # Create the bbappend - result = self.runCmd('devtool update-recipe %s -a %s' % (testrecipe, templayerdir)) - self.assertNotIn('WARNING:', result.output) - # Check recipe is still clean - self._check_repo_status(os.path.dirname(recipefile), []) - # Check bbappend was created - splitpath = os.path.dirname(recipefile).split(os.sep) - appenddir = os.path.join(templayerdir, splitpath[-2], splitpath[-1]) - bbappendfile = self._check_bbappend(testrecipe, recipefile, appenddir) - patchfile = os.path.join(appenddir, testrecipe, '0001-Add-our-custom-version.patch') - self.assertExists(patchfile, 'Patch file not created') - - # Check bbappend contents - expectedlines = ['FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"\n', - '\n', - 'SRC_URI += "file://0001-Add-our-custom-version.patch"\n', - '\n'] - with open(bbappendfile, 'r') as f: - self.assertEqual(expectedlines, f.readlines()) - - # Check we can run it again and bbappend isn't modified - result = self.runCmd('devtool update-recipe %s -a %s' % (testrecipe, templayerdir)) - with open(bbappendfile, 'r') as f: - self.assertEqual(expectedlines, f.readlines()) - # Drop new commit and check patch gets deleted - result = self.runCmd('git reset HEAD^', cwd=tempsrcdir) - result = self.runCmd('devtool update-recipe %s -a %s' % (testrecipe, templayerdir)) - self.assertNotExists(patchfile, 'Patch file not deleted') - expectedlines2 = ['FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"\n', - '\n'] - with open(bbappendfile, 'r') as f: - self.assertEqual(expectedlines2, f.readlines()) - # Put commit back and check we can run it if layer isn't in bblayers.conf - os.remove(bbappendfile) - result = self.runCmd('git commit -a -m "Add our custom version"', cwd=tempsrcdir) - result = self.runCmd('bitbake-layers remove-layer %s' % templayerdir, cwd=self.builddir) - result = self.runCmd('devtool update-recipe %s -a %s' % (testrecipe, templayerdir)) - self.assertIn('WARNING: Specified layer is not currently enabled in bblayers.conf', result.output) - self.assertExists(patchfile, 'Patch file not created (with disabled layer)') - with open(bbappendfile, 'r') as f: - self.assertEqual(expectedlines, f.readlines()) - # Deleting isn't expected to work under these circumstances - - @OETestID(1171) - def test_devtool_update_recipe_append_git(self): - # Check preconditions - testrecipe = 'mtd-utils' - bb_vars = self.get_bb_vars(['FILE', 'SRC_URI'], testrecipe) - recipefile = bb_vars['FILE'] - src_uri = bb_vars['SRC_URI'] - self.assertIn('git://', src_uri, 'This test expects the %s recipe to be a git recipe' % testrecipe) - for entry in src_uri.split(): - if entry.startswith('git://'): - git_uri = entry - break - self._check_repo_status(os.path.dirname(recipefile), []) - # First, modify a recipe - tempdir = tempfile.mkdtemp(prefix='devtoolqa') - tempsrcdir = os.path.join(tempdir, 'source') - templayerdir = os.path.join(tempdir, 'layer') - self.track_for_cleanup(tempdir) - self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) - # (don't bother with cleaning the recipe on teardown, we won't be building it) - result = self.runCmd('devtool modify %s -x %s' % (testrecipe, tempsrcdir)) - # Check git repo - self._check_src_repo(tempsrcdir) - # Add a commit - result = self.runCmd('echo "# Additional line" >> Makefile.am', cwd=tempsrcdir) - result = self.runCmd('git commit -a -m "Change the Makefile"', cwd=tempsrcdir) - self.add_command_to_tearDown('cd %s; rm -f %s/*.patch; git checkout .' % (os.path.dirname(recipefile), testrecipe)) - # Create a temporary layer - os.makedirs(os.path.join(templayerdir, 'conf')) - with open(os.path.join(templayerdir, 'conf', 'layer.conf'), 'w') as f: - f.write('BBPATH .= ":${LAYERDIR}"\n') - f.write('BBFILES += "${LAYERDIR}/recipes-*/*/*.bbappend"\n') - f.write('BBFILE_COLLECTIONS += "oeselftesttemplayer"\n') - f.write('BBFILE_PATTERN_oeselftesttemplayer = "^${LAYERDIR}/"\n') - f.write('BBFILE_PRIORITY_oeselftesttemplayer = "999"\n') - f.write('BBFILE_PATTERN_IGNORE_EMPTY_oeselftesttemplayer = "1"\n') - self.add_command_to_tearDown('bitbake-layers remove-layer %s || true' % templayerdir) - result = self.runCmd('bitbake-layers add-layer %s' % templayerdir, cwd=self.builddir) - # Create the bbappend - result = self.runCmd('devtool update-recipe -m srcrev %s -a %s' % (testrecipe, templayerdir)) - self.assertNotIn('WARNING:', result.output) - # Check recipe is still clean - self._check_repo_status(os.path.dirname(recipefile), []) - # Check bbappend was created - splitpath = os.path.dirname(recipefile).split(os.sep) - appenddir = os.path.join(templayerdir, splitpath[-2], splitpath[-1]) - bbappendfile = self._check_bbappend(testrecipe, recipefile, appenddir) - self.assertNotExists(os.path.join(appenddir, testrecipe), 'Patch directory should not be created') - - # Check bbappend contents - result = self.runCmd('git rev-parse HEAD', cwd=tempsrcdir) - expectedlines = set(['SRCREV = "%s"\n' % result.output, - '\n', - 'SRC_URI = "%s"\n' % git_uri, - '\n']) - with open(bbappendfile, 'r') as f: - self.assertEqual(expectedlines, set(f.readlines())) - - # Check we can run it again and bbappend isn't modified - result = self.runCmd('devtool update-recipe -m srcrev %s -a %s' % (testrecipe, templayerdir)) - with open(bbappendfile, 'r') as f: - self.assertEqual(expectedlines, set(f.readlines())) - # Drop new commit and check SRCREV changes - result = self.runCmd('git reset HEAD^', cwd=tempsrcdir) - result = self.runCmd('devtool update-recipe -m srcrev %s -a %s' % (testrecipe, templayerdir)) - self.assertNotExists(os.path.join(appenddir, testrecipe), 'Patch directory should not be created') - result = self.runCmd('git rev-parse HEAD', cwd=tempsrcdir) - expectedlines = set(['SRCREV = "%s"\n' % result.output, - '\n', - 'SRC_URI = "%s"\n' % git_uri, - '\n']) - with open(bbappendfile, 'r') as f: - self.assertEqual(expectedlines, set(f.readlines())) - # Put commit back and check we can run it if layer isn't in bblayers.conf - os.remove(bbappendfile) - result = self.runCmd('git commit -a -m "Change the Makefile"', cwd=tempsrcdir) - result = self.runCmd('bitbake-layers remove-layer %s' % templayerdir, cwd=self.builddir) - result = self.runCmd('devtool update-recipe -m srcrev %s -a %s' % (testrecipe, templayerdir)) - self.assertIn('WARNING: Specified layer is not currently enabled in bblayers.conf', result.output) - self.assertNotExists(os.path.join(appenddir, testrecipe), 'Patch directory should not be created') - result = self.runCmd('git rev-parse HEAD', cwd=tempsrcdir) - expectedlines = set(['SRCREV = "%s"\n' % result.output, - '\n', - 'SRC_URI = "%s"\n' % git_uri, - '\n']) - with open(bbappendfile, 'r') as f: - self.assertEqual(expectedlines, set(f.readlines())) - # Deleting isn't expected to work under these circumstances - - @OETestID(1370) - def test_devtool_update_recipe_local_files(self): - """Check that local source files are copied over instead of patched""" - testrecipe = 'makedevs' - recipefile = self.get_bb_var('FILE', testrecipe) - # Setup srctree for modifying the recipe - tempdir = tempfile.mkdtemp(prefix='devtoolqa') - self.track_for_cleanup(tempdir) - self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) - # (don't bother with cleaning the recipe on teardown, we won't be - # building it) - result = self.runCmd('devtool modify %s -x %s' % (testrecipe, tempdir)) - # Check git repo - self._check_src_repo(tempdir) - # Try building just to ensure we haven't broken that - self.bitbake("%s" % testrecipe) - # Edit / commit local source - self.runCmd('echo "/* Foobar */" >> oe-local-files/makedevs.c', cwd=tempdir) - self.runCmd('echo "Foo" > oe-local-files/new-local', cwd=tempdir) - self.runCmd('echo "Bar" > new-file', cwd=tempdir) - self.runCmd('git add new-file', cwd=tempdir) - self.runCmd('git commit -m "Add new file"', cwd=tempdir) - self.add_command_to_tearDown('cd %s; git clean -fd .; git checkout .' % - os.path.dirname(recipefile)) - self.runCmd('devtool update-recipe %s' % testrecipe) - expected_status = [(' M', '.*/%s$' % os.path.basename(recipefile)), - (' M', '.*/makedevs/makedevs.c$'), - ('??', '.*/makedevs/new-local$'), - ('??', '.*/makedevs/0001-Add-new-file.patch$')] - self._check_repo_status(os.path.dirname(recipefile), expected_status) - - @OETestID(1371) - def test_devtool_update_recipe_local_files_2(self): - """Check local source files support when oe-local-files is in Git""" - testrecipe = 'lzo' - recipefile = self.get_bb_var('FILE', testrecipe) - # Setup srctree for modifying the recipe - tempdir = tempfile.mkdtemp(prefix='devtoolqa') - self.track_for_cleanup(tempdir) - self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) - result = self.runCmd('devtool modify %s -x %s' % (testrecipe, tempdir)) - # Check git repo - self._check_src_repo(tempdir) - # Add oe-local-files to Git - self.runCmd('rm oe-local-files/.gitignore', cwd=tempdir) - self.runCmd('git add oe-local-files', cwd=tempdir) - self.runCmd('git commit -m "Add local sources"', cwd=tempdir) - # Edit / commit local sources - self.runCmd('echo "# Foobar" >> oe-local-files/acinclude.m4', cwd=tempdir) - self.runCmd('git commit -am "Edit existing file"', cwd=tempdir) - self.runCmd('git rm oe-local-files/run-ptest', cwd=tempdir) - self.runCmd('git commit -m"Remove file"', cwd=tempdir) - self.runCmd('echo "Foo" > oe-local-files/new-local', cwd=tempdir) - self.runCmd('git add oe-local-files/new-local', cwd=tempdir) - self.runCmd('git commit -m "Add new local file"', cwd=tempdir) - self.runCmd('echo "Gar" > new-file', cwd=tempdir) - self.runCmd('git add new-file', cwd=tempdir) - self.runCmd('git commit -m "Add new file"', cwd=tempdir) - self.add_command_to_tearDown('cd %s; git clean -fd .; git checkout .' % - os.path.dirname(recipefile)) - # Checkout unmodified file to working copy -> devtool should still pick - # the modified version from HEAD - self.runCmd('git checkout HEAD^ -- oe-local-files/acinclude.m4', cwd=tempdir) - self.runCmd('devtool update-recipe %s' % testrecipe) - expected_status = [(' M', '.*/%s$' % os.path.basename(recipefile)), - (' M', '.*/acinclude.m4$'), - (' D', '.*/run-ptest$'), - ('??', '.*/new-local$'), - ('??', '.*/0001-Add-new-file.patch$')] - self._check_repo_status(os.path.dirname(recipefile), expected_status) - - @OETestID(1627) - def test_devtool_update_recipe_local_files_3(self): - # First, modify the recipe - testrecipe = 'devtool-test-localonly' - bb_vars = self.get_bb_vars(['FILE', 'SRC_URI'], testrecipe) - recipefile = bb_vars['FILE'] - src_uri = bb_vars['SRC_URI'] - tempdir = tempfile.mkdtemp(prefix='devtoolqa') - self.track_for_cleanup(tempdir) - self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) - # (don't bother with cleaning the recipe on teardown, we won't be building it) - result = self.runCmd('devtool modify %s' % testrecipe) - # Modify one file - self.runCmd('echo "Another line" >> file2', cwd=os.path.join(self.workspacedir, 'sources', testrecipe, 'oe-local-files')) - self.add_command_to_tearDown('cd %s; rm %s/*; git checkout %s %s' % (os.path.dirname(recipefile), testrecipe, testrecipe, os.path.basename(recipefile))) - result = self.runCmd('devtool update-recipe %s' % testrecipe) - expected_status = [(' M', '.*/%s/file2$' % testrecipe)] - self._check_repo_status(os.path.dirname(recipefile), expected_status) - - @OETestID(1629) - def test_devtool_update_recipe_local_patch_gz(self): - # First, modify the recipe - testrecipe = 'devtool-test-patch-gz' - if self.get_bb_var('DISTRO') == 'poky-tiny': - self.skipTest("The DISTRO 'poky-tiny' does not provide the dependencies needed by %s" % testrecipe) - bb_vars = self.get_bb_vars(['FILE', 'SRC_URI'], testrecipe) - recipefile = bb_vars['FILE'] - src_uri = bb_vars['SRC_URI'] - tempdir = tempfile.mkdtemp(prefix='devtoolqa') - self.track_for_cleanup(tempdir) - self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) - # (don't bother with cleaning the recipe on teardown, we won't be building it) - result = self.runCmd('devtool modify %s' % testrecipe) - # Modify one file - srctree = os.path.join(self.workspacedir, 'sources', testrecipe) - self.runCmd('echo "Another line" >> README', cwd=srctree) - self.runCmd('git commit -a --amend --no-edit', cwd=srctree) - self.add_command_to_tearDown('cd %s; rm %s/*; git checkout %s %s' % (os.path.dirname(recipefile), testrecipe, testrecipe, os.path.basename(recipefile))) - result = self.runCmd('devtool update-recipe %s' % testrecipe) - expected_status = [(' M', '.*/%s/readme.patch.gz$' % testrecipe)] - self._check_repo_status(os.path.dirname(recipefile), expected_status) - patch_gz = os.path.join(os.path.dirname(recipefile), testrecipe, 'readme.patch.gz') - result = self.runCmd('file %s' % patch_gz) - if 'gzip compressed data' not in result.output: - self.fail('New patch file is not gzipped - file reports:\n%s' % result.output) - - @OETestID(1628) - def test_devtool_update_recipe_local_files_subdir(self): - # Try devtool extract on a recipe that has a file with subdir= set in - # SRC_URI such that it overwrites a file that was in an archive that - # was also in SRC_URI - # First, modify the recipe - testrecipe = 'devtool-test-subdir' - bb_vars = self.get_bb_vars(['FILE', 'SRC_URI'], testrecipe) - recipefile = bb_vars['FILE'] - src_uri = bb_vars['SRC_URI'] - tempdir = tempfile.mkdtemp(prefix='devtoolqa') - self.track_for_cleanup(tempdir) - self.track_for_cleanup(self.workspacedir) - self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) - # (don't bother with cleaning the recipe on teardown, we won't be building it) - result = self.runCmd('devtool modify %s' % testrecipe) - testfile = os.path.join(self.workspacedir, 'sources', testrecipe, 'testfile') - self.assertExists(testfile, 'Extracted source could not be found') - with open(testfile, 'r') as f: - contents = f.read().rstrip() - self.assertEqual(contents, 'Modified version', 'File has apparently not been overwritten as it should have been') - # Test devtool update-recipe without modifying any files - self.add_command_to_tearDown('cd %s; rm %s/*; git checkout %s %s' % (os.path.dirname(recipefile), testrecipe, testrecipe, os.path.basename(recipefile))) - result = self.runCmd('devtool update-recipe %s' % testrecipe) - expected_status = [] - self._check_repo_status(os.path.dirname(recipefile), expected_status) - @OETestID(1163) def test_devtool_extract(self): tempdir = tempfile.mkdtemp(prefix='devtoolqa')
@@ -1399,87 +987,6 @@ class DevtoolTests(DevtoolCommon): self.assertExists(os.path.join(newdir, patchfn), 'Patch file should have been copied into new directory but wasn\'t') self.assertExists(os.path.join(newdir, '0002-Add-a-comment-to-the-code.patch'), 'New patch file should have been created but wasn\'t') - def _setup_test_devtool_finish_modify(self): - # Check preconditions - self.assertTrue(not os.path.exists(self.workspacedir), 'This test cannot be run with a workspace directory under the build directory') - # Try modifying a recipe - self.track_for_cleanup(self.workspacedir) - recipe = 'mdadm' - oldrecipefile = self.get_bb_var('FILE', recipe) - recipedir = os.path.dirname(oldrecipefile) - result = self.runCmd('git status --porcelain .', cwd=recipedir) - if result.output.strip(): - self.fail('Recipe directory for %s contains uncommitted changes' % recipe) - tempdir = tempfile.mkdtemp(prefix='devtoolqa') - self.track_for_cleanup(tempdir) - self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) - result = self.runCmd('devtool modify %s %s' % (recipe, tempdir)) - self.assertExists(os.path.join(tempdir, 'Makefile'), 'Extracted source could not be found') - # Test devtool status - result = self.runCmd('devtool status') - self.assertIn(recipe, result.output) - self.assertIn(tempdir, result.output) - # Make a change to the source - result = self.runCmd('sed -i \'/^#include "mdadm.h"/a \\/* Here is a new comment *\\/\' maps.c', cwd=tempdir) - result = self.runCmd('git status --porcelain', cwd=tempdir) - self.assertIn('M maps.c', result.output) - result = self.runCmd('git commit maps.c -m "Add a comment to the code"', cwd=tempdir) - for entry in os.listdir(recipedir): - filesdir = os.path.join(recipedir, entry) - if os.path.isdir(filesdir): - break - else: - self.fail('Unable to find recipe files directory for %s' % recipe) - return recipe, oldrecipefile, recipedir, filesdir - - @OETestID(1621) - def test_devtool_finish_modify_origlayer(self): - recipe, oldrecipefile, recipedir, filesdir = self._setup_test_devtool_finish_modify() - # Ensure the recipe is where we think it should be (so that cleanup doesn't trash things) - self.assertIn('/meta/', recipedir) - # Try finish to the original layer - self.add_command_to_tearDown('rm -rf %s ; cd %s ; git checkout %s' % (recipedir, os.path.dirname(recipedir), recipedir)) - result = self.runCmd('devtool finish %s meta' % recipe) - result = self.runCmd('devtool status') - self.assertNotIn(recipe, result.output, 'Recipe should have been reset by finish but wasn\'t') - self.assertNotExists(os.path.join(self.workspacedir, 'recipes', recipe), 'Recipe directory should not exist after finish') - expected_status = [(' M', '.*/%s$' % os.path.basename(oldrecipefile)), - ('??', '.*/.*-Add-a-comment-to-the-code.patch$')] - self._check_repo_status(recipedir, expected_status) - - @OETestID(1622) - def test_devtool_finish_modify_otherlayer(self): - recipe, oldrecipefile, recipedir, filesdir = self._setup_test_devtool_finish_modify() - # Ensure the recipe is where we think it should be (so that cleanup doesn't trash things) - self.assertIn('/meta/', recipedir) - relpth = os.path.relpath(recipedir, os.path.join(self.get_bb_var('COREBASE'), 'meta')) - appenddir = os.path.join(self.testlayer_path, relpth) - self.track_for_cleanup(appenddir) - # Try finish to the original layer - self.add_command_to_tearDown('rm -rf %s ; cd %s ; git checkout %s' % (recipedir, os.path.dirname(recipedir), recipedir)) - result = self.runCmd('devtool finish %s meta-selftest' % recipe) - result = self.runCmd('devtool status') - self.assertNotIn(recipe, result.output, 'Recipe should have been reset by finish but wasn\'t') - self.assertNotExists(os.path.join(self.workspacedir, 'recipes', recipe), 'Recipe directory should not exist after finish') - result = self.runCmd('git status --porcelain .', cwd=recipedir) - if result.output.strip(): - self.fail('Recipe directory for %s contains the following unexpected changes after finish:\n%s' % (recipe, result.output.strip())) - recipefn = os.path.splitext(os.path.basename(oldrecipefile))[0] - recipefn = recipefn.split('_')[0] + '_%' - appendfile = os.path.join(appenddir, recipefn + '.bbappend') - self.assertExists(appendfile, 'bbappend %s should have been created but wasn\'t' % appendfile) - newdir = os.path.join(appenddir, recipe) - files = os.listdir(newdir) - foundpatch = None - for fn in files: - if fnmatch.fnmatch(fn, '*-Add-a-comment-to-the-code.patch'): - foundpatch = fn - if not foundpatch: - self.fail('No patch file created next to bbappend') - files.remove(foundpatch) - if files: - self.fail('Unexpected file(s) copied next to bbappend: %s' % ', '.join(files)) - @OETestID(1626) def test_devtool_rename(self): # Check preconditions
meta/lib/oeqa/selftest/cases/devtool_end.py new file +506 -0
506 lines not on this page · raw message
Signature · 1 line
2.11.0
PATCH v2 26/29 seltest/cases/devtool: Build dbus on test_devtool_add_git_local
In reply to Aníbal LimónThe dbus-wait recipe has the dependency of dbus, due to now we have build folder per test class the dependency needs to be build before run devtool add because without it the DEPENDS field is unset.
The devtool/recipetool uses previously build recipes to figure out the dependencies.
--- meta/lib/oeqa/selftest/cases/devtool.py | 2 ++ 1 file changed, 2 insertions(+)
meta/lib/oeqa/selftest/cases/devtool.py +2 -0
@@ -248,6 +248,8 @@ class DevtoolTests(DevtoolCommon): # Test devtool add self.track_for_cleanup(self.workspacedir) self.add_command_to_tearDown('bitbake-layers remove-layer %s' % self.workspacedir) + # dbus needs to be built because is a dependency of dbus-wait + self.bitbake('dbus') # Don't specify a name since we should be able to auto-detect it result = self.runCmd('devtool add %s' % srcdir) self.assertExists(os.path.join(self.workspacedir, 'conf', 'layer.conf'), 'Workspace directory not created')
Signature · 1 line
2.11.0
PATCH v2 27/29 argparse_oe: Add int_positive type
In reply to Aníbal LimónSometimes only expect positive values from cmdline so it's better to filter at parsing cmdline step instead of validate later.
--- scripts/lib/argparse_oe.py | 7 +++++++ 1 file changed, 7 insertions(+)
scripts/lib/argparse_oe.py +7 -0
@@ -167,3 +167,10 @@ class OeHelpFormatter(argparse.HelpFormatter): return '\n'.join(lines) else: return super(OeHelpFormatter, self)._format_action(action) + +def int_positive(value): + ivalue = int(value) + if ivalue <= 0: + raise argparse.ArgumentTypeError( + "%s is not a positive int value" % value) + return ivalue
Signature · 1 line
2.11.0
PATCH v2 28/29 oeqa/selftest/context: Enable support for threaded runs
In reply to Aníbal LimónAdd an option to specify how many threads will be used for execution, default to 1.
If the thread_num are greater than 1 the OESelftestContextThreaded will be used, this is due to compatibility reasons.
--- meta/lib/oeqa/selftest/context.py | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-)
meta/lib/oeqa/selftest/context.py +22 -4
@@ -11,11 +11,12 @@ from shutil import copyfile import tempfile from random import choice -import oeqa +from argparse_oe import int_positive -from oeqa.core.context import OETestContext, OETestContextExecutor +import oeqa +from oeqa.core.context import OETestContext, OETestContextExecutor from oeqa.core.exception import OEQAPreRun - +from oeqa.core.threaded import OETestContextThreaded from oeqa.utils.commands import runCmd, get_bb_vars, get_test_layer class OESelftestTestContext(OETestContext):
@@ -38,14 +39,19 @@ class OESelftestTestContext(OETestContext): def listTests(self, display_type, machine=None): return super(OESelftestTestContext, self).listTests(display_type) +class OESelftestTestContextThreaded(OESelftestTestContext, OETestContextThreaded): + pass + class OESelftestTestContextExecutor(OETestContextExecutor): - _context_class = OESelftestTestContext + _context_class = OESelftestTestContextThreaded _script_executor = 'oe-selftest' name = 'oe-selftest' help = 'oe-selftest test component' description = 'Executes selftest tests' + DEFAULT_THREADS = 1 + def register_commands(self, logger, parser): group = parser.add_mutually_exclusive_group(required=True)
@@ -66,6 +72,11 @@ class OESelftestTestContextExecutor(OETestContextExecutor): action="store_true", default=False, help='List all available tests.') + parser.add_argument('-t', '--thread-num', required=False, action='store', + dest="thread_num", default=self.DEFAULT_THREADS, type=int_positive, + help='Number of threads to use for execute selftests,'\ + ' default: %d' % self.DEFAULT_THREADS) + parser.add_argument('--machine', required=False, choices=['random', 'all'], help='Run tests on different machines (random/all).')
@@ -137,6 +148,8 @@ class OESelftestTestContextExecutor(OETestContextExecutor): self.tc_kwargs['init']['config_paths']['base_builddir'] = \ tempfile.mkdtemp(prefix='build-selftest-', dir=builddir) + self.tc_kwargs['load']['process_num'] = args.thread_num + def _pre_run(self): def _check_required_env_variables(vars): for var in vars:
@@ -199,6 +212,11 @@ class OESelftestTestContextExecutor(OETestContextExecutor): self.module_paths = self._get_cases_paths( self.tc_kwargs['init']['td']['BBPATH'].split(':')) + if self.tc_kwargs['load']['process_num'] == 1: + self._context_class = OESelftestTestContext + # OESelftestTestContext class doesn't expect process_num + del self.tc_kwargs['load']['process_num'] + self.tc = self._context_class(**self.tc_kwargs['init']) self.tc.loadTests(self.module_paths, **self.tc_kwargs['load'])
Signature · 1 line
2.11.0
PATCH v2 29/29 oeqa/selftest/cases: systemd_boot enable threaded runs
In reply to Aníbal Limón--- .../lib/oeqa/selftest/cases/systemd_boot.py | 26 ++++++++++++---------- 1 file changed, 14 insertions(+), 12 deletions(-)
meta-yocto-bsp/lib/oeqa/selftest/cases/systemd_boot.py +14 -12
@@ -3,9 +3,11 @@ import os from oeqa.selftest.case import OESelftestTestCase from oeqa.core.decorator.oeid import OETestID from oeqa.core.decorator.depends import OETestDepends -from oeqa.utils.commands import runCmd, bitbake, get_bb_var, runqemu class Systemdboot(OESelftestTestCase): + _use_own_builddir = True + _main_thread = False + def _common_setup(self): """ Common setup for test cases: 1445, 1528
@@ -22,7 +24,7 @@ class Systemdboot(OESelftestTestCase): """ # Build a genericx86-64/efi systemdboot image - bitbake('mtools-native core-image-minimal') + self.bitbake('mtools-native core-image-minimal') @OETestID(1445)
@@ -38,14 +40,14 @@ class Systemdboot(OESelftestTestCase): # We'd use DEPLOY_DIR_IMAGE here, except that we need its value for # MACHINE="genericx86-64 which is probably not the one configured - systemdbootfile = os.path.join(get_bb_var('DEPLOY_DIR'), 'images', 'genericx86-64', 'systemd-bootx64.efi') + systemdbootfile = os.path.join(self.get_bb_var('DEPLOY_DIR'), 'images', 'genericx86-64', 'systemd-bootx64.efi') self._common_setup() # Ensure we're actually testing that this gets built and not that # it was around from an earlier build - bitbake('-c cleansstate systemd-boot') - runCmd('rm -f %s' % systemdbootfile) + self.bitbake('-c cleansstate systemd-boot') + self.runCmd('rm -f %s' % systemdbootfile) self._common_build()
@@ -71,20 +73,20 @@ class Systemdboot(OESelftestTestCase): AutomatedBy: Jose Perez Carranza <jose.perez.carranza at linux-intel.com> """ - systemdbootfile = os.path.join(get_bb_var('DEPLOY_DIR'), 'images', 'genericx86-64', + systemdbootfile = os.path.join(self.get_bb_var('DEPLOY_DIR'), 'images', 'genericx86-64', 'systemd-bootx64.efi') - systemdbootimage = os.path.join(get_bb_var('DEPLOY_DIR'), 'images', 'genericx86-64', + systemdbootimage = os.path.join(self.get_bb_var('DEPLOY_DIR'), 'images', 'genericx86-64', 'core-image-minimal-genericx86-64.hddimg') - imagebootfile = os.path.join(get_bb_var('DEPLOY_DIR'), 'images', 'genericx86-64', + imagebootfile = os.path.join(self.get_bb_var('DEPLOY_DIR'), 'images', 'genericx86-64', 'bootx64.efi') - mcopynative = os.path.join(get_bb_var('STAGING_BINDIR_NATIVE'), 'mcopy') + mcopynative = os.path.join(self.get_bb_var('STAGING_BINDIR_NATIVE'), 'mcopy') #Clean environment before start the test if os.path.isfile(imagebootfile): - runCmd('rm -f %s' % imagebootfile) + self.runCmd('rm -f %s' % imagebootfile) #Step 1 - runCmd('%s -i %s ::EFI/BOOT/bootx64.efi %s' % (mcopynative ,systemdbootimage, + self.runCmd('%s -i %s ::EFI/BOOT/bootx64.efi %s' % (mcopynative ,systemdbootimage, imagebootfile)) #Step 2
@@ -93,6 +95,6 @@ class Systemdboot(OESelftestTestCase): % imagebootfile) #Step 3 - result = runCmd('md5sum %s %s' % (systemdbootfile, imagebootfile)) + result = self.runCmd('md5sum %s %s' % (systemdbootfile, imagebootfile)) self.assertEqual(result.output.split()[0], result.output.split()[2], '%s was not correclty generated' % imagebootfile)
Signature · 1 line
2.11.0
✗ patchtest: failure for oeqa core and oe-selftest threaded enablement (rev2)
In reply to Aníbal Limón== Series Details ==
Series: oeqa core and oe-selftest threaded enablement (rev2)
Revision: 2
URL : https://patchwork.openembedded.org/series/7694/
State : failure
== Summary ==
Thank you for submitting this patch series to OpenEmbedded Core. This is an automated response. Several tests have been executed on the proposed series by patchtest resulting in the following failures:
* Issue Series does not apply on top of target branch [test_series_merge_on_head]
Suggested fix Rebase your series on top of targeted branch
Targeted branch master (currently at b1c4661742)
* Issue Series sent to the wrong mailing list or some patches from the series correspond to different mailing lists [test_target_mailing_list]
Suggested fix Send the series again to the correct mailing list (ML) Suggested ML [email protected] [http://git.yoctoproject.org/cgit/cgit.cgi/poky/] Patch's path: meta-yocto-bsp/lib/oeqa/selftest/cases/systemd_boot.py
If you believe any of these test results are incorrect, please reply to the mailing list ([email protected]) raising your concerns. Otherwise we would appreciate you correcting the issues and submitting a new version of the patchset if applicable. Please ensure you add/increment the version number when sending the new version (i.e. [PATCH] -> [PATCH v2] -> [PATCH v3] -> ...).
---
Test framework: http://git.yoctoproject.org/cgit/cgit.cgi/patchtest Test suite: http://git.yoctoproject.org/cgit/cgit.cgi/patchtest-oe
Re: ✗ patchtest: failure for oeqa core and oe-selftest threaded enablement (rev2)
Quoted 16 lines · Patchwork
== Series Details ==
Series: oeqa core and oe-selftest threaded enablement (rev2)
Revision: 2
URL : https://patchwork.openembedded.org/series/7694/
State : failure== Summary ==
Thank you for submitting this patch series to OpenEmbedded Core. This is an automated response. Several tests have been executed on the proposed series by patchtest resulting in the following failures:
Quoted 3 lines
* Issue Series does not apply on top of target branch [
test_series_merge_on_head]
Suggested fix Rebase your series on top of targeted branch
Targeted branch master (currently atb1c4661742)
Just dig into it and found the following: the above issue raised by patchtest is due to the below one. The safest is to rebase against oe-core, not poky and send the patch or patches to the correct ML.
Leo
Quoted 19 lines
* Issue Series sent to the wrong mailing list or some patches from the series correspond to different mailing lists [
test_target_mailing_list]Suggested fix Send the series again to the correct mailing list (ML) Suggested ML [email protected] [http://git.yoctoproject.org/cgit/cgit.cgi/poky/] Patch's path: meta-yocto-bsp/lib/oeqa/selftest/cases/systemd_boot.pyIf you believe any of these test results are incorrect, please reply to the mailing list ([email protected]) raising your concerns. Otherwise we would appreciate you correcting the issues and submitting a new version of the patchset if applicable. Please ensure you add/increment the version number when sending the new version (i.e. [PATCH] -> [PATCH v2] -> [PATCH v3] -> ...).
---
Test framework: http://git.yoctoproject.org/cgit/cgit.cgi/patchtest Test suite: http://git.yoctoproject.org/cgit/cgit.cgi/patchtest-oe
Re: [PATCHv2 04/29] bb/tinfoil: run_command handle busy status in bitbake server
In reply to Aníbal LimónOn Wed, Jul 12, 2017 at 12:36 PM, Aníbal Limón <[email protected]
Quoted 8 lines
wrote:
When tinfoil request a command to bitbake is handled in async manner [1], sometimes is this ends on return a Busy status.
This is a workaround a needs to be fixed in proper manner inside bitbake code.
I’m assuming you verified this doesn’t cause issues with synchronous commands? Not all commands are async, after all, but the comment in your retry logic acts like they are.
Signature · 4 lines
Christopher Larson kergoth at gmail dot com Founder - BitBake, OpenEmbedded, OpenZaurus Senior Software Engineer, Mentor Graphics
Re: [PATCHv2 04/29] bb/tinfoil: run_command handle busy status in bitbake server
Quoted 6 lines · Christopher Larson
On Wed, Jul 12, 2017 at 12:36 PM, Aníbal Limón <[email protected]
Quoted 5 lines
wrote:
When tinfoil request a command to bitbake is handled in async manner [1], sometimes is this ends on return a Busy status.
Quoted 7 lines
Quoted 3 lines
This is a workaround a needs to be fixed in proper manner inside bitbake code.
I’m assuming you verified this doesn’t cause issues with synchronous commands? Not all commands are async, after all, but the comment in your retry logic acts like they are.
Yes, this a workaround, and now only is applied to clientComplete command that is async, we need to review the bitbake code and make the proper fix.
This patch could be removed for the integration.
Cheers,
Anibal
Quoted 1 line
I found some other races in the test cases execution, i will send a v3.
Cheers,
Anibal
Quoted 120 lines · Aníbal Limón
The v2 address comments did by Patrick about add better explanation on the commit messages and some typos.
Other interesting information to add is that with this series we will able to execute oe-selftest in around half [1] of the original time [2], (9406.782s vs 17303.014s).
[1] https://bugzilla.yoctoproject.org/attachment.cgi?id=3863
[2] https://bugzilla.yoctoproject.org/attachment.cgi?id=3864This series is to enable oe-selftest threaded runs along some fixes,
* Implementation of main/end thread usage in oeqa threaded
* Adaptation of oe-selftest cases to be able to run in threaded env, ** Usage of own build directory by Test class.
** Mark the test modules that are enabled to run into a thread. ** Split some test modules because aren't support run into a thread
due to bitbake/tinfoil constraints.The oe-selftest script now has an cmdline option (-t) to enable threaded runs, by default is set to 1, this needs to be set manually because depending on HW resources available can cause ran out of cpu/memory.
By default the oe-selftest cases runs on the main thread and uses the main build directory for compatibility purposes.
The following changes since commit
81498aac9560fbeaeb58eaada32ce80e0ea51628:yocto-project-qs: Updated Next Steps list (2017-07-12 00:28:16 +0100)
are available in the git repository at:
git://git.yoctoproject.org/poky-contribalimon/oe_selftest_threaded
http://git.yoctoproject.org/cgit.cgi/poky-contrib/log/?h=alimon/oe_selftest_threadedAníbal Limón (29):
oeqa/core/loader: Switch method definition for_make_failed_testoeqa/selftest/{context,case}: Handle KeyboardInterrupt/SIGINT and
SIGTERM
selftest/cases/package: Call parent setUpClass method bb/tinfoil:run_commandhandle busy status in bitbake server oe/copy_buildsystem:check_sstate_task_listalso pop BBPATH from env oeqa/core/threaded: Enable support to use the main thread oeqa/core/threaded: Add support to run into a thread at end of
execution
oeqa/core/threaded: logSummary add skipped tests info oeqa/core/tests: Updatetest_loaderthreaded to cover main thread
usage
oeqa/selftest/{case,context}: Add builddir by test class and context oeqa/selftest/case: Add wrappers to utils.commands modules oeqa/selftest/case: Creates meta-selftest layer per class oeqa/selftest/case: tearDown extra commands print what actually fails oeqa/selftest/case: Support bitbake memres mode in per build directory oeqa/selftest/cases: Usetestlayer_pathinstead of call
get_test_layer()
oeqa/selftest/cases: Use builddir from class instead of get from
environment
oeqa/selftest/cases: Use wrapper methods from OESelfTestCase class oeqa/selftest/cases: imagefeatures enable threaded runs oeqa/selftest/cases: runqemu enable threaded runs oeqa/selftest/cases: runtime enable threaded runs oeqa/selftest/cases: eSDK enable threaded runs oeqa/selftest/cases: devtool enable threaded runs oeqa/selftest/cases: recipetool enable for threaded runs oeqa/selftest/cases: Move devtool deploy test case to own module selftest/cases/devtool{,end}: Move update/finish_modify tests to its
own module
seltest/cases/devtool: Build dbus ontest_devtool_add_git_local
argparse_oe: Addint_positivetype
oeqa/selftest/context: Enable support for threaded runs oeqa/selftest/cases:systemd_bootenable threaded runsbitbake/lib/bb/tinfoil.py | 23 +- .../lib/oeqa/selftest/cases/systemd_boot.py | 26 +- meta/lib/oe/copy_buildsystem.py | 1 + meta/lib/oeqa/core/loader.py | 4 +- meta/lib/oeqa/core/tests/test_loader.py | 17 +- meta/lib/oeqa/core/threaded.py | 169 +++- meta/lib/oeqa/selftest/case.py | 251 ++++- .../lib/oeqa/selftest/cases/_sstatetests_noauto.py | 23 +- meta/lib/oeqa/selftest/cases/archiver.py | 21 +- meta/lib/oeqa/selftest/cases/bblayers.py | 45 +- meta/lib/oeqa/selftest/cases/bbtests.py | 103 +- meta/lib/oeqa/selftest/cases/buildhistory.py | 9 +- meta/lib/oeqa/selftest/cases/buildoptions.py | 51 +- meta/lib/oeqa/selftest/cases/containerimage.py | 9 +- meta/lib/oeqa/selftest/cases/devtool.py | 1014 +++++--------------- meta/lib/oeqa/selftest/cases/devtool_deploy.py | 93 ++ meta/lib/oeqa/selftest/cases/devtool_end.py | 506 ++++++++++ meta/lib/oeqa/selftest/cases/distrodata.py | 7 +- meta/lib/oeqa/selftest/cases/eSDK.py | 61 +- meta/lib/oeqa/selftest/cases/image_typedep.py | 8 +- meta/lib/oeqa/selftest/cases/imagefeatures.py | 78 +- meta/lib/oeqa/selftest/cases/imagefeatures_boot.py | 63 ++ meta/lib/oeqa/selftest/cases/layerappend.py | 22 +- meta/lib/oeqa/selftest/cases/liboe.py | 13 +- meta/lib/oeqa/selftest/cases/lic_checksum.py | 8 +- meta/lib/oeqa/selftest/cases/manifest.py | 13 +- meta/lib/oeqa/selftest/cases/oelib/buildhistory.py | 7 +- meta/lib/oeqa/selftest/cases/oescripts.py | 5 +- meta/lib/oeqa/selftest/cases/package.py | 12 +- meta/lib/oeqa/selftest/cases/pkgdata.py | 73 +- meta/lib/oeqa/selftest/cases/prservice.py | 19 +- meta/lib/oeqa/selftest/cases/recipetool.py | 105 +- meta/lib/oeqa/selftest/cases/runqemu.py | 7 +- meta/lib/oeqa/selftest/cases/runtime_test.py | 225 +---- .../lib/oeqa/selftest/cases/runtime_test_export.py | 104 ++ .../oeqa/selftest/cases/runtime_test_postinsts.py | 114 +++ meta/lib/oeqa/selftest/cases/signing.py | 40 +- meta/lib/oeqa/selftest/cases/sstate.py | 5 +- meta/lib/oeqa/selftest/cases/sstatetests.py | 51 +- meta/lib/oeqa/selftest/context.py | 137 ++- scripts/lib/argparse_oe.py | 7 + 41 files changed, 1997 insertions(+), 1552 deletions(-) create mode 100644 meta/lib/oeqa/selftest/cases/devtool_deploy.py create mode 100644 meta/lib/oeqa/selftest/cases/devtool_end.py create mode 100644 meta/lib/oeqa/selftest/cases/imagefeatures_boot.py create mode 100644 meta/lib/oeqa/selftest/cases/runtime_test_export.py create mode 100644 meta/lib/oeqa/selftest/cases/runtime_test_postinsts.py