All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/36] OEQA threading support and selftest migration
@ 2017-05-26 20:37 Aníbal Limón
  2017-05-26 20:37 ` [PATCH 01/36] testsdk.bbclass: Remove unused import of OEStreamLogger Aníbal Limón
                   ` (37 more replies)
  0 siblings, 38 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

This series is the integration of tree main changes into the OEQA module,

* Implement threading support into OEQA core module
* Enables OEQA threaded mode into {,e}SDK test component
* Migrate current oe-selftest to use the same framework

The following changes since commit 5eed6c644f715783edb0d05926373e719442dd6a:

  libpcap: add native package (2017-05-25 23:59:32 +0100)

are available in the git repository at:

  git://git.yoctoproject.org/poky-contrib alimon/oeqa_integration
  http://git.yoctoproject.org/cgit.cgi/poky-contrib/log/?h=alimon/oeqa_integration

Aníbal Limón (25):
  testsdk.bbclass: Remove unused import of OEStreamLogger
  oeqa/sdk/context.py: Import argparse_oe at OESDKTestContext.run method
  oeqa/sdk/context.py: Add return to OESDKTestContext.run() method
  oeqa/core: Don't expose OEStreamLogger in OETestContext
  oeqa/core/runner: OETestResult remove unneeded override of startTest
  oeqa/core: Move OETestContext.log{Summary, Details} into OETestResult
  oeqa/core/threaded: Add new module with OETestLoaderThreaded
  oeqa/core/threaded: Add OEStreamLoggerThreaded class
  oeqa/core/runner: OETestResult add internal _tc_map_results
  oeqa/core/threaded: Add OETestResultThreaded{,Internal} classes
  oeqa/core/threaded: Add support of OETestRunnerThreaded
  oeqa/core/threaded: Add OETestContextThreaded class
  oeqa/core/decorator/depends: Add support for threading mode
  oeqa/core/decorator/oetimeout: Add support for OEQA threaded mode
  oeqa/core/tests: Add tests of OEQA Threaded mode
  oeqa/sdkext/cases: Move sdk_update test into devtool module
  oeqa/sdk: Enable usage of OEQA thread mode
  oeqa/core: Add list tests support in context and runner
  oeqa/core: Add support for run tests by module, class and name
  classes/test{export,images}: Change modules to list
  oeqa/runtime/case: Don't use OEQA framework internal methods
  scripts/oe-test: Move load_test_components to oeqa.utils
  oeqa/selftest: Move base class to case module
  oeqa/selftest/case: Don't figure out the testlayer inside
  selftest: Migrate systemd_boot test case to the new framework

Leonardo Sandoval (11):
  oeqa/core/README: Improve documentation
  oeqa/core/case: fix typo on comment about exception name
  oeqa/core/context: Raise exception when a manifest is specified but
    missing
  oeqa/core/context: Use a default iterable modules object
  oeqa/core/context: Omit docstring output on XMLResult
  oeqa/core/context: Include a _pre_run method
  oeqa/selftest/case: Migrate case class to the new OEQA framework
  scripts/oe-selftest: Move {add,remove}_include files to case
  oeqa/selftest/case.py: Remove machine selection logic
  scripts/oe-selftest: Migrate to new framework into
    oeqa.selftest.context
  oeqa/selftest/cases: Migrate test cases into the new oe-qa framework

 meta-yocto-bsp/lib/oeqa/selftest/__init__.py       |   0
 .../lib/oeqa/selftest/{ => cases}/systemd_boot.py  |  14 +-
 meta/classes/testexport.bbclass                    |   2 +-
 meta/classes/testimage.bbclass                     |   6 +-
 meta/classes/testsdk.bbclass                       |  13 +-
 meta/lib/oeqa/core/README                          |  81 ++-
 meta/lib/oeqa/core/case.py                         |   2 +-
 meta/lib/oeqa/core/context.py                      | 127 +---
 meta/lib/oeqa/core/decorator/depends.py            |   8 +-
 meta/lib/oeqa/core/decorator/oetimeout.py          |  40 +-
 meta/lib/oeqa/core/exception.py                    |   6 +
 meta/lib/oeqa/core/loader.py                       |  66 +-
 meta/lib/oeqa/core/runner.py                       | 192 ++++-
 .../core/tests/cases/loader/threaded/threaded.py   |  12 +
 .../tests/cases/loader/threaded/threaded_alone.py  |   8 +
 .../cases/loader/threaded/threaded_depends.py      |  10 +
 .../tests/cases/loader/threaded/threaded_module.py |  12 +
 meta/lib/oeqa/core/tests/common.py                 |  10 +
 meta/lib/oeqa/core/tests/test_decorators.py        |  12 +
 meta/lib/oeqa/core/tests/test_loader.py            |  30 +-
 meta/lib/oeqa/core/threaded.py                     | 274 +++++++
 meta/lib/oeqa/runtime/case.py                      |   8 +-
 meta/lib/oeqa/sdk/context.py                       |  11 +-
 meta/lib/oeqa/sdkext/cases/devtool.py              |  32 +
 meta/lib/oeqa/sdkext/cases/sdk_update.py           |  39 -
 meta/lib/oeqa/selftest/__init__.py                 |   2 -
 meta/lib/oeqa/selftest/{base.py => case.py}        | 220 +++---
 .../selftest/{ => cases}/_sstatetests_noauto.py    |   7 +-
 meta/lib/oeqa/selftest/{ => cases}/archiver.py     |  14 +-
 meta/lib/oeqa/selftest/{ => cases}/bblayers.py     |  24 +-
 meta/lib/oeqa/selftest/{ => cases}/bbtests.py      |  57 +-
 meta/lib/oeqa/selftest/{ => cases}/buildhistory.py |   5 +-
 meta/lib/oeqa/selftest/{ => cases}/buildoptions.py |  34 +-
 .../oeqa/selftest/{ => cases}/containerimage.py    |   4 +-
 meta/lib/oeqa/selftest/{ => cases}/devtool.py      |  68 +-
 meta/lib/oeqa/selftest/{ => cases}/eSDK.py         |  18 +-
 .../lib/oeqa/selftest/{ => cases}/image_typedep.py |   4 +-
 .../lib/oeqa/selftest/{ => cases}/imagefeatures.py |  16 +-
 meta/lib/oeqa/selftest/{ => cases}/layerappend.py  |  15 +-
 meta/lib/oeqa/selftest/{ => cases}/liboe.py        |   7 +-
 .../{lic-checksum.py => cases/lic_checksum.py}     |   8 +-
 meta/lib/oeqa/selftest/{ => cases}/manifest.py     |  52 +-
 .../oeqa/selftest/{ => cases}/oelib/__init__.py    |   0
 .../selftest/{ => cases}/oelib/buildhistory.py     |   4 +-
 meta/lib/oeqa/selftest/{ => cases}/oelib/elf.py    |   4 +-
 .../lib/oeqa/selftest/{ => cases}/oelib/license.py |   6 +-
 meta/lib/oeqa/selftest/{ => cases}/oelib/path.py   |   4 +-
 meta/lib/oeqa/selftest/{ => cases}/oelib/types.py  |   6 +-
 meta/lib/oeqa/selftest/{ => cases}/oelib/utils.py  |   6 +-
 meta/lib/oeqa/selftest/{ => cases}/oescripts.py    |  15 +-
 meta/lib/oeqa/selftest/{ => cases}/package.py      |   4 +-
 meta/lib/oeqa/selftest/{ => cases}/pkgdata.py      |  29 +-
 meta/lib/oeqa/selftest/{ => cases}/prservice.py    |  27 +-
 meta/lib/oeqa/selftest/{ => cases}/recipetool.py   |  81 ++-
 meta/lib/oeqa/selftest/{ => cases}/runqemu.py      |  31 +-
 .../{runtime-test.py => cases/runtime_test.py}     |  15 +-
 meta/lib/oeqa/selftest/{ => cases}/signing.py      |  15 +-
 meta/lib/oeqa/selftest/{ => cases}/sstate.py       |   5 +-
 meta/lib/oeqa/selftest/{ => cases}/sstatetests.py  |  46 +-
 meta/lib/oeqa/selftest/{ => cases}/tinfoil.py      |  25 +-
 meta/lib/oeqa/selftest/{ => cases}/wic.py          |  84 +--
 meta/lib/oeqa/selftest/context.py                  | 224 ++++++
 meta/lib/oeqa/utils/__init__.py                    |  37 +-
 scripts/oe-selftest                                | 791 +--------------------
 scripts/oe-test                                    |  34 +-
 65 files changed, 1578 insertions(+), 1485 deletions(-)
 delete mode 100644 meta-yocto-bsp/lib/oeqa/selftest/__init__.py
 rename meta-yocto-bsp/lib/oeqa/selftest/{ => cases}/systemd_boot.py (91%)
 create mode 100644 meta/lib/oeqa/core/tests/cases/loader/threaded/threaded.py
 create mode 100644 meta/lib/oeqa/core/tests/cases/loader/threaded/threaded_alone.py
 create mode 100644 meta/lib/oeqa/core/tests/cases/loader/threaded/threaded_depends.py
 create mode 100644 meta/lib/oeqa/core/tests/cases/loader/threaded/threaded_module.py
 create mode 100644 meta/lib/oeqa/core/threaded.py
 delete mode 100644 meta/lib/oeqa/sdkext/cases/sdk_update.py
 delete mode 100644 meta/lib/oeqa/selftest/__init__.py
 rename meta/lib/oeqa/selftest/{base.py => case.py} (46%)
 rename meta/lib/oeqa/selftest/{ => cases}/_sstatetests_noauto.py (97%)
 rename meta/lib/oeqa/selftest/{ => cases}/archiver.py (91%)
 rename meta/lib/oeqa/selftest/{ => cases}/bblayers.py (94%)
 rename meta/lib/oeqa/selftest/{ => cases}/bbtests.py (95%)
 rename meta/lib/oeqa/selftest/{ => cases}/buildhistory.py (94%)
 rename meta/lib/oeqa/selftest/{ => cases}/buildoptions.py (94%)
 rename meta/lib/oeqa/selftest/{ => cases}/containerimage.py (97%)
 rename meta/lib/oeqa/selftest/{ => cases}/devtool.py (99%)
 rename meta/lib/oeqa/selftest/{ => cases}/eSDK.py (92%)
 rename meta/lib/oeqa/selftest/{ => cases}/image_typedep.py (93%)
 rename meta/lib/oeqa/selftest/{ => cases}/imagefeatures.py (95%)
 rename meta/lib/oeqa/selftest/{ => cases}/layerappend.py (93%)
 rename meta/lib/oeqa/selftest/{ => cases}/liboe.py (96%)
 rename meta/lib/oeqa/selftest/{lic-checksum.py => cases/lic_checksum.py} (87%)
 rename meta/lib/oeqa/selftest/{ => cases}/manifest.py (80%)
 rename meta/lib/oeqa/selftest/{ => cases}/oelib/__init__.py (100%)
 rename meta/lib/oeqa/selftest/{ => cases}/oelib/buildhistory.py (97%)
 rename meta/lib/oeqa/selftest/{ => cases}/oelib/elf.py (92%)
 rename meta/lib/oeqa/selftest/{ => cases}/oelib/license.py (93%)
 rename meta/lib/oeqa/selftest/{ => cases}/oelib/path.py (97%)
 rename meta/lib/oeqa/selftest/{ => cases}/oelib/types.py (93%)
 rename meta/lib/oeqa/selftest/{ => cases}/oelib/utils.py (91%)
 rename meta/lib/oeqa/selftest/{ => cases}/oescripts.py (72%)
 rename meta/lib/oeqa/selftest/{ => cases}/package.py (97%)
 rename meta/lib/oeqa/selftest/{ => cases}/pkgdata.py (96%)
 rename meta/lib/oeqa/selftest/{ => cases}/prservice.py (93%)
 rename meta/lib/oeqa/selftest/{ => cases}/recipetool.py (97%)
 rename meta/lib/oeqa/selftest/{ => cases}/runqemu.py (92%)
 rename meta/lib/oeqa/selftest/{runtime-test.py => cases/runtime_test.py} (97%)
 rename meta/lib/oeqa/selftest/{ => cases}/signing.py (96%)
 rename meta/lib/oeqa/selftest/{ => cases}/sstate.py (95%)
 rename meta/lib/oeqa/selftest/{ => cases}/sstatetests.py (97%)
 rename meta/lib/oeqa/selftest/{ => cases}/tinfoil.py (96%)
 rename meta/lib/oeqa/selftest/{ => cases}/wic.py (97%)
 create mode 100644 meta/lib/oeqa/selftest/context.py

-- 
2.1.4



^ permalink raw reply	[flat|nested] 43+ messages in thread

* [PATCH 01/36] testsdk.bbclass: Remove unused import of OEStreamLogger
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
@ 2017-05-26 20:37 ` Aníbal Limón
  2017-05-26 20:37 ` [PATCH 02/36] oeqa/sdk/context.py: Import argparse_oe at OESDKTestContext.run method Aníbal Limón
                   ` (36 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
 meta/classes/testsdk.bbclass | 1 -
 1 file changed, 1 deletion(-)

diff --git a/meta/classes/testsdk.bbclass b/meta/classes/testsdk.bbclass
index 6a201aa..4740233 100644
--- a/meta/classes/testsdk.bbclass
+++ b/meta/classes/testsdk.bbclass
@@ -21,7 +21,6 @@ def testsdk_main(d):
     import logging
 
     from bb.utils import export_proxies
-    from oeqa.core.runner import OEStreamLogger
     from oeqa.sdk.context import OESDKTestContext, OESDKTestContextExecutor
     from oeqa.utils import make_logger_bitbake_compatible
 
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 02/36] oeqa/sdk/context.py: Import argparse_oe at OESDKTestContext.run method
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
  2017-05-26 20:37 ` [PATCH 01/36] testsdk.bbclass: Remove unused import of OEStreamLogger Aníbal Limón
@ 2017-05-26 20:37 ` Aníbal Limón
  2017-05-26 20:37 ` [PATCH 03/36] oeqa/sdk/context.py: Add return to OESDKTestContext.run() method Aníbal Limón
                   ` (35 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

This import was at level of OESDKTestContext.register_commands
but OESDKTestContext.run method need it to raise exceptions.

Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
 meta/lib/oeqa/sdk/context.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/meta/lib/oeqa/sdk/context.py b/meta/lib/oeqa/sdk/context.py
index 0189ed8..509d2b4 100644
--- a/meta/lib/oeqa/sdk/context.py
+++ b/meta/lib/oeqa/sdk/context.py
@@ -44,8 +44,6 @@ class OESDKTestContextExecutor(OETestContextExecutor):
     default_test_data = None
 
     def register_commands(self, logger, subparsers):
-        import argparse_oe
-
         super(OESDKTestContextExecutor, self).register_commands(logger, subparsers)
 
         sdk_group = self.parser.add_argument_group('sdk options')
@@ -109,6 +107,8 @@ class OESDKTestContextExecutor(OETestContextExecutor):
             log(env)
 
     def run(self, logger, args):
+        import argparse_oe
+
         if not args.sdk_dir:
             raise argparse_oe.ArgumentUsageError("No SDK directory "\
                    "specified please do, --sdk-dir SDK_DIR", self.name)
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 03/36] oeqa/sdk/context.py: Add return to OESDKTestContext.run() method
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
  2017-05-26 20:37 ` [PATCH 01/36] testsdk.bbclass: Remove unused import of OEStreamLogger Aníbal Limón
  2017-05-26 20:37 ` [PATCH 02/36] oeqa/sdk/context.py: Import argparse_oe at OESDKTestContext.run method Aníbal Limón
@ 2017-05-26 20:37 ` Aníbal Limón
  2017-05-26 20:37 ` [PATCH 04/36] oeqa/core: Don't expose OEStreamLogger in OETestContext Aníbal Limón
                   ` (34 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

The run() methods of a OETestContext's are expected to return the
results.

Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
 meta/lib/oeqa/sdk/context.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/meta/lib/oeqa/sdk/context.py b/meta/lib/oeqa/sdk/context.py
index 509d2b4..82e4c19 100644
--- a/meta/lib/oeqa/sdk/context.py
+++ b/meta/lib/oeqa/sdk/context.py
@@ -128,6 +128,6 @@ class OESDKTestContextExecutor(OETestContextExecutor):
                    "environment (%s) specified" % args.sdk_env, self.name)
 
         self.sdk_env = sdk_envs[args.sdk_env]
-        super(OESDKTestContextExecutor, self).run(logger, args)
+        return super(OESDKTestContextExecutor, self).run(logger, args)
 
 _executor_class = OESDKTestContextExecutor
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 04/36] oeqa/core: Don't expose OEStreamLogger in OETestContext
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (2 preceding siblings ...)
  2017-05-26 20:37 ` [PATCH 03/36] oeqa/sdk/context.py: Add return to OESDKTestContext.run() method Aníbal Limón
@ 2017-05-26 20:37 ` Aníbal Limón
  2017-05-26 20:37 ` [PATCH 05/36] oeqa/core/runner: OETestResult remove unneeded override of startTest Aníbal Limón
                   ` (33 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

The OEStreamLogger class is used for redirect PyUnit output
to a certain logger so there is not need to expose at level
of OETestContext because only OETestRunner needs to know.

[YOCTO #11450]

Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
 meta/lib/oeqa/core/context.py | 6 ++----
 meta/lib/oeqa/core/runner.py  | 3 +++
 2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/meta/lib/oeqa/core/context.py b/meta/lib/oeqa/core/context.py
index 4476750..2628651 100644
--- a/meta/lib/oeqa/core/context.py
+++ b/meta/lib/oeqa/core/context.py
@@ -10,12 +10,11 @@ import collections
 import re
 
 from oeqa.core.loader import OETestLoader
-from oeqa.core.runner import OETestRunner, OEStreamLogger, xmlEnabled
+from oeqa.core.runner import OETestRunner, xmlEnabled
 
 class OETestContext(object):
     loaderClass = OETestLoader
     runnerClass = OETestRunner
-    streamLoggerClass = OEStreamLogger
 
     files_dir = os.path.abspath(os.path.join(os.path.dirname(
         os.path.abspath(__file__)), "../files"))
@@ -52,8 +51,7 @@ class OETestContext(object):
         self.suites = self.loader.discover()
 
     def runTests(self):
-        streamLogger = self.streamLoggerClass(self.logger)
-        self.runner = self.runnerClass(self, stream=streamLogger, verbosity=2)
+        self.runner = self.runnerClass(self, verbosity=2)
 
         self._run_start_time = time.time()
         result = self.runner.run(self.suites)
diff --git a/meta/lib/oeqa/core/runner.py b/meta/lib/oeqa/core/runner.py
index 44ffecb..40fbf3b 100644
--- a/meta/lib/oeqa/core/runner.py
+++ b/meta/lib/oeqa/core/runner.py
@@ -48,12 +48,15 @@ class OETestResult(_TestResult):
         super(OETestResult, self).startTest(test)
 
 class OETestRunner(_TestRunner):
+    streamLoggerClass = OEStreamLogger
+
     def __init__(self, tc, *args, **kwargs):
         if xmlEnabled:
             if not kwargs.get('output'):
                 kwargs['output'] = os.path.join(os.getcwd(),
                         'TestResults_%s_%s' % (time.strftime("%Y%m%d%H%M%S"), os.getpid()))
 
+        kwargs['stream'] = self.streamLoggerClass(tc.logger)
         super(OETestRunner, self).__init__(*args, **kwargs)
         self.tc = tc
         self.resultclass = OETestResult
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 05/36] oeqa/core/runner: OETestResult remove unneeded override of startTest
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (3 preceding siblings ...)
  2017-05-26 20:37 ` [PATCH 04/36] oeqa/core: Don't expose OEStreamLogger in OETestContext Aníbal Limón
@ 2017-05-26 20:37 ` Aníbal Limón
  2017-05-26 20:37 ` [PATCH 06/36] oeqa/core: Move OETestContext.log{Summary, Details} into OETestResult Aníbal Limón
                   ` (32 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

I override this method before for keep track of results and forget
to remove it, now isn't need.

Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
 meta/lib/oeqa/core/runner.py | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/meta/lib/oeqa/core/runner.py b/meta/lib/oeqa/core/runner.py
index 40fbf3b..0b04e8d 100644
--- a/meta/lib/oeqa/core/runner.py
+++ b/meta/lib/oeqa/core/runner.py
@@ -44,9 +44,6 @@ class OETestResult(_TestResult):
         self.tc._results['skipped'] = self.skipped
         self.tc._results['expectedFailures'] = self.expectedFailures
 
-    def startTest(self, test):
-        super(OETestResult, self).startTest(test)
-
 class OETestRunner(_TestRunner):
     streamLoggerClass = OEStreamLogger
 
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 06/36] oeqa/core: Move OETestContext.log{Summary, Details} into OETestResult
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (4 preceding siblings ...)
  2017-05-26 20:37 ` [PATCH 05/36] oeqa/core/runner: OETestResult remove unneeded override of startTest Aníbal Limón
@ 2017-05-26 20:37 ` Aníbal Limón
  2017-05-26 20:37 ` [PATCH 07/36] oeqa/core/threaded: Add new module with OETestLoaderThreaded Aníbal Limón
                   ` (31 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

Those methods are used to write in the log the results so
it makes sense to have defined at OETestResult because
is a format of the result itself.

[YOCTO #11450]

Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
 meta/classes/testimage.bbclass |  4 +-
 meta/classes/testsdk.bbclass   |  8 ++--
 meta/lib/oeqa/core/context.py  | 93 ++----------------------------------------
 meta/lib/oeqa/core/runner.py   | 88 +++++++++++++++++++++++++++++++++++++++
 4 files changed, 97 insertions(+), 96 deletions(-)

diff --git a/meta/classes/testimage.bbclass b/meta/classes/testimage.bbclass
index fb21460..d42907c 100644
--- a/meta/classes/testimage.bbclass
+++ b/meta/classes/testimage.bbclass
@@ -292,8 +292,8 @@ def testimage_main(d):
     # Show results (if we have them)
     if not results:
         bb.fatal('%s - FAILED - tests were interrupted during execution' % pn)
-    tc.logSummary(results, pn)
-    tc.logDetails()
+    results.logSummary(pn)
+    results.logDetails()
     if not results.wasSuccessful():
         bb.fatal('%s - FAILED - check the task log and the ssh log' % pn)
 
diff --git a/meta/classes/testsdk.bbclass b/meta/classes/testsdk.bbclass
index 4740233..edea89c 100644
--- a/meta/classes/testsdk.bbclass
+++ b/meta/classes/testsdk.bbclass
@@ -70,8 +70,8 @@ def testsdk_main(d):
         component = "%s %s" % (pn, OESDKTestContextExecutor.name)
         context_msg = "%s:%s" % (os.path.basename(tcname), os.path.basename(sdk_env))
 
-        tc.logSummary(result, component, context_msg)
-        tc.logDetails()
+        result.logSummary(component, context_msg)
+        result.logDetails()
 
         if not result.wasSuccessful():
             fail = True
@@ -172,8 +172,8 @@ def testsdkext_main(d):
         component = "%s %s" % (pn, OESDKExtTestContextExecutor.name)
         context_msg = "%s:%s" % (os.path.basename(tcname), os.path.basename(sdk_env))
 
-        tc.logSummary(result, component, context_msg)
-        tc.logDetails()
+        result.logSummary(component, context_msg)
+        result.logDetails()
 
         if not result.wasSuccessful():
             fail = True
diff --git a/meta/lib/oeqa/core/context.py b/meta/lib/oeqa/core/context.py
index 2628651..54958ad 100644
--- a/meta/lib/oeqa/core/context.py
+++ b/meta/lib/oeqa/core/context.py
@@ -7,10 +7,9 @@ import json
 import time
 import logging
 import collections
-import re
 
 from oeqa.core.loader import OETestLoader
-from oeqa.core.runner import OETestRunner, xmlEnabled
+from oeqa.core.runner import OETestRunner
 
 class OETestContext(object):
     loaderClass = OETestLoader
@@ -59,92 +58,6 @@ class OETestContext(object):
 
         return result
 
-    def logSummary(self, result, component, context_msg=''):
-        self.logger.info("SUMMARY:")
-        self.logger.info("%s (%s) - Ran %d test%s in %.3fs" % (component,
-            context_msg, result.testsRun, result.testsRun != 1 and "s" or "",
-            (self._run_end_time - self._run_start_time)))
-
-        if result.wasSuccessful():
-            msg = "%s - OK - All required tests passed" % component
-        else:
-            msg = "%s - FAIL - Required tests failed" % component
-        skipped = len(self._results['skipped'])
-        if skipped: 
-            msg += " (skipped=%d)" % skipped
-        self.logger.info(msg)
-
-    def _getDetailsNotPassed(self, case, type, desc):
-        found = False
-
-        for (scase, msg) in self._results[type]:
-            # XXX: When XML reporting is enabled scase is
-            # xmlrunner.result._TestInfo instance instead of
-            # string.
-            if xmlEnabled:
-                if case.id() == scase.test_id:
-                    found = True
-                    break
-                scase_str = scase.test_id
-            else:
-                if case == scase:
-                    found = True
-                    break
-                scase_str = str(scase)
-
-            # When fails at module or class level the class name is passed as string
-            # so figure out to see if match
-            m = re.search("^setUpModule \((?P<module_name>.*)\)$", scase_str)
-            if m:
-                if case.__class__.__module__ == m.group('module_name'):
-                    found = True
-                    break
-
-            m = re.search("^setUpClass \((?P<class_name>.*)\)$", scase_str)
-            if m:
-                class_name = "%s.%s" % (case.__class__.__module__,
-                        case.__class__.__name__)
-
-                if class_name == m.group('class_name'):
-                    found = True
-                    break
-
-        if found:
-            return (found, msg)
-
-        return (found, None)
-
-    def logDetails(self):
-        self.logger.info("RESULTS:")
-        for case_name in self._registry['cases']:
-            case = self._registry['cases'][case_name]
-
-            result_types = ['failures', 'errors', 'skipped', 'expectedFailures']
-            result_desc = ['FAILED', 'ERROR', 'SKIPPED', 'EXPECTEDFAIL']
-
-            fail = False
-            desc = None
-            for idx, name in enumerate(result_types):
-                (fail, msg) = self._getDetailsNotPassed(case, result_types[idx],
-                        result_desc[idx])
-                if fail:
-                    desc = result_desc[idx]
-                    break
-
-            oeid = -1
-            for d in case.decorators:
-                if hasattr(d, 'oeid'):
-                    oeid = d.oeid
-            
-            if fail:
-                self.logger.info("RESULTS - %s - Testcase %s: %s" % (case.id(),
-                    oeid, desc))
-                if msg:
-                    self.logger.info(msg)
-            else:
-                self.logger.info("RESULTS - %s - Testcase %s: %s" % (case.id(),
-                    oeid, 'PASSED'))
-
 class OETestContextExecutor(object):
     _context_class = OETestContext
 
@@ -227,8 +140,8 @@ class OETestContextExecutor(object):
         self.tc = self._context_class(**self.tc_kwargs['init'])
         self.tc.loadTests(self.module_paths, **self.tc_kwargs['load'])
         rc = self.tc.runTests(**self.tc_kwargs['run'])
-        self.tc.logSummary(rc, self.name)
-        self.tc.logDetails()
+        rc.logSummary(self.name)
+        rc.logDetails()
 
         output_link = os.path.join(os.path.dirname(args.output_log),
                 "%s-results.log" % self.name)
diff --git a/meta/lib/oeqa/core/runner.py b/meta/lib/oeqa/core/runner.py
index 0b04e8d..7505838 100644
--- a/meta/lib/oeqa/core/runner.py
+++ b/meta/lib/oeqa/core/runner.py
@@ -5,6 +5,7 @@ import os
 import time
 import unittest
 import logging
+import re
 
 xmlEnabled = False
 try:
@@ -44,6 +45,93 @@ class OETestResult(_TestResult):
         self.tc._results['skipped'] = self.skipped
         self.tc._results['expectedFailures'] = self.expectedFailures
 
+    def logSummary(self, component, context_msg=''):
+        elapsed_time = self.tc._run_end_time - self.tc._run_start_time
+        self.tc.logger.info("SUMMARY:")
+        self.tc.logger.info("%s (%s) - Ran %d test%s in %.3fs" % (component,
+            context_msg, self.testsRun, self.testsRun != 1 and "s" or "",
+            elapsed_time))
+
+        if self.wasSuccessful():
+            msg = "%s - OK - All required tests passed" % component
+        else:
+            msg = "%s - FAIL - Required tests failed" % component
+        skipped = len(self.tc._results['skipped'])
+        if skipped: 
+            msg += " (skipped=%d)" % skipped
+        self.tc.logger.info(msg)
+
+    def _getDetailsNotPassed(self, case, type, desc):
+        found = False
+
+        for (scase, msg) in self.tc._results[type]:
+            # XXX: When XML reporting is enabled scase is
+            # xmlrunner.result._TestInfo instance instead of
+            # string.
+            if xmlEnabled:
+                if case.id() == scase.test_id:
+                    found = True
+                    break
+                scase_str = scase.test_id
+            else:
+                if case == scase:
+                    found = True
+                    break
+                scase_str = str(scase)
+
+            # When fails at module or class level the class name is passed as string
+            # so figure out to see if match
+            m = re.search("^setUpModule \((?P<module_name>.*)\)$", scase_str)
+            if m:
+                if case.__class__.__module__ == m.group('module_name'):
+                    found = True
+                    break
+
+            m = re.search("^setUpClass \((?P<class_name>.*)\)$", scase_str)
+            if m:
+                class_name = "%s.%s" % (case.__class__.__module__,
+                        case.__class__.__name__)
+
+                if class_name == m.group('class_name'):
+                    found = True
+                    break
+
+        if found:
+            return (found, msg)
+
+        return (found, None)
+
+    def logDetails(self):
+        self.tc.logger.info("RESULTS:")
+        for case_name in self.tc._registry['cases']:
+            case = self.tc._registry['cases'][case_name]
+
+            result_types = ['failures', 'errors', 'skipped', 'expectedFailures']
+            result_desc = ['FAILED', 'ERROR', 'SKIPPED', 'EXPECTEDFAIL']
+
+            fail = False
+            desc = None
+            for idx, name in enumerate(result_types):
+                (fail, msg) = self._getDetailsNotPassed(case, result_types[idx],
+                        result_desc[idx])
+                if fail:
+                    desc = result_desc[idx]
+                    break
+
+            oeid = -1
+            for d in case.decorators:
+                if hasattr(d, 'oeid'):
+                    oeid = d.oeid
+
+            if fail:
+                self.tc.logger.info("RESULTS - %s - Testcase %s: %s" % (case.id(),
+                    oeid, desc))
+                if msg:
+                    self.tc.logger.info(msg)
+            else:
+                self.tc.logger.info("RESULTS - %s - Testcase %s: %s" % (case.id(),
+                    oeid, 'PASSED'))
+
 class OETestRunner(_TestRunner):
     streamLoggerClass = OEStreamLogger
 
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 07/36] oeqa/core/threaded: Add new module with OETestLoaderThreaded
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (5 preceding siblings ...)
  2017-05-26 20:37 ` [PATCH 06/36] oeqa/core: Move OETestContext.log{Summary, Details} into OETestResult Aníbal Limón
@ 2017-05-26 20:37 ` Aníbal Limón
  2017-05-26 20:37 ` [PATCH 08/36] oeqa/core/threaded: Add OEStreamLoggerThreaded class Aníbal Limón
                   ` (30 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

The threded module will implement Thread support into the OEQA
framework.

The OETestLoaderThreaded overrides discover to return a list of
suites every suite will be run by a separate Thread.

Some design considerations are:

- All the tests of a certain module needs to be run at one thread
  because unittest framework needs to keep track of setUp{Module,
Class,} and tearDown{Module, Class,}.

- Tests that depends on other needs to be run at the same thread
because OEQA framework look at the status of dependant test to
decide if skip or not, this constraint can be change in the future
but a sync mechanishm is needed to implement between the Threads.

[YOCTO #11450]

Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
 meta/lib/oeqa/core/threaded.py | 91 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 91 insertions(+)
 create mode 100644 meta/lib/oeqa/core/threaded.py

diff --git a/meta/lib/oeqa/core/threaded.py b/meta/lib/oeqa/core/threaded.py
new file mode 100644
index 0000000..e6f2140
--- /dev/null
+++ b/meta/lib/oeqa/core/threaded.py
@@ -0,0 +1,91 @@
+# Copyright (C) 2017 Intel Corporation
+# Released under the MIT license (see COPYING.MIT)
+
+import multiprocessing
+
+from unittest.suite import TestSuite
+from oeqa.core.loader import OETestLoader
+
+class OETestLoaderThreaded(OETestLoader):
+    def __init__(self, tc, module_paths, modules, tests, modules_required,
+            filters, process_num=0, *args, **kwargs):
+        super(OETestLoaderThreaded, self).__init__(tc, module_paths, modules,
+                tests, modules_required, filters, *args, **kwargs)
+
+        self.process_num = process_num
+
+    def discover(self):
+        suite = super(OETestLoaderThreaded, self).discover()
+
+        if self.process_num <= 0:
+            self.process_num = min(multiprocessing.cpu_count(),
+                    len(suite._tests))
+
+        suites = []
+        for _ in range(self.process_num):
+            suites.append(self.suiteClass())
+
+        def _search_for_module_idx(suites, case):
+            """
+                Cases in the same module needs to be run
+                in the same thread because PyUnit keeps track
+                of setUp{Module, Class,} and tearDown{Module, Class,}.
+            """
+
+            for idx in range(self.process_num):
+                suite = suites[idx]
+                for c in suite._tests:
+                    if case.__module__ == c.__module__:
+                        return idx
+
+            return -1
+
+        def _search_for_depend_idx(suites, depends):
+            """
+                Dependency cases needs to be run in the same
+                thread, because OEQA framework look at the state
+                of dependant test to figure out if skip or not.
+            """
+
+            for idx in range(self.process_num):
+                suite = suites[idx]
+
+                for case in suite._tests:
+                    if case.id() in depends:
+                        return idx
+            return -1
+
+        def _get_best_idx(suites):
+            sizes = [len(suite._tests) for suite in suites]
+            return sizes.index(min(sizes))
+
+        def _fill_suites(suite):
+            idx = -1
+            for case in suite:
+                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 idx == -1 and case.id() in depends:
+                        case_depends = depends[case.id()] 
+                        idx = _search_for_depend_idx(suites, case_depends)
+
+                    if idx == -1:
+                        idx = _get_best_idx(suites)
+
+                    suites[idx].addTest(case)
+        _fill_suites(suite)
+
+        suites_tmp = suites
+        suites = []
+        for suite in suites_tmp:
+            if len(suite._tests) > 0:
+                suites.append(suite)
+
+        return suites
+
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 08/36] oeqa/core/threaded: Add OEStreamLoggerThreaded class
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (6 preceding siblings ...)
  2017-05-26 20:37 ` [PATCH 07/36] oeqa/core/threaded: Add new module with OETestLoaderThreaded Aníbal Limón
@ 2017-05-26 20:37 ` Aníbal Limón
  2017-05-26 20:37 ` [PATCH 09/36] oeqa/core/runner: OETestResult add internal _tc_map_results Aníbal Limón
                   ` (29 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

The OEStreamLoggerThreaded overrides OEStreamLogger to redirect
the PyUnit output to a logger.

Instead of log every line when comes the OEStreamLoggerThreaded
will buffer the PyUnit output and write everything at end of every
suite execution to don't have mixed suite outputs.

[YOCTO #11450]

Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
 meta/lib/oeqa/core/threaded.py | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/meta/lib/oeqa/core/threaded.py b/meta/lib/oeqa/core/threaded.py
index e6f2140..73b7f2f 100644
--- a/meta/lib/oeqa/core/threaded.py
+++ b/meta/lib/oeqa/core/threaded.py
@@ -1,10 +1,13 @@
 # Copyright (C) 2017 Intel Corporation
 # Released under the MIT license (see COPYING.MIT)
 
+import threading
 import multiprocessing
 
 from unittest.suite import TestSuite
+
 from oeqa.core.loader import OETestLoader
+from oeqa.core.runner import OEStreamLogger
 
 class OETestLoaderThreaded(OETestLoader):
     def __init__(self, tc, module_paths, modules, tests, modules_required,
@@ -89,3 +92,25 @@ class OETestLoaderThreaded(OETestLoader):
 
         return suites
 
+class OEStreamLoggerThreaded(OEStreamLogger):
+    _lock = threading.Lock()
+    buffers = {}
+
+    def write(self, msg):
+        tid = threading.get_ident()
+
+        if not tid in self.buffers:
+            self.buffers[tid] = ""
+
+        if msg:
+            self.buffers[tid] += msg
+
+    def finish(self):
+        tid = threading.get_ident()
+        
+        self._lock.acquire()
+        self.logger.info('THREAD: %d' % tid)
+        self.logger.info('-' * 70)
+        for line in self.buffers[tid].split('\n'):
+            self.logger.info(line)
+        self._lock.release()
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 09/36] oeqa/core/runner: OETestResult add internal _tc_map_results
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (7 preceding siblings ...)
  2017-05-26 20:37 ` [PATCH 08/36] oeqa/core/threaded: Add OEStreamLoggerThreaded class Aníbal Limón
@ 2017-05-26 20:37 ` Aníbal Limón
  2017-05-26 20:37 ` [PATCH 10/36] oeqa/core/threaded: Add OETestResultThreaded{, Internal} classes Aníbal Limón
                   ` (28 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

This method is to assign results into the TestContext, create
an internal one to support change implementation in Thread version.

[YOCTO #11450]

Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
 meta/lib/oeqa/core/runner.py | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/meta/lib/oeqa/core/runner.py b/meta/lib/oeqa/core/runner.py
index 7505838..3ebffc7 100644
--- a/meta/lib/oeqa/core/runner.py
+++ b/meta/lib/oeqa/core/runner.py
@@ -39,7 +39,9 @@ class OETestResult(_TestResult):
         super(OETestResult, self).__init__(*args, **kwargs)
 
         self.tc = tc
+        self._tc_map_results()
 
+    def _tc_map_results(self):
         self.tc._results['failures'] = self.failures
         self.tc._results['errors'] = self.errors
         self.tc._results['skipped'] = self.skipped
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 10/36] oeqa/core/threaded: Add OETestResultThreaded{, Internal} classes
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (8 preceding siblings ...)
  2017-05-26 20:37 ` [PATCH 09/36] oeqa/core/runner: OETestResult add internal _tc_map_results Aníbal Limón
@ 2017-05-26 20:37 ` Aníbal Limón
  2017-05-26 20:37 ` [PATCH 11/36] oeqa/core/threaded: Add support of OETestRunnerThreaded Aníbal Limón
                   ` (27 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

The OETestResultThreadedInternal extends OETestResult to stores
results by Thread.

The OETestResultThreaded is a simple class that provides the
implementation of interfaces needed by outside like wasSuccesful,
stop, logSummary, logDetails.

[YOCTO #11450]

Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
 meta/lib/oeqa/core/threaded.py | 73 +++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 72 insertions(+), 1 deletion(-)

diff --git a/meta/lib/oeqa/core/threaded.py b/meta/lib/oeqa/core/threaded.py
index 73b7f2f..f216685 100644
--- a/meta/lib/oeqa/core/threaded.py
+++ b/meta/lib/oeqa/core/threaded.py
@@ -7,7 +7,7 @@ import multiprocessing
 from unittest.suite import TestSuite
 
 from oeqa.core.loader import OETestLoader
-from oeqa.core.runner import OEStreamLogger
+from oeqa.core.runner import OEStreamLogger, OETestResult
 
 class OETestLoaderThreaded(OETestLoader):
     def __init__(self, tc, module_paths, modules, tests, modules_required,
@@ -114,3 +114,74 @@ class OEStreamLoggerThreaded(OEStreamLogger):
         for line in self.buffers[tid].split('\n'):
             self.logger.info(line)
         self._lock.release()
+
+class OETestResultThreadedInternal(OETestResult):
+    def _tc_map_results(self):
+        tid = threading.get_ident()
+        
+        # PyUnit generates a result for every test module run, test
+        # if the thread already has an entry to avoid lose the previous
+        # test module results.
+        if not tid in self.tc._results:
+            self.tc._results[tid] = {}
+            self.tc._results[tid]['failures'] = self.failures
+            self.tc._results[tid]['errors'] = self.errors
+            self.tc._results[tid]['skipped'] = self.skipped
+            self.tc._results[tid]['expectedFailures'] = self.expectedFailures
+
+class OETestResultThreaded(object):
+    _results = {}
+    _lock = threading.Lock()
+
+    def __init__(self, tc):
+        self.tc = tc
+
+    def _fill_tc_results(self):
+        tids = list(self.tc._results.keys())
+        fields = ['failures', 'errors', 'skipped', 'expectedFailures']
+
+        for tid in tids:
+            result = self.tc._results[tid]
+            for field in fields:
+                if not field in self.tc._results:
+                    self.tc._results[field] = []
+                self.tc._results[field].extend(result[field])
+
+    def addResult(self, result, run_start_time, run_end_time):
+        tid = threading.get_ident()
+
+        self._lock.acquire()
+        self._results[tid] = {}
+        self._results[tid]['result'] = result
+        self._results[tid]['run_start_time'] = run_start_time 
+        self._results[tid]['run_end_time'] = run_end_time 
+        self._results[tid]['result'] = result
+        self._lock.release()
+
+    def wasSuccessful(self):
+        wasSuccessful = True
+        for tid in self._results.keys():
+            wasSuccessful = wasSuccessful and \
+                    self._results[tid]['result'].wasSuccessful()
+        return wasSuccessful
+
+    def stop(self):
+        for tid in self._results.keys():
+            self._results[tid]['result'].stop()
+
+    def logSummary(self, component, context_msg=''):
+        elapsed_time = (self.tc._run_end_time - self.tc._run_start_time)
+
+        self.tc.logger.info("SUMMARY:")
+        self.tc.logger.info("%s (%s) - Ran %d tests in %.3fs" % (component,
+            context_msg, len(self.tc._registry['cases']), elapsed_time))
+        if self.wasSuccessful():
+            msg = "%s - OK - All required tests passed" % component
+        else:
+            msg = "%s - FAIL - Required tests failed" % component
+        self.tc.logger.info(msg)
+
+    def logDetails(self):
+        tid = list(self._results)[0]
+        result = self._results[tid]['result']
+        result.logDetails()
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 11/36] oeqa/core/threaded: Add support of OETestRunnerThreaded
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (9 preceding siblings ...)
  2017-05-26 20:37 ` [PATCH 10/36] oeqa/core/threaded: Add OETestResultThreaded{, Internal} classes Aníbal Limón
@ 2017-05-26 20:37 ` Aníbal Limón
  2017-05-26 20:37 ` [PATCH 12/36] oeqa/core/threaded: Add OETestContextThreaded class Aníbal Limón
                   ` (26 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

The OETestRunnerThreaded overrides the run method of OETestRunner
it recieves a list of suites to be executed by a ThreadPool.

The new run method handles the ThreadPool creation and the
OETestResultThreaded fill.

[YOCTO #11450]

Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
 meta/lib/oeqa/core/threaded.py | 75 +++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 74 insertions(+), 1 deletion(-)

diff --git a/meta/lib/oeqa/core/threaded.py b/meta/lib/oeqa/core/threaded.py
index f216685..81df340 100644
--- a/meta/lib/oeqa/core/threaded.py
+++ b/meta/lib/oeqa/core/threaded.py
@@ -3,11 +3,13 @@
 
 import threading
 import multiprocessing
+import queue
+import time
 
 from unittest.suite import TestSuite
 
 from oeqa.core.loader import OETestLoader
-from oeqa.core.runner import OEStreamLogger, OETestResult
+from oeqa.core.runner import OEStreamLogger, OETestResult, OETestRunner
 
 class OETestLoaderThreaded(OETestLoader):
     def __init__(self, tc, module_paths, modules, tests, modules_required,
@@ -185,3 +187,74 @@ class OETestResultThreaded(object):
         tid = list(self._results)[0]
         result = self._results[tid]['result']
         result.logDetails()
+
+class _Worker(threading.Thread):
+    """Thread executing tasks from a given tasks queue"""
+    def __init__(self, tasks, result, stream):
+        threading.Thread.__init__(self)
+        self.tasks = tasks
+
+        self.result = result
+        self.stream = stream
+
+    def run(self):
+        while True:
+            try:
+                func, args, kargs = self.tasks.get(block=False)
+            except queue.Empty:
+                break
+
+            try:
+                run_start_time = time.time()
+                rc = func(*args, **kargs)
+                run_end_time = time.time()
+                self.result.addResult(rc, run_start_time, run_end_time)
+                self.stream.finish()
+            except Exception as e:
+                print(e)
+            finally:
+                self.tasks.task_done()
+
+class _ThreadedPool:
+    """Pool of threads consuming tasks from a queue"""
+    def __init__(self, num_workers, num_tasks, stream=None, result=None):
+        self.tasks = queue.Queue(num_tasks)
+        self.workers = []
+
+        for _ in range(num_workers):
+            worker = _Worker(self.tasks, result, stream)
+            self.workers.append(worker)
+
+    def start(self):
+        for worker in self.workers:
+            worker.start()
+
+    def add_task(self, func, *args, **kargs):
+        """Add a task to the queue"""
+        self.tasks.put((func, args, kargs))
+
+    def wait_completion(self):
+        """Wait for completion of all the tasks in the queue"""
+        self.tasks.join()
+        for worker in self.workers:
+            worker.join()
+
+class OETestRunnerThreaded(OETestRunner):
+    streamLoggerClass = OEStreamLoggerThreaded
+
+    def __init__(self, tc, *args, **kwargs):
+        super(OETestRunnerThreaded, self).__init__(tc, *args, **kwargs)
+        self.resultclass = OETestResultThreadedInternal # XXX: XML reporting overrides at __init__
+
+    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()
+        result._fill_tc_results()
+
+        return result
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 12/36] oeqa/core/threaded: Add OETestContextThreaded class
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (10 preceding siblings ...)
  2017-05-26 20:37 ` [PATCH 11/36] oeqa/core/threaded: Add support of OETestRunnerThreaded Aníbal Limón
@ 2017-05-26 20:37 ` Aníbal Limón
  2017-05-26 20:37 ` [PATCH 13/36] oeqa/core/decorator/depends: Add support for threading mode Aníbal Limón
                   ` (25 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

This class sets the {loader,runner}Class to the threaded versions and
overrides loadTests method to be able specify the process_num.

[YOCTO #11450]

Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
 meta/lib/oeqa/core/threaded.py | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/meta/lib/oeqa/core/threaded.py b/meta/lib/oeqa/core/threaded.py
index 81df340..c6058a3 100644
--- a/meta/lib/oeqa/core/threaded.py
+++ b/meta/lib/oeqa/core/threaded.py
@@ -10,6 +10,7 @@ from unittest.suite import TestSuite
 
 from oeqa.core.loader import OETestLoader
 from oeqa.core.runner import OEStreamLogger, OETestResult, OETestRunner
+from oeqa.core.context import OETestContext
 
 class OETestLoaderThreaded(OETestLoader):
     def __init__(self, tc, module_paths, modules, tests, modules_required,
@@ -258,3 +259,16 @@ class OETestRunnerThreaded(OETestRunner):
         result._fill_tc_results()
 
         return result
+
+class OETestContextThreaded(OETestContext):
+    loaderClass = OETestLoaderThreaded
+    runnerClass = OETestRunnerThreaded
+
+    def loadTests(self, module_paths, modules=[], tests=[],
+            modules_manifest="", modules_required=[], filters={}, process_num=0):
+        if modules_manifest:
+            modules = self._read_modules_from_manifest(modules_manifest)
+
+        self.loader = self.loaderClass(self, module_paths, modules, tests,
+                modules_required, filters, process_num)
+        self.suites = self.loader.discover()
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 13/36] oeqa/core/decorator/depends: Add support for threading mode
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (11 preceding siblings ...)
  2017-05-26 20:37 ` [PATCH 12/36] oeqa/core/threaded: Add OETestContextThreaded class Aníbal Limón
@ 2017-05-26 20:37 ` Aníbal Limón
  2017-05-26 20:37 ` [PATCH 14/36] oeqa/core/decorator/oetimeout: Add support for OEQA threaded mode Aníbal Limón
                   ` (24 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

The _skipTestDependency needs to know if the thread mode is
enabled because the _results are by thread.

[YOCTO #11450]

Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
 meta/lib/oeqa/core/decorator/depends.py | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/meta/lib/oeqa/core/decorator/depends.py b/meta/lib/oeqa/core/decorator/depends.py
index 195711c..baa0434 100644
--- a/meta/lib/oeqa/core/decorator/depends.py
+++ b/meta/lib/oeqa/core/decorator/depends.py
@@ -3,6 +3,7 @@
 
 from unittest import SkipTest
 
+from oeqa.core.threaded import OETestRunnerThreaded
 from oeqa.core.exception import OEQADependency
 
 from . import OETestDiscover, registerDecorator
@@ -63,7 +64,12 @@ def _order_test_case_by_depends(cases, depends):
     return [cases[case_id] for case_id in cases_ordered]
 
 def _skipTestDependency(case, depends):
-    results = case.tc._results
+    if isinstance(case.tc.runner, OETestRunnerThreaded):
+        import threading
+        results = case.tc._results[threading.get_ident()]
+    else:
+        results = case.tc._results
+
     skipReasons = ['errors', 'failures', 'skipped']
 
     for reason in skipReasons:
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 14/36] oeqa/core/decorator/oetimeout: Add support for OEQA threaded mode
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (12 preceding siblings ...)
  2017-05-26 20:37 ` [PATCH 13/36] oeqa/core/decorator/depends: Add support for threading mode Aníbal Limón
@ 2017-05-26 20:37 ` Aníbal Limón
  2017-05-26 20:37 ` [PATCH 15/36] oeqa/core/tests: Add tests of OEQA Threaded mode Aníbal Limón
                   ` (23 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

In python signals are only allowed to delivery into the main thread,
to support the threading mode test if the runner is threaded and
use threading.Timer instead.

There are some considerations like SIGALRM interrupts the execution
after N seconds but the Timer only starts a Thread to notice the
timeout and the exception will be raised when the test run ends.

[YOCTO #11450]

Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
 meta/lib/oeqa/core/decorator/oetimeout.py | 40 +++++++++++++++++++++++--------
 1 file changed, 30 insertions(+), 10 deletions(-)

diff --git a/meta/lib/oeqa/core/decorator/oetimeout.py b/meta/lib/oeqa/core/decorator/oetimeout.py
index a247583..f85e7d9 100644
--- a/meta/lib/oeqa/core/decorator/oetimeout.py
+++ b/meta/lib/oeqa/core/decorator/oetimeout.py
@@ -1,8 +1,12 @@
 # Copyright (C) 2016 Intel Corporation
 # Released under the MIT license (see COPYING.MIT)
 
-import signal
 from . import OETestDecorator, registerDecorator
+
+import signal
+from threading import Timer
+
+from oeqa.core.threaded import OETestRunnerThreaded
 from oeqa.core.exception import OEQATimeoutError
 
 @registerDecorator
@@ -10,16 +14,32 @@ class OETimeout(OETestDecorator):
     attrs = ('oetimeout',)
 
     def setUpDecorator(self):
-        timeout = self.oetimeout
-        def _timeoutHandler(signum, frame):
-            raise OEQATimeoutError("Timed out after %s "
+        self.logger.debug("Setting up a %d second(s) timeout" % self.oetimeout)
+
+        if isinstance(self.case.tc.runner, OETestRunnerThreaded):
+            self.timeouted = False
+            def _timeoutHandler():
+                self.timeouted = True
+
+            self.timer = Timer(self.oetimeout, _timeoutHandler)
+            self.timer.start()
+        else:
+            timeout = self.oetimeout
+            def _timeoutHandler(signum, frame):
+                raise OEQATimeoutError("Timed out after %s "
                     "seconds of execution" % timeout)
 
-        self.logger.debug("Setting up a %d second(s) timeout" % self.oetimeout)
-        self.alarmSignal = signal.signal(signal.SIGALRM, _timeoutHandler)
-        signal.alarm(self.oetimeout)
+            self.alarmSignal = signal.signal(signal.SIGALRM, _timeoutHandler)
+            signal.alarm(self.oetimeout)
 
     def tearDownDecorator(self):
-        signal.alarm(0)
-        signal.signal(signal.SIGALRM, self.alarmSignal)
-        self.logger.debug("Removed SIGALRM handler")
+        if isinstance(self.case.tc.runner, OETestRunnerThreaded):
+            self.timer.cancel()
+            self.logger.debug("Removed Timer handler")
+            if self.timeouted:
+                raise OEQATimeoutError("Timed out after %s "
+                    "seconds of execution" % self.oetimeout)
+        else:
+            signal.alarm(0)
+            signal.signal(signal.SIGALRM, self.alarmSignal)
+            self.logger.debug("Removed SIGALRM handler")
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 15/36] oeqa/core/tests: Add tests of OEQA Threaded mode
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (13 preceding siblings ...)
  2017-05-26 20:37 ` [PATCH 14/36] oeqa/core/decorator/oetimeout: Add support for OEQA threaded mode Aníbal Limón
@ 2017-05-26 20:37 ` Aníbal Limón
  2017-05-26 20:37 ` [PATCH 16/36] oeqa/sdkext/cases: Move sdk_update test into devtool module Aníbal Limón
                   ` (22 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

Add needed tests to validate the OEQA Threaded mode, the remaining
parts are tested by the OEQA without Threaded mode.

- test_loader.py: Add a test to validate rules when creating the
list of test suites.
- test_decorators.py: Add oetimeout test because the threaded mode
uses Timer instead of signal.

[YOCTO #11450]

Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
 .../core/tests/cases/loader/threaded/threaded.py   | 12 +++++++++
 .../tests/cases/loader/threaded/threaded_alone.py  |  8 ++++++
 .../cases/loader/threaded/threaded_depends.py      | 10 ++++++++
 .../tests/cases/loader/threaded/threaded_module.py | 12 +++++++++
 meta/lib/oeqa/core/tests/common.py                 | 10 ++++++++
 meta/lib/oeqa/core/tests/test_decorators.py        | 12 +++++++++
 meta/lib/oeqa/core/tests/test_loader.py            | 30 +++++++++++++++++++++-
 7 files changed, 93 insertions(+), 1 deletion(-)
 create mode 100644 meta/lib/oeqa/core/tests/cases/loader/threaded/threaded.py
 create mode 100644 meta/lib/oeqa/core/tests/cases/loader/threaded/threaded_alone.py
 create mode 100644 meta/lib/oeqa/core/tests/cases/loader/threaded/threaded_depends.py
 create mode 100644 meta/lib/oeqa/core/tests/cases/loader/threaded/threaded_module.py

diff --git a/meta/lib/oeqa/core/tests/cases/loader/threaded/threaded.py b/meta/lib/oeqa/core/tests/cases/loader/threaded/threaded.py
new file mode 100644
index 0000000..0fe4cb3
--- /dev/null
+++ b/meta/lib/oeqa/core/tests/cases/loader/threaded/threaded.py
@@ -0,0 +1,12 @@
+# Copyright (C) 2017 Intel Corporation
+# Released under the MIT license (see COPYING.MIT)
+
+from oeqa.core.case import OETestCase
+
+class ThreadedTest(OETestCase):
+    def test_threaded_no_depends(self):
+        self.assertTrue(True, msg='How is this possible?')
+
+class ThreadedTest2(OETestCase):
+    def test_threaded_same_module(self):
+        self.assertTrue(True, msg='How is this possible?')
diff --git a/meta/lib/oeqa/core/tests/cases/loader/threaded/threaded_alone.py b/meta/lib/oeqa/core/tests/cases/loader/threaded/threaded_alone.py
new file mode 100644
index 0000000..905f397
--- /dev/null
+++ b/meta/lib/oeqa/core/tests/cases/loader/threaded/threaded_alone.py
@@ -0,0 +1,8 @@
+# Copyright (C) 2017 Intel Corporation
+# Released under the MIT license (see COPYING.MIT)
+
+from oeqa.core.case import OETestCase
+
+class ThreadedTestAlone(OETestCase):
+    def test_threaded_alone(self):
+        self.assertTrue(True, msg='How is this possible?')
diff --git a/meta/lib/oeqa/core/tests/cases/loader/threaded/threaded_depends.py b/meta/lib/oeqa/core/tests/cases/loader/threaded/threaded_depends.py
new file mode 100644
index 0000000..0c158d3
--- /dev/null
+++ b/meta/lib/oeqa/core/tests/cases/loader/threaded/threaded_depends.py
@@ -0,0 +1,10 @@
+# Copyright (C) 2017 Intel Corporation
+# Released under the MIT license (see COPYING.MIT)
+
+from oeqa.core.case import OETestCase
+from oeqa.core.decorator.depends import OETestDepends
+
+class ThreadedTest3(OETestCase):
+    @OETestDepends(['threaded.ThreadedTest.test_threaded_no_depends'])
+    def test_threaded_depends(self):
+        self.assertTrue(True, msg='How is this possible?')
diff --git a/meta/lib/oeqa/core/tests/cases/loader/threaded/threaded_module.py b/meta/lib/oeqa/core/tests/cases/loader/threaded/threaded_module.py
new file mode 100644
index 0000000..63d17e0
--- /dev/null
+++ b/meta/lib/oeqa/core/tests/cases/loader/threaded/threaded_module.py
@@ -0,0 +1,12 @@
+# Copyright (C) 2017 Intel Corporation
+# Released under the MIT license (see COPYING.MIT)
+
+from oeqa.core.case import OETestCase
+
+class ThreadedTestModule(OETestCase):
+    def test_threaded_module(self):
+        self.assertTrue(True, msg='How is this possible?')
+
+class ThreadedTestModule2(OETestCase):
+    def test_threaded_module2(self):
+        self.assertTrue(True, msg='How is this possible?')
diff --git a/meta/lib/oeqa/core/tests/common.py b/meta/lib/oeqa/core/tests/common.py
index 52b18a1..1932323 100644
--- a/meta/lib/oeqa/core/tests/common.py
+++ b/meta/lib/oeqa/core/tests/common.py
@@ -33,3 +33,13 @@ class TestBase(unittest.TestCase):
         tc.loadTests(self.cases_path, modules=modules, tests=tests,
                      filters=filters)
         return tc
+
+    def _testLoaderThreaded(self, d={}, modules=[],
+            tests=[], filters={}):
+        from oeqa.core.threaded import OETestContextThreaded
+
+        tc = OETestContextThreaded(d, self.logger)
+        tc.loadTests(self.cases_path, modules=modules, tests=tests,
+                     filters=filters)
+
+        return tc
diff --git a/meta/lib/oeqa/core/tests/test_decorators.py b/meta/lib/oeqa/core/tests/test_decorators.py
index f7d11e8..cf99e0d 100755
--- a/meta/lib/oeqa/core/tests/test_decorators.py
+++ b/meta/lib/oeqa/core/tests/test_decorators.py
@@ -131,5 +131,17 @@ class TestTimeoutDecorator(TestBase):
         msg = "OETestTimeout didn't restore SIGALRM"
         self.assertIs(alarm_signal, signal.getsignal(signal.SIGALRM), msg=msg)
 
+    def test_timeout_thread(self):
+        tests = ['timeout.TimeoutTest.testTimeoutPass']
+        msg = 'Failed to run test using OETestTimeout'
+        tc = self._testLoaderThreaded(modules=self.modules, tests=tests)
+        self.assertTrue(tc.runTests().wasSuccessful(), msg=msg)
+
+    def test_timeout_threaded_fail(self):
+        tests = ['timeout.TimeoutTest.testTimeoutFail']
+        msg = "OETestTimeout test didn't timeout as expected"
+        tc = self._testLoaderThreaded(modules=self.modules, tests=tests)
+        self.assertFalse(tc.runTests().wasSuccessful(), msg=msg)
+
 if __name__ == '__main__':
     unittest.main()
diff --git a/meta/lib/oeqa/core/tests/test_loader.py b/meta/lib/oeqa/core/tests/test_loader.py
index b79b8ba..e0d917d 100755
--- a/meta/lib/oeqa/core/tests/test_loader.py
+++ b/meta/lib/oeqa/core/tests/test_loader.py
@@ -1,6 +1,6 @@
 #!/usr/bin/env python3
 
-# Copyright (C) 2016 Intel Corporation
+# Copyright (C) 2016-2017 Intel Corporation
 # Released under the MIT license (see COPYING.MIT)
 
 import os
@@ -82,5 +82,33 @@ class TestLoader(TestBase):
         msg = 'Expected modules from two different paths'
         self.assertEqual(modules, expected_modules, msg=msg)
 
+    def test_loader_threaded(self):
+        cases_path = self.cases_path
+
+        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")
+
+        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:
+            self.assertEqual(case.id(),
+                    case_ids[tc.suites[0]._tests.index(case)])
+
+        case_ids = ['threaded_alone.ThreadedTestAlone.test_threaded_alone']
+        for case in tc.suites[1]._tests:
+            self.assertEqual(case.id(),
+                    case_ids[tc.suites[1]._tests.index(case)])
+
+        case_ids = ['threaded_module.ThreadedTestModule.test_threaded_module',
+                'threaded_module.ThreadedTestModule2.test_threaded_module2']
+        for case in tc.suites[2]._tests:
+            self.assertEqual(case.id(),
+                    case_ids[tc.suites[2]._tests.index(case)])
+
+        self.cases_path = cases_path
+
 if __name__ == '__main__':
     unittest.main()
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 16/36] oeqa/sdkext/cases: Move sdk_update test into devtool module
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (14 preceding siblings ...)
  2017-05-26 20:37 ` [PATCH 15/36] oeqa/core/tests: Add tests of OEQA Threaded mode Aníbal Limón
@ 2017-05-26 20:37 ` Aníbal Limón
  2017-05-26 20:37 ` [PATCH 17/36] oeqa/sdk: Enable usage of OEQA thread mode Aníbal Limón
                   ` (21 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

With the new OEQA thread support there are problems running
devtool twice at the same time because only one instance of
bitbake/devtool is allowed.

[YOCTO #11450]

Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
 meta/lib/oeqa/sdkext/cases/devtool.py    | 32 ++++++++++++++++++++++++++
 meta/lib/oeqa/sdkext/cases/sdk_update.py | 39 --------------------------------
 2 files changed, 32 insertions(+), 39 deletions(-)
 delete mode 100644 meta/lib/oeqa/sdkext/cases/sdk_update.py

diff --git a/meta/lib/oeqa/sdkext/cases/devtool.py b/meta/lib/oeqa/sdkext/cases/devtool.py
index a01bc0b..ea90517 100644
--- a/meta/lib/oeqa/sdkext/cases/devtool.py
+++ b/meta/lib/oeqa/sdkext/cases/devtool.py
@@ -1,12 +1,14 @@
 # Copyright (C) 2016 Intel Corporation
 # Released under the MIT license (see COPYING.MIT)
 
+import os
 import shutil
 import subprocess
 
 from oeqa.sdkext.case import OESDKExtTestCase
 from oeqa.core.decorator.depends import OETestDepends
 from oeqa.core.decorator.oeid import OETestID
+from oeqa.utils.httpserver import HTTPService
 
 class DevtoolTest(OESDKExtTestCase):
     @classmethod
@@ -95,3 +97,33 @@ class DevtoolTest(OESDKExtTestCase):
             self._run('devtool build %s ' % package_nodejs)
         finally:
             self._run('devtool reset %s '% package_nodejs)
+
+class SdkUpdateTest(OESDKExtTestCase):
+    @classmethod
+    def setUpClass(self):
+        self.publish_dir = os.path.join(self.tc.sdk_dir, 'esdk_publish')
+        if os.path.exists(self.publish_dir):
+            shutil.rmtree(self.publish_dir)
+        os.mkdir(self.publish_dir)
+
+        base_tcname = "%s/%s" % (self.td.get("SDK_DEPLOY", ''),
+            self.td.get("TOOLCHAINEXT_OUTPUTNAME", ''))
+        tcname_new = "%s-new.sh" % base_tcname
+        if not os.path.exists(tcname_new):
+            tcname_new = "%s.sh" % base_tcname
+
+        cmd = 'oe-publish-sdk %s %s' % (tcname_new, self.publish_dir)
+        subprocess.check_output(cmd, shell=True)
+
+        self.http_service = HTTPService(self.publish_dir)
+        self.http_service.start()
+
+        self.http_url = "http://127.0.0.1:%d" % self.http_service.port
+
+    def test_sdk_update_http(self):
+        output = self._run("devtool sdk-update \"%s\"" % self.http_url)
+
+    @classmethod
+    def tearDownClass(self):
+        self.http_service.stop()
+        shutil.rmtree(self.publish_dir)
diff --git a/meta/lib/oeqa/sdkext/cases/sdk_update.py b/meta/lib/oeqa/sdkext/cases/sdk_update.py
deleted file mode 100644
index 2f8598b..0000000
--- a/meta/lib/oeqa/sdkext/cases/sdk_update.py
+++ /dev/null
@@ -1,39 +0,0 @@
-# Copyright (C) 2016 Intel Corporation
-# Released under the MIT license (see COPYING.MIT)
-
-import os
-import shutil
-import subprocess
-
-from oeqa.sdkext.case import OESDKExtTestCase
-from oeqa.utils.httpserver import HTTPService
-
-class SdkUpdateTest(OESDKExtTestCase):
-    @classmethod
-    def setUpClass(self):
-        self.publish_dir = os.path.join(self.tc.sdk_dir, 'esdk_publish')
-        if os.path.exists(self.publish_dir):
-            shutil.rmtree(self.publish_dir)
-        os.mkdir(self.publish_dir)
-
-        base_tcname = "%s/%s" % (self.td.get("SDK_DEPLOY", ''),
-            self.td.get("TOOLCHAINEXT_OUTPUTNAME", ''))
-        tcname_new = "%s-new.sh" % base_tcname
-        if not os.path.exists(tcname_new):
-            tcname_new = "%s.sh" % base_tcname
-
-        cmd = 'oe-publish-sdk %s %s' % (tcname_new, self.publish_dir)
-        subprocess.check_output(cmd, shell=True)
-
-        self.http_service = HTTPService(self.publish_dir)
-        self.http_service.start()
-
-        self.http_url = "http://127.0.0.1:%d" % self.http_service.port
-
-    def test_sdk_update_http(self):
-        output = self._run("devtool sdk-update \"%s\"" % self.http_url)
-
-    @classmethod
-    def tearDownClass(self):
-        self.http_service.stop()
-        shutil.rmtree(self.publish_dir)
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 17/36] oeqa/sdk: Enable usage of OEQA thread mode
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (15 preceding siblings ...)
  2017-05-26 20:37 ` [PATCH 16/36] oeqa/sdkext/cases: Move sdk_update test into devtool module Aníbal Limón
@ 2017-05-26 20:37 ` Aníbal Limón
  2017-05-26 20:37 ` [PATCH 18/36] oeqa/core: Add list tests support in context and runner Aníbal Limón
                   ` (20 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

oeqa/sdk/context.py - Use OETestContextThreaded.
classes/testsdk.bbclass - Enable bb event thread mode to avoid
corrupt the PIPE when multiple threads writes.

[YOCTO #11450]

Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
 meta/classes/testsdk.bbclass | 4 ++++
 meta/lib/oeqa/sdk/context.py | 5 +++--
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/meta/classes/testsdk.bbclass b/meta/classes/testsdk.bbclass
index edea89c..8a9e680 100644
--- a/meta/classes/testsdk.bbclass
+++ b/meta/classes/testsdk.bbclass
@@ -24,6 +24,8 @@ def testsdk_main(d):
     from oeqa.sdk.context import OESDKTestContext, OESDKTestContextExecutor
     from oeqa.utils import make_logger_bitbake_compatible
 
+    bb.event.enable_threadlock()
+
     pn = d.getVar("PN")
     logger = make_logger_bitbake_compatible(logging.getLogger("BitBake"))
 
@@ -97,6 +99,8 @@ def testsdkext_main(d):
     from oeqa.utils import avoid_paths_in_environ, make_logger_bitbake_compatible, subprocesstweak
     from oeqa.sdkext.context import OESDKExtTestContext, OESDKExtTestContextExecutor
 
+    bb.event.enable_threadlock()
+
     pn = d.getVar("PN")
     logger = make_logger_bitbake_compatible(logging.getLogger("BitBake"))
 
diff --git a/meta/lib/oeqa/sdk/context.py b/meta/lib/oeqa/sdk/context.py
index 82e4c19..b3d7c75 100644
--- a/meta/lib/oeqa/sdk/context.py
+++ b/meta/lib/oeqa/sdk/context.py
@@ -6,9 +6,10 @@ import sys
 import glob
 import re
 
-from oeqa.core.context import OETestContext, OETestContextExecutor
+from oeqa.core.context import OETestContextExecutor
+from oeqa.core.threaded import OETestContextThreaded
 
-class OESDKTestContext(OETestContext):
+class OESDKTestContext(OETestContextThreaded):
     sdk_files_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "files")
 
     def __init__(self, td=None, logger=None, sdk_dir=None, sdk_env=None,
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 18/36] oeqa/core: Add list tests support in context and runner
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (16 preceding siblings ...)
  2017-05-26 20:37 ` [PATCH 17/36] oeqa/sdk: Enable usage of OEQA thread mode Aníbal Limón
@ 2017-05-26 20:37 ` Aníbal Limón
  2017-05-26 20:37 ` [PATCH 19/36] oeqa/core: Add support for run tests by module, class and name Aníbal Limón
                   ` (19 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

A common operation is to list tests, currently only selftest
support it, this changes enables this functionality into the
core framework.

Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
 meta/lib/oeqa/core/context.py | 22 +++++++---
 meta/lib/oeqa/core/runner.py  | 98 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 115 insertions(+), 5 deletions(-)

diff --git a/meta/lib/oeqa/core/context.py b/meta/lib/oeqa/core/context.py
index 54958ad..bc958d0 100644
--- a/meta/lib/oeqa/core/context.py
+++ b/meta/lib/oeqa/core/context.py
@@ -58,6 +58,10 @@ class OETestContext(object):
 
         return result
 
+    def listTests(self, display_type):
+        self.runner = self.runnerClass(self, verbosity=2)
+        return self.runner.list_tests(self.suites, display_type)
+
 class OETestContextExecutor(object):
     _context_class = OETestContext
 
@@ -79,9 +83,14 @@ class OETestContextExecutor(object):
         self.parser.add_argument('--output-log', action='store',
                 default=self.default_output_log,
                 help="results output log, default: %s" % self.default_output_log)
-        self.parser.add_argument('--run-tests', action='store',
+
+        group = self.parser.add_mutually_exclusive_group()
+        group.add_argument('--run-tests', action='store',
                 default=self.default_tests,
                 help="tests to run in <module>[.<class>[.<name>]] format. Just works for modules now")
+        group.add_argument('--list-tests', action='store',
+                choices=('module', 'class', 'name'),
+                help="lists available tests")
 
         if self.default_test_data:
             self.parser.add_argument('--test-data-file', action='store',
@@ -126,7 +135,6 @@ class OETestContextExecutor(object):
         else:
             self.tc_kwargs['init']['td'] = {}
 
-
         if args.run_tests:
             self.tc_kwargs['load']['modules'] = args.run_tests.split()
         else:
@@ -139,9 +147,13 @@ class OETestContextExecutor(object):
 
         self.tc = self._context_class(**self.tc_kwargs['init'])
         self.tc.loadTests(self.module_paths, **self.tc_kwargs['load'])
-        rc = self.tc.runTests(**self.tc_kwargs['run'])
-        rc.logSummary(self.name)
-        rc.logDetails()
+
+        if args.list_tests:
+            rc = self.tc.listTests(args.list_tests, **self.tc_kwargs['run'])
+        else:
+            rc = self.tc.runTests(**self.tc_kwargs['run'])
+            rc.logSummary(self.name)
+            rc.logDetails()
 
         output_link = os.path.join(os.path.dirname(args.output_log),
                 "%s-results.log" % self.name)
diff --git a/meta/lib/oeqa/core/runner.py b/meta/lib/oeqa/core/runner.py
index 3ebffc7..7ce718e 100644
--- a/meta/lib/oeqa/core/runner.py
+++ b/meta/lib/oeqa/core/runner.py
@@ -134,6 +134,10 @@ class OETestResult(_TestResult):
                 self.tc.logger.info("RESULTS - %s - Testcase %s: %s" % (case.id(),
                     oeid, 'PASSED'))
 
+class OEListTestsResult(object):
+    def wasSuccessful(self):
+        return True
+
 class OETestRunner(_TestRunner):
     streamLoggerClass = OEStreamLogger
 
@@ -164,3 +168,97 @@ class OETestRunner(_TestRunner):
         def _makeResult(self):
             return self.resultclass(self.tc, self.stream, self.descriptions,
                     self.verbosity)
+
+
+    def _walk_suite(self, suite, func):
+        for obj in suite:
+            if isinstance(obj, unittest.suite.TestSuite):
+                if len(obj._tests):
+                    self._walk_suite(obj, func)
+            elif isinstance(obj, unittest.case.TestCase):
+                func(self.tc.logger, obj)
+                self._walked_cases = self._walked_cases + 1
+
+    def _list_tests_name(self, suite):
+        from oeqa.core.decorator.oeid import OETestID
+        from oeqa.core.decorator.oetag import OETestTag
+
+        self._walked_cases = 0
+
+        def _list_cases_without_id(logger, case):
+
+            found_id = False
+            for d in case.decorators:
+                if isinstance(d, OETestID):
+                    found_id = True
+
+            if not found_id:
+                logger.info('oeid missing for %s' % case.id())
+
+        def _list_cases(logger, case):
+            oeid = None
+            oetag = None
+
+            for d in case.decorators:
+                if isinstance(d, OETestID):
+                    oeid = d.oeid
+                elif isinstance(d, OETestTag):
+                    oetag = d.oetag
+
+            logger.info("%s\t%s\t\t%s" % (oeid, oetag, case.id()))
+
+        self.tc.logger.info("Listing test cases that don't have oeid ...")
+        self._walk_suite(suite, _list_cases_without_id)
+        self.tc.logger.info("-" * 80)
+
+        self.tc.logger.info("Listing all available tests:")
+        self._walked_cases = 0
+        self.tc.logger.info("id\ttag\t\ttest")
+        self.tc.logger.info("-" * 80)
+        self._walk_suite(suite, _list_cases)
+        self.tc.logger.info("-" * 80)
+        self.tc.logger.info("Total found:\t%s" % self._walked_cases)
+
+    def _list_tests_class(self, suite):
+        self._walked_cases = 0
+
+        curr = {}
+        def _list_classes(logger, case):
+            if not 'module' in curr or curr['module'] != case.__module__:
+                curr['module'] = case.__module__
+                logger.info(curr['module'])
+
+            if not 'class' in curr  or curr['class'] != \
+                    case.__class__.__name__:
+                curr['class'] = case.__class__.__name__
+                logger.info(" -- %s" % curr['class'])
+
+            logger.info(" -- -- %s" % case._testMethodName)
+
+        self.tc.logger.info("Listing all available test classes:")
+        self._walk_suite(suite, _list_classes)
+
+    def _list_tests_module(self, suite):
+        self._walked_cases = 0
+
+        listed = []
+        def _list_modules(logger, case):
+            if not case.__module__ in listed:
+                if case.__module__.startswith('_'):
+                    logger.info("%s (hidden)" % case.__module__)
+                else:
+                    logger.info(case.__module__)
+                listed.append(case.__module__)
+
+        self.tc.logger.info("Listing all available test modules:")
+        self._walk_suite(suite, _list_modules)
+
+    def list_tests(self, suite, display_type):
+        if display_type == 'name':
+            self._list_tests_name(suite)
+        elif display_type == 'class':
+            self._list_tests_class(suite)
+        elif display_type == 'module':
+            self._list_tests_module(suite)
+
+        return OEListTestsResult()
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 19/36] oeqa/core: Add support for run tests by module, class and name
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (17 preceding siblings ...)
  2017-05-26 20:37 ` [PATCH 18/36] oeqa/core: Add list tests support in context and runner Aníbal Limón
@ 2017-05-26 20:37 ` Aníbal Limón
  2017-05-26 20:37 ` [PATCH 20/36] classes/test{export, images}: Change modules to list Aníbal Limón
                   ` (18 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

This will enable only run certain module tests and filter by
class and test name.

Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
 meta/lib/oeqa/core/context.py |  6 ++--
 meta/lib/oeqa/core/loader.py  | 66 ++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 68 insertions(+), 4 deletions(-)

diff --git a/meta/lib/oeqa/core/context.py b/meta/lib/oeqa/core/context.py
index bc958d0..28ae017 100644
--- a/meta/lib/oeqa/core/context.py
+++ b/meta/lib/oeqa/core/context.py
@@ -85,9 +85,9 @@ class OETestContextExecutor(object):
                 help="results output log, default: %s" % self.default_output_log)
 
         group = self.parser.add_mutually_exclusive_group()
-        group.add_argument('--run-tests', action='store',
+        group.add_argument('--run-tests', action='store', nargs='+',
                 default=self.default_tests,
-                help="tests to run in <module>[.<class>[.<name>]] format. Just works for modules now")
+                help="tests to run in <module>[.<class>[.<name>]]")
         group.add_argument('--list-tests', action='store',
                 choices=('module', 'class', 'name'),
                 help="lists available tests")
@@ -136,7 +136,7 @@ class OETestContextExecutor(object):
             self.tc_kwargs['init']['td'] = {}
 
         if args.run_tests:
-            self.tc_kwargs['load']['modules'] = args.run_tests.split()
+            self.tc_kwargs['load']['modules'] = args.run_tests
         else:
             self.tc_kwargs['load']['modules'] = None
 
diff --git a/meta/lib/oeqa/core/loader.py b/meta/lib/oeqa/core/loader.py
index 63a1703..bffb2da 100644
--- a/meta/lib/oeqa/core/loader.py
+++ b/meta/lib/oeqa/core/loader.py
@@ -29,6 +29,51 @@ def _find_duplicated_modules(suite, directory):
         if path:
             raise ImportError("Duplicated %s module found in %s" % (module, path))
 
+def _built_modules_dict(modules):
+    modules_dict = {}
+
+    if modules == None:
+        return modules_dict
+
+    for m in modules:
+        ms = m.split('.')
+
+        if len(ms) == 1:
+            module_name = ms[0]
+            if not module_name in modules_dict:
+                modules_dict[module_name] = {}
+        elif len(ms) == 2:
+            module_name = ms[0]
+            class_name = ms[1]
+            if not module_name in modules_dict:
+                modules_dict[module_name] = {}
+            if not class_name in modules_dict[module_name]:
+                modules_dict[module_name][class_name] = []
+        elif len(ms) == 3:
+            module_name = ms[0]
+            class_name = ms[1]
+            test_name = ms[2]
+
+            if not module_name in modules_dict:
+                modules_dict[module_name] = {}
+            if not class_name in modules_dict[module_name]:
+                modules_dict[module_name][class_name] = []
+            if not test_name in modules_dict[module_name][class_name]:
+                modules_dict[module_name][class_name].append(test_name)
+        elif len(ms) >= 4:
+            module_name = '.'.join(ms[0:-2])
+            class_name = ms[-2]
+            test_name = ms[-1]
+
+            if not module_name in modules_dict:
+                modules_dict[module_name] = {}
+            if not class_name in modules_dict[module_name]:
+                modules_dict[module_name][class_name] = []
+            if not test_name in modules_dict[module_name][class_name]:
+                modules_dict[module_name][class_name].append(test_name)
+
+    return modules_dict
+
 class OETestLoader(unittest.TestLoader):
     caseClass = OETestCase
 
@@ -39,7 +84,8 @@ class OETestLoader(unittest.TestLoader):
             filters, *args, **kwargs):
         self.tc = tc
 
-        self.modules = modules
+        self.modules = _built_modules_dict(modules)
+
         self.tests = tests
         self.modules_required = modules_required
 
@@ -116,6 +162,24 @@ class OETestLoader(unittest.TestLoader):
         """
             Returns True if test case must be filtered, False otherwise.
         """
+        # Filters by module.class.name
+        module_name = case.__module__
+        class_name = case.__class__.__name__
+        test_name = case._testMethodName
+
+        if self.modules:
+            if not module_name in self.modules:
+                return True
+
+            if self.modules[module_name]:
+                if not class_name in self.modules[module_name]:
+                    return True
+
+                if self.modules[module_name][class_name]:
+                    if test_name not in self.modules[module_name][class_name]:
+                        return True
+
+        # Decorator filters
         if self.filters:
             filters = self.filters.copy()
             case_decorators = [cd for cd in case.decorators
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 20/36] classes/test{export, images}: Change modules to list
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (18 preceding siblings ...)
  2017-05-26 20:37 ` [PATCH 19/36] oeqa/core: Add support for run tests by module, class and name Aníbal Limón
@ 2017-05-26 20:37 ` Aníbal Limón
  2017-05-26 20:37 ` [PATCH 21/36] oeqa/runtime/case: Don't use OEQA framework internal methods Aníbal Limón
                   ` (17 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

With the new filters by <module>.[class].[testname] the modules
arg is expected to be a list so use split into TEST_SUITES variable.

Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
 meta/classes/testexport.bbclass | 2 +-
 meta/classes/testimage.bbclass  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/meta/classes/testexport.bbclass b/meta/classes/testexport.bbclass
index 56edda9..d070f07 100644
--- a/meta/classes/testexport.bbclass
+++ b/meta/classes/testexport.bbclass
@@ -113,7 +113,7 @@ def copy_needed_files(d, tc):
     oe.path.remove(cases_path)
     bb.utils.mkdirhier(cases_path)
     test_paths = get_runtime_paths(d)
-    test_modules = d.getVar('TEST_SUITES')
+    test_modules = d.getVar('TEST_SUITES').split()
     tc.loadTests(test_paths, modules=test_modules)
     for f in getSuiteCasesFiles(tc.suites):
         shutil.copy2(f, cases_path)
diff --git a/meta/classes/testimage.bbclass b/meta/classes/testimage.bbclass
index d42907c..1185593 100644
--- a/meta/classes/testimage.bbclass
+++ b/meta/classes/testimage.bbclass
@@ -257,7 +257,7 @@ def testimage_main(d):
 
     # Load tests before starting the target
     test_paths = get_runtime_paths(d)
-    test_modules = d.getVar('TEST_SUITES')
+    test_modules = d.getVar('TEST_SUITES').split()
     tc.loadTests(test_paths, modules=test_modules)
 
     if not getSuiteCases(tc.suites):
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 21/36] oeqa/runtime/case: Don't use OEQA framework internal methods
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (19 preceding siblings ...)
  2017-05-26 20:37 ` [PATCH 20/36] classes/test{export, images}: Change modules to list Aníbal Limón
@ 2017-05-26 20:37 ` Aníbal Limón
  2017-05-26 20:37 ` [PATCH 22/36] oeqa/core/README: Improve documentation Aníbal Limón
                   ` (16 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

The OEQA framework has internal methods for provide functionality
in decorators so Test components aren't expected to override it.

Use the base unittest methods for setUp and tearDown.

Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
 meta/lib/oeqa/runtime/case.py | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/meta/lib/oeqa/runtime/case.py b/meta/lib/oeqa/runtime/case.py
index c1485c9..2f190ac 100644
--- a/meta/lib/oeqa/runtime/case.py
+++ b/meta/lib/oeqa/runtime/case.py
@@ -8,10 +8,10 @@ class OERuntimeTestCase(OETestCase):
     # target instance set by OERuntimeTestLoader.
     target = None
 
-    def _oeSetUp(self):
-        super(OERuntimeTestCase, self)._oeSetUp()
+    def setUp(self):
+        super(OERuntimeTestCase, self).setUp()
         install_package(self)
 
-    def _oeTearDown(self):
-        super(OERuntimeTestCase, self)._oeTearDown()
+    def tearDown(self):
+        super(OERuntimeTestCase, self).tearDown()
         uninstall_package(self)
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 22/36] oeqa/core/README: Improve documentation
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (20 preceding siblings ...)
  2017-05-26 20:37 ` [PATCH 21/36] oeqa/runtime/case: Don't use OEQA framework internal methods Aníbal Limón
@ 2017-05-26 20:37 ` Aníbal Limón
  2017-05-26 20:37 ` [PATCH 23/36] oeqa/core/case: fix typo on comment about exception name Aníbal Limón
                   ` (15 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

From: Leonardo Sandoval <leonardo.sandoval.gonzalez@linux.intel.com>

Most of the text include on this text refactor came from [1].

[1] http://lists.openembedded.org/pipermail/openembedded-architecture/2016-December/000351.html

Signed-off-by: Leonardo Sandoval <leonardo.sandoval.gonzalez@linux.intel.com>
---
 meta/lib/oeqa/core/README | 81 +++++++++++++++++++++++++++++++++++------------
 1 file changed, 60 insertions(+), 21 deletions(-)

diff --git a/meta/lib/oeqa/core/README b/meta/lib/oeqa/core/README
index 0c859fd..f67dff7 100644
--- a/meta/lib/oeqa/core/README
+++ b/meta/lib/oeqa/core/README
@@ -1,38 +1,77 @@
-= OEQA Framework =
+= OEQA (v2) Framework =
 
 == Introduction ==
 
-This is the new OEQA framework the base clases of the framework
-are in this module oeqa/core the subsequent components needs to
-extend this classes.
+This is the new (version 2) OEQA framework. Base clases are located inside the
+'oeqa/core' folder and subsequent components needs to extend from these.
 
-A new/unique runner was created called oe-test and is under scripts/
-oe-test, this new runner scans over oeqa module searching for test
-components that supports OETestContextExecutor implemented in context
-module (i.e. oeqa/core/context.py).
+The main design consideration was to implement the needed functionality
+on top of Python unittest framework. To archive the latter, the following
+modules are present:
 
-For execute an example:
+    * oeqa/core/runner.py: Provides OETestResult and OETestRunner base
+      classes extending the unittest ones. This class has the support for
+      export results to different formats currently RAW and XML.
 
-$ source oe-init-build-env
-$ oe-test core
+    * oeqa/core/loader.py: Provides OETestLoader extending unittest ones,
+      also implements unified way for decorator support and for filtering test
+      cases.
 
-For list supported components:
+    * oeqa/core/case.py: Provides OETestCase base class extending
+      unittest.TestCase and provides access to the Test data (td), Test context
+      and Logger functionality.
 
-$ oe-test -h
+    * oeqa/core/decorator: Provides OETestDecorator a new class to implement
+      decorators for Test cases.
 
-== Create new Test component ==
+    * oeqa/core/context: Provides OETestContext a high-level API for
+      loadTests and runTests of certain Test component and
+      OETestContextExecutor a base class to enable oe-test to discover/use
+      the Test component.
 
-Usally for add a new Test component the developer needs to extend
-OETestContext/OETestContextExecutor in context.py and OETestCase in
-case.py.
+In the other hand, a new 'oe-test' runner is located under 'scripts', allowing scans for components
+that supports OETestContextExecutor (see below).
 
-== How to run the testing of the OEQA framework ==
+== Terminology ==
+
+    * Test component: The area of testing in the Project, for example: runtime, SDK, eSDK, selftest.
+
+    * Test data: Data associated with the Test component. Currently we use bitbake datastore as
+      a Test data input.
+
+    * Test context: A context of what tests needs to be run and how to do it, additionally provides
+      access to the Test data and could have custom methods, attrs.
+
+== oe-test ==
+
+The new tool oe-test (located at scripts) has the ability to scan the code base for test
+components and provide a unified way to run test cases. Internally it scans folders inside
+oeqa module in order to find specific classes that
+implements a test component.
+
+== Usage ==
+
+Executing the example test component
+
+    $ source oe-init-build-env
+    $ oe-test core
+
+Getting help
+
+    $ oe-test -h
+
+== Creating new Test Component ==
+
+Adding a new test component the developer needs to extend OETestContext/OETestContextExecutor
+(from context.py) and OETestCase (from case.py)
+
+== Selftesting the framework ==
 
 Run all tests:
 
-$ PATH=$PATH:../../ python3 -m unittest discover -s tests
+    $ PATH=$PATH:../../ python3 -m unittest discover -s tests
 
 Run some test:
 
-$ cd tests/
-$ ./test_data.py
+    $ cd tests/
+    $ ./test_data.py
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 23/36] oeqa/core/case: fix typo on comment about exception name
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (21 preceding siblings ...)
  2017-05-26 20:37 ` [PATCH 22/36] oeqa/core/README: Improve documentation Aníbal Limón
@ 2017-05-26 20:37 ` Aníbal Limón
  2017-05-26 20:37 ` [PATCH 24/36] oeqa/core/context: Raise exception when a manifest is specified but missing Aníbal Limón
                   ` (14 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

From: Leonardo Sandoval <leonardo.sandoval.gonzalez@linux.intel.com>

Signed-off-by: Leonardo Sandoval <leonardo.sandoval.gonzalez@linux.intel.com>
---
 meta/lib/oeqa/core/case.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/meta/lib/oeqa/core/case.py b/meta/lib/oeqa/core/case.py
index d2dbf20..917a2aa 100644
--- a/meta/lib/oeqa/core/case.py
+++ b/meta/lib/oeqa/core/case.py
@@ -23,7 +23,7 @@ class OETestCase(unittest.TestCase):
 
     # td_vars has the variables needed by a test class
     # or test case instance, if some var isn't into td a
-    # OEMissingVariable exception is raised
+    # OEQAMissingVariable exception is raised
     td_vars = None
 
     @classmethod
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 24/36] oeqa/core/context: Raise exception when a manifest is specified but missing
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (22 preceding siblings ...)
  2017-05-26 20:37 ` [PATCH 23/36] oeqa/core/case: fix typo on comment about exception name Aníbal Limón
@ 2017-05-26 20:37 ` Aníbal Limón
  2017-05-26 20:37 ` [PATCH 25/36] oeqa/core/context: Use a default iterable modules object Aníbal Limón
                   ` (13 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

From: Leonardo Sandoval <leonardo.sandoval.gonzalez@linux.intel.com>

Signed-off-by: Leonardo Sandoval <leonardo.sandoval.gonzalez@linux.intel.com>
---
 meta/lib/oeqa/core/context.py   | 3 ++-
 meta/lib/oeqa/core/exception.py | 3 +++
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/meta/lib/oeqa/core/context.py b/meta/lib/oeqa/core/context.py
index 28ae017..1ac2878 100644
--- a/meta/lib/oeqa/core/context.py
+++ b/meta/lib/oeqa/core/context.py
@@ -10,6 +10,7 @@ import collections
 
 from oeqa.core.loader import OETestLoader
 from oeqa.core.runner import OETestRunner
+from oeqa.core.exception import OEQAMissingManifest
 
 class OETestContext(object):
     loaderClass = OETestLoader
@@ -30,7 +31,7 @@ class OETestContext(object):
 
     def _read_modules_from_manifest(self, manifest):
         if not os.path.exists(manifest):
-            raise
+            raise OEQAMissingManifest("Manifest does not exist on %s" % manifest)
 
         modules = []
         for line in open(manifest).readlines():
diff --git a/meta/lib/oeqa/core/exception.py b/meta/lib/oeqa/core/exception.py
index 2dfd840..97ef19d 100644
--- a/meta/lib/oeqa/core/exception.py
+++ b/meta/lib/oeqa/core/exception.py
@@ -12,3 +12,6 @@ class OEQAMissingVariable(OEQAException):
 
 class OEQADependency(OEQAException):
     pass
+
+class OEQAMissingManifest(OEQAException):
+    pass
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 25/36] oeqa/core/context: Use a default iterable modules object
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (23 preceding siblings ...)
  2017-05-26 20:37 ` [PATCH 24/36] oeqa/core/context: Raise exception when a manifest is specified but missing Aníbal Limón
@ 2017-05-26 20:37 ` Aníbal Limón
  2017-05-26 20:37 ` [PATCH 26/36] oeqa/core/context: Omit docstring output on XMLResult Aníbal Limón
                   ` (12 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

From: Leonardo Sandoval <leonardo.sandoval.gonzalez@linux.intel.com>

The OETestLoader.modules must be an iterable object, otherwise
checking presence of specific modules with the 'in' operator fails
with the following command/error:

    % oe-test core
    .. - core - INFO - Running bitbake -p
    Traceback (most recent call last):
      File "..poky2/scripts/oe-test", line 108, in <module>
        ret = main()
      File "..poky2/scripts/oe-test", line 93, in main
        results = args.func(logger, args)
      File "..poky2/meta/lib/oeqa/core/context.py", line 235, in run
        self.tc.loadTests(self.module_paths, **self.tc_kwargs['load'])
      File "..poky2/meta/lib/oeqa/core/context.py", line 53, in loadTests
        self.suites = self.loader.discover()
      File "..poky2/meta/lib/oeqa/core/loader.py", line 204, in discover
        pattern='*.py', top_level_dir=path)
      File "/usr/lib64/python3.4/unittest/loader.py", line 275, in discover
        tests = list(self._find_tests(start_dir, pattern))
      File "/usr/lib64/python3.4/unittest/loader.py", line 339, in _find_tests
        yield self.loadTestsFromModule(module)
      File "..poky2/meta/lib/oeqa/core/loader.py", line 266, in loadTestsFromModule
        and module.__name__ in self.modules \
    TypeError: argument of type 'NoneType' is not iterable

Signed-off-by: Leonardo Sandoval <leonardo.sandoval.gonzalez@linux.intel.com>
---
 meta/lib/oeqa/core/context.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/meta/lib/oeqa/core/context.py b/meta/lib/oeqa/core/context.py
index 1ac2878..20d8236 100644
--- a/meta/lib/oeqa/core/context.py
+++ b/meta/lib/oeqa/core/context.py
@@ -139,7 +139,7 @@ class OETestContextExecutor(object):
         if args.run_tests:
             self.tc_kwargs['load']['modules'] = args.run_tests
         else:
-            self.tc_kwargs['load']['modules'] = None
+            self.tc_kwargs['load']['modules'] = []
 
         self.module_paths = args.CASES_PATHS
 
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 26/36] oeqa/core/context: Omit docstring output on XMLResult
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (24 preceding siblings ...)
  2017-05-26 20:37 ` [PATCH 25/36] oeqa/core/context: Use a default iterable modules object Aníbal Limón
@ 2017-05-26 20:37 ` Aníbal Limón
  2017-05-26 20:37 ` [PATCH 27/36] oeqa/core/context: Include a _pre_run method Aníbal Limón
                   ` (11 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

From: Leonardo Sandoval <leonardo.sandoval.gonzalez@linux.intel.com>

By default, the xml runner class prints out the docstring for every
unit test but it order to keep the same format as the standard
runner, avoid docstring output setting descriptions to False.

Signed-off-by: Leonardo Sandoval <leonardo.sandoval.gonzalez@linux.intel.com>
---
 meta/lib/oeqa/core/context.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/meta/lib/oeqa/core/context.py b/meta/lib/oeqa/core/context.py
index 20d8236..6667f46 100644
--- a/meta/lib/oeqa/core/context.py
+++ b/meta/lib/oeqa/core/context.py
@@ -51,7 +51,7 @@ class OETestContext(object):
         self.suites = self.loader.discover()
 
     def runTests(self):
-        self.runner = self.runnerClass(self, verbosity=2)
+        self.runner = self.runnerClass(self, descriptions=False, verbosity=2)
 
         self._run_start_time = time.time()
         result = self.runner.run(self.suites)
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 27/36] oeqa/core/context: Include a _pre_run method
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (25 preceding siblings ...)
  2017-05-26 20:37 ` [PATCH 26/36] oeqa/core/context: Omit docstring output on XMLResult Aníbal Limón
@ 2017-05-26 20:37 ` Aníbal Limón
  2017-05-26 20:37 ` [PATCH 28/36] scripts/oe-test: Move load_test_components to oeqa.utils Aníbal Limón
                   ` (10 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

From: Leonardo Sandoval <leonardo.sandoval.gonzalez@linux.intel.com>

This pre runner will serve to allow Test components executes code
previously of the run a suite.

Signed-off-by: Leonardo Sandoval <leonardo.sandoval.gonzalez@linux.intel.com>
---
 meta/lib/oeqa/core/context.py   | 4 ++++
 meta/lib/oeqa/core/exception.py | 3 +++
 scripts/oe-test                 | 3 +++
 3 files changed, 10 insertions(+)

diff --git a/meta/lib/oeqa/core/context.py b/meta/lib/oeqa/core/context.py
index 6667f46..5f399fd 100644
--- a/meta/lib/oeqa/core/context.py
+++ b/meta/lib/oeqa/core/context.py
@@ -143,6 +143,9 @@ class OETestContextExecutor(object):
 
         self.module_paths = args.CASES_PATHS
 
+    def _pre_run(self):
+        pass
+
     def run(self, logger, args):
         self._process_args(logger, args)
 
@@ -152,6 +155,7 @@ class OETestContextExecutor(object):
         if args.list_tests:
             rc = self.tc.listTests(args.list_tests, **self.tc_kwargs['run'])
         else:
+            self._pre_run()
             rc = self.tc.runTests(**self.tc_kwargs['run'])
             rc.logSummary(self.name)
             rc.logDetails()
diff --git a/meta/lib/oeqa/core/exception.py b/meta/lib/oeqa/core/exception.py
index 97ef19d..a07961a 100644
--- a/meta/lib/oeqa/core/exception.py
+++ b/meta/lib/oeqa/core/exception.py
@@ -15,3 +15,6 @@ class OEQADependency(OEQAException):
 
 class OEQAMissingManifest(OEQAException):
     pass
+
+class OEQAPreRun(OEQAException):
+    pass
diff --git a/scripts/oe-test b/scripts/oe-test
index a1d282d..f90d85b 100755
--- a/scripts/oe-test
+++ b/scripts/oe-test
@@ -26,6 +26,7 @@ except ImportError:
     pass
 
 from oeqa.core.context import OETestContextExecutor
+from oeqa.core.exception import OEQAPreRun
 
 logger = scriptutils.logger_create('oe-test')
 
@@ -92,6 +93,8 @@ def main():
         ret = err.code
     except argparse_oe.ArgumentUsageError as ae:
         parser.error_subcommand(ae.message, ae.subcommand)
+    except OEQAPreRun as pr:
+        ret = 1
 
     return ret
 
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 28/36] scripts/oe-test: Move load_test_components to oeqa.utils
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (26 preceding siblings ...)
  2017-05-26 20:37 ` [PATCH 27/36] oeqa/core/context: Include a _pre_run method Aníbal Limón
@ 2017-05-26 20:37 ` Aníbal Limón
  2017-05-26 20:37 ` [PATCH 29/36] oeqa/selftest: Move base class to case module Aníbal Limón
                   ` (9 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

In order to maintain compatibility with oe-selftest, the
load_test_components needs to be re-used, so the script
executor needs to pass to only load components supported
by certain script (oe-test, oe-selftest).

Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
 meta/lib/oeqa/core/context.py   |  1 +
 meta/lib/oeqa/utils/__init__.py | 37 ++++++++++++++++++++++++++++++++++++-
 scripts/oe-test                 | 31 ++-----------------------------
 3 files changed, 39 insertions(+), 30 deletions(-)

diff --git a/meta/lib/oeqa/core/context.py b/meta/lib/oeqa/core/context.py
index 5f399fd..0dbf5c3 100644
--- a/meta/lib/oeqa/core/context.py
+++ b/meta/lib/oeqa/core/context.py
@@ -65,6 +65,7 @@ class OETestContext(object):
 
 class OETestContextExecutor(object):
     _context_class = OETestContext
+    _script_executor = 'oe-test'
 
     name = 'core'
     help = 'core test component example'
diff --git a/meta/lib/oeqa/utils/__init__.py b/meta/lib/oeqa/utils/__init__.py
index 485de03..d38a323 100644
--- a/meta/lib/oeqa/utils/__init__.py
+++ b/meta/lib/oeqa/utils/__init__.py
@@ -2,7 +2,6 @@
 from pkgutil import extend_path
 __path__ = extend_path(__path__, __name__)
 
-
 # Borrowed from CalledProcessError
 
 class CommandError(Exception):
@@ -66,3 +65,39 @@ def make_logger_bitbake_compatible(logger):
     logger.info = _bitbake_log_info
 
     return logger
+
+def load_test_components(logger, executor):
+    import sys
+    import os
+    import importlib
+
+    from oeqa.core.context import OETestContextExecutor
+
+    components = {}
+
+    for path in sys.path:
+        base_dir = os.path.join(path, 'oeqa')
+        if os.path.exists(base_dir) and os.path.isdir(base_dir):
+            for file in os.listdir(base_dir):
+                comp_name = file
+                comp_context = os.path.join(base_dir, file, 'context.py')
+                if os.path.exists(comp_context):
+                    comp_plugin = importlib.import_module('oeqa.%s.%s' % \
+                            (comp_name, 'context'))
+                    try:
+                        if not issubclass(comp_plugin._executor_class,
+                                OETestContextExecutor):
+                            raise TypeError("Component %s in %s, _executor_class "\
+                                "isn't derived from OETestContextExecutor."\
+                                % (comp_name, comp_context))
+
+                        if comp_plugin._executor_class._script_executor \
+                                != executor:
+                            continue
+
+                        components[comp_name] = comp_plugin._executor_class()
+                    except AttributeError:
+                        raise AttributeError("Component %s in %s don't have "\
+                                "_executor_class defined." % (comp_name, comp_context))
+
+    return components
diff --git a/scripts/oe-test b/scripts/oe-test
index f90d85b..0a36b78 100755
--- a/scripts/oe-test
+++ b/scripts/oe-test
@@ -8,7 +8,6 @@
 import os
 import sys
 import argparse
-import importlib
 import logging
 
 scripts_path = os.path.dirname(os.path.realpath(__file__))
@@ -25,37 +24,11 @@ try:
 except ImportError:
     pass
 
-from oeqa.core.context import OETestContextExecutor
+from oeqa.utils import load_test_components
 from oeqa.core.exception import OEQAPreRun
 
 logger = scriptutils.logger_create('oe-test')
 
-def _load_test_components(logger):
-    components = {}
-
-    for path in sys.path:
-        base_dir = os.path.join(path, 'oeqa')
-        if os.path.exists(base_dir) and os.path.isdir(base_dir):
-            for file in os.listdir(base_dir):
-                comp_name = file
-                comp_context = os.path.join(base_dir, file, 'context.py')
-                if os.path.exists(comp_context):
-                    comp_plugin = importlib.import_module('oeqa.%s.%s' % \
-                            (comp_name, 'context'))
-                    try:
-                        if not issubclass(comp_plugin._executor_class,
-                                OETestContextExecutor):
-                            raise TypeError("Component %s in %s, _executor_class "\
-                                "isn't derived from OETestContextExecutor."\
-                                % (comp_name, comp_context))
-
-                        components[comp_name] = comp_plugin._executor_class()
-                    except AttributeError:
-                        raise AttributeError("Component %s in %s don't have "\
-                                "_executor_class defined." % (comp_name, comp_context))
-
-    return components
-
 def main():
     parser = argparse_oe.ArgumentParser(description="OpenEmbedded test tool",
                                         add_help=False,
@@ -74,7 +47,7 @@ def main():
     elif global_args.quiet:
         logger.setLevel(logging.ERROR)
 
-    components = _load_test_components(logger)
+    components = load_test_components(logger, 'oe-test')
 
     subparsers = parser.add_subparsers(dest="subparser_name", title='subcommands', metavar='<subcommand>')
     subparsers.add_subparser_group('components', 'Test components')
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 29/36] oeqa/selftest: Move base class to case module
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (27 preceding siblings ...)
  2017-05-26 20:37 ` [PATCH 28/36] scripts/oe-test: Move load_test_components to oeqa.utils Aníbal Limón
@ 2017-05-26 20:37 ` Aníbal Limón
  2017-05-26 20:37 ` [PATCH 30/36] oeqa/selftest/case: Migrate case class to the new OEQA framework Aníbal Limón
                   ` (8 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

To match the new structure of the OEQA framework.

Signed-off-by: Leonardo Sandoval <leonardo.sandoval.gonzalez@linux.intel.com>
Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
 meta/lib/oeqa/selftest/{base.py => case.py} | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename meta/lib/oeqa/selftest/{base.py => case.py} (100%)

diff --git a/meta/lib/oeqa/selftest/base.py b/meta/lib/oeqa/selftest/case.py
similarity index 100%
rename from meta/lib/oeqa/selftest/base.py
rename to meta/lib/oeqa/selftest/case.py
-- 
2.1.4



^ permalink raw reply	[flat|nested] 43+ messages in thread

* [PATCH 30/36] oeqa/selftest/case: Migrate case class to the new OEQA framework
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (28 preceding siblings ...)
  2017-05-26 20:37 ` [PATCH 29/36] oeqa/selftest: Move base class to case module Aníbal Limón
@ 2017-05-26 20:37 ` Aníbal Limón
  2017-05-26 20:37 ` [PATCH 31/36] scripts/oe-selftest: Move {add, remove}_include files to case Aníbal Limón
                   ` (7 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

From: Leonardo Sandoval <leonardo.sandoval.gonzalez@linux.intel.com>

Summary of the changes:

- Use OETestCase as base class instead of unittest.TestCase
- Remove LogResults decorator the new framework provides logging into
  the core functionality.
- Logger is now self.logger instead of self.log
- Move comments into docstrings in several help methods
- Use get_test_layer() method instead of access monkey patched variable
  in old oeSelfTest case class.

Signed-off-by: Leonardo Sandoval <leonardo.sandoval.gonzalez@linux.intel.com>
Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
 meta/lib/oeqa/selftest/case.py | 111 +++++++++++++++++++----------------------
 1 file changed, 51 insertions(+), 60 deletions(-)

diff --git a/meta/lib/oeqa/selftest/case.py b/meta/lib/oeqa/selftest/case.py
index 43a1951..95a8769 100644
--- a/meta/lib/oeqa/selftest/case.py
+++ b/meta/lib/oeqa/selftest/case.py
@@ -1,31 +1,19 @@
-# Copyright (c) 2013 Intel Corporation
-#
+# Copyright (C) 2013-2017 Intel Corporation
 # Released under the MIT license (see COPYING.MIT)
 
-
-# DESCRIPTION
-# Base class inherited by test classes in meta/lib/oeqa/selftest
-
-import unittest
-import os
 import sys
+import os
 import shutil
-import logging
+import glob
 import errno
-
-import oeqa.utils.ftools as ftools
-from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_test_layer
-from oeqa.utils.decorators import LogResults
 from random import choice
-import glob
 from unittest.util import safe_repr
 
-@LogResults
-class oeSelfTest(unittest.TestCase):
-
-    log = logging.getLogger("selftest.base")
-    longMessage = True
+import oeqa.utils.ftools as ftools
+from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_test_layer
+from oeqa.core.case import OETestCase
 
+class OESelftestTestCase(OETestCase):
     def __init__(self, methodName="runTest"):
         self.builddir = os.environ.get("BUILDDIR")
         self.localconf_path = os.path.join(self.builddir, "conf/local.conf")
@@ -36,23 +24,26 @@ class oeSelfTest(unittest.TestCase):
                                                   "conf/bblayers.bk")
         self.testinc_bblayers_path = os.path.join(self.builddir, "conf/bblayers.inc")
         self.machineinc_path = os.path.join(self.builddir, "conf/machine.inc")
-        self.testlayer_path = oeSelfTest.testlayer_path
+        self.testlayer_path = get_test_layer()
         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(oeSelfTest, self).__init__(methodName)
+
+        super(OESelftestTestCase, self).__init__(methodName)
 
     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(
                 self.local_bblayers_backup):
-            self.log.debug("Found a local.conf and/or bblayers.conf backup \
-from a previously aborted test. Restoring these files now, but tests should \
-be re-executed from a clean environment to ensure accurate results.")
+            self.logger.debug("\
+Found a local.conf and/or bblayers.conf backup from a previously aborted test.\
+Restoring these files now, but tests should be re-executed from a clean environment\
+to ensure accurate results.")
             try:
                 shutil.copyfile(self.localconf_backup, self.localconf_path)
             except OSError as e:
@@ -67,9 +58,8 @@ be re-executed from a clean environment to ensure accurate results.")
         else:
             # backup local.conf and bblayers.conf
             shutil.copyfile(self.localconf_path, self.localconf_backup)
-            shutil.copyfile(self.local_bblayers_path,
-                            self.local_bblayers_backup)
-            self.log.debug("Creating local.conf and bblayers.conf backups.")
+            shutil.copyfile(self.local_bblayers_path, self.local_bblayers_backup)
+            self.logger.debug("Creating local.conf and bblayers.conf backups.")
         # we don't know what the previous test left around in config or inc files
         # if it failed so we need a fresh start
         try:
@@ -116,8 +106,8 @@ be re-executed from a clean environment to ensure accurate results.")
                 if not result.status ==  0:
                     failed_extra_commands.append(command)
             if failed_extra_commands:
-                self.log.warning("tearDown commands have failed: %s" % ', '.join(map(str, failed_extra_commands)))
-                self.log.debug("Trying to move on.")
+                self.logger.warning("tearDown commands have failed: %s" % ', '.join(map(str, failed_extra_commands)))
+                self.logger.debug("Trying to move on.")
             self._extra_tear_down_commands = []
 
         if self._track_for_cleanup:
@@ -129,90 +119,92 @@ be re-executed from a clean environment to ensure accurate results.")
             self._track_for_cleanup = []
 
         self.tearDownLocal()
+        super(OESelftestTestCase, self).tearDown()
 
     def tearDownLocal(self):
         pass
 
-    # add test specific commands to the tearDown method.
     def add_command_to_tearDown(self, command):
-        self.log.debug("Adding command '%s' to tearDown for this test." % command)
+        """Add test specific commands to the tearDown method"""
+        self.logger.debug("Adding command '%s' to tearDown for this test." % command)
         self._extra_tear_down_commands.append(command)
-    # add test specific files or directories to be removed in the tearDown method
+
     def track_for_cleanup(self, path):
-        self.log.debug("Adding path '%s' to be cleaned up when test is over" % path)
+        """Add test specific files or directories to be removed in the tearDown method"""
+        self.logger.debug("Adding path '%s' to be cleaned up when test is over" % path)
         self._track_for_cleanup.append(path)
 
-    # write to <builddir>/conf/selftest.inc
     def write_config(self, data):
-        self.log.debug("Writing to: %s\n%s\n" % (self.testinc_path, data))
+        """Write to <builddir>/conf/selftest.inc"""
+
+        self.logger.debug("Writing to: %s\n%s\n" % (self.testinc_path, data))
         ftools.write_file(self.testinc_path, data)
 
         custommachine = os.getenv('CUSTOMMACHINE')
         if custommachine and 'MACHINE' in data:
             machine = get_bb_var('MACHINE')
-            self.log.warning('MACHINE overridden: %s' % machine)
+            self.logger.warning('MACHINE overridden: %s' % machine)
 
-    # append to <builddir>/conf/selftest.inc
     def append_config(self, data):
-        self.log.debug("Appending to: %s\n%s\n" % (self.testinc_path, data))
+        """Append to <builddir>/conf/selftest.inc"""
+        self.logger.debug("Appending to: %s\n%s\n" % (self.testinc_path, data))
         ftools.append_file(self.testinc_path, data)
 
         custommachine = os.getenv('CUSTOMMACHINE')
         if custommachine and 'MACHINE' in data:
             machine = get_bb_var('MACHINE')
-            self.log.warning('MACHINE overridden: %s' % machine)
+            self.logger.warning('MACHINE overridden: %s' % machine)
 
-    # remove data from <builddir>/conf/selftest.inc
     def remove_config(self, data):
-        self.log.debug("Removing from: %s\n%s\n" % (self.testinc_path, data))
+        """Remove data from <builddir>/conf/selftest.inc"""
+        self.logger.debug("Removing from: %s\n%s\n" % (self.testinc_path, data))
         ftools.remove_from_file(self.testinc_path, data)
 
-    # write to meta-sefltest/recipes-test/<recipe>/test_recipe.inc
     def write_recipeinc(self, recipe, data):
+        """Write to meta-sefltest/recipes-test/<recipe>/test_recipe.inc"""
         inc_file = os.path.join(self.testlayer_path, 'recipes-test', recipe, 'test_recipe.inc')
-        self.log.debug("Writing to: %s\n%s\n" % (inc_file, data))
+        self.logger.debug("Writing to: %s\n%s\n" % (inc_file, data))
         ftools.write_file(inc_file, data)
 
-    # append data to meta-sefltest/recipes-test/<recipe>/test_recipe.inc
     def append_recipeinc(self, recipe, data):
+        """Append data to meta-sefltest/recipes-test/<recipe>/test_recipe.inc"""
         inc_file = os.path.join(self.testlayer_path, 'recipes-test', recipe, 'test_recipe.inc')
-        self.log.debug("Appending to: %s\n%s\n" % (inc_file, data))
+        self.logger.debug("Appending to: %s\n%s\n" % (inc_file, data))
         ftools.append_file(inc_file, data)
 
-    # remove data from meta-sefltest/recipes-test/<recipe>/test_recipe.inc
     def remove_recipeinc(self, recipe, data):
+        """Remove data from meta-sefltest/recipes-test/<recipe>/test_recipe.inc"""
         inc_file = os.path.join(self.testlayer_path, 'recipes-test', recipe, 'test_recipe.inc')
-        self.log.debug("Removing from: %s\n%s\n" % (inc_file, data))
+        self.logger.debug("Removing from: %s\n%s\n" % (inc_file, data))
         ftools.remove_from_file(inc_file, data)
 
-    # delete meta-sefltest/recipes-test/<recipe>/test_recipe.inc file
     def delete_recipeinc(self, recipe):
+        """Delete meta-sefltest/recipes-test/<recipe>/test_recipe.inc file"""
         inc_file = os.path.join(self.testlayer_path, 'recipes-test', recipe, 'test_recipe.inc')
-        self.log.debug("Deleting file: %s" % inc_file)
+        self.logger.debug("Deleting file: %s" % inc_file)
         try:
             os.remove(inc_file)
         except OSError as e:
             if e.errno != errno.ENOENT:
                 raise
-
-    # write to <builddir>/conf/bblayers.inc
     def write_bblayers_config(self, data):
-        self.log.debug("Writing to: %s\n%s\n" % (self.testinc_bblayers_path, data))
+        """Write to <builddir>/conf/bblayers.inc"""
+        self.logger.debug("Writing to: %s\n%s\n" % (self.testinc_bblayers_path, data))
         ftools.write_file(self.testinc_bblayers_path, data)
 
-    # append to <builddir>/conf/bblayers.inc
     def append_bblayers_config(self, data):
-        self.log.debug("Appending to: %s\n%s\n" % (self.testinc_bblayers_path, data))
+        """Append to <builddir>/conf/bblayers.inc"""
+        self.logger.debug("Appending to: %s\n%s\n" % (self.testinc_bblayers_path, data))
         ftools.append_file(self.testinc_bblayers_path, data)
 
-    # remove data from <builddir>/conf/bblayers.inc
     def remove_bblayers_config(self, data):
-        self.log.debug("Removing from: %s\n%s\n" % (self.testinc_bblayers_path, data))
+        """Remove data from <builddir>/conf/bblayers.inc"""
+        self.logger.debug("Removing from: %s\n%s\n" % (self.testinc_bblayers_path, data))
         ftools.remove_from_file(self.testinc_bblayers_path, data)
 
-    # write to <builddir>/conf/machine.inc
     def set_machine_config(self, data):
-        self.log.debug("Writing to: %s\n%s\n" % (self.machineinc_path, data))
+        """Write to <builddir>/conf/machine.inc"""
+        self.logger.debug("Writing to: %s\n%s\n" % (self.machineinc_path, data))
         ftools.write_file(self.machineinc_path, data)
 
     # check does path exist    
@@ -227,7 +219,6 @@ be re-executed from a clean environment to ensure accurate results.")
             msg = self._formatMessage(msg, "%s exists when it should not" % safe_repr(expr))
             raise self.failureException(msg)
 
-
 def get_available_machines():
     # Get a list of all available machines
     bbpath = get_bb_var('BBPATH').split(':')
@@ -237,7 +228,7 @@ def get_available_machines():
         found_machines = glob.glob(os.path.join(path, 'conf', 'machine', '*.conf'))
         if found_machines:
             for i in found_machines:
-                # eg: '/home/<user>/poky/meta-intel/conf/machine/intel-core2-32.conf'
+            # eg: '/home/<user>/poky/meta-intel/conf/machine/intel-core2-32.conf'
                 machines.append(os.path.splitext(os.path.basename(i))[0])
 
     return machines
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 31/36] scripts/oe-selftest: Move {add, remove}_include files to case
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (29 preceding siblings ...)
  2017-05-26 20:37 ` [PATCH 30/36] oeqa/selftest/case: Migrate case class to the new OEQA framework Aníbal Limón
@ 2017-05-26 20:37 ` Aníbal Limón
  2017-05-26 20:37 ` [PATCH 32/36] oeqa/selftest/case.py: Remove machine selection logic Aníbal Limón
                   ` (6 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

From: Leonardo Sandoval <leonardo.sandoval.gonzalez@linux.intel.com>

The oe-selftest creates include files to store custom configuration to
make specific tests, every class executes a different test and may be
uses custom configuration.

So move to case class in order to simplify oe-selftest script and later
implement later a build folder per class.

Signed-off-by: Leonardo Sandoval <leonardo.sandoval.gonzalez@linux.intel.com>
Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
 meta/lib/oeqa/selftest/case.py | 76 ++++++++++++++++++++++++++++++++++++------
 scripts/oe-selftest            | 54 ------------------------------
 2 files changed, 66 insertions(+), 64 deletions(-)

diff --git a/meta/lib/oeqa/selftest/case.py b/meta/lib/oeqa/selftest/case.py
index 95a8769..ca95b7e 100644
--- a/meta/lib/oeqa/selftest/case.py
+++ b/meta/lib/oeqa/selftest/case.py
@@ -14,17 +14,17 @@ from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_test_layer
 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")
+    testlayer_path = get_test_layer()
+
     def __init__(self, methodName="runTest"):
-        self.builddir = os.environ.get("BUILDDIR")
-        self.localconf_path = os.path.join(self.builddir, "conf/local.conf")
-        self.localconf_backup = os.path.join(self.builddir, "conf/local.bk")
-        self.testinc_path = os.path.join(self.builddir, "conf/selftest.inc")
-        self.local_bblayers_path = os.path.join(self.builddir, "conf/bblayers.conf")
-        self.local_bblayers_backup = os.path.join(self.builddir,
-                                                  "conf/bblayers.bk")
-        self.testinc_bblayers_path = os.path.join(self.builddir, "conf/bblayers.inc")
-        self.machineinc_path = os.path.join(self.builddir, "conf/machine.inc")
-        self.testlayer_path = get_test_layer()
         self._extra_tear_down_commands = []
         self._track_for_cleanup = [
             self.testinc_path, self.testinc_bblayers_path,
@@ -33,6 +33,62 @@ class OESelftestTestCase(OETestCase):
 
         super(OESelftestTestCase, self).__init__(methodName)
 
+    @classmethod
+    def setUpClass(cls):
+        super(OESelftestTestCase, cls).setUpClass()
+        cls.add_include()
+
+    @classmethod
+    def tearDownClass(cls):
+        cls.remove_include()
+        cls.remove_inc_files()
+        super(OESelftestTestCase, cls).tearDownClass()
+
+    @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"), \
+                        "\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"), \
+                        "\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"), \
+                        "\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"), \
+                        "\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"))
+            for root, _, files in os.walk(get_test_layer()):
+                for f in files:
+                    if f == 'test_recipe.inc':
+                        os.remove(os.path.join(root, f))
+        except OSError as e:
+            pass
+
+        for incl_file in ['conf/bblayers.inc', 'conf/machine.inc']:
+            try:
+                os.remove(os.path.join(cls.builddir, incl_file))
+            except:
+                pass
+
     def setUp(self):
         super(OESelftestTestCase, self).setUp()
         os.chdir(self.builddir)
diff --git a/scripts/oe-selftest b/scripts/oe-selftest
index 52366b1..4909157 100755
--- a/scripts/oe-selftest
+++ b/scripts/oe-selftest
@@ -159,56 +159,6 @@ def preflight_check():
 
     return True
 
-def add_include():
-    global builddir
-    if "#include added by oe-selftest.py" \
-        not in ftools.read_file(os.path.join(builddir, "conf/local.conf")):
-            log.info("Adding: \"include selftest.inc\" in local.conf")
-            ftools.append_file(os.path.join(builddir, "conf/local.conf"), \
-                    "\n#include added by oe-selftest.py\ninclude machine.inc\ninclude selftest.inc")
-
-    if "#include added by oe-selftest.py" \
-        not in ftools.read_file(os.path.join(builddir, "conf/bblayers.conf")):
-            log.info("Adding: \"include bblayers.inc\" in bblayers.conf")
-            ftools.append_file(os.path.join(builddir, "conf/bblayers.conf"), \
-                    "\n#include added by oe-selftest.py\ninclude bblayers.inc")
-
-def remove_include():
-    global builddir
-    if builddir is None:
-        return
-    if "#include added by oe-selftest.py" \
-        in ftools.read_file(os.path.join(builddir, "conf/local.conf")):
-            log.info("Removing the include from local.conf")
-            ftools.remove_from_file(os.path.join(builddir, "conf/local.conf"), \
-                    "\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(builddir, "conf/bblayers.conf")):
-            log.info("Removing the include from bblayers.conf")
-            ftools.remove_from_file(os.path.join(builddir, "conf/bblayers.conf"), \
-                    "\n#include added by oe-selftest.py\ninclude bblayers.inc")
-
-def remove_inc_files():
-    global builddir
-    if builddir is None:
-        return
-    try:
-        os.remove(os.path.join(builddir, "conf/selftest.inc"))
-        for root, _, files in os.walk(get_test_layer()):
-            for f in files:
-                if f == 'test_recipe.inc':
-                    os.remove(os.path.join(root, f))
-    except OSError as e:
-        pass
-
-    for incl_file in ['conf/bblayers.inc', 'conf/machine.inc']:
-        try:
-            os.remove(os.path.join(builddir, incl_file))
-        except:
-            pass
-
-
 def get_tests_modules(include_hidden=False):
     modules_list = list()
     for modules_path in oeqa.selftest.__path__:
@@ -583,7 +533,6 @@ def main():
                 log.error("Failed to import %s" % test)
                 log.error(e)
                 return 1
-        add_include()
 
         if args.machine:
             # Custom machine sets only weak default values (??=) for MACHINE in machine.inc
@@ -808,7 +757,4 @@ if __name__ == "__main__":
         ret = 1
         import traceback
         traceback.print_exc()
-    finally:
-        remove_include()
-        remove_inc_files()
     sys.exit(ret)
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 32/36] oeqa/selftest/case.py: Remove machine selection logic
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (30 preceding siblings ...)
  2017-05-26 20:37 ` [PATCH 31/36] scripts/oe-selftest: Move {add, remove}_include files to case Aníbal Limón
@ 2017-05-26 20:37 ` Aníbal Limón
  2017-05-26 20:37 ` [PATCH 33/36] oeqa/selftest/case: Don't figure out the testlayer inside Aníbal Limón
                   ` (5 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

From: Leonardo Sandoval <leonardo.sandoval.gonzalez@linux.intel.com>

The machine selection is an operation that needs to be made
in every test run, the best place to it is on the context
module.

Use self.tc.custommachine variable instead of use environment.

SIgned-off-by: Leonardo Sandoval <leonardo.sandoval.gonzalez@linux.intel.com>
Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
 meta/lib/oeqa/selftest/case.py | 37 ++++---------------------------------
 1 file changed, 4 insertions(+), 33 deletions(-)

diff --git a/meta/lib/oeqa/selftest/case.py b/meta/lib/oeqa/selftest/case.py
index ca95b7e..1e6754a 100644
--- a/meta/lib/oeqa/selftest/case.py
+++ b/meta/lib/oeqa/selftest/case.py
@@ -6,7 +6,6 @@ import os
 import shutil
 import glob
 import errno
-from random import choice
 from unittest.util import safe_repr
 
 import oeqa.utils.ftools as ftools
@@ -135,16 +134,9 @@ to ensure accurate results.")
                 if e.errno != errno.ENOENT:
                     raise
 
-        # Get CUSTOMMACHINE from env (set by --machine argument to oe-selftest)
-        custommachine = os.getenv('CUSTOMMACHINE')
-        if custommachine:
-            if custommachine == 'random':
-                machine = get_random_machine()
-            else:
-                machine = custommachine
-            machine_conf = 'MACHINE ??= "%s"\n' % machine
+        if self.tc.custommachine:
+            machine_conf = 'MACHINE ??= "%s"\n' % self.tc.custommachine
             self.set_machine_config(machine_conf)
-            print('MACHINE: %s' % machine)
 
         # tests might need their own setup
         # but if they overwrite this one they have to call
@@ -196,8 +188,7 @@ to ensure accurate results.")
         self.logger.debug("Writing to: %s\n%s\n" % (self.testinc_path, data))
         ftools.write_file(self.testinc_path, data)
 
-        custommachine = os.getenv('CUSTOMMACHINE')
-        if custommachine and 'MACHINE' in data:
+        if self.tc.custommachine and 'MACHINE' in data:
             machine = get_bb_var('MACHINE')
             self.logger.warning('MACHINE overridden: %s' % machine)
 
@@ -206,8 +197,7 @@ to ensure accurate results.")
         self.logger.debug("Appending to: %s\n%s\n" % (self.testinc_path, data))
         ftools.append_file(self.testinc_path, data)
 
-        custommachine = os.getenv('CUSTOMMACHINE')
-        if custommachine and 'MACHINE' in data:
+        if self.tc.custommachine and 'MACHINE' in data:
             machine = get_bb_var('MACHINE')
             self.logger.warning('MACHINE overridden: %s' % machine)
 
@@ -274,22 +264,3 @@ to ensure accurate results.")
         if os.path.exists(expr):
             msg = self._formatMessage(msg, "%s exists when it should not" % safe_repr(expr))
             raise self.failureException(msg)
-
-def get_available_machines():
-    # Get a list of all available machines
-    bbpath = get_bb_var('BBPATH').split(':')
-    machines = []
-
-    for path in bbpath:
-        found_machines = glob.glob(os.path.join(path, 'conf', 'machine', '*.conf'))
-        if found_machines:
-            for i in found_machines:
-            # eg: '/home/<user>/poky/meta-intel/conf/machine/intel-core2-32.conf'
-                machines.append(os.path.splitext(os.path.basename(i))[0])
-
-    return machines
-
-
-def get_random_machine():
-    # Get a random machine
-    return choice(get_available_machines())
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 33/36] oeqa/selftest/case: Don't figure out the testlayer inside
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (31 preceding siblings ...)
  2017-05-26 20:37 ` [PATCH 32/36] oeqa/selftest/case.py: Remove machine selection logic Aníbal Limón
@ 2017-05-26 20:37 ` Aníbal Limón
  2017-05-26 20:38 ` [PATCH 34/36] scripts/oe-selftest: Migrate to new framework into oeqa.selftest.context Aníbal Limón
                   ` (4 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:37 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

The test layer is added at init of selftest and is the same
across test runs so pass it as a attr in the context.

Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
 meta/lib/oeqa/selftest/case.py | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/meta/lib/oeqa/selftest/case.py b/meta/lib/oeqa/selftest/case.py
index 1e6754a..31a11fd 100644
--- a/meta/lib/oeqa/selftest/case.py
+++ b/meta/lib/oeqa/selftest/case.py
@@ -9,7 +9,7 @@ import errno
 from unittest.util import safe_repr
 
 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.core.case import OETestCase
 
 class OESelftestTestCase(OETestCase):
@@ -21,7 +21,6 @@ class OESelftestTestCase(OETestCase):
     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")
-    testlayer_path = get_test_layer()
 
     def __init__(self, methodName="runTest"):
         self._extra_tear_down_commands = []
@@ -35,6 +34,7 @@ class OESelftestTestCase(OETestCase):
     @classmethod
     def setUpClass(cls):
         super(OESelftestTestCase, cls).setUpClass()
+        cls.testlayer_path = cls.tc.testlayer_path
         cls.add_include()
 
     @classmethod
@@ -75,7 +75,7 @@ class OESelftestTestCase(OETestCase):
     def remove_inc_files(cls):
         try:
             os.remove(os.path.join(cls.builddir, "conf/selftest.inc"))
-            for root, _, files in os.walk(get_test_layer()):
+            for root, _, files in os.walk(cls.testlayer_path):
                 for f in files:
                     if f == 'test_recipe.inc':
                         os.remove(os.path.join(root, f))
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 34/36] scripts/oe-selftest: Migrate to new framework into oeqa.selftest.context
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (32 preceding siblings ...)
  2017-05-26 20:37 ` [PATCH 33/36] oeqa/selftest/case: Don't figure out the testlayer inside Aníbal Limón
@ 2017-05-26 20:38 ` Aníbal Limón
  2017-05-26 20:38 ` [PATCH 35/36] oeqa/selftest/cases: Migrate test cases into the new oe-qa framework Aníbal Limón
                   ` (3 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:38 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

From: Leonardo Sandoval <leonardo.sandoval.gonzalez@linux.intel.com>

The new OEQA framework aims to re-use code into the different Test
components.

The previous oe-selftest implements it-self loading, run, and list test
cases in a non-standard way (unittest base) and other functionalities
like logging that is now on oeqa core. This ends on a compact oe-selftest
script.

All needed command line options was migrated but there are some of them
pending of implementation and others deprecated.

Deprecated options:

list-tags: The tag functionality into the old oeqa framework isn't
    work, the selftest doesn't has tag decorators.
{run, list}-tests-by: Ambiguos options it accepts all the posibilites module,
    class, name, id or tag.

Remaining to implement:

coverage: It enables covrage reports over a test run, currently isn't on
    on use and some bugs [1], i filed a bug to add support to OEQA core module in
    this way other Test components could enable it.
repository: It push XML results into a git repository and isn't in use,
    i filed a bug to implement this into OEQA core module. [2]

[1] https://bugzilla.yoctoproject.org/show_bug.cgi?id=11582#c0
[2] https://bugzilla.yoctoproject.org/show_bug.cgi?id=11583#c0

Signed-off-by: Leonardo Sandoval <leonardo.sandoval.gonzalez@linux.intel.com>
Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
 meta/lib/oeqa/selftest/context.py | 224 ++++++++++++
 scripts/oe-selftest               | 737 ++------------------------------------
 2 files changed, 250 insertions(+), 711 deletions(-)
 create mode 100644 meta/lib/oeqa/selftest/context.py

diff --git a/meta/lib/oeqa/selftest/context.py b/meta/lib/oeqa/selftest/context.py
new file mode 100644
index 0000000..ca73070
--- /dev/null
+++ b/meta/lib/oeqa/selftest/context.py
@@ -0,0 +1,224 @@
+# Copyright (C) 2017 Intel Corporation
+# Released under the MIT license (see COPYING.MIT)
+
+import os
+import time
+import glob
+import sys
+import imp
+from random import choice
+
+import oeqa
+
+from oeqa.core.context import OETestContext, OETestContextExecutor
+from oeqa.core.exception import OEQAPreRun
+
+from oeqa.utils.commands import runCmd, get_bb_vars, get_test_layer
+
+class OESelftestTestContext(OETestContext):
+    def __init__(self, td=None, logger=None, machines=None, testlayer_path=None):
+        super(OESelftestTestContext, self).__init__(td, logger)
+
+        self.machines = machines
+        self.custommachine = None
+
+        self.testlayer_path = testlayer_path
+
+    def runTests(self, machine=None):
+        if machine:
+            self.custommachine = machine
+            if machine == 'random':
+                self.custommachine = choice(self.machines)
+            self.logger.info('Run tests with custom MACHINE set to: %s' % \
+                    self.custommachine)
+        return super(OESelftestTestContext, self).runTests()
+
+    def listTests(self, display_type, machine=None):
+        return super(OESelftestTestContext, self).listTests(display_type)
+
+class OESelftestTestContextExecutor(OETestContextExecutor):
+    _context_class = OESelftestTestContext
+    _script_executor = 'oe-selftest'
+
+    name = 'oe-selftest'
+    help = 'oe-selftest test component'
+    description = 'Executes selftest tests'
+
+    def register_commands(self, logger, parser):
+        group = parser.add_mutually_exclusive_group(required=True)
+
+        group.add_argument('-a', '--run-all-tests', default=False,
+                action="store_true", dest="run_all_tests",
+                help='Run all (unhidden) tests')
+        group.add_argument('-r', '--run-tests', required=False, action='store',
+                nargs='+', dest="run_tests", default=None,
+                help='Select what tests to run (modules, classes or test methods). Format should be: <module>.<class>.<test_method>')
+
+        group.add_argument('-m', '--list-modules', required=False,
+                action="store_true", default=False,
+                help='List all available test modules.')
+        group.add_argument('--list-classes', required=False,
+                action="store_true", default=False,
+                help='List all available test classes.')
+        group.add_argument('-l', '--list-tests', required=False,
+                action="store_true", default=False,
+                help='List all available tests.')
+
+        parser.add_argument('--machine', required=False, choices=['random', 'all'],
+                            help='Run tests on different machines (random/all).')
+        
+        parser.set_defaults(func=self.run)
+
+    def _get_available_machines(self):
+        machines = []
+
+        bbpath = self.tc_kwargs['init']['td']['BBPATH'].split(':')
+    
+        for path in bbpath:
+            found_machines = glob.glob(os.path.join(path, 'conf', 'machine', '*.conf'))
+            if found_machines:
+                for i in found_machines:
+                    # eg: '/home/<user>/poky/meta-intel/conf/machine/intel-core2-32.conf'
+                    machines.append(os.path.splitext(os.path.basename(i))[0])
+    
+        return machines
+
+    def _get_cases_paths(self, bbpath):
+        cases_paths = []
+        for layer in bbpath:
+            cases_dir = os.path.join(layer, 'lib', 'oeqa', 'selftest', 'cases')
+            if os.path.isdir(cases_dir):
+                cases_paths.append(cases_dir)
+        return cases_paths
+
+    def _process_args(self, logger, args):
+        args.output_log = '%s-results-%s.log' % (self.name,
+                time.strftime("%Y%m%d%H%M%S"))
+        args.test_data_file = None
+        args.CASES_PATHS = None
+
+        super(OESelftestTestContextExecutor, self)._process_args(logger, args)
+
+        if args.list_modules:
+            args.list_tests = 'module'
+        elif args.list_classes:
+            args.list_tests = 'class'
+        elif args.list_tests:
+            args.list_tests = 'name'
+
+        self.tc_kwargs['init']['td'] = get_bb_vars()
+        self.tc_kwargs['init']['machines'] = self._get_available_machines()
+        self.tc_kwargs['init']['testlayer_path'] = get_test_layer()
+
+    def _pre_run(self):
+        def _check_required_env_variables(vars):
+            for var in vars:
+                if not os.environ.get(var):
+                    self.tc.logger.error("%s is not set. Did you forget to source your build environment setup script?" % var)
+                    raise OEQAPreRun
+
+        def _check_presence_meta_selftest():
+            builddir = os.environ.get("BUILDDIR")
+            if os.getcwd() != builddir:
+                self.tc.logger.info("Changing cwd to %s" % builddir)
+                os.chdir(builddir)
+
+            if not "meta-selftest" in self.tc.td["BBLAYERS"]:
+                self.tc.logger.warn("meta-selftest layer not found in BBLAYERS, adding it")
+                meta_selftestdir = os.path.join(
+                    self.tc.td["BBLAYERS_FETCH_DIR"], 'meta-selftest')
+                if os.path.isdir(meta_selftestdir):
+                    runCmd("bitbake-layers add-layer %s" %meta_selftestdir)
+                    # reload data is needed because a meta-selftest layer was add
+                    self.tc.td = get_bb_vars()
+                else:
+                    self.tc.logger.error("could not locate meta-selftest in:\n%s" % meta_selftestdir)
+                    raise OEQAPreRun
+
+        def _add_layer_libs():
+            bbpath = self.tc.td['BBPATH'].split(':')
+            layer_libdirs = [p for p in (os.path.join(l, 'lib') \
+                    for l in bbpath) if os.path.exists(p)]
+            if layer_libdirs:
+                self.tc.logger.info("Adding layer libraries:")
+                for l in layer_libdirs:
+                    self.tc.logger.info("\t%s" % l)
+
+                sys.path.extend(layer_libdirs)
+                imp.reload(oeqa.selftest)
+
+        _check_required_env_variables(["BUILDDIR"])
+        _check_presence_meta_selftest()
+
+        if "buildhistory.bbclass" in self.tc.td["BBINCLUDED"]:
+            self.tc.logger.error("You have buildhistory enabled already and this isn't recommended for selftest, please disable it first.")
+            raise OEQAPreRun
+
+        if "PRSERV_HOST" in self.tc.td:
+            self.tc.logger.error("Please unset PRSERV_HOST in order to run oe-selftest")
+            raise OEQAPreRun
+
+        if "SANITY_TESTED_DISTROS" in self.tc.td:
+            self.tc.logger.error("Please unset SANITY_TESTED_DISTROS in order to run oe-selftest")
+            raise OEQAPreRun
+
+        _add_layer_libs()
+
+        self.tc.logger.info("Running bitbake -p")
+        runCmd("bitbake -p")
+
+    def _internal_run(self, logger, args):
+        self.module_paths = self._get_cases_paths(
+                self.tc_kwargs['init']['td']['BBPATH'].split(':'))
+
+        self.tc = self._context_class(**self.tc_kwargs['init'])
+        self.tc.loadTests(self.module_paths, **self.tc_kwargs['load'])
+
+        if args.list_tests:
+            rc = self.tc.listTests(args.list_tests, **self.tc_kwargs['run'])
+        else:
+            self._pre_run()
+            rc = self.tc.runTests(**self.tc_kwargs['run'])
+            rc.logSummary(self.name)
+            rc.logDetails()
+
+        return rc
+    
+    def run(self, logger, args):
+        self._process_args(logger, args)
+        rc = None
+
+        if args.machine:
+            logger.info('Custom machine mode enabled. MACHINE set to %s' %
+                    args.machine)
+
+            if args.machine == 'all':
+                results = []
+                for m in self.tc_kwargs['init']['machines']:
+                    self.tc_kwargs['run']['machine'] = m
+                    results.append(self._internal_run(logger, args))
+
+                    # XXX: the oe-selftest script only needs to know if one
+                    # machine run fails
+                    for r in results:
+                        rc = r
+                        if not r.wasSuccessful():
+                            break
+
+            else:
+                self.tc_kwargs['run']['machine'] = args.machine
+                return self._internal_run(logger, args)
+
+        else:
+            self.tc_kwargs['run']['machine'] = args.machine
+            rc = self._internal_run(logger, args)
+
+        output_link = os.path.join(os.path.dirname(args.output_log),
+                "%s-results.log" % self.name)
+        if os.path.exists(output_link):
+            os.remove(output_link)
+        os.symlink(args.output_log, output_link)
+
+        return rc
+
+_executor_class = OESelftestTestContextExecutor
diff --git a/scripts/oe-selftest b/scripts/oe-selftest
index 4909157..b200ace 100755
--- a/scripts/oe-selftest
+++ b/scripts/oe-selftest
@@ -1,6 +1,6 @@
 #!/usr/bin/env python3
 
-# Copyright (c) 2013 Intel Corporation
+# Copyright (c) 2013-2017 Intel Corporation
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License version 2 as
@@ -25,732 +25,47 @@
 # E.g: "oe-selftest -r bblayers.BitbakeLayers" will run just the BitbakeLayers class from meta/lib/oeqa/selftest/bblayers.py
 
 
+
 import os
 import sys
-import unittest
-import logging
 import argparse
-import subprocess
-import time as t
-import re
-import fnmatch
-import collections
-import imp
+import logging
 
-sys.path.insert(0, os.path.dirname(os.path.realpath(__file__)) + '/lib')
+scripts_path = os.path.dirname(os.path.realpath(__file__))
+lib_path = scripts_path + '/lib'
+sys.path = sys.path + [lib_path]
+import argparse_oe
+import scriptutils
 import scriptpath
-scriptpath.add_bitbake_lib_path()
 scriptpath.add_oe_lib_path()
-import argparse_oe
-
-import oeqa.selftest
-import oeqa.utils.ftools as ftools
-from oeqa.utils.commands import runCmd, get_bb_var, get_test_layer
-from oeqa.utils.metadata import metadata_from_bb, write_metadata_file
-from oeqa.selftest.base import oeSelfTest, get_available_machines
-
-try:
-    import xmlrunner
-    from xmlrunner.result import _XMLTestResult as TestResult
-    from xmlrunner import XMLTestRunner as _TestRunner
-except ImportError:
-    # use the base runner instead
-    from unittest import TextTestResult as TestResult
-    from unittest import TextTestRunner as _TestRunner
-
-log_prefix = "oe-selftest-" + t.strftime("%Y%m%d-%H%M%S")
-
-def logger_create():
-    log_file = log_prefix + ".log"
-    if os.path.lexists("oe-selftest.log"):
-        os.remove("oe-selftest.log")
-    os.symlink(log_file, "oe-selftest.log")
-
-    log = logging.getLogger("selftest")
-    log.setLevel(logging.DEBUG)
-
-    fh = logging.FileHandler(filename=log_file, mode='w')
-    fh.setLevel(logging.DEBUG)
-
-    ch = logging.StreamHandler(sys.stdout)
-    ch.setLevel(logging.INFO)
-
-    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
-    fh.setFormatter(formatter)
-    ch.setFormatter(formatter)
-
-    log.addHandler(fh)
-    log.addHandler(ch)
+scriptpath.add_bitbake_lib_path()
 
-    return log
+from oeqa.utils import load_test_components
+from oeqa.core.exception import OEQAPreRun
 
-log = logger_create()
+logger = scriptutils.logger_create('oe-selftest')
 
-def get_args_parser():
+def main():
     description = "Script that runs unit tests against bitbake and other Yocto related tools. The goal is to validate tools functionality and metadata integrity. Refer to https://wiki.yoctoproject.org/wiki/Oe-selftest for more information."
     parser = argparse_oe.ArgumentParser(description=description)
-    group = parser.add_mutually_exclusive_group(required=True)
-    group.add_argument('-r', '--run-tests', required=False, action='store', nargs='*', dest="run_tests", default=None, help='Select what tests to run (modules, classes or test methods). Format should be: <module>.<class>.<test_method>')
-    group.add_argument('-a', '--run-all-tests', required=False, action="store_true", dest="run_all_tests", default=False, help='Run all (unhidden) tests')
-    group.add_argument('-m', '--list-modules', required=False, action="store_true", dest="list_modules", default=False, help='List all available test modules.')
-    group.add_argument('--list-classes', required=False, action="store_true", dest="list_allclasses", default=False, help='List all available test classes.')
-    parser.add_argument('--coverage', action="store_true", help="Run code coverage when testing")
-    parser.add_argument('--coverage-source', dest="coverage_source", nargs="+", help="Specifiy the directories to take coverage from")
-    parser.add_argument('--coverage-include', dest="coverage_include", nargs="+", help="Specify extra patterns to include into the coverage measurement")
-    parser.add_argument('--coverage-omit', dest="coverage_omit", nargs="+", help="Specify with extra patterns to exclude from the coverage measurement")
-    group.add_argument('--run-tests-by', required=False, dest='run_tests_by', default=False, nargs='*',
-                       help='run-tests-by <name|class|module|id|tag> <list of tests|classes|modules|ids|tags>')
-    group.add_argument('--list-tests-by', required=False, dest='list_tests_by', default=False, nargs='*',
-                       help='list-tests-by <name|class|module|id|tag> <list of tests|classes|modules|ids|tags>')
-    group.add_argument('-l', '--list-tests', required=False,  action="store_true", dest="list_tests", default=False,
-                       help='List all available tests.')
-    group.add_argument('--list-tags', required=False, dest='list_tags', default=False, action="store_true",
-                       help='List all tags that have been set to test cases.')
-    parser.add_argument('--machine', required=False, dest='machine', choices=['random', 'all'], default=None,
-                        help='Run tests on different machines (random/all).')
-    parser.add_argument('--repository', required=False, dest='repository', default='', action='store',
-                        help='Submit test results to a repository')
-    return parser
-
-builddir = None
-
-
-def preflight_check():
-
-    global builddir
-
-    log.info("Checking that everything is in order before running the tests")
-
-    if not os.environ.get("BUILDDIR"):
-        log.error("BUILDDIR isn't set. Did you forget to source your build environment setup script?")
-        return False
-
-    builddir = os.environ.get("BUILDDIR")
-    if os.getcwd() != builddir:
-        log.info("Changing cwd to %s" % builddir)
-        os.chdir(builddir)
-
-    if not "meta-selftest" in get_bb_var("BBLAYERS"):
-        log.warn("meta-selftest layer not found in BBLAYERS, adding it")
-        meta_selftestdir = os.path.join(
-                get_bb_var("BBLAYERS_FETCH_DIR"),
-                'meta-selftest')
-        if os.path.isdir(meta_selftestdir):
-            runCmd("bitbake-layers add-layer %s" %meta_selftestdir)
-        else:
-            log.error("could not locate meta-selftest in:\n%s"
-                    %meta_selftestdir)
-            return False
-
-    if "buildhistory.bbclass" in get_bb_var("BBINCLUDED"):
-        log.error("You have buildhistory enabled already and this isn't recommended for selftest, please disable it first.")
-        return False
-
-    if get_bb_var("PRSERV_HOST"):
-        log.error("Please unset PRSERV_HOST in order to run oe-selftest")
-        return False
-
-    if get_bb_var("SANITY_TESTED_DISTROS"):
-        log.error("Please unset SANITY_TESTED_DISTROS in order to run oe-selftest")
-        return False
-
-    log.info("Running bitbake -p")
-    runCmd("bitbake -p")
-
-    return True
 
-def get_tests_modules(include_hidden=False):
-    modules_list = list()
-    for modules_path in oeqa.selftest.__path__:
-        for (p, d, f) in os.walk(modules_path):
-            files = sorted([f for f in os.listdir(p) if f.endswith('.py') and not (f.startswith('_') and not include_hidden) and not f.startswith('__') and f != 'base.py'])
-            for f in files:
-                submodules = p.split("selftest")[-1]
-                module = ""
-                if submodules:
-                    module = 'oeqa.selftest' + submodules.replace("/",".") + "." + f.split('.py')[0]
-                else:
-                    module = 'oeqa.selftest.' + f.split('.py')[0]
-                if module not in modules_list:
-                    modules_list.append(module)
-    return modules_list
-
-
-def get_tests(exclusive_modules=[], include_hidden=False):
-    test_modules = list()
-    for x in exclusive_modules:
-        test_modules.append('oeqa.selftest.' + x)
-    if not test_modules:
-        inc_hidden = include_hidden
-        test_modules = get_tests_modules(inc_hidden)
-
-    return test_modules
-
-
-class Tc:
-    def __init__(self, tcname, tcclass, tcmodule, tcid=None, tctag=None):
-        self.tcname = tcname
-        self.tcclass = tcclass
-        self.tcmodule = tcmodule
-        self.tcid = tcid
-        # A test case can have multiple tags (as tuples) otherwise str will suffice
-        self.tctag = tctag
-        self.fullpath = '.'.join(['oeqa', 'selftest', tcmodule, tcclass, tcname])
-
-
-def get_tests_from_module(tmod):
-    tlist = []
-    prefix = 'oeqa.selftest.'
+    comp_name, comp = load_test_components(logger, 'oe-selftest').popitem()
+    comp.register_commands(logger, parser)
 
     try:
-        import importlib
-        modlib = importlib.import_module(tmod)
-        for mod in list(vars(modlib).values()):
-            if isinstance(mod, type(oeSelfTest)) and issubclass(mod, oeSelfTest) and mod is not oeSelfTest:
-                for test in dir(mod):
-                    if test.startswith('test_') and hasattr(vars(mod)[test], '__call__'):
-                        # Get test case id and feature tag
-                        # NOTE: if testcase decorator or feature tag not set will throw error
-                        try:
-                            tid = vars(mod)[test].test_case
-                        except:
-                            print('DEBUG: tc id missing for ' + str(test))
-                            tid = None
-                        try:
-                            ttag = vars(mod)[test].tag__feature
-                        except:
-                            # print('DEBUG: feature tag missing for ' + str(test))
-                            ttag = None
-
-                        # NOTE: for some reason lstrip() doesn't work for mod.__module__
-                        tlist.append(Tc(test, mod.__name__, mod.__module__.replace(prefix, ''), tid, ttag))
-    except:
-        pass
-
-    return tlist
-
-
-def get_all_tests():
-    # Get all the test modules (except the hidden ones)
-    testlist = []
-    tests_modules = get_tests_modules()
-    # Get all the tests from modules
-    for tmod in sorted(tests_modules):
-        testlist += get_tests_from_module(tmod)
-    return testlist
-
-
-def get_testsuite_by(criteria, keyword):
-    # Get a testsuite based on 'keyword'
-    # criteria: name, class, module, id, tag
-    # keyword: a list of tests, classes, modules, ids, tags
-
-    ts = []
-    all_tests = get_all_tests()
-
-    def get_matches(values):
-        # Get an item and return the ones that match with keyword(s)
-        # values: the list of items (names, modules, classes...)
-        result = []
-        remaining = values[:]
-        for key in keyword:
-            found = False
-            if key in remaining:
-                # Regular matching of exact item
-                result.append(key)
-                remaining.remove(key)
-                found = True
-            else:
-                # Wildcard matching
-                pattern = re.compile(fnmatch.translate(r"%s" % key))
-                added = [x for x in remaining if pattern.match(x)]
-                if added:
-                    result.extend(added)
-                    remaining = [x for x in remaining if x not in added]
-                    found = True
-            if not found:
-                log.error("Failed to find test: %s" % key)
-
-        return result
-
-    if criteria == 'name':
-        names = get_matches([ tc.tcname for tc in all_tests ])
-        ts = [ tc for tc in all_tests if tc.tcname in names ]
-
-    elif criteria == 'class':
-        classes = get_matches([ tc.tcclass for tc in all_tests ])
-        ts = [ tc for tc in all_tests if tc.tcclass in classes ]
-
-    elif criteria == 'module':
-        modules = get_matches([ tc.tcmodule for tc in all_tests ])
-        ts = [ tc for tc in all_tests if tc.tcmodule in modules ]
-
-    elif criteria == 'id':
-        ids = get_matches([ str(tc.tcid) for tc in all_tests ])
-        ts = [ tc for tc in all_tests if str(tc.tcid) in ids ]
-
-    elif criteria == 'tag':
-        values = set()
-        for tc in all_tests:
-            # tc can have multiple tags (as tuple) otherwise str will suffice
-            if isinstance(tc.tctag, tuple):
-                values |= { str(tag) for tag in tc.tctag }
-            else:
-                values.add(str(tc.tctag))
-
-        tags = get_matches(list(values))
-
-        for tc in all_tests:
-            for tag in tags:
-                if isinstance(tc.tctag, tuple) and tag in tc.tctag:
-                    ts.append(tc)
-                elif tag == tc.tctag:
-                    ts.append(tc)
-
-        # Remove duplicates from the list
-        ts = list(set(ts))
-
-    return ts
-
-
-def list_testsuite_by(criteria, keyword):
-    # Get a testsuite based on 'keyword'
-    # criteria: name, class, module, id, tag
-    # keyword: a list of tests, classes, modules, ids, tags
-    def tc_key(t):
-        if t[0] is None:
-            return  (0,) + t[1:]
-        return t
-    # tcid may be None if no ID was assigned, in which case sorted() will throw
-    # a TypeError as Python 3 does not allow comparison (<,<=,>=,>) of
-    # heterogeneous types, handle this by using a custom key generator
-    ts = sorted([ (tc.tcid, tc.tctag, tc.tcname, tc.tcclass, tc.tcmodule) \
-                  for tc in get_testsuite_by(criteria, keyword) ], key=tc_key)
-    print('_' * 150)
-    for t in ts:
-        if isinstance(t[1], (tuple, list)):
-            print('%-4s\t%-20s\t%-60s\t%-25s\t%-20s' % (t[0], ', '.join(t[1]), t[2], t[3], t[4]))
-        else:
-            print('%-4s\t%-20s\t%-60s\t%-25s\t%-20s' % t)
-    print('_' * 150)
-    print('Filtering by:\t %s' % criteria)
-    print('Looking for:\t %s' % ', '.join(str(x) for x in keyword))
-    print('Total found:\t %s' % len(ts))
-
-
-def list_tests():
-    # List all available oe-selftest tests
-
-    ts = get_all_tests()
-
-    print('%-4s\t%-10s\t%-50s' % ('id', 'tag', 'test'))
-    print('_' * 80)
-    for t in ts:
-        if isinstance(t.tctag, (tuple, list)):
-            print('%-4s\t%-10s\t%-50s' % (t.tcid, ', '.join(t.tctag), '.'.join([t.tcmodule, t.tcclass, t.tcname])))
-        else:
-            print('%-4s\t%-10s\t%-50s' % (t.tcid, t.tctag, '.'.join([t.tcmodule, t.tcclass, t.tcname])))
-    print('_' * 80)
-    print('Total found:\t %s' % len(ts))
-
-def list_tags():
-    # Get all tags set to test cases
-    # This is useful when setting tags to test cases
-    # The list of tags should be kept as minimal as possible
-    tags = set()
-    all_tests = get_all_tests()
-
-    for tc in all_tests:
-        if isinstance(tc.tctag, (tuple, list)):
-            tags.update(set(tc.tctag))
-        else:
-            tags.add(tc.tctag)
-
-    print('Tags:\t%s' % ', '.join(str(x) for x in tags))
-
-def coverage_setup(coverage_source, coverage_include, coverage_omit):
-    """ Set up the coverage measurement for the testcases to be run """
-    import datetime
-    import subprocess
-    global builddir
-    pokydir = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
-    curcommit= subprocess.check_output(["git", "--git-dir", os.path.join(pokydir, ".git"), "rev-parse", "HEAD"]).decode('utf-8')
-    coveragerc = "%s/.coveragerc" % builddir
-    data_file = "%s/.coverage." % builddir
-    data_file += datetime.datetime.now().strftime('%Y%m%dT%H%M%S')
-    if os.path.isfile(data_file):
-        os.remove(data_file)
-    with open(coveragerc, 'w') as cps:
-        cps.write("# Generated with command '%s'\n" % " ".join(sys.argv))
-        cps.write("# HEAD commit %s\n" % curcommit.strip())
-        cps.write("[run]\n")
-        cps.write("data_file = %s\n" % data_file)
-        cps.write("branch = True\n")
-        # Measure just BBLAYERS, scripts and bitbake folders
-        cps.write("source = \n")
-        if coverage_source:
-            for directory in coverage_source:
-                if not os.path.isdir(directory):
-                    log.warn("Directory %s is not valid.", directory)
-                cps.write("    %s\n" % directory)
-        else:
-            for layer in get_bb_var('BBLAYERS').split():
-                cps.write("    %s\n" % layer)
-            cps.write("    %s\n" % os.path.dirname(os.path.realpath(__file__)))
-            cps.write("    %s\n" % os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))),'bitbake'))
-
-        if coverage_include:
-            cps.write("include = \n")
-            for pattern in coverage_include:
-                cps.write("    %s\n" % pattern)
-        if coverage_omit:
-            cps.write("omit = \n")
-            for pattern in coverage_omit:
-                cps.write("    %s\n" % pattern)
-
-        return coveragerc
-
-def coverage_report():
-    """ Loads the coverage data gathered and reports it back """
-    try:
-        # Coverage4 uses coverage.Coverage
-        from coverage import Coverage
-    except:
-        # Coverage under version 4 uses coverage.coverage
-        from coverage import coverage as Coverage
-
-    import io as StringIO
-    from coverage.misc import CoverageException
-
-    cov_output = StringIO.StringIO()
-    # Creating the coverage data with the setting from the configuration file
-    cov = Coverage(config_file = os.environ.get('COVERAGE_PROCESS_START'))
-    try:
-        # Load data from the data file specified in the configuration
-        cov.load()
-        # Store report data in a StringIO variable
-        cov.report(file = cov_output, show_missing=False)
-        log.info("\n%s" % cov_output.getvalue())
-    except CoverageException as e:
-        # Show problems with the reporting. Since Coverage4 not finding  any data to report raises an exception
-        log.warn("%s" % str(e))
-    finally:
-        cov_output.close()
-
-
-def main():
-    parser = get_args_parser()
-    args = parser.parse_args()
-
-    # Add <layer>/lib to sys.path, so layers can add selftests
-    log.info("Running bitbake -e to get BBPATH")
-    bbpath = get_bb_var('BBPATH').split(':')
-    layer_libdirs = [p for p in (os.path.join(l, 'lib') for l in bbpath) if os.path.exists(p)]
-    sys.path.extend(layer_libdirs)
-    imp.reload(oeqa.selftest)
-
-    # act like bitbake and enforce en_US.UTF-8 locale
-    os.environ["LC_ALL"] = "en_US.UTF-8"
-
-    if args.run_tests_by and len(args.run_tests_by) >= 2:
-        valid_options = ['name', 'class', 'module', 'id', 'tag']
-        if args.run_tests_by[0] not in valid_options:
-            print('--run-tests-by %s not a valid option. Choose one of <name|class|module|id|tag>.' % args.run_tests_by[0])
-            return 1
-        else:
-            criteria = args.run_tests_by[0]
-            keyword = args.run_tests_by[1:]
-            ts = sorted([ tc.fullpath for tc in get_testsuite_by(criteria, keyword) ])
-        if not ts:
-            return 1
-
-    if args.list_tests_by and len(args.list_tests_by) >= 2:
-        valid_options = ['name', 'class', 'module', 'id', 'tag']
-        if args.list_tests_by[0] not in valid_options:
-            print('--list-tests-by %s not a valid option. Choose one of <name|class|module|id|tag>.' % args.list_tests_by[0])
-            return 1
-        else:
-            criteria = args.list_tests_by[0]
-            keyword = args.list_tests_by[1:]
-            list_testsuite_by(criteria, keyword)
-
-    if args.list_tests:
-        list_tests()
-
-    if args.list_tags:
-        list_tags()
-
-    if args.list_allclasses:
-        args.list_modules = True
-
-    if args.list_modules:
-        log.info('Listing all available test modules:')
-        testslist = get_tests(include_hidden=True)
-        for test in testslist:
-            module = test.split('oeqa.selftest.')[-1]
-            info = ''
-            if module.startswith('_'):
-                info = ' (hidden)'
-            print(module + info)
-            if args.list_allclasses:
-                try:
-                    import importlib
-                    modlib = importlib.import_module(test)
-                    for v in vars(modlib):
-                        t = vars(modlib)[v]
-                        if isinstance(t, type(oeSelfTest)) and issubclass(t, oeSelfTest) and t!=oeSelfTest:
-                            print(" --", v)
-                            for method in dir(t):
-                                if method.startswith("test_") and isinstance(vars(t)[method], collections.Callable):
-                                    print(" --  --", method)
-
-                except (AttributeError, ImportError) as e:
-                    print(e)
-                    pass
-
-    if args.run_tests or args.run_all_tests or args.run_tests_by:
-        if not preflight_check():
-            return 1
-
-        if args.run_tests_by:
-            testslist = ts
-        else:
-            testslist = get_tests(exclusive_modules=(args.run_tests or []), include_hidden=False)
-
-        suite = unittest.TestSuite()
-        loader = unittest.TestLoader()
-        loader.sortTestMethodsUsing = None
-        runner = TestRunner(verbosity=2,
-                resultclass=buildResultClass(args))
-        # we need to do this here, otherwise just loading the tests
-        # will take 2 minutes (bitbake -e calls)
-        oeSelfTest.testlayer_path = get_test_layer()
-        for test in testslist:
-            log.info("Loading tests from: %s" % test)
-            try:
-                suite.addTests(loader.loadTestsFromName(test))
-            except AttributeError as e:
-                log.error("Failed to import %s" % test)
-                log.error(e)
-                return 1
-
-        if args.machine:
-            # Custom machine sets only weak default values (??=) for MACHINE in machine.inc
-            # This let test cases that require a specific MACHINE to be able to override it, using (?= or =)
-            log.info('Custom machine mode enabled. MACHINE set to %s' % args.machine)
-            if args.machine == 'random':
-                os.environ['CUSTOMMACHINE'] = 'random'
-                result = runner.run(suite)
-            else:  # all
-                machines = get_available_machines()
-                for m in machines:
-                    log.info('Run tests with custom MACHINE set to: %s' % m)
-                    os.environ['CUSTOMMACHINE'] = m
-                    result = runner.run(suite)
-        else:
-            result = runner.run(suite)
-
-        log.info("Finished")
-
-        if args.repository:
-            import git
-            # Commit tests results to repository
-            metadata = metadata_from_bb()
-            git_dir = os.path.join(os.getcwd(), 'selftest')
-            if not os.path.isdir(git_dir):
-                os.mkdir(git_dir)
-
-            log.debug('Checking for git repository in %s' % git_dir)
-            try:
-                repo = git.Repo(git_dir)
-            except git.exc.InvalidGitRepositoryError:
-                log.debug("Couldn't find git repository %s; "
-                         "cloning from %s" % (git_dir, args.repository))
-                repo = git.Repo.clone_from(args.repository, git_dir)
-
-            r_branches = repo.git.branch(r=True)
-            r_branches = set(r_branches.replace('origin/', '').split())
-            l_branches = {str(branch) for branch in repo.branches}
-            branch = '%s/%s/%s' % (metadata['hostname'],
-                                   metadata['layers']['meta'].get('branch', '(nogit)'),
-                                   metadata['config']['MACHINE'])
-
-            if branch in l_branches:
-                log.debug('Found branch in local repository, checking out')
-                repo.git.checkout(branch)
-            elif branch in r_branches:
-                log.debug('Found branch in remote repository, checking'
-                          ' out and pulling')
-                repo.git.checkout(branch)
-                repo.git.pull()
-            else:
-                log.debug('New branch %s' % branch)
-                repo.git.checkout('master')
-                repo.git.checkout(b=branch)
-
-            cleanResultsDir(repo)
-            xml_dir = os.path.join(os.getcwd(), log_prefix)
-            copyResultFiles(xml_dir, git_dir, repo)
-            metadata_file = os.path.join(git_dir, 'metadata.xml')
-            write_metadata_file(metadata_file, metadata)
-            repo.index.add([metadata_file])
-            repo.index.write()
-
-            # Get information for commit message
-            layer_info = ''
-            for layer, values in metadata['layers'].items():
-                layer_info = '%s%-17s = %s:%s\n' % (layer_info, layer,
-                              values.get('branch', '(nogit)'), values.get('commit', '0'*40))
-            msg = 'Selftest for build %s of %s for machine %s on %s\n\n%s' % (
-                   log_prefix[12:], metadata['distro']['pretty_name'],
-                   metadata['config']['MACHINE'], metadata['hostname'], layer_info)
-
-            log.debug('Commiting results to local repository')
-            repo.index.commit(msg)
-            if not repo.is_dirty():
-                try:
-                    if branch in r_branches:
-                        log.debug('Pushing changes to remote repository')
-                        repo.git.push()
-                    else:
-                        log.debug('Pushing changes to remote repository '
-                                  'creating new branch')
-                        repo.git.push('-u', 'origin', branch)
-                except GitCommandError:
-                    log.error('Falied to push to remote repository')
-                    return 1
-            else:
-                log.error('Local repository is dirty, not pushing commits')
-
-        if result.wasSuccessful():
-            return 0
-        else:
-            return 1
-
-def buildResultClass(args):
-    """Build a Result Class to use in the testcase execution"""
-    import site
-
-    class StampedResult(TestResult):
-        """
-        Custom TestResult that prints the time when a test starts.  As oe-selftest
-        can take a long time (ie a few hours) to run, timestamps help us understand
-        what tests are taking a long time to execute.
-        If coverage is required, this class executes the coverage setup and reporting.
-        """
-        def startTest(self, test):
-            import time
-            self.stream.write(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + " - ")
-            super(StampedResult, self).startTest(test)
-
-        def startTestRun(self):
-            """ Setup coverage before running any testcase """
-
-            # variable holding the coverage configuration file allowing subprocess to be measured
-            self.coveragepth = None
-
-            # indicates the system if coverage is currently installed
-            self.coverage_installed = True
-
-            if args.coverage or args.coverage_source or args.coverage_include or args.coverage_omit:
-                try:
-                    # check if user can do coverage
-                    import coverage
-                except:
-                    log.warn("python coverage is not installed. More info on https://pypi.python.org/pypi/coverage")
-                    self.coverage_installed = False
-
-                if self.coverage_installed:
-                    log.info("Coverage is enabled")
-
-                    major_version = int(coverage.version.__version__[0])
-                    if major_version < 4:
-                        log.error("python coverage %s installed. Require version 4 or greater." % coverage.version.__version__)
-                        self.stop()
-                    # In case the user has not set the variable COVERAGE_PROCESS_START,
-                    # create a default one and export it. The COVERAGE_PROCESS_START
-                    # value indicates where the coverage configuration file resides
-                    # More info on https://pypi.python.org/pypi/coverage
-                    if not os.environ.get('COVERAGE_PROCESS_START'):
-                        os.environ['COVERAGE_PROCESS_START'] = coverage_setup(args.coverage_source, args.coverage_include, args.coverage_omit)
-
-                    # Use default site.USER_SITE and write corresponding config file
-                    site.ENABLE_USER_SITE = True
-                    if not os.path.exists(site.USER_SITE):
-                        os.makedirs(site.USER_SITE)
-                    self.coveragepth = os.path.join(site.USER_SITE, "coverage.pth")
-                    with open(self.coveragepth, 'w') as cps:
-                        cps.write('import sys,site; sys.path.extend(site.getsitepackages()); import coverage; coverage.process_startup();')
-
-        def stopTestRun(self):
-            """ Report coverage data after the testcases are run """
-
-            if args.coverage or args.coverage_source or args.coverage_include or args.coverage_omit:
-                if self.coverage_installed:
-                    with open(os.environ['COVERAGE_PROCESS_START']) as ccf:
-                        log.info("Coverage configuration file (%s)" % os.environ.get('COVERAGE_PROCESS_START'))
-                        log.info("===========================")
-                        log.info("\n%s" % "".join(ccf.readlines()))
-
-                    log.info("Coverage Report")
-                    log.info("===============")
-                    try:
-                        coverage_report()
-                    finally:
-                        # remove the pth file
-                        try:
-                            os.remove(self.coveragepth)
-                        except OSError:
-                            log.warn("Expected temporal file from coverage is missing, ignoring removal.")
-
-    return StampedResult
-
-def cleanResultsDir(repo):
-    """ Remove result files from directory """
-
-    xml_files = []
-    directory = repo.working_tree_dir
-    for f in os.listdir(directory):
-        path = os.path.join(directory, f)
-        if os.path.isfile(path) and path.endswith('.xml'):
-            xml_files.append(f)
-    repo.index.remove(xml_files, working_tree=True)
-
-def copyResultFiles(src, dst, repo):
-    """ Copy result files from src to dst removing the time stamp. """
-
-    import shutil
-
-    re_time = re.compile("-[0-9]+")
-    file_list = []
-
-    for root, subdirs, files in os.walk(src):
-        tmp_dir = root.replace(src, '').lstrip('/')
-        for s in subdirs:
-            os.mkdir(os.path.join(dst, tmp_dir, s))
-        for f in files:
-            file_name = os.path.join(dst, tmp_dir, re_time.sub("", f))
-            shutil.copy2(os.path.join(root, f), file_name)
-            file_list.append(file_name)
-    repo.index.add(file_list)
+        args = parser.parse_args()
+        results = args.func(logger, args)
+        ret = 0 if results.wasSuccessful() else 1
+    except SystemExit as err:
+        if err.code != 0:
+            raise err
+        ret = err.code
+    except OEQAPreRun as pr:
+        ret = 1
 
-class TestRunner(_TestRunner):
-    """Test runner class aware of exporting tests."""
-    def __init__(self, *args, **kwargs):
-        try:
-            exportdir = os.path.join(os.getcwd(), log_prefix)
-            kwargsx = dict(**kwargs)
-            # argument specific to XMLTestRunner, if adding a new runner then
-            # also add logic to use other runner's args.
-            kwargsx['output'] = exportdir
-            kwargsx['descriptions'] = False
-            # done for the case where telling the runner where to export
-            super(TestRunner, self).__init__(*args, **kwargsx)
-        except TypeError:
-            log.info("test runner init'ed like unittest")
-            super(TestRunner, self).__init__(*args, **kwargs)
+    return ret
 
-if __name__ == "__main__":
+if __name__ == '__main__':
     try:
         ret = main()
     except Exception:
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 35/36] oeqa/selftest/cases: Migrate test cases into the new oe-qa framework
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (33 preceding siblings ...)
  2017-05-26 20:38 ` [PATCH 34/36] scripts/oe-selftest: Migrate to new framework into oeqa.selftest.context Aníbal Limón
@ 2017-05-26 20:38 ` Aníbal Limón
  2017-05-26 20:38 ` [PATCH 36/36] selftest: Migrate systemd_boot test case to the new framework Aníbal Limón
                   ` (2 subsequent siblings)
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:38 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

From: Leonardo Sandoval <leonardo.sandoval.gonzalez@linux.intel.com>

New framework has different classes/decorators so adapt current test cases to
support these. Changes include changes on base classes and decorators.

Also include paths in selftest/__init__.py isn't needed because the
loader is the standard unittest one.

Signed-off-by: Leonardo Sandoval <leonardo.sandoval.gonzalez@linux.intel.com>
Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
 meta/lib/oeqa/selftest/__init__.py                 |  2 -
 .../selftest/{ => cases}/_sstatetests_noauto.py    |  7 +-
 meta/lib/oeqa/selftest/{ => cases}/archiver.py     | 14 ++--
 meta/lib/oeqa/selftest/{ => cases}/bblayers.py     | 24 +++----
 meta/lib/oeqa/selftest/{ => cases}/bbtests.py      | 57 +++++++--------
 meta/lib/oeqa/selftest/{ => cases}/buildhistory.py |  5 +-
 meta/lib/oeqa/selftest/{ => cases}/buildoptions.py | 34 ++++-----
 .../oeqa/selftest/{ => cases}/containerimage.py    |  4 +-
 meta/lib/oeqa/selftest/{ => cases}/devtool.py      | 68 +++++++++---------
 meta/lib/oeqa/selftest/{ => cases}/eSDK.py         | 18 ++---
 .../lib/oeqa/selftest/{ => cases}/image_typedep.py |  4 +-
 .../lib/oeqa/selftest/{ => cases}/imagefeatures.py | 16 ++---
 meta/lib/oeqa/selftest/{ => cases}/layerappend.py  | 15 ++--
 meta/lib/oeqa/selftest/{ => cases}/liboe.py        |  7 +-
 .../{lic-checksum.py => cases/lic_checksum.py}     |  8 +--
 meta/lib/oeqa/selftest/{ => cases}/manifest.py     | 52 +++++++-------
 .../oeqa/selftest/{ => cases}/oelib/__init__.py    |  0
 .../selftest/{ => cases}/oelib/buildhistory.py     |  4 +-
 meta/lib/oeqa/selftest/{ => cases}/oelib/elf.py    |  4 +-
 .../lib/oeqa/selftest/{ => cases}/oelib/license.py |  6 +-
 meta/lib/oeqa/selftest/{ => cases}/oelib/path.py   |  4 +-
 meta/lib/oeqa/selftest/{ => cases}/oelib/types.py  |  6 +-
 meta/lib/oeqa/selftest/{ => cases}/oelib/utils.py  |  6 +-
 meta/lib/oeqa/selftest/{ => cases}/oescripts.py    | 15 ++--
 meta/lib/oeqa/selftest/{ => cases}/package.py      |  4 +-
 meta/lib/oeqa/selftest/{ => cases}/pkgdata.py      | 29 ++++----
 meta/lib/oeqa/selftest/{ => cases}/prservice.py    | 27 ++++---
 meta/lib/oeqa/selftest/{ => cases}/recipetool.py   | 81 +++++++++++----------
 meta/lib/oeqa/selftest/{ => cases}/runqemu.py      | 31 ++++----
 .../{runtime-test.py => cases/runtime_test.py}     | 15 ++--
 meta/lib/oeqa/selftest/{ => cases}/signing.py      | 15 ++--
 meta/lib/oeqa/selftest/{ => cases}/sstate.py       |  5 +-
 meta/lib/oeqa/selftest/{ => cases}/sstatetests.py  | 46 ++++++------
 meta/lib/oeqa/selftest/{ => cases}/tinfoil.py      | 25 ++++---
 meta/lib/oeqa/selftest/{ => cases}/wic.py          | 84 +++++++++++-----------
 35 files changed, 355 insertions(+), 387 deletions(-)
 delete mode 100644 meta/lib/oeqa/selftest/__init__.py
 rename meta/lib/oeqa/selftest/{ => cases}/_sstatetests_noauto.py (97%)
 rename meta/lib/oeqa/selftest/{ => cases}/archiver.py (91%)
 rename meta/lib/oeqa/selftest/{ => cases}/bblayers.py (94%)
 rename meta/lib/oeqa/selftest/{ => cases}/bbtests.py (95%)
 rename meta/lib/oeqa/selftest/{ => cases}/buildhistory.py (94%)
 rename meta/lib/oeqa/selftest/{ => cases}/buildoptions.py (94%)
 rename meta/lib/oeqa/selftest/{ => cases}/containerimage.py (97%)
 rename meta/lib/oeqa/selftest/{ => cases}/devtool.py (99%)
 rename meta/lib/oeqa/selftest/{ => cases}/eSDK.py (92%)
 rename meta/lib/oeqa/selftest/{ => cases}/image_typedep.py (93%)
 rename meta/lib/oeqa/selftest/{ => cases}/imagefeatures.py (95%)
 rename meta/lib/oeqa/selftest/{ => cases}/layerappend.py (93%)
 rename meta/lib/oeqa/selftest/{ => cases}/liboe.py (96%)
 rename meta/lib/oeqa/selftest/{lic-checksum.py => cases/lic_checksum.py} (87%)
 rename meta/lib/oeqa/selftest/{ => cases}/manifest.py (80%)
 rename meta/lib/oeqa/selftest/{ => cases}/oelib/__init__.py (100%)
 rename meta/lib/oeqa/selftest/{ => cases}/oelib/buildhistory.py (97%)
 rename meta/lib/oeqa/selftest/{ => cases}/oelib/elf.py (92%)
 rename meta/lib/oeqa/selftest/{ => cases}/oelib/license.py (93%)
 rename meta/lib/oeqa/selftest/{ => cases}/oelib/path.py (97%)
 rename meta/lib/oeqa/selftest/{ => cases}/oelib/types.py (93%)
 rename meta/lib/oeqa/selftest/{ => cases}/oelib/utils.py (91%)
 rename meta/lib/oeqa/selftest/{ => cases}/oescripts.py (72%)
 rename meta/lib/oeqa/selftest/{ => cases}/package.py (97%)
 rename meta/lib/oeqa/selftest/{ => cases}/pkgdata.py (96%)
 rename meta/lib/oeqa/selftest/{ => cases}/prservice.py (93%)
 rename meta/lib/oeqa/selftest/{ => cases}/recipetool.py (97%)
 rename meta/lib/oeqa/selftest/{ => cases}/runqemu.py (92%)
 rename meta/lib/oeqa/selftest/{runtime-test.py => cases/runtime_test.py} (97%)
 rename meta/lib/oeqa/selftest/{ => cases}/signing.py (96%)
 rename meta/lib/oeqa/selftest/{ => cases}/sstate.py (95%)
 rename meta/lib/oeqa/selftest/{ => cases}/sstatetests.py (97%)
 rename meta/lib/oeqa/selftest/{ => cases}/tinfoil.py (96%)
 rename meta/lib/oeqa/selftest/{ => cases}/wic.py (97%)

diff --git a/meta/lib/oeqa/selftest/__init__.py b/meta/lib/oeqa/selftest/__init__.py
deleted file mode 100644
index 3ad9513..0000000
--- a/meta/lib/oeqa/selftest/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-from pkgutil import extend_path
-__path__ = extend_path(__path__, __name__)
diff --git a/meta/lib/oeqa/selftest/_sstatetests_noauto.py b/meta/lib/oeqa/selftest/cases/_sstatetests_noauto.py
similarity index 97%
rename from meta/lib/oeqa/selftest/_sstatetests_noauto.py
rename to meta/lib/oeqa/selftest/cases/_sstatetests_noauto.py
index fc9ae7e..0e58962 100644
--- a/meta/lib/oeqa/selftest/_sstatetests_noauto.py
+++ b/meta/lib/oeqa/selftest/cases/_sstatetests_noauto.py
@@ -1,19 +1,16 @@
-import datetime
-import unittest
 import os
-import re
 import shutil
 
 import oeqa.utils.ftools as ftools
-from oeqa.selftest.base import oeSelfTest
 from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_test_layer
-from oeqa.selftest.sstate import SStateBase
+from oeqa.selftest.cases.sstate import SStateBase
 
 
 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):
diff --git a/meta/lib/oeqa/selftest/archiver.py b/meta/lib/oeqa/selftest/cases/archiver.py
similarity index 91%
rename from meta/lib/oeqa/selftest/archiver.py
rename to meta/lib/oeqa/selftest/cases/archiver.py
index d7f215c..70c7282 100644
--- a/meta/lib/oeqa/selftest/archiver.py
+++ b/meta/lib/oeqa/selftest/cases/archiver.py
@@ -1,14 +1,12 @@
-from oeqa.selftest.base import oeSelfTest
-from oeqa.utils.commands import bitbake, get_bb_vars
-from oeqa.utils.decorators import testcase
-import glob
 import os
-import shutil
-
+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(oeSelfTest):
+class Archiver(OESelftestTestCase):
 
-    @testcase(1345)
+    @OETestID(1345)
     def test_archiver_allows_to_filter_on_recipe_name(self):
         """
         Summary:     The archiver should offer the possibility to filter on the recipe. (#6929)
diff --git a/meta/lib/oeqa/selftest/bblayers.py b/meta/lib/oeqa/selftest/cases/bblayers.py
similarity index 94%
rename from meta/lib/oeqa/selftest/bblayers.py
rename to meta/lib/oeqa/selftest/cases/bblayers.py
index cd658c5..90a2249 100644
--- a/meta/lib/oeqa/selftest/bblayers.py
+++ b/meta/lib/oeqa/selftest/cases/bblayers.py
@@ -1,39 +1,37 @@
-import unittest
 import os
-import logging
 import re
-import shutil
 
 import oeqa.utils.ftools as ftools
-from oeqa.selftest.base import oeSelfTest
 from oeqa.utils.commands import runCmd, get_bb_var
-from oeqa.utils.decorators import testcase
 
-class BitbakeLayers(oeSelfTest):
+from oeqa.selftest.case import OESelftestTestCase
+from oeqa.core.decorator.oeid import OETestID
 
-    @testcase(756)
+class BitbakeLayers(OESelftestTestCase):
+
+    @OETestID(756)
     def test_bitbakelayers_showcrossdepends(self):
         result = runCmd('bitbake-layers show-cross-depends')
         self.assertTrue('aspell' in result.output, msg = "No dependencies were shown. bitbake-layers show-cross-depends output: %s" % result.output)
 
-    @testcase(83)
+    @OETestID(83)
     def test_bitbakelayers_showlayers(self):
         result = runCmd('bitbake-layers show-layers')
         self.assertTrue('meta-selftest' in result.output, msg = "No layers were shown. bitbake-layers show-layers output: %s" % result.output)
 
-    @testcase(93)
+    @OETestID(93)
     def test_bitbakelayers_showappends(self):
         recipe = "xcursor-transparent-theme"
         bb_file = self.get_recipe_basename(recipe)
         result = runCmd('bitbake-layers show-appends')
         self.assertTrue(bb_file in result.output, msg="%s file was not recognised. bitbake-layers show-appends output: %s" % (bb_file, result.output))
 
-    @testcase(90)
+    @OETestID(90)
     def test_bitbakelayers_showoverlayed(self):
         result = runCmd('bitbake-layers show-overlayed')
         self.assertTrue('aspell' in result.output, msg="aspell overlayed recipe was not recognised bitbake-layers show-overlayed %s" % result.output)
 
-    @testcase(95)
+    @OETestID(95)
     def test_bitbakelayers_flatten(self):
         recipe = "xcursor-transparent-theme"
         recipe_path = "recipes-graphics/xcursor-transparent-theme"
@@ -48,7 +46,7 @@ class BitbakeLayers(oeSelfTest):
         find_in_contents = re.search("##### bbappended from meta-selftest #####\n(.*\n)*include test_recipe.inc", contents)
         self.assertTrue(find_in_contents, msg = "Flattening layers did not work. bitbake-layers flatten output: %s" % result.output)
 
-    @testcase(1195)
+    @OETestID(1195)
     def test_bitbakelayers_add_remove(self):
         test_layer = os.path.join(get_bb_var('COREBASE'), 'meta-skeleton')
         result = runCmd('bitbake-layers show-layers')
@@ -66,7 +64,7 @@ class BitbakeLayers(oeSelfTest):
         result = runCmd('bitbake-layers show-layers')
         self.assertNotIn('meta-skeleton', result.output, msg = "meta-skeleton should have been removed at this step.  bitbake-layers show-layers output: %s" % result.output)
 
-    @testcase(1384)
+    @OETestID(1384)
     def test_bitbakelayers_showrecipes(self):
         result = runCmd('bitbake-layers show-recipes')
         self.assertIn('aspell:', result.output)
diff --git a/meta/lib/oeqa/selftest/bbtests.py b/meta/lib/oeqa/selftest/cases/bbtests.py
similarity index 95%
rename from meta/lib/oeqa/selftest/bbtests.py
rename to meta/lib/oeqa/selftest/cases/bbtests.py
index 46e09f5..4c82049 100644
--- a/meta/lib/oeqa/selftest/bbtests.py
+++ b/meta/lib/oeqa/selftest/cases/bbtests.py
@@ -2,30 +2,31 @@ import os
 import re
 
 import oeqa.utils.ftools as ftools
-from oeqa.selftest.base import oeSelfTest
 from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_bb_vars
-from oeqa.utils.decorators import testcase
 
-class BitbakeTests(oeSelfTest):
+from oeqa.selftest.case import OESelftestTestCase
+from oeqa.core.decorator.oeid import OETestID
+
+class BitbakeTests(OESelftestTestCase):
 
     def getline(self, res, line):
         for l in res.output.split('\n'):
             if line in l:
                 return l
 
-    @testcase(789)
+    @OETestID(789)
     def test_run_bitbake_from_dir_1(self):
         os.chdir(os.path.join(self.builddir, 'conf'))
         self.assertEqual(bitbake('-e').status, 0, msg = "bitbake couldn't run from \"conf\" dir")
 
-    @testcase(790)
+    @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']))
         self.assertEqual(bitbake('-e', env=my_env).status, 0, msg = "bitbake couldn't run from builddir")
 
-    @testcase(806)
+    @OETestID(806)
     def test_event_handler(self):
         self.write_config("INHERIT += \"test_events\"")
         result = bitbake('m4-native')
@@ -35,7 +36,7 @@ class BitbakeTests(oeSelfTest):
         self.assertTrue(find_build_completed, msg = "Match failed in:\n%s" % result.output)
         self.assertFalse('Test for bb.event.InvalidEvent' in result.output, msg = "\"Test for bb.event.InvalidEvent\" message found during bitbake process. bitbake output: %s" % result.output)
 
-    @testcase(103)
+    @OETestID(103)
     def test_local_sstate(self):
         bitbake('m4-native')
         bitbake('m4-native -cclean')
@@ -43,17 +44,17 @@ class BitbakeTests(oeSelfTest):
         find_setscene = re.search("m4-native.*do_.*_setscene", result.output)
         self.assertTrue(find_setscene, msg = "No \"m4-native.*do_.*_setscene\" message found during bitbake m4-native. bitbake output: %s" % result.output )
 
-    @testcase(105)
+    @OETestID(105)
     def test_bitbake_invalid_recipe(self):
         result = bitbake('-b asdf', ignore_status=True)
         self.assertTrue("ERROR: Unable to find any recipe file matching 'asdf'" in result.output, msg = "Though asdf recipe doesn't exist, bitbake didn't output any err. message. bitbake output: %s" % result.output)
 
-    @testcase(107)
+    @OETestID(107)
     def test_bitbake_invalid_target(self):
         result = bitbake('asdf', ignore_status=True)
         self.assertTrue("ERROR: Nothing PROVIDES 'asdf'" in result.output, msg = "Though no 'asdf' target exists, bitbake didn't output any err. message. bitbake output: %s" % result.output)
 
-    @testcase(106)
+    @OETestID(106)
     def test_warnings_errors(self):
         result = bitbake('-b asdf', ignore_status=True)
         find_warnings = re.search("Summary: There w.{2,3}? [1-9][0-9]* WARNING messages* shown", result.output)
@@ -61,7 +62,7 @@ class BitbakeTests(oeSelfTest):
         self.assertTrue(find_warnings, msg="Did not find the mumber of warnings at the end of the build:\n" + result.output)
         self.assertTrue(find_errors, msg="Did not find the mumber of errors at the end of the build:\n" + result.output)
 
-    @testcase(108)
+    @OETestID(108)
     def test_invalid_patch(self):
         # This patch already exists in SRC_URI so adding it again will cause the
         # patch to fail.
@@ -73,7 +74,7 @@ class BitbakeTests(oeSelfTest):
         line = self.getline(result, "Function failed: patch_do_patch")
         self.assertTrue(line and line.startswith("ERROR:"), msg = "Repeated patch application didn't fail. bitbake output: %s" % result.output)
 
-    @testcase(1354)
+    @OETestID(1354)
     def test_force_task_1(self):
         # test 1 from bug 5875
         test_recipe = 'zlib'
@@ -98,7 +99,7 @@ class BitbakeTests(oeSelfTest):
         ret = bitbake(test_recipe)
         self.assertIn('task do_package_write_rpm:', ret.output, 'Task do_package_write_rpm did not re-executed.')
 
-    @testcase(163)
+    @OETestID(163)
     def test_force_task_2(self):
         # test 2 from bug 5875
         test_recipe = 'zlib'
@@ -111,7 +112,7 @@ class BitbakeTests(oeSelfTest):
         for task in look_for_tasks:
             self.assertIn(task, result.output, msg="Couldn't find %s task.")
 
-    @testcase(167)
+    @OETestID(167)
     def test_bitbake_g(self):
         result = bitbake('-g core-image-minimal')
         for f in ['pn-buildlist', 'recipe-depends.dot', 'task-depends.dot']:
@@ -119,7 +120,7 @@ class BitbakeTests(oeSelfTest):
         self.assertTrue('Task dependencies saved to \'task-depends.dot\'' in result.output, msg = "No task dependency \"task-depends.dot\" file was generated for the given task target. bitbake output: %s" % result.output)
         self.assertTrue('busybox' in ftools.read_file(os.path.join(self.builddir, 'task-depends.dot')), msg = "No \"busybox\" dependency found in task-depends.dot file.")
 
-    @testcase(899)
+    @OETestID(899)
     def test_image_manifest(self):
         bitbake('core-image-minimal')
         bb_vars = get_bb_vars(["DEPLOY_DIR_IMAGE", "IMAGE_LINK_NAME"], "core-image-minimal")
@@ -128,7 +129,7 @@ class BitbakeTests(oeSelfTest):
         manifest = os.path.join(deploydir, imagename + ".manifest")
         self.assertTrue(os.path.islink(manifest), msg="No manifest file created for image. It should have been created in %s" % manifest)
 
-    @testcase(168)
+    @OETestID(168)
     def test_invalid_recipe_src_uri(self):
         data = 'SRC_URI = "file://invalid"'
         self.write_recipeinc('man', data)
@@ -149,7 +150,7 @@ doesn't exist, yet no error message encountered. bitbake output: %s" % result.ou
         self.assertTrue(line and line.startswith("ERROR:"), msg = "\"invalid\" file \
 doesn't exist, yet fetcher didn't report any error. bitbake output: %s" % result.output)
 
-    @testcase(171)
+    @OETestID(171)
     def test_rename_downloaded_file(self):
         # TODO unique dldir instead of using cleanall
         # TODO: need to set sstatedir?
@@ -167,29 +168,29 @@ SSTATE_DIR = \"${TOPDIR}/download-selftest\"
         self.assertTrue(os.path.isfile(os.path.join(dl_dir, 'test-aspell.tar.gz')), msg = "File rename failed. No corresponding test-aspell.tar.gz file found under %s" % dl_dir)
         self.assertTrue(os.path.isfile(os.path.join(dl_dir, 'test-aspell.tar.gz.done')), "File rename failed. No corresponding test-aspell.tar.gz.done file found under %s" % dl_dir)
 
-    @testcase(1028)
+    @OETestID(1028)
     def test_environment(self):
         self.write_config("TEST_ENV=\"localconf\"")
         result = runCmd('bitbake -e | grep TEST_ENV=')
         self.assertTrue('localconf' in result.output, msg = "bitbake didn't report any value for TEST_ENV variable. To test, run 'bitbake -e | grep TEST_ENV='")
 
-    @testcase(1029)
+    @OETestID(1029)
     def test_dry_run(self):
         result = runCmd('bitbake -n m4-native')
         self.assertEqual(0, result.status, "bitbake dry run didn't run as expected. %s" % result.output)
 
-    @testcase(1030)
+    @OETestID(1030)
     def test_just_parse(self):
         result = runCmd('bitbake -p')
         self.assertEqual(0, result.status, "errors encountered when parsing recipes. %s" % result.output)
 
-    @testcase(1031)
+    @OETestID(1031)
     def test_version(self):
         result = runCmd('bitbake -s | grep wget')
         find = re.search("wget *:([0-9a-zA-Z\.\-]+)", result.output)
         self.assertTrue(find, "No version returned for searched recipe. bitbake output: %s" % result.output)
 
-    @testcase(1032)
+    @OETestID(1032)
     def test_prefile(self):
         preconf = os.path.join(self.builddir, 'conf/prefile.conf')
         self.track_for_cleanup(preconf)
@@ -200,7 +201,7 @@ SSTATE_DIR = \"${TOPDIR}/download-selftest\"
         result = runCmd('bitbake -r conf/prefile.conf -e | grep TEST_PREFILE=')
         self.assertTrue('localconf' in result.output, "Preconfigure file \"prefile.conf\"was not taken into consideration.")
 
-    @testcase(1033)
+    @OETestID(1033)
     def test_postfile(self):
         postconf = os.path.join(self.builddir, 'conf/postfile.conf')
         self.track_for_cleanup(postconf)
@@ -209,12 +210,12 @@ SSTATE_DIR = \"${TOPDIR}/download-selftest\"
         result = runCmd('bitbake -R conf/postfile.conf -e | grep TEST_POSTFILE=')
         self.assertTrue('postfile' in result.output, "Postconfigure file \"postfile.conf\"was not taken into consideration.")
 
-    @testcase(1034)
+    @OETestID(1034)
     def test_checkuri(self):
         result = runCmd('bitbake -c checkuri m4')
         self.assertEqual(0, result.status, msg = "\"checkuri\" task was not executed. bitbake output: %s" % result.output)
 
-    @testcase(1035)
+    @OETestID(1035)
     def test_continue(self):
         self.write_config("""DL_DIR = \"${TOPDIR}/download-selftest\"
 SSTATE_DIR = \"${TOPDIR}/download-selftest\"
@@ -229,7 +230,7 @@ INHERIT_remove = \"report-error\"
         continuepos = result.output.find('NOTE: recipe xcursor-transparent-theme-%s: task do_unpack: Started' % manver.group(1))
         self.assertLess(errorpos,continuepos, msg = "bitbake didn't pass do_fail_task. bitbake output: %s" % result.output)
 
-    @testcase(1119)
+    @OETestID(1119)
     def test_non_gplv3(self):
         self.write_config('INCOMPATIBLE_LICENSE = "GPLv3"')
         result = bitbake('selftest-ed', ignore_status=True)
@@ -238,7 +239,7 @@ INHERIT_remove = \"report-error\"
         self.assertFalse(os.path.isfile(os.path.join(lic_dir, 'selftest-ed/generic_GPLv3')))
         self.assertTrue(os.path.isfile(os.path.join(lic_dir, 'selftest-ed/generic_GPLv2')))
 
-    @testcase(1422)
+    @OETestID(1422)
     def test_setscene_only(self):
         """ Bitbake option to restore from sstate only within a build (i.e. execute no real tasks, only setscene)"""
         test_recipe = 'ed'
@@ -253,7 +254,7 @@ INHERIT_remove = \"report-error\"
             self.assertIn('_setscene', task, 'A task different from _setscene ran: %s.\n'
                                              'Executed tasks were: %s' % (task, str(tasks)))
 
-    @testcase(1425)
+    @OETestID(1425)
     def test_bbappend_order(self):
         """ Bitbake should bbappend to recipe in a predictable order """
         test_recipe = 'ed'
diff --git a/meta/lib/oeqa/selftest/buildhistory.py b/meta/lib/oeqa/selftest/cases/buildhistory.py
similarity index 94%
rename from meta/lib/oeqa/selftest/buildhistory.py
rename to meta/lib/oeqa/selftest/cases/buildhistory.py
index 008c39c..06792d9 100644
--- a/meta/lib/oeqa/selftest/buildhistory.py
+++ b/meta/lib/oeqa/selftest/cases/buildhistory.py
@@ -2,12 +2,11 @@ import os
 import re
 import datetime
 
-from oeqa.selftest.base import oeSelfTest
+from oeqa.selftest.case import OESelftestTestCase
 from oeqa.utils.commands import bitbake, get_bb_vars
-from oeqa.utils.decorators import testcase
 
 
-class BuildhistoryBase(oeSelfTest):
+class BuildhistoryBase(OESelftestTestCase):
 
     def config_buildhistory(self, tmp_bh_location=False):
         bb_vars = get_bb_vars(['USER_CLASSES', 'INHERIT'])
diff --git a/meta/lib/oeqa/selftest/buildoptions.py b/meta/lib/oeqa/selftest/cases/buildoptions.py
similarity index 94%
rename from meta/lib/oeqa/selftest/buildoptions.py
rename to meta/lib/oeqa/selftest/cases/buildoptions.py
index ce37ea4..1f1bb7a 100644
--- a/meta/lib/oeqa/selftest/buildoptions.py
+++ b/meta/lib/oeqa/selftest/cases/buildoptions.py
@@ -3,15 +3,15 @@ import re
 import glob as g
 import shutil
 import tempfile
-from oeqa.selftest.base import oeSelfTest
-from oeqa.selftest.buildhistory import BuildhistoryBase
+from oeqa.selftest.case import OESelftestTestCase
+from oeqa.selftest.cases.buildhistory import BuildhistoryBase
 from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_bb_vars
 import oeqa.utils.ftools as ftools
-from oeqa.utils.decorators import testcase
+from oeqa.core.decorator.oeid import OETestID
 
-class ImageOptionsTests(oeSelfTest):
+class ImageOptionsTests(OESelftestTestCase):
 
-    @testcase(761)
+    @OETestID(761)
     def test_incremental_image_generation(self):
         image_pkgtype = get_bb_var("IMAGE_PKGTYPE")
         if image_pkgtype != 'rpm':
@@ -30,7 +30,7 @@ class ImageOptionsTests(oeSelfTest):
         incremental_removed = re.search(r"Erasing\s*:\s*packagegroup-core-ssh-openssh", log_data_removed)
         self.assertTrue(incremental_removed, msg = "Match failed in:\n%s" % log_data_removed)
 
-    @testcase(286)
+    @OETestID(286)
     def test_ccache_tool(self):
         bitbake("ccache-native")
         bb_vars = get_bb_vars(['SYSROOT_DESTDIR', 'bindir'], 'ccache-native')
@@ -43,7 +43,7 @@ class ImageOptionsTests(oeSelfTest):
         res = runCmd("grep ccache %s" % log_compile, ignore_status=True)
         self.assertEqual(0, res.status, msg="No match for ccache in m4 log.do_compile. For further details: %s" % log_compile)
 
-    @testcase(1435)
+    @OETestID(1435)
     def test_read_only_image(self):
         distro_features = get_bb_var('DISTRO_FEATURES')
         if not ('x11' in distro_features and 'opengl' in distro_features):
@@ -52,9 +52,9 @@ class ImageOptionsTests(oeSelfTest):
         bitbake("core-image-sato")
         # do_image will fail if there are any pending postinsts
 
-class DiskMonTest(oeSelfTest):
+class DiskMonTest(OESelftestTestCase):
 
-    @testcase(277)
+    @OETestID(277)
     def test_stoptask_behavior(self):
         self.write_config('BB_DISKMON_DIRS = "STOPTASKS,${TMPDIR},100000G,100K"')
         res = bitbake("m4", ignore_status = True)
@@ -68,13 +68,13 @@ class DiskMonTest(oeSelfTest):
         res = bitbake("m4")
         self.assertTrue('WARNING: The free space' in res.output, msg = "A warning should have been displayed for disk monitor is set to WARN: %s" %res.output)
 
-class SanityOptionsTest(oeSelfTest):
+class SanityOptionsTest(OESelftestTestCase):
     def getline(self, res, line):
         for l in res.output.split('\n'):
             if line in l:
                 return l
 
-    @testcase(927)
+    @OETestID(927)
     def test_options_warnqa_errorqa_switch(self):
 
         self.write_config("INHERIT_remove = \"report-error\"")
@@ -96,7 +96,7 @@ class SanityOptionsTest(oeSelfTest):
         line = self.getline(res, "QA Issue: xcursor-transparent-theme-dbg is listed in PACKAGES multiple times, this leads to packaging errors.")
         self.assertTrue(line and line.startswith("WARNING:"), msg=res.output)
 
-    @testcase(278)
+    @OETestID(278)
     def test_sanity_unsafe_script_references(self):
         self.write_config('WARN_QA_append = " unsafe-references-in-scripts"')
 
@@ -114,7 +114,7 @@ do_install_append_pn-gzip () {
         line = self.getline(res, "QA Issue: gzip")
         self.assertTrue(line and line.startswith("WARNING:"), "WARNING: QA Issue: gzip message is not present in bitbake's output: %s" % res.output)
 
-    @testcase(1421)
+    @OETestID(1421)
     def test_layer_without_git_dir(self):
         """
         Summary:     Test that layer git revisions are displayed and do not fail without git repository
@@ -156,20 +156,20 @@ do_install_append_pn-gzip () {
 
 class BuildhistoryTests(BuildhistoryBase):
 
-    @testcase(293)
+    @OETestID(293)
     def test_buildhistory_basic(self):
         self.run_buildhistory_operation('xcursor-transparent-theme')
         self.assertTrue(os.path.isdir(get_bb_var('BUILDHISTORY_DIR')), "buildhistory dir was not created.")
 
-    @testcase(294)
+    @OETestID(294)
     def test_buildhistory_buildtime_pr_backwards(self):
         target = 'xcursor-transparent-theme'
         error = "ERROR:.*QA Issue: Package version for package %s went backwards which would break package feeds from (.*-r1.* to .*-r0.*)" % target
         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, error_regex=error)
 
-class ArchiverTest(oeSelfTest):
-    @testcase(926)
+class ArchiverTest(OESelftestTestCase):
+    @OETestID(926)
     def test_arch_work_dir_and_export_source(self):
         """
         Test for archiving the work directory and exporting the source files.
diff --git a/meta/lib/oeqa/selftest/containerimage.py b/meta/lib/oeqa/selftest/cases/containerimage.py
similarity index 97%
rename from meta/lib/oeqa/selftest/containerimage.py
rename to meta/lib/oeqa/selftest/cases/containerimage.py
index def481f..73162fa 100644
--- a/meta/lib/oeqa/selftest/containerimage.py
+++ b/meta/lib/oeqa/selftest/cases/containerimage.py
@@ -1,6 +1,6 @@
 import os
 
-from oeqa.selftest.base import oeSelfTest
+from oeqa.selftest.case import OESelftestTestCase
 from oeqa.utils.commands import bitbake, get_bb_vars, runCmd
 
 # This test builds an image with using the "container" IMAGE_FSTYPE, and
@@ -16,7 +16,7 @@ from oeqa.utils.commands import bitbake, get_bb_vars, runCmd
 # of them, but this test is more to catch if other packages get added by
 # default other than what is in ROOTFS_BOOTSTRAP_INSTALL.
 #
-class ContainerImageTests(oeSelfTest):
+class ContainerImageTests(OESelftestTestCase):
 
     # Verify that when specifying a IMAGE_TYPEDEP_ of the form "foo.bar" that
     # the conversion type bar gets added as a dep as well
diff --git a/meta/lib/oeqa/selftest/devtool.py b/meta/lib/oeqa/selftest/cases/devtool.py
similarity index 99%
rename from meta/lib/oeqa/selftest/devtool.py
rename to meta/lib/oeqa/selftest/cases/devtool.py
index 39f3543..75340d6 100644
--- a/meta/lib/oeqa/selftest/devtool.py
+++ b/meta/lib/oeqa/selftest/cases/devtool.py
@@ -1,6 +1,4 @@
-import unittest
 import os
-import logging
 import re
 import shutil
 import tempfile
@@ -8,12 +6,12 @@ import glob
 import fnmatch
 
 import oeqa.utils.ftools as ftools
-from oeqa.selftest.base import oeSelfTest
+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.decorators import testcase
+from oeqa.core.decorator.oeid import OETestID
 
-class DevtoolBase(oeSelfTest):
+class DevtoolBase(OESelftestTestCase):
 
     def _test_recipe_contents(self, recipefile, checkvars, checkinherits):
         with open(recipefile, 'r') as f:
@@ -120,6 +118,7 @@ class DevtoolTests(DevtoolBase):
 
     @classmethod
     def setUpClass(cls):
+        super(DevtoolTests, cls).setUpClass()
         bb_vars = get_bb_vars(['TOPDIR', 'SSTATE_DIR'])
         cls.original_sstate = bb_vars['SSTATE_DIR']
         cls.devtool_sstate = os.path.join(bb_vars['TOPDIR'], 'sstate_devtool')
@@ -129,8 +128,9 @@ class DevtoolTests(DevtoolBase):
 
     @classmethod
     def tearDownClass(cls):
-        cls.log.debug('Deleting devtool sstate cache on %s' % cls.devtool_sstate)
+        cls.logger.debug('Deleting devtool sstate cache on %s' % cls.devtool_sstate)
         runCmd('rm -rf %s' % cls.devtool_sstate)
+        super(DevtoolTests, cls).tearDownClass()
 
     def setUp(self):
         """Test case setup function"""
@@ -168,7 +168,7 @@ class DevtoolTests(DevtoolBase):
         if expected_status:
             self.fail('Missing file changes: %s' % expected_status)
 
-    @testcase(1158)
+    @OETestID(1158)
     def test_create_workspace(self):
         # Check preconditions
         result = runCmd('bitbake-layers show-layers')
@@ -189,7 +189,7 @@ class DevtoolTests(DevtoolBase):
         self.assertNotIn(tempdir, result.output)
         self.assertIn(self.workspacedir, result.output)
 
-    @testcase(1159)
+    @OETestID(1159)
     def test_devtool_add(self):
         # Fetch source
         tempdir = tempfile.mkdtemp(prefix='devtoolqa')
@@ -222,7 +222,7 @@ class DevtoolTests(DevtoolBase):
             bindir = bindir[1:]
         self.assertTrue(os.path.isfile(os.path.join(installdir, bindir, 'pv')), 'pv binary not found in D')
 
-    @testcase(1423)
+    @OETestID(1423)
     def test_devtool_add_git_local(self):
         # Fetch source from a remote URL, but do it outside of devtool
         tempdir = tempfile.mkdtemp(prefix='devtoolqa')
@@ -262,7 +262,7 @@ class DevtoolTests(DevtoolBase):
         checkvars['DEPENDS'] = set(['dbus'])
         self._test_recipe_contents(recipefile, checkvars, [])
 
-    @testcase(1162)
+    @OETestID(1162)
     def test_devtool_add_library(self):
         # Fetch source
         tempdir = tempfile.mkdtemp(prefix='devtoolqa')
@@ -311,7 +311,7 @@ class DevtoolTests(DevtoolBase):
         self.assertFalse(matches, 'Stamp files exist for recipe libftdi that should have been cleaned')
         self.assertFalse(os.path.isfile(os.path.join(staging_libdir, 'libftdi1.so.2.1.0')), 'libftdi binary still found in STAGING_LIBDIR after cleaning')
 
-    @testcase(1160)
+    @OETestID(1160)
     def test_devtool_add_fetch(self):
         # Fetch source
         tempdir = tempfile.mkdtemp(prefix='devtoolqa')
@@ -357,7 +357,7 @@ class DevtoolTests(DevtoolBase):
         checkvars['SRC_URI'] = url
         self._test_recipe_contents(recipefile, checkvars, [])
 
-    @testcase(1161)
+    @OETestID(1161)
     def test_devtool_add_fetch_git(self):
         tempdir = tempfile.mkdtemp(prefix='devtoolqa')
         self.track_for_cleanup(tempdir)
@@ -405,7 +405,7 @@ class DevtoolTests(DevtoolBase):
         checkvars['SRCREV'] = checkrev
         self._test_recipe_contents(recipefile, checkvars, [])
 
-    @testcase(1391)
+    @OETestID(1391)
     def test_devtool_add_fetch_simple(self):
         # Fetch source from a remote URL, auto-detecting name
         tempdir = tempfile.mkdtemp(prefix='devtoolqa')
@@ -433,7 +433,7 @@ class DevtoolTests(DevtoolBase):
         checkvars['SRC_URI'] = url.replace(testver, '${PV}')
         self._test_recipe_contents(recipefile, checkvars, [])
 
-    @testcase(1164)
+    @OETestID(1164)
     def test_devtool_modify(self):
         import oe.path
 
@@ -537,7 +537,7 @@ class DevtoolTests(DevtoolBase):
         finally:
             self.delete_recipeinc('m4')
 
-    @testcase(1166)
+    @OETestID(1166)
     def test_devtool_modify_invalid(self):
         # Try modifying some recipes
         tempdir = tempfile.mkdtemp(prefix='devtoolqa')
@@ -566,7 +566,7 @@ class DevtoolTests(DevtoolBase):
             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)
 
-    @testcase(1365)
+    @OETestID(1365)
     def test_devtool_modify_native(self):
         # Check preconditions
         self.assertTrue(not os.path.exists(self.workspacedir), 'This test cannot be run with a workspace directory under the build directory')
@@ -596,7 +596,7 @@ class DevtoolTests(DevtoolBase):
         self.assertTrue(inheritnative, 'None of these recipes do "inherit native" - need to adjust testrecipes list: %s' % ', '.join(testrecipes))
 
 
-    @testcase(1165)
+    @OETestID(1165)
     def test_devtool_modify_git(self):
         # Check preconditions
         testrecipe = 'mkelfimage'
@@ -624,7 +624,7 @@ class DevtoolTests(DevtoolBase):
         # Try building
         bitbake(testrecipe)
 
-    @testcase(1167)
+    @OETestID(1167)
     def test_devtool_modify_localfiles(self):
         # Check preconditions
         testrecipe = 'lighttpd'
@@ -655,7 +655,7 @@ class DevtoolTests(DevtoolBase):
         # Try building
         bitbake(testrecipe)
 
-    @testcase(1378)
+    @OETestID(1378)
     def test_devtool_modify_virtual(self):
         # Try modifying a virtual recipe
         virtrecipe = 'virtual/make'
@@ -678,7 +678,7 @@ class DevtoolTests(DevtoolBase):
         # This is probably sufficient
 
 
-    @testcase(1169)
+    @OETestID(1169)
     def test_devtool_update_recipe(self):
         # Check preconditions
         testrecipe = 'minicom'
@@ -711,7 +711,7 @@ class DevtoolTests(DevtoolBase):
                            ('??', '.*/0002-Add-a-new-file.patch$')]
         self._check_repo_status(os.path.dirname(recipefile), expected_status)
 
-    @testcase(1172)
+    @OETestID(1172)
     def test_devtool_update_recipe_git(self):
         # Check preconditions
         testrecipe = 'mtd-utils'
@@ -781,7 +781,7 @@ class DevtoolTests(DevtoolBase):
                            ('??', '%s/0002-Add-a-new-file.patch' % relpatchpath)]
         self._check_repo_status(os.path.dirname(recipefile), expected_status)
 
-    @testcase(1170)
+    @OETestID(1170)
     def test_devtool_update_recipe_append(self):
         # Check preconditions
         testrecipe = 'mdadm'
@@ -850,7 +850,7 @@ class DevtoolTests(DevtoolBase):
             self.assertEqual(expectedlines, f.readlines())
         # Deleting isn't expected to work under these circumstances
 
-    @testcase(1171)
+    @OETestID(1171)
     def test_devtool_update_recipe_append_git(self):
         # Check preconditions
         testrecipe = 'mtd-utils'
@@ -940,7 +940,7 @@ class DevtoolTests(DevtoolBase):
             self.assertEqual(expectedlines, set(f.readlines()))
         # Deleting isn't expected to work under these circumstances
 
-    @testcase(1370)
+    @OETestID(1370)
     def test_devtool_update_recipe_local_files(self):
         """Check that local source files are copied over instead of patched"""
         testrecipe = 'makedevs'
@@ -972,7 +972,7 @@ class DevtoolTests(DevtoolBase):
                            ('??', '.*/makedevs/0001-Add-new-file.patch$')]
         self._check_repo_status(os.path.dirname(recipefile), expected_status)
 
-    @testcase(1371)
+    @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'
@@ -1085,7 +1085,7 @@ class DevtoolTests(DevtoolBase):
         expected_status = []
         self._check_repo_status(os.path.dirname(recipefile), expected_status)
 
-    @testcase(1163)
+    @OETestID(1163)
     def test_devtool_extract(self):
         tempdir = tempfile.mkdtemp(prefix='devtoolqa')
         # Try devtool extract
@@ -1097,7 +1097,7 @@ class DevtoolTests(DevtoolBase):
         self.assertFalse(os.path.exists(self.workspacedir))
         self._check_src_repo(tempdir)
 
-    @testcase(1379)
+    @OETestID(1379)
     def test_devtool_extract_virtual(self):
         tempdir = tempfile.mkdtemp(prefix='devtoolqa')
         # Try devtool extract
@@ -1108,7 +1108,7 @@ class DevtoolTests(DevtoolBase):
         self.assertFalse(os.path.exists(self.workspacedir))
         self._check_src_repo(tempdir)
 
-    @testcase(1168)
+    @OETestID(1168)
     def test_devtool_reset_all(self):
         tempdir = tempfile.mkdtemp(prefix='devtoolqa')
         self.track_for_cleanup(tempdir)
@@ -1135,7 +1135,7 @@ class DevtoolTests(DevtoolBase):
         matches2 = glob.glob(stampprefix2 + '*')
         self.assertFalse(matches2, 'Stamp files exist for recipe %s that should have been cleaned' % testrecipe2)
 
-    @testcase(1272)
+    @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
@@ -1221,7 +1221,7 @@ class DevtoolTests(DevtoolBase):
             result = 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')
 
-    @testcase(1366)
+    @OETestID(1366)
     def test_devtool_build_image(self):
         """Test devtool build-image plugin"""
         # Check preconditions
@@ -1255,7 +1255,7 @@ class DevtoolTests(DevtoolBase):
         if reqpkgs:
             self.fail('The following packages were not present in the image as expected: %s' % ', '.join(reqpkgs))
 
-    @testcase(1367)
+    @OETestID(1367)
     def test_devtool_upgrade(self):
         # Check preconditions
         self.assertTrue(not os.path.exists(self.workspacedir), 'This test cannot be run with a workspace directory under the build directory')
@@ -1300,7 +1300,7 @@ class DevtoolTests(DevtoolBase):
         self.assertNotIn(recipe, result.output)
         self.assertFalse(os.path.exists(os.path.join(self.workspacedir, 'recipes', recipe)), 'Recipe directory should not exist after resetting')
 
-    @testcase(1433)
+    @OETestID(1433)
     def test_devtool_upgrade_git(self):
         # Check preconditions
         self.assertTrue(not os.path.exists(self.workspacedir), 'This test cannot be run with a workspace directory under the build directory')
@@ -1337,7 +1337,7 @@ class DevtoolTests(DevtoolBase):
         self.assertNotIn(recipe, result.output)
         self.assertFalse(os.path.exists(os.path.join(self.workspacedir, 'recipes', recipe)), 'Recipe directory should not exist after resetting')
 
-    @testcase(1352)
+    @OETestID(1352)
     def test_devtool_layer_plugins(self):
         """Test that devtool can use plugins from other layers.
 
@@ -1609,7 +1609,7 @@ class DevtoolTests(DevtoolBase):
         checkvars['SRC_URI'] = url
         self._test_recipe_contents(newrecipefile, checkvars, [])
 
-    @testcase(1577)
+    @OETestID(1577)
     def test_devtool_virtual_kernel_modify(self):
         """
         Summary:        The purpose of this test case is to verify that
diff --git a/meta/lib/oeqa/selftest/eSDK.py b/meta/lib/oeqa/selftest/cases/eSDK.py
similarity index 92%
rename from meta/lib/oeqa/selftest/eSDK.py
rename to meta/lib/oeqa/selftest/cases/eSDK.py
index 1596c6e..f36c3cc 100644
--- a/meta/lib/oeqa/selftest/eSDK.py
+++ b/meta/lib/oeqa/selftest/cases/eSDK.py
@@ -1,16 +1,12 @@
-import unittest
 import tempfile
 import shutil
 import os
 import glob
-import logging
-import subprocess
-import oeqa.utils.ftools as ftools
-from oeqa.utils.decorators import testcase
-from oeqa.selftest.base import oeSelfTest
+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(oeSelfTest):
+class oeSDKExtSelfTest(OESelftestTestCase):
     """
     # Bugzilla Test Plan: 6033
     # This code is planned to be part of the automation for eSDK containig
@@ -73,6 +69,7 @@ CORE_IMAGE_EXTRA_INSTALL = "perl"
 
     @classmethod
     def setUpClass(cls):
+        super(oeSDKExtSelfTest, cls).setUpClass()
         cls.tmpdir_eSDKQA = tempfile.mkdtemp(prefix='eSDKQA')
 
         sstate_dir = get_bb_var('SSTATE_DIR')
@@ -97,19 +94,18 @@ SSTATE_MIRRORS =  "file://.* file://%s/PATH"
     @classmethod
     def tearDownClass(cls):
         shutil.rmtree(cls.tmpdir_eSDKQA)
+        super(oeSDKExtSelfTest, cls).tearDownClass()
 
-    @testcase (1602)
+    @OETestID(1602)
     def test_install_libraries_headers(self):
         pn_sstate = 'bc'
         bitbake(pn_sstate)
         cmd = "devtool sdk-install %s " % pn_sstate
         oeSDKExtSelfTest.run_esdk_cmd(self.env_eSDK, self.tmpdir_eSDKQA, cmd)
 
-    @testcase(1603)
+    @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)
 
-if __name__ == '__main__':
-    unittest.main()
diff --git a/meta/lib/oeqa/selftest/image_typedep.py b/meta/lib/oeqa/selftest/cases/image_typedep.py
similarity index 93%
rename from meta/lib/oeqa/selftest/image_typedep.py
rename to meta/lib/oeqa/selftest/cases/image_typedep.py
index 256142d25..0614c76 100644
--- a/meta/lib/oeqa/selftest/image_typedep.py
+++ b/meta/lib/oeqa/selftest/cases/image_typedep.py
@@ -1,9 +1,9 @@
 import os
 
-from oeqa.selftest.base import oeSelfTest
+from oeqa.selftest.case import OESelftestTestCase
 from oeqa.utils.commands import bitbake
 
-class ImageTypeDepTests(oeSelfTest):
+class ImageTypeDepTests(OESelftestTestCase):
 
     # Verify that when specifying a IMAGE_TYPEDEP_ of the form "foo.bar" that
     # the conversion type bar gets added as a dep as well
diff --git a/meta/lib/oeqa/selftest/imagefeatures.py b/meta/lib/oeqa/selftest/cases/imagefeatures.py
similarity index 95%
rename from meta/lib/oeqa/selftest/imagefeatures.py
rename to meta/lib/oeqa/selftest/cases/imagefeatures.py
index 76896c7..45a06fe 100644
--- a/meta/lib/oeqa/selftest/imagefeatures.py
+++ b/meta/lib/oeqa/selftest/cases/imagefeatures.py
@@ -1,17 +1,15 @@
-from oeqa.selftest.base import oeSelfTest
+from oeqa.selftest.case import OESelftestTestCase
 from oeqa.utils.commands import runCmd, bitbake, get_bb_var, runqemu
-from oeqa.utils.decorators import testcase
+from oeqa.core.decorator.oeid import OETestID
 from oeqa.utils.sshcontrol import SSHControl
 import os
-import sys
-import logging
 
-class ImageFeatures(oeSelfTest):
+class ImageFeatures(OESelftestTestCase):
 
     test_user = 'tester'
     root_user = 'root'
 
-    @testcase(1107)
+    @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
@@ -37,7 +35,7 @@ class ImageFeatures(oeSelfTest):
                 status, output = ssh.run("true")
                 self.assertEqual(status, 0, 'ssh to user %s failed with %s' % (user, output))
 
-    @testcase(1115)
+    @OETestID(1115)
     def test_all_users_can_connect_via_ssh_without_password(self):
         """
         Summary:     Check if all users can connect via ssh without password
@@ -67,7 +65,7 @@ class ImageFeatures(oeSelfTest):
                     self.assertEqual(status, 0, 'ssh to user tester failed with %s' % output)
 
 
-    @testcase(1116)
+    @OETestID(1116)
     def test_clutter_image_can_be_built(self):
         """
         Summary:     Check if clutter image can be built
@@ -80,7 +78,7 @@ class ImageFeatures(oeSelfTest):
         # Build a core-image-clutter
         bitbake('core-image-clutter')
 
-    @testcase(1117)
+    @OETestID(1117)
     def test_wayland_support_in_image(self):
         """
         Summary:     Check Wayland support in image
diff --git a/meta/lib/oeqa/selftest/layerappend.py b/meta/lib/oeqa/selftest/cases/layerappend.py
similarity index 93%
rename from meta/lib/oeqa/selftest/layerappend.py
rename to meta/lib/oeqa/selftest/cases/layerappend.py
index 37bb32c..9562116 100644
--- a/meta/lib/oeqa/selftest/layerappend.py
+++ b/meta/lib/oeqa/selftest/cases/layerappend.py
@@ -1,15 +1,11 @@
-import unittest
 import os
-import logging
-import re
 
-from oeqa.selftest.base import oeSelfTest
-from oeqa.selftest.buildhistory import BuildhistoryBase
+from oeqa.selftest.case import OESelftestTestCase
 from oeqa.utils.commands import runCmd, bitbake, get_bb_var
 import oeqa.utils.ftools as ftools
-from oeqa.utils.decorators import testcase
+from oeqa.core.decorator.oeid import OETestID
 
-class LayerAppendTests(oeSelfTest):
+class LayerAppendTests(OESelftestTestCase):
     layerconf = """
 # We have a conf and classes directory, append to BBPATH
 BBPATH .= ":${LAYERDIR}"
@@ -51,8 +47,9 @@ SRC_URI_append += "file://appendtest.txt"
     def tearDownLocal(self):
         if self.layerappend:
             ftools.remove_from_file(self.builddir + "/conf/bblayers.conf", self.layerappend)
+        super(LayerAppendTests, self).tearDownLocal()
 
-    @testcase(1196)
+    @OETestID(1196)
     def test_layer_appends(self):
         corebase = get_bb_var("COREBASE")
 
@@ -96,5 +93,3 @@ SRC_URI_append += "file://appendtest.txt"
         bitbake("layerappendtest")
         data = ftools.read_file(stagingdir + "/appendtest.txt")
         self.assertEqual(data, "Layer 2 test")
-
-
diff --git a/meta/lib/oeqa/selftest/liboe.py b/meta/lib/oeqa/selftest/cases/liboe.py
similarity index 96%
rename from meta/lib/oeqa/selftest/liboe.py
rename to meta/lib/oeqa/selftest/cases/liboe.py
index 0b0301d..01b2cab 100644
--- a/meta/lib/oeqa/selftest/liboe.py
+++ b/meta/lib/oeqa/selftest/cases/liboe.py
@@ -1,14 +1,13 @@
-from oeqa.selftest.base import oeSelfTest
+from oeqa.selftest.case import OESelftestTestCase
 from oeqa.utils.commands import get_bb_var, get_bb_vars, bitbake, runCmd
 import oe.path
-import glob
 import os
-import os.path
 
-class LibOE(oeSelfTest):
+class LibOE(OESelftestTestCase):
 
     @classmethod
     def setUpClass(cls):
+        super(LibOE, cls).setUpClass()
         cls.tmp_dir = get_bb_var('TMPDIR')
 
     def test_copy_tree_special(self):
diff --git a/meta/lib/oeqa/selftest/lic-checksum.py b/meta/lib/oeqa/selftest/cases/lic_checksum.py
similarity index 87%
rename from meta/lib/oeqa/selftest/lic-checksum.py
rename to meta/lib/oeqa/selftest/cases/lic_checksum.py
index 2e81373..3740715 100644
--- a/meta/lib/oeqa/selftest/lic-checksum.py
+++ b/meta/lib/oeqa/selftest/cases/lic_checksum.py
@@ -1,16 +1,16 @@
 import os
 import tempfile
 
-from oeqa.selftest.base import oeSelfTest
+from oeqa.selftest.case import OESelftestTestCase
 from oeqa.utils.commands import bitbake
 from oeqa.utils import CommandError
-from oeqa.utils.decorators import testcase
+from oeqa.core.decorator.oeid import OETestID
 
-class LicenseTests(oeSelfTest):
+class LicenseTests(OESelftestTestCase):
 
     # Verify that changing a license file that has an absolute path causes
     # the license qa to fail due to a mismatched md5sum.
-    @testcase(1197)
+    @OETestID(1197)
     def test_nonmatching_checksum(self):
         bitbake_cmd = '-c populate_lic emptytest'
         error_msg = 'emptytest: The new md5 checksum is 8d777f385d3dfec8815d20f7496026dc'
diff --git a/meta/lib/oeqa/selftest/manifest.py b/meta/lib/oeqa/selftest/cases/manifest.py
similarity index 80%
rename from meta/lib/oeqa/selftest/manifest.py
rename to meta/lib/oeqa/selftest/cases/manifest.py
index fe6f949..1460719 100644
--- a/meta/lib/oeqa/selftest/manifest.py
+++ b/meta/lib/oeqa/selftest/cases/manifest.py
@@ -1,9 +1,8 @@
-import unittest
 import os
 
-from oeqa.selftest.base import oeSelfTest
+from oeqa.selftest.case import OESelftestTestCase
 from oeqa.utils.commands import get_bb_var, get_bb_vars, bitbake
-from oeqa.utils.decorators import testcase
+from oeqa.core.decorator.oeid import OETestID
 
 class ManifestEntry:
     '''A manifest item of a collection able to list missing packages'''
@@ -11,7 +10,7 @@ class ManifestEntry:
         self.file = entry
         self.missing = []
 
-class VerifyManifest(oeSelfTest):
+class VerifyManifest(OESelftestTestCase):
     '''Tests for the manifest files and contents of an image'''
 
     @classmethod
@@ -21,14 +20,14 @@ class VerifyManifest(oeSelfTest):
             with open(manifest, "r") as mfile:
                 for line in mfile:
                     manifest_entry = os.path.join(path, line.split()[0])
-                    self.log.debug("{}: looking for {}"\
+                    self.logger.debug("{}: looking for {}"\
                                     .format(self.classname, manifest_entry))
                     if not os.path.isfile(manifest_entry):
                         manifest_errors.append(manifest_entry)
-                        self.log.debug("{}: {} not found"\
+                        self.logger.debug("{}: {} not found"\
                                     .format(self.classname, manifest_entry))
         except OSError as e:
-            self.log.debug("{}: checking of {} failed"\
+            self.logger.debug("{}: checking of {} failed"\
                     .format(self.classname, manifest))
             raise e
 
@@ -40,7 +39,7 @@ class VerifyManifest(oeSelfTest):
         target == self.buildtarget if target == None else target
         directory = get_bb_var(bb_var, target);
         if not directory or not os.path.isdir(directory):
-            self.log.debug("{}: {} points to {} when target = {}"\
+            self.logger.debug("{}: {} points to {} when target = {}"\
                     .format(self.classname, bb_var, directory, target))
             raise OSError
         return directory
@@ -48,18 +47,19 @@ class VerifyManifest(oeSelfTest):
     @classmethod
     def setUpClass(self):
 
+        super(VerifyManifest, self).setUpClass()
         self.buildtarget = 'core-image-minimal'
         self.classname = 'VerifyManifest'
 
-        self.log.info("{}: doing bitbake {} as a prerequisite of the test"\
+        self.logger.info("{}: doing bitbake {} as a prerequisite of the test"\
                 .format(self.classname, self.buildtarget))
         if bitbake(self.buildtarget).status:
-            self.log.debug("{} Failed to setup {}"\
+            self.logger.debug("{} Failed to setup {}"\
                     .format(self.classname, self.buildtarget))
-            unittest.SkipTest("{}: Cannot setup testing scenario"\
+            self.skipTest("{}: Cannot setup testing scenario"\
                     .format(self.classname))
 
-    @testcase(1380)
+    @OETestID(1380)
     def test_SDK_manifest_entries(self):
         '''Verifying the SDK manifest entries exist, this may take a build'''
 
@@ -67,12 +67,12 @@ class VerifyManifest(oeSelfTest):
         # to do an additional setup for the sdk
         sdktask = '-c populate_sdk'
         bbargs = sdktask + ' ' + self.buildtarget
-        self.log.debug("{}: doing bitbake {} as a prerequisite of the test"\
+        self.logger.debug("{}: doing bitbake {} as a prerequisite of the test"\
                 .format(self.classname, bbargs))
         if bitbake(bbargs).status:
-            self.log.debug("{} Failed to bitbake {}"\
+            self.logger.debug("{} Failed to bitbake {}"\
                     .format(self.classname, bbargs))
-            unittest.SkipTest("{}: Cannot setup testing scenario"\
+            self.skipTest("{}: Cannot setup testing scenario"\
                     .format(self.classname))
 
 
@@ -91,7 +91,7 @@ class VerifyManifest(oeSelfTest):
                         k)
                 mpath[k] = os.path.join(mdir, mfilename[k])
                 if not os.path.isfile(mpath[k]):
-                    self.log.debug("{}: {} does not exist".format(
+                    self.logger.debug("{}: {} does not exist".format(
                         self.classname, mpath[k]))
                     raise IOError
                 m_entry[k] = ManifestEntry(mpath[k])
@@ -101,11 +101,11 @@ class VerifyManifest(oeSelfTest):
                 reverse_dir[k] = os.path.join(pkgdata_dir[k],
                         'runtime-reverse')
                 if not os.path.exists(reverse_dir[k]):
-                    self.log.debug("{}: {} does not exist".format(
+                    self.logger.debug("{}: {} does not exist".format(
                         self.classname, reverse_dir[k]))
                     raise IOError
         except OSError:
-            raise unittest.SkipTest("{}: Error in obtaining manifest dirs"\
+            raise self.skipTest("{}: Error in obtaining manifest dirs"\
                 .format(self.classname))
         except IOError:
             msg = "{}: Error cannot find manifests in the specified dir:\n{}"\
@@ -113,7 +113,7 @@ class VerifyManifest(oeSelfTest):
             self.fail(msg)
 
         for k in d_target.keys():
-            self.log.debug("{}: Check manifest {}".format(
+            self.logger.debug("{}: Check manifest {}".format(
                 self.classname, m_entry[k].file))
 
             m_entry[k].missing = self.check_manifest_entries(\
@@ -122,11 +122,11 @@ class VerifyManifest(oeSelfTest):
                 msg = '{}: {} Error has the following missing entries'\
                         .format(self.classname, m_entry[k].file)
                 logmsg = msg+':\n'+'\n'.join(m_entry[k].missing)
-                self.log.debug(logmsg)
-                self.log.info(msg)
+                self.logger.debug(logmsg)
+                self.logger.info(msg)
                 self.fail(logmsg)
 
-    @testcase(1381)
+    @OETestID(1381)
     def test_image_manifest_entries(self):
         '''Verifying the image manifest entries exist'''
 
@@ -146,14 +146,14 @@ class VerifyManifest(oeSelfTest):
             revdir = os.path.join(pkgdata_dir, 'runtime-reverse')
             if not os.path.exists(revdir): raise IOError
         except OSError:
-            raise unittest.SkipTest("{}: Error in obtaining manifest dirs"\
+            raise self.skipTest("{}: Error in obtaining manifest dirs"\
                 .format(self.classname))
         except IOError:
             msg = "{}: Error cannot find manifests in dir:\n{}"\
                     .format(self.classname, mdir)
             self.fail(msg)
 
-        self.log.debug("{}: Check manifest {}"\
+        self.logger.debug("{}: Check manifest {}"\
                             .format(self.classname, m_entry.file))
         m_entry.missing = self.check_manifest_entries(\
                                                     m_entry.file, revdir)
@@ -161,6 +161,6 @@ class VerifyManifest(oeSelfTest):
             msg = '{}: {} Error has the following missing entries'\
                     .format(self.classname, m_entry.file)
             logmsg = msg+':\n'+'\n'.join(m_entry.missing)
-            self.log.debug(logmsg)
-            self.log.info(msg)
+            self.logger.debug(logmsg)
+            self.logger.info(msg)
             self.fail(logmsg)
diff --git a/meta/lib/oeqa/selftest/oelib/__init__.py b/meta/lib/oeqa/selftest/cases/oelib/__init__.py
similarity index 100%
rename from meta/lib/oeqa/selftest/oelib/__init__.py
rename to meta/lib/oeqa/selftest/cases/oelib/__init__.py
diff --git a/meta/lib/oeqa/selftest/oelib/buildhistory.py b/meta/lib/oeqa/selftest/cases/oelib/buildhistory.py
similarity index 97%
rename from meta/lib/oeqa/selftest/oelib/buildhistory.py
rename to meta/lib/oeqa/selftest/cases/oelib/buildhistory.py
index 5ed4b02..4e87751 100644
--- a/meta/lib/oeqa/selftest/oelib/buildhistory.py
+++ b/meta/lib/oeqa/selftest/cases/oelib/buildhistory.py
@@ -1,11 +1,11 @@
 import os
-import unittest
+from oeqa.selftest.case import OESelftestTestCase
 import tempfile
 from git import Repo
 from oeqa.utils.commands import get_bb_var
 from oe.buildhistory_analysis import blob_to_dict, compare_dict_blobs
 
-class TestBlobParsing(unittest.TestCase):
+class TestBlobParsing(OESelftestTestCase):
 
     def setUp(self):
         import time
diff --git a/meta/lib/oeqa/selftest/oelib/elf.py b/meta/lib/oeqa/selftest/cases/oelib/elf.py
similarity index 92%
rename from meta/lib/oeqa/selftest/oelib/elf.py
rename to meta/lib/oeqa/selftest/cases/oelib/elf.py
index 1f59037..0451eba 100644
--- a/meta/lib/oeqa/selftest/oelib/elf.py
+++ b/meta/lib/oeqa/selftest/cases/oelib/elf.py
@@ -1,7 +1,7 @@
-import unittest
+from oeqa.selftest.case import OESelftestTestCase
 import oe.qa
 
-class TestElf(unittest.TestCase):
+class TestElf(OESelftestTestCase):
     def test_machine_name(self):
         """
         Test elf_machine_to_string()
diff --git a/meta/lib/oeqa/selftest/oelib/license.py b/meta/lib/oeqa/selftest/cases/oelib/license.py
similarity index 93%
rename from meta/lib/oeqa/selftest/oelib/license.py
rename to meta/lib/oeqa/selftest/cases/oelib/license.py
index c388886..a6d9c9a 100644
--- a/meta/lib/oeqa/selftest/oelib/license.py
+++ b/meta/lib/oeqa/selftest/cases/oelib/license.py
@@ -1,4 +1,4 @@
-import unittest
+from oeqa.selftest.case import OESelftestTestCase
 import oe.license
 
 class SeenVisitor(oe.license.LicenseVisitor):
@@ -9,7 +9,7 @@ class SeenVisitor(oe.license.LicenseVisitor):
     def visit_Str(self, node):
         self.seen.append(node.s)
 
-class TestSingleLicense(unittest.TestCase):
+class TestSingleLicense(OESelftestTestCase):
     licenses = [
         "GPLv2",
         "LGPL-2.0",
@@ -37,7 +37,7 @@ class TestSingleLicense(unittest.TestCase):
                 self.parse(license)
             self.assertEqual(cm.exception.license, license)
 
-class TestSimpleCombinations(unittest.TestCase):
+class TestSimpleCombinations(OESelftestTestCase):
     tests = {
         "FOO&BAR": ["FOO", "BAR"],
         "BAZ & MOO": ["BAZ", "MOO"],
diff --git a/meta/lib/oeqa/selftest/oelib/path.py b/meta/lib/oeqa/selftest/cases/oelib/path.py
similarity index 97%
rename from meta/lib/oeqa/selftest/oelib/path.py
rename to meta/lib/oeqa/selftest/cases/oelib/path.py
index 44d0681..2ae5eaf 100644
--- a/meta/lib/oeqa/selftest/oelib/path.py
+++ b/meta/lib/oeqa/selftest/cases/oelib/path.py
@@ -1,11 +1,11 @@
-import unittest
+from oeqa.selftest.case import OESelftestTestCase
 import oe, oe.path
 import tempfile
 import os
 import errno
 import shutil
 
-class TestRealPath(unittest.TestCase):
+class TestRealPath(OESelftestTestCase):
     DIRS = [ "a", "b", "etc", "sbin", "usr", "usr/bin", "usr/binX", "usr/sbin", "usr/include", "usr/include/gdbm" ]
     FILES = [ "etc/passwd", "b/file" ]
     LINKS = [
diff --git a/meta/lib/oeqa/selftest/oelib/types.py b/meta/lib/oeqa/selftest/cases/oelib/types.py
similarity index 93%
rename from meta/lib/oeqa/selftest/oelib/types.py
rename to meta/lib/oeqa/selftest/cases/oelib/types.py
index 4fe2746..99c8404 100644
--- a/meta/lib/oeqa/selftest/oelib/types.py
+++ b/meta/lib/oeqa/selftest/cases/oelib/types.py
@@ -1,7 +1,7 @@
-import unittest
+from oeqa.selftest.case import OESelftestTestCase
 from oe.maketype import create
 
-class TestBooleanType(unittest.TestCase):
+class TestBooleanType(OESelftestTestCase):
     def test_invalid(self):
         self.assertRaises(ValueError, create, '', 'boolean')
         self.assertRaises(ValueError, create, 'foo', 'boolean')
@@ -31,7 +31,7 @@ class TestBooleanType(unittest.TestCase):
         self.assertEqual(create('y', 'boolean'), True)
         self.assertNotEqual(create('y', 'boolean'), False)
 
-class TestList(unittest.TestCase):
+class TestList(OESelftestTestCase):
     def assertListEqual(self, value, valid, sep=None):
         obj = create(value, 'list', separator=sep)
         self.assertEqual(obj, valid)
diff --git a/meta/lib/oeqa/selftest/oelib/utils.py b/meta/lib/oeqa/selftest/cases/oelib/utils.py
similarity index 91%
rename from meta/lib/oeqa/selftest/oelib/utils.py
rename to meta/lib/oeqa/selftest/cases/oelib/utils.py
index 7deb10f..5bc5fff 100644
--- a/meta/lib/oeqa/selftest/oelib/utils.py
+++ b/meta/lib/oeqa/selftest/cases/oelib/utils.py
@@ -1,7 +1,7 @@
-import unittest
+from oeqa.selftest.case import OESelftestTestCase
 from oe.utils import packages_filter_out_system, trim_version
 
-class TestPackagesFilterOutSystem(unittest.TestCase):
+class TestPackagesFilterOutSystem(OESelftestTestCase):
     def test_filter(self):
         """
         Test that oe.utils.packages_filter_out_system works.
@@ -31,7 +31,7 @@ class TestPackagesFilterOutSystem(unittest.TestCase):
         self.assertEqual(pkgs, ["foo-data"])
 
 
-class TestTrimVersion(unittest.TestCase):
+class TestTrimVersion(OESelftestTestCase):
     def test_version_exception(self):
         with self.assertRaises(TypeError):
             trim_version(None, 2)
diff --git a/meta/lib/oeqa/selftest/oescripts.py b/meta/lib/oeqa/selftest/cases/oescripts.py
similarity index 72%
rename from meta/lib/oeqa/selftest/oescripts.py
rename to meta/lib/oeqa/selftest/cases/oescripts.py
index 29547f5..1ee7537 100644
--- a/meta/lib/oeqa/selftest/oescripts.py
+++ b/meta/lib/oeqa/selftest/cases/oescripts.py
@@ -1,18 +1,11 @@
-import datetime
-import unittest
-import os
-import re
-import shutil
-
-import oeqa.utils.ftools as ftools
-from oeqa.selftest.base import oeSelfTest
-from oeqa.selftest.buildhistory import BuildhistoryBase
+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.decorators import testcase
+from oeqa.core.decorator.oeid import OETestID
 
 class BuildhistoryDiffTests(BuildhistoryBase):
 
-    @testcase(295)
+    @OETestID(295)
     def test_buildhistory_diff(self):
         target = 'xcursor-transparent-theme'
         self.run_buildhistory_operation(target, target_config="PR = \"r1\"", change_bh_location=True)
diff --git a/meta/lib/oeqa/selftest/package.py b/meta/lib/oeqa/selftest/cases/package.py
similarity index 97%
rename from meta/lib/oeqa/selftest/package.py
rename to meta/lib/oeqa/selftest/cases/package.py
index 95125f2..6a8bc92 100644
--- a/meta/lib/oeqa/selftest/package.py
+++ b/meta/lib/oeqa/selftest/cases/package.py
@@ -1,9 +1,9 @@
-from oeqa.selftest.base import oeSelfTest
+from oeqa.selftest.case import OESelftestTestCase
 from oeqa.utils.commands import bitbake, get_bb_vars
 import subprocess, os
 import oe.path
 
-class VersionOrdering(oeSelfTest):
+class VersionOrdering(OESelftestTestCase):
     # version1, version2, sort order
     tests = (
         ("1.0", "1.0", 0),
diff --git a/meta/lib/oeqa/selftest/pkgdata.py b/meta/lib/oeqa/selftest/cases/pkgdata.py
similarity index 96%
rename from meta/lib/oeqa/selftest/pkgdata.py
rename to meta/lib/oeqa/selftest/cases/pkgdata.py
index d69c3c8..0b4caf1 100644
--- a/meta/lib/oeqa/selftest/pkgdata.py
+++ b/meta/lib/oeqa/selftest/cases/pkgdata.py
@@ -1,24 +1,21 @@
-import unittest
 import os
 import tempfile
-import logging
 import fnmatch
 
-import oeqa.utils.ftools as ftools
-from oeqa.selftest.base import oeSelfTest
+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.core.decorator.oeid import OETestID
 
-class OePkgdataUtilTests(oeSelfTest):
+class OePkgdataUtilTests(OESelftestTestCase):
 
     @classmethod
     def setUpClass(cls):
+        super(OePkgdataUtilTests, cls).setUpClass()
         # Ensure we have the right data in pkgdata
-        logger = logging.getLogger("selftest")
-        logger.info('Running bitbake to generate pkgdata')
+        cls.logger.info('Running bitbake to generate pkgdata')
         bitbake('busybox zlib m4')
 
-    @testcase(1203)
+    @OETestID(1203)
     def test_lookup_pkg(self):
         # Forward tests
         result = runCmd('oe-pkgdata-util lookup-pkg "zlib busybox"')
@@ -37,7 +34,7 @@ class OePkgdataUtilTests(oeSelfTest):
         self.assertEqual(result.status, 1, "Status different than 1. output: %s" % result.output)
         self.assertEqual(result.output, 'ERROR: The following packages could not be found: nonexistentpkg')
 
-    @testcase(1205)
+    @OETestID(1205)
     def test_read_value(self):
         result = runCmd('oe-pkgdata-util read-value PN libz1')
         self.assertEqual(result.output, 'zlib')
@@ -47,7 +44,7 @@ class OePkgdataUtilTests(oeSelfTest):
         pkgsize = int(result.output.strip())
         self.assertGreater(pkgsize, 1, "Size should be greater than 1. %s" % result.output)
 
-    @testcase(1198)
+    @OETestID(1198)
     def test_find_path(self):
         result = runCmd('oe-pkgdata-util find-path /lib/libz.so.1')
         self.assertEqual(result.output, 'zlib: /lib/libz.so.1')
@@ -57,7 +54,7 @@ class OePkgdataUtilTests(oeSelfTest):
         self.assertEqual(result.status, 1, "Status different than 1. output: %s" % result.output)
         self.assertEqual(result.output, 'ERROR: Unable to find any package producing path /not/exist')
 
-    @testcase(1204)
+    @OETestID(1204)
     def test_lookup_recipe(self):
         result = runCmd('oe-pkgdata-util lookup-recipe "libz-staticdev busybox"')
         self.assertEqual(result.output, 'zlib\nbusybox')
@@ -67,7 +64,7 @@ class OePkgdataUtilTests(oeSelfTest):
         self.assertEqual(result.status, 1, "Status different than 1. output: %s" % result.output)
         self.assertEqual(result.output, 'ERROR: The following packages could not be found: nonexistentpkg')
 
-    @testcase(1202)
+    @OETestID(1202)
     def test_list_pkgs(self):
         # No arguments
         result = runCmd('oe-pkgdata-util list-pkgs')
@@ -111,7 +108,7 @@ class OePkgdataUtilTests(oeSelfTest):
         pkglist = sorted(result.output.split())
         self.assertEqual(pkglist, ['libz-dbg', 'libz-dev', 'libz-doc'], "Packages listed: %s" % result.output)
 
-    @testcase(1201)
+    @OETestID(1201)
     def test_list_pkg_files(self):
         def splitoutput(output):
             files = {}
@@ -201,7 +198,7 @@ class OePkgdataUtilTests(oeSelfTest):
         self.assertIn(os.path.join(mandir, 'man3/zlib.3'), files['libz-doc'])
         self.assertIn(os.path.join(libdir, 'libz.a'), files['libz-staticdev'])
 
-    @testcase(1200)
+    @OETestID(1200)
     def test_glob(self):
         tempdir = tempfile.mkdtemp(prefix='pkgdataqa')
         self.track_for_cleanup(tempdir)
@@ -221,7 +218,7 @@ class OePkgdataUtilTests(oeSelfTest):
         self.assertNotIn('libz-dev', resultlist)
         self.assertNotIn('libz-dbg', resultlist)
 
-    @testcase(1206)
+    @OETestID(1206)
     def test_specify_pkgdatadir(self):
         result = runCmd('oe-pkgdata-util -p %s lookup-pkg zlib' % get_bb_var('PKGDATA_DIR'))
         self.assertEqual(result.output, 'libz1')
diff --git a/meta/lib/oeqa/selftest/prservice.py b/meta/lib/oeqa/selftest/cases/prservice.py
similarity index 93%
rename from meta/lib/oeqa/selftest/prservice.py
rename to meta/lib/oeqa/selftest/cases/prservice.py
index 34d4197..ed36f0f 100644
--- a/meta/lib/oeqa/selftest/prservice.py
+++ b/meta/lib/oeqa/selftest/cases/prservice.py
@@ -1,20 +1,19 @@
-import unittest
 import os
-import logging
 import re
 import shutil
 import datetime
 
 import oeqa.utils.ftools as ftools
-from oeqa.selftest.base import oeSelfTest
+from oeqa.selftest.case import OESelftestTestCase
 from oeqa.utils.commands import runCmd, bitbake, get_bb_var
-from oeqa.utils.decorators import testcase
+from oeqa.core.decorator.oeid import OETestID
 from oeqa.utils.network import get_free_port
 
-class BitbakePrTests(oeSelfTest):
+class BitbakePrTests(OESelftestTestCase):
 
     @classmethod
     def setUpClass(cls):
+        super(BitbakePrTests, cls).setUpClass()
         cls.pkgdata_dir = get_bb_var('PKGDATA_DIR')
 
     def get_pr_version(self, package_name):
@@ -89,39 +88,39 @@ class BitbakePrTests(oeSelfTest):
 
         self.assertTrue(pr_2 - pr_1 == 1, "Step between same pkg. revision is greater than 1")
 
-    @testcase(930)
+    @OETestID(930)
     def test_import_export_replace_db(self):
         self.run_test_pr_export_import('m4')
 
-    @testcase(931)
+    @OETestID(931)
     def test_import_export_override_db(self):
         self.run_test_pr_export_import('m4', replace_current_db=False)
 
-    @testcase(932)
+    @OETestID(932)
     def test_pr_service_rpm_arch_dep(self):
         self.run_test_pr_service('m4', 'rpm', 'do_package')
 
-    @testcase(934)
+    @OETestID(934)
     def test_pr_service_deb_arch_dep(self):
         self.run_test_pr_service('m4', 'deb', 'do_package')
 
-    @testcase(933)
+    @OETestID(933)
     def test_pr_service_ipk_arch_dep(self):
         self.run_test_pr_service('m4', 'ipk', 'do_package')
 
-    @testcase(935)
+    @OETestID(935)
     def test_pr_service_rpm_arch_indep(self):
         self.run_test_pr_service('xcursor-transparent-theme', 'rpm', 'do_package')
 
-    @testcase(937)
+    @OETestID(937)
     def test_pr_service_deb_arch_indep(self):
         self.run_test_pr_service('xcursor-transparent-theme', 'deb', 'do_package')
 
-    @testcase(936)
+    @OETestID(936)
     def test_pr_service_ipk_arch_indep(self):
         self.run_test_pr_service('xcursor-transparent-theme', 'ipk', 'do_package')
 
-    @testcase(1419)
+    @OETestID(1419)
     def test_stopping_prservice_message(self):
         port = get_free_port()
 
diff --git a/meta/lib/oeqa/selftest/recipetool.py b/meta/lib/oeqa/selftest/cases/recipetool.py
similarity index 97%
rename from meta/lib/oeqa/selftest/recipetool.py
rename to meta/lib/oeqa/selftest/cases/recipetool.py
index 7bfb02f..12c9011 100644
--- a/meta/lib/oeqa/selftest/recipetool.py
+++ b/meta/lib/oeqa/selftest/cases/recipetool.py
@@ -1,18 +1,15 @@
 import os
-import logging
 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.utils.decorators import testcase
-from oeqa.selftest import devtool
-
+from oeqa.core.decorator.oeid import OETestID
+from oeqa.selftest.cases import devtool
 
 templayerdir = None
 
-
 def setUpModule():
     global templayerdir
     templayerdir = tempfile.mkdtemp(prefix='recipetoolqa')
@@ -28,6 +25,7 @@ def tearDownModule():
 class RecipetoolBase(devtool.DevtoolBase):
 
     def setUpLocal(self):
+        super(RecipetoolBase, self).setUpLocal()
         self.templayerdir = templayerdir
         self.tempdir = tempfile.mkdtemp(prefix='recipetoolqa')
         self.track_for_cleanup(self.tempdir)
@@ -37,6 +35,7 @@ class RecipetoolBase(devtool.DevtoolBase):
 
     def tearDownLocal(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)
@@ -70,9 +69,9 @@ class RecipetoolTests(RecipetoolBase):
 
     @classmethod
     def setUpClass(cls):
+        super(RecipetoolTests, cls).setUpClass()
         # Ensure we have the right data in shlibs/pkgdata
-        logger = logging.getLogger("selftest")
-        logger.info('Running bitbake to generate 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.corebase = bb_vars['COREBASE']
@@ -90,7 +89,7 @@ class RecipetoolTests(RecipetoolBase):
         for errorstr in checkerror:
             self.assertIn(errorstr, result.output)
 
-    @testcase(1177)
+    @OETestID(1177)
     def test_recipetool_appendfile_basic(self):
         # Basic test
         expectedlines = ['FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"\n',
@@ -98,14 +97,14 @@ class RecipetoolTests(RecipetoolBase):
         _, output = self._try_recipetool_appendfile('base-files', '/etc/motd', self.testfile, '', expectedlines, ['motd'])
         self.assertNotIn('WARNING: ', output)
 
-    @testcase(1183)
+    @OETestID(1183)
     def test_recipetool_appendfile_invalid(self):
         # Test some commands that should error
         self._try_recipetool_appendfile_fail('/etc/passwd', self.testfile, ['ERROR: /etc/passwd cannot be handled by this tool', 'useradd', 'extrausers'])
         self._try_recipetool_appendfile_fail('/etc/timestamp', self.testfile, ['ERROR: /etc/timestamp cannot be handled by this tool'])
         self._try_recipetool_appendfile_fail('/dev/console', self.testfile, ['ERROR: /dev/console cannot be handled by this tool'])
 
-    @testcase(1176)
+    @OETestID(1176)
     def test_recipetool_appendfile_alternatives(self):
         # Now try with a file we know should be an alternative
         # (this is very much a fake example, but one we know is reliably an alternative)
@@ -129,7 +128,7 @@ class RecipetoolTests(RecipetoolBase):
         result = 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)
 
-    @testcase(1178)
+    @OETestID(1178)
     def test_recipetool_appendfile_binary(self):
         # Try appending a binary file
         # /bin/ls can be a symlink to /usr/bin/ls
@@ -138,7 +137,7 @@ class RecipetoolTests(RecipetoolBase):
         self.assertIn('WARNING: ', result.output)
         self.assertIn('is a binary', result.output)
 
-    @testcase(1173)
+    @OETestID(1173)
     def test_recipetool_appendfile_add(self):
         # Try arbitrary file add to a recipe
         expectedlines = ['FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"\n',
@@ -167,7 +166,7 @@ class RecipetoolTests(RecipetoolBase):
                          '}\n']
         self._try_recipetool_appendfile('netbase', '/usr/share/scriptname', testfile2, '-r netbase', expectedlines, ['testfile', testfile2name])
 
-    @testcase(1174)
+    @OETestID(1174)
     def test_recipetool_appendfile_add_bindir(self):
         # Try arbitrary file add to a recipe, this time to a location such that should be installed as executable
         expectedlines = ['FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"\n',
@@ -181,7 +180,7 @@ class RecipetoolTests(RecipetoolBase):
         _, output = self._try_recipetool_appendfile('netbase', '/usr/bin/selftest-recipetool-testbin', self.testfile, '-r netbase', expectedlines, ['testfile'])
         self.assertNotIn('WARNING: ', output)
 
-    @testcase(1175)
+    @OETestID(1175)
     def test_recipetool_appendfile_add_machine(self):
         # Try arbitrary file add to a recipe, this time to a location such that should be installed as executable
         expectedlines = ['FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"\n',
@@ -197,7 +196,7 @@ class RecipetoolTests(RecipetoolBase):
         _, output = self._try_recipetool_appendfile('netbase', '/usr/share/something', self.testfile, '-r netbase -m mymachine', expectedlines, ['mymachine/testfile'])
         self.assertNotIn('WARNING: ', output)
 
-    @testcase(1184)
+    @OETestID(1184)
     def test_recipetool_appendfile_orig(self):
         # A file that's in SRC_URI and in do_install with the same name
         expectedlines = ['FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"\n',
@@ -205,7 +204,7 @@ class RecipetoolTests(RecipetoolBase):
         _, output = self._try_recipetool_appendfile('selftest-recipetool-appendfile', '/usr/share/selftest-replaceme-orig', self.testfile, '', expectedlines, ['selftest-replaceme-orig'])
         self.assertNotIn('WARNING: ', output)
 
-    @testcase(1191)
+    @OETestID(1191)
     def test_recipetool_appendfile_todir(self):
         # A file that's in SRC_URI and in do_install with destination directory rather than file
         expectedlines = ['FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"\n',
@@ -213,7 +212,7 @@ class RecipetoolTests(RecipetoolBase):
         _, output = self._try_recipetool_appendfile('selftest-recipetool-appendfile', '/usr/share/selftest-replaceme-todir', self.testfile, '', expectedlines, ['selftest-replaceme-todir'])
         self.assertNotIn('WARNING: ', output)
 
-    @testcase(1187)
+    @OETestID(1187)
     def test_recipetool_appendfile_renamed(self):
         # A file that's in SRC_URI with a different name to the destination file
         expectedlines = ['FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"\n',
@@ -221,7 +220,7 @@ class RecipetoolTests(RecipetoolBase):
         _, output = self._try_recipetool_appendfile('selftest-recipetool-appendfile', '/usr/share/selftest-replaceme-renamed', self.testfile, '', expectedlines, ['file1'])
         self.assertNotIn('WARNING: ', output)
 
-    @testcase(1190)
+    @OETestID(1190)
     def test_recipetool_appendfile_subdir(self):
         # A file that's in SRC_URI in a subdir
         expectedlines = ['FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"\n',
@@ -235,7 +234,7 @@ class RecipetoolTests(RecipetoolBase):
         _, output = self._try_recipetool_appendfile('selftest-recipetool-appendfile', '/usr/share/selftest-replaceme-subdir', self.testfile, '', expectedlines, ['testfile'])
         self.assertNotIn('WARNING: ', output)
 
-    @testcase(1189)
+    @OETestID(1189)
     def test_recipetool_appendfile_src_glob(self):
         # A file that's in SRC_URI as a glob
         expectedlines = ['FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"\n',
@@ -249,7 +248,7 @@ class RecipetoolTests(RecipetoolBase):
         _, output = self._try_recipetool_appendfile('selftest-recipetool-appendfile', '/usr/share/selftest-replaceme-src-globfile', self.testfile, '', expectedlines, ['testfile'])
         self.assertNotIn('WARNING: ', output)
 
-    @testcase(1181)
+    @OETestID(1181)
     def test_recipetool_appendfile_inst_glob(self):
         # A file that's in do_install as a glob
         expectedlines = ['FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"\n',
@@ -257,7 +256,7 @@ class RecipetoolTests(RecipetoolBase):
         _, output = self._try_recipetool_appendfile('selftest-recipetool-appendfile', '/usr/share/selftest-replaceme-inst-globfile', self.testfile, '', expectedlines, ['selftest-replaceme-inst-globfile'])
         self.assertNotIn('WARNING: ', output)
 
-    @testcase(1182)
+    @OETestID(1182)
     def test_recipetool_appendfile_inst_todir_glob(self):
         # A file that's in do_install as a glob with destination as a directory
         expectedlines = ['FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"\n',
@@ -265,7 +264,7 @@ class RecipetoolTests(RecipetoolBase):
         _, output = self._try_recipetool_appendfile('selftest-recipetool-appendfile', '/usr/share/selftest-replaceme-inst-todir-globfile', self.testfile, '', expectedlines, ['selftest-replaceme-inst-todir-globfile'])
         self.assertNotIn('WARNING: ', output)
 
-    @testcase(1185)
+    @OETestID(1185)
     def test_recipetool_appendfile_patch(self):
         # A file that's added by a patch in SRC_URI
         expectedlines = ['FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"\n',
@@ -284,7 +283,7 @@ class RecipetoolTests(RecipetoolBase):
         else:
             self.fail('Patch warning not found in output:\n%s' % output)
 
-    @testcase(1188)
+    @OETestID(1188)
     def test_recipetool_appendfile_script(self):
         # Now, a file that's in SRC_URI but installed by a script (so no mention in do_install)
         expectedlines = ['FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"\n',
@@ -298,7 +297,7 @@ class RecipetoolTests(RecipetoolBase):
         _, output = self._try_recipetool_appendfile('selftest-recipetool-appendfile', '/usr/share/selftest-replaceme-scripted', self.testfile, '', expectedlines, ['testfile'])
         self.assertNotIn('WARNING: ', output)
 
-    @testcase(1180)
+    @OETestID(1180)
     def test_recipetool_appendfile_inst_func(self):
         # A file that's installed from a function called by do_install
         expectedlines = ['FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"\n',
@@ -306,7 +305,7 @@ class RecipetoolTests(RecipetoolBase):
         _, output = self._try_recipetool_appendfile('selftest-recipetool-appendfile', '/usr/share/selftest-replaceme-inst-func', self.testfile, '', expectedlines, ['selftest-replaceme-inst-func'])
         self.assertNotIn('WARNING: ', output)
 
-    @testcase(1186)
+    @OETestID(1186)
     def test_recipetool_appendfile_postinstall(self):
         # A file that's created by a postinstall script (and explicitly mentioned in it)
         # First try without specifying recipe
@@ -322,7 +321,7 @@ class RecipetoolTests(RecipetoolBase):
                          '}\n']
         _, output = self._try_recipetool_appendfile('selftest-recipetool-appendfile', '/usr/share/selftest-replaceme-postinst', self.testfile, '-r selftest-recipetool-appendfile', expectedlines, ['testfile'])
 
-    @testcase(1179)
+    @OETestID(1179)
     def test_recipetool_appendfile_extlayer(self):
         # 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')
@@ -338,7 +337,7 @@ class RecipetoolTests(RecipetoolBase):
                          'metadata/recipes/recipes-test/selftest-recipetool-appendfile/selftest-recipetool-appendfile/selftest-replaceme-orig']
         self.assertEqual(sorted(createdfiles), sorted(expectedfiles))
 
-    @testcase(1192)
+    @OETestID(1192)
     def test_recipetool_appendfile_wildcard(self):
 
         def try_appendfile_wc(options):
@@ -363,7 +362,7 @@ class RecipetoolTests(RecipetoolBase):
         filename = try_appendfile_wc('-w')
         self.assertEqual(filename, recipefn.split('_')[0] + '_%.bbappend')
 
-    @testcase(1193)
+    @OETestID(1193)
     def test_recipetool_create(self):
         # Try adding a recipe
         tempsrc = os.path.join(self.tempdir, 'srctree')
@@ -380,7 +379,7 @@ class RecipetoolTests(RecipetoolBase):
         checkvars['SRC_URI[sha256sum]'] = 'dece4bfeb9d8374a0ecafa34be139b5a697db5c926dcc69a9b8715431a22e733'
         self._test_recipe_contents(recipefile, checkvars, [])
 
-    @testcase(1194)
+    @OETestID(1194)
     def test_recipetool_create_git(self):
         if 'x11' not in get_bb_var('DISTRO_FEATURES'):
             self.skipTest('Test requires x11 as distro feature')
@@ -403,7 +402,7 @@ class RecipetoolTests(RecipetoolBase):
         inherits = ['autotools', 'pkgconfig']
         self._test_recipe_contents(recipefile, checkvars, inherits)
 
-    @testcase(1392)
+    @OETestID(1392)
     def test_recipetool_create_simple(self):
         # Try adding a recipe
         temprecipe = os.path.join(self.tempdir, 'recipe')
@@ -426,7 +425,7 @@ class RecipetoolTests(RecipetoolBase):
         inherits = ['autotools']
         self._test_recipe_contents(os.path.join(temprecipe, dirlist[0]), checkvars, inherits)
 
-    @testcase(1418)
+    @OETestID(1418)
     def test_recipetool_create_cmake(self):
         # Try adding a recipe
         temprecipe = os.path.join(self.tempdir, 'recipe')
@@ -621,11 +620,11 @@ class RecipetoolAppendsrcBase(RecipetoolBase):
 
 class RecipetoolAppendsrcTests(RecipetoolAppendsrcBase):
 
-    @testcase(1273)
+    @OETestID(1273)
     def test_recipetool_appendsrcfile_basic(self):
         self._test_appendsrcfile('base-files', 'a-file')
 
-    @testcase(1274)
+    @OETestID(1274)
     def test_recipetool_appendsrcfile_basic_wildcard(self):
         testrecipe = 'base-files'
         self._test_appendsrcfile(testrecipe, 'a-file', options='-w')
@@ -633,15 +632,15 @@ class RecipetoolAppendsrcTests(RecipetoolAppendsrcBase):
         bbappendfile = self._check_bbappend(testrecipe, recipefile, self.templayerdir)
         self.assertEqual(os.path.basename(bbappendfile), '%s_%%.bbappend' % testrecipe)
 
-    @testcase(1281)
+    @OETestID(1281)
     def test_recipetool_appendsrcfile_subdir_basic(self):
         self._test_appendsrcfile('base-files', 'a-file', 'tmp')
 
-    @testcase(1282)
+    @OETestID(1282)
     def test_recipetool_appendsrcfile_subdir_basic_dirdest(self):
         self._test_appendsrcfile('base-files', destdir='tmp')
 
-    @testcase(1280)
+    @OETestID(1280)
     def test_recipetool_appendsrcfile_srcdir_basic(self):
         testrecipe = 'bash'
         bb_vars = get_bb_vars(['S', 'WORKDIR'], testrecipe)
@@ -650,14 +649,14 @@ class RecipetoolAppendsrcTests(RecipetoolAppendsrcBase):
         subdir = os.path.relpath(srcdir, workdir)
         self._test_appendsrcfile(testrecipe, 'a-file', srcdir=subdir)
 
-    @testcase(1275)
+    @OETestID(1275)
     def test_recipetool_appendsrcfile_existing_in_src_uri(self):
         testrecipe = 'base-files'
         filepath = self._get_first_file_uri(testrecipe)
         self.assertTrue(filepath, 'Unable to test, no file:// uri found in SRC_URI for %s' % testrecipe)
         self._test_appendsrcfile(testrecipe, filepath, has_src_uri=False)
 
-    @testcase(1276)
+    @OETestID(1276)
     def test_recipetool_appendsrcfile_existing_in_src_uri_diff_params(self):
         testrecipe = 'base-files'
         subdir = 'tmp'
@@ -667,7 +666,7 @@ class RecipetoolAppendsrcTests(RecipetoolAppendsrcBase):
         output = self._test_appendsrcfile(testrecipe, filepath, subdir, has_src_uri=False)
         self.assertTrue(any('with different parameters' in l for l in output))
 
-    @testcase(1277)
+    @OETestID(1277)
     def test_recipetool_appendsrcfile_replace_file_srcdir(self):
         testrecipe = 'bash'
         filepath = 'Makefile.in'
@@ -680,7 +679,7 @@ class RecipetoolAppendsrcTests(RecipetoolAppendsrcBase):
         bitbake('%s:do_unpack' % testrecipe)
         self.assertEqual(open(self.testfile, 'r').read(), open(os.path.join(srcdir, filepath), 'r').read())
 
-    @testcase(1278)
+    @OETestID(1278)
     def test_recipetool_appendsrcfiles_basic(self, destdir=None):
         newfiles = [self.testfile]
         for i in range(1, 5):
@@ -690,6 +689,6 @@ class RecipetoolAppendsrcTests(RecipetoolAppendsrcBase):
             newfiles.append(testfile)
         self._test_appendsrcfiles('gcc', newfiles, destdir=destdir, options='-W')
 
-    @testcase(1279)
+    @OETestID(1279)
     def test_recipetool_appendsrcfiles_basic_subdir(self):
         self.test_recipetool_appendsrcfiles_basic(destdir='testdir')
diff --git a/meta/lib/oeqa/selftest/runqemu.py b/meta/lib/oeqa/selftest/cases/runqemu.py
similarity index 92%
rename from meta/lib/oeqa/selftest/runqemu.py
rename to meta/lib/oeqa/selftest/cases/runqemu.py
index 58c6f96..4050a41 100644
--- a/meta/lib/oeqa/selftest/runqemu.py
+++ b/meta/lib/oeqa/selftest/cases/runqemu.py
@@ -5,17 +5,18 @@
 import re
 import logging
 
-from oeqa.selftest.base import oeSelfTest
+from oeqa.selftest.case import OESelftestTestCase
 from oeqa.utils.commands import bitbake, runqemu, get_bb_var
-from oeqa.utils.decorators import testcase
+from oeqa.core.decorator.oeid import OETestID
 
-class RunqemuTests(oeSelfTest):
+class RunqemuTests(OESelftestTestCase):
     """Runqemu test class"""
 
     image_is_ready = False
     deploy_dir_image = ''
 
     def setUpLocal(self):
+        super(RunqemuTests, self).setUpLocal()
         self.recipe = 'core-image-minimal'
         self.machine =  'qemux86-64'
         self.fstypes = "ext4 iso hddimg vmdk qcow2 vdi"
@@ -40,14 +41,14 @@ SYSLINUX_TIMEOUT = "10"
             bitbake(self.recipe)
             RunqemuTests.image_is_ready = True
 
-    @testcase(2001)
+    @OETestID(2001)
     def test_boot_machine(self):
         """Test runqemu machine"""
         cmd = "%s %s" % (self.cmd_common, self.machine)
         with runqemu(self.recipe, ssh=False, launch_cmd=cmd) as qemu:
             self.assertTrue(qemu.runner.logged, "Failed: %s" % cmd)
 
-    @testcase(2002)
+    @OETestID(2002)
     def test_boot_machine_ext4(self):
         """Test runqemu machine ext4"""
         cmd = "%s %s ext4" % (self.cmd_common, self.machine)
@@ -55,7 +56,7 @@ SYSLINUX_TIMEOUT = "10"
             with open(qemu.qemurunnerlog) as f:
                 self.assertTrue('rootfs.ext4' in f.read(), "Failed: %s" % cmd)
 
-    @testcase(2003)
+    @OETestID(2003)
     def test_boot_machine_iso(self):
         """Test runqemu machine iso"""
         cmd = "%s %s iso" % (self.cmd_common, self.machine)
@@ -63,14 +64,14 @@ SYSLINUX_TIMEOUT = "10"
             with open(qemu.qemurunnerlog) as f:
                 self.assertTrue(' -cdrom ' in f.read(), "Failed: %s" % cmd)
 
-    @testcase(2004)
+    @OETestID(2004)
     def test_boot_recipe_image(self):
         """Test runqemu recipe-image"""
         cmd = "%s %s" % (self.cmd_common, self.recipe)
         with runqemu(self.recipe, ssh=False, launch_cmd=cmd) as qemu:
             self.assertTrue(qemu.runner.logged, "Failed: %s" % cmd)
 
-    @testcase(2005)
+    @OETestID(2005)
     def test_boot_recipe_image_vmdk(self):
         """Test runqemu recipe-image vmdk"""
         cmd = "%s %s vmdk" % (self.cmd_common, self.recipe)
@@ -78,7 +79,7 @@ SYSLINUX_TIMEOUT = "10"
             with open(qemu.qemurunnerlog) as f:
                 self.assertTrue('format=vmdk' in f.read(), "Failed: %s" % cmd)
 
-    @testcase(2006)
+    @OETestID(2006)
     def test_boot_recipe_image_vdi(self):
         """Test runqemu recipe-image vdi"""
         cmd = "%s %s vdi" % (self.cmd_common, self.recipe)
@@ -86,14 +87,14 @@ SYSLINUX_TIMEOUT = "10"
             with open(qemu.qemurunnerlog) as f:
                 self.assertTrue('format=vdi' in f.read(), "Failed: %s" % cmd)
 
-    @testcase(2007)
+    @OETestID(2007)
     def test_boot_deploy(self):
         """Test runqemu deploy_dir_image"""
         cmd = "%s %s" % (self.cmd_common, self.deploy_dir_image)
         with runqemu(self.recipe, ssh=False, launch_cmd=cmd) as qemu:
             self.assertTrue(qemu.runner.logged, "Failed: %s" % cmd)
 
-    @testcase(2008)
+    @OETestID(2008)
     def test_boot_deploy_hddimg(self):
         """Test runqemu deploy_dir_image hddimg"""
         cmd = "%s %s hddimg" % (self.cmd_common, self.deploy_dir_image)
@@ -101,7 +102,7 @@ SYSLINUX_TIMEOUT = "10"
             with open(qemu.qemurunnerlog) as f:
                 self.assertTrue(re.search('file=.*.hddimg', f.read()), "Failed: %s" % cmd)
 
-    @testcase(2009)
+    @OETestID(2009)
     def test_boot_machine_slirp(self):
         """Test runqemu machine slirp"""
         cmd = "%s slirp %s" % (self.cmd_common, self.machine)
@@ -109,7 +110,7 @@ SYSLINUX_TIMEOUT = "10"
             with open(qemu.qemurunnerlog) as f:
                 self.assertTrue(' -netdev user' in f.read(), "Failed: %s" % cmd)
 
-    @testcase(2009)
+    @OETestID(2009)
     def test_boot_machine_slirp_qcow2(self):
         """Test runqemu machine slirp qcow2"""
         cmd = "%s slirp qcow2 %s" % (self.cmd_common, self.machine)
@@ -117,7 +118,7 @@ SYSLINUX_TIMEOUT = "10"
             with open(qemu.qemurunnerlog) as f:
                 self.assertTrue('format=qcow2' in f.read(), "Failed: %s" % cmd)
 
-    @testcase(2010)
+    @OETestID(2010)
     def test_boot_qemu_boot(self):
         """Test runqemu /path/to/image.qemuboot.conf"""
         qemuboot_conf = "%s-%s.qemuboot.conf" % (self.recipe, self.machine)
@@ -128,7 +129,7 @@ SYSLINUX_TIMEOUT = "10"
         with runqemu(self.recipe, ssh=False, launch_cmd=cmd) as qemu:
             self.assertTrue(qemu.runner.logged, "Failed: %s" % cmd)
 
-    @testcase(2011)
+    @OETestID(2011)
     def test_boot_rootfs(self):
         """Test runqemu /path/to/rootfs.ext4"""
         rootfs = "%s-%s.ext4" % (self.recipe, self.machine)
diff --git a/meta/lib/oeqa/selftest/runtime-test.py b/meta/lib/oeqa/selftest/cases/runtime_test.py
similarity index 97%
rename from meta/lib/oeqa/selftest/runtime-test.py
rename to meta/lib/oeqa/selftest/cases/runtime_test.py
index 13a4c03..9fec4d8 100644
--- a/meta/lib/oeqa/selftest/runtime-test.py
+++ b/meta/lib/oeqa/selftest/cases/runtime_test.py
@@ -1,14 +1,15 @@
-from oeqa.selftest.base import oeSelfTest
+from oeqa.selftest.case import OESelftestTestCase
 from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_bb_vars, runqemu
-from oeqa.utils.decorators import testcase
+from oeqa.core.decorator.oeid import OETestID
 import os
 import re
 
-class TestExport(oeSelfTest):
+class TestExport(OESelftestTestCase):
 
     @classmethod
     def tearDownClass(cls):
         runCmd("rm -rf /tmp/sdk")
+        super(TestExport, cls).tearDownClass()
 
     def test_testexport_basic(self):
         """
@@ -101,7 +102,7 @@ class TestExport(oeSelfTest):
         self.assertEqual(0, result.status, "Couldn't run tar from SDK")
 
 
-class TestImage(oeSelfTest):
+class TestImage(OESelftestTestCase):
 
     def test_testimage_install(self):
         """
@@ -129,8 +130,8 @@ class TestImage(oeSelfTest):
         bitbake('core-image-full-cmdline socat')
         bitbake('-c testimage core-image-full-cmdline')
 
-class Postinst(oeSelfTest):
-    @testcase(1540)
+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]
@@ -180,7 +181,7 @@ postinst-delayed-t \
                         self.assertEqual(idx, len(postinst_list), "Not found all postinsts")
                         break
 
-    @testcase(1545)
+    @OETestID(1545)
     def test_postinst_rootfs_and_boot(self):
         """
         Summary:        The purpose of this test case is to verify Post-installation
diff --git a/meta/lib/oeqa/selftest/signing.py b/meta/lib/oeqa/selftest/cases/signing.py
similarity index 96%
rename from meta/lib/oeqa/selftest/signing.py
rename to meta/lib/oeqa/selftest/cases/signing.py
index 0ac3d1f..edb5f65 100644
--- a/meta/lib/oeqa/selftest/signing.py
+++ b/meta/lib/oeqa/selftest/cases/signing.py
@@ -1,15 +1,15 @@
-from oeqa.selftest.base import oeSelfTest
+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
 import shutil
 import tempfile
-from oeqa.utils.decorators import testcase
+from oeqa.core.decorator.oeid import OETestID
 from oeqa.utils.ftools import write_file
 
 
-class Signing(oeSelfTest):
+class Signing(OESelftestTestCase):
 
     gpg_dir = ""
     pub_key_path = ""
@@ -17,6 +17,7 @@ class Signing(oeSelfTest):
 
     @classmethod
     def setUpClass(cls):
+        super(Signing, cls).setUpClass()
         # Check that we can find the gpg binary and fail early if we can't
         if not shutil.which("gpg"):
             raise AssertionError("This test needs GnuPG")
@@ -29,7 +30,7 @@ class Signing(oeSelfTest):
 
         runCmd('gpg --batch --homedir %s --import %s %s' % (cls.gpg_dir, cls.pub_key_path, cls.secret_key_path))
 
-    @testcase(1362)
+    @OETestID(1362)
     def test_signing_packages(self):
         """
         Summary:     Test that packages can be signed in the package feed
@@ -92,7 +93,7 @@ class Signing(oeSelfTest):
         bitbake('core-image-minimal')
 
 
-    @testcase(1382)
+    @OETestID(1382)
     def test_signing_sstate_archive(self):
         """
         Summary:     Test that sstate archives can be signed
@@ -135,9 +136,9 @@ class Signing(oeSelfTest):
         self.assertIn('gpg: Good signature from', ret.output, 'Package signed incorrectly.')
 
 
-class LockedSignatures(oeSelfTest):
+class LockedSignatures(OESelftestTestCase):
 
-    @testcase(1420)
+    @OETestID(1420)
     def test_locked_signatures(self):
         """
         Summary:     Test locked signature mechanism
diff --git a/meta/lib/oeqa/selftest/sstate.py b/meta/lib/oeqa/selftest/cases/sstate.py
similarity index 95%
rename from meta/lib/oeqa/selftest/sstate.py
rename to meta/lib/oeqa/selftest/cases/sstate.py
index f54bc41..bc2fdbd 100644
--- a/meta/lib/oeqa/selftest/sstate.py
+++ b/meta/lib/oeqa/selftest/cases/sstate.py
@@ -5,13 +5,14 @@ import re
 import shutil
 
 import oeqa.utils.ftools as ftools
-from oeqa.selftest.base import oeSelfTest
+from oeqa.selftest.case import OESelftestTestCase
 from oeqa.utils.commands import runCmd, bitbake, get_bb_vars, get_test_layer
 
 
-class SStateBase(oeSelfTest):
+class SStateBase(OESelftestTestCase):
 
     def setUpLocal(self):
+        super(SStateBase, self).setUpLocal()
         self.temp_sstate_location = None
         needed_vars = ['SSTATE_DIR', 'NATIVELSBSTRING', 'TCLIBC', 'TUNE_ARCH',
                        'TOPDIR', 'TARGET_VENDOR', 'TARGET_OS']
diff --git a/meta/lib/oeqa/selftest/sstatetests.py b/meta/lib/oeqa/selftest/cases/sstatetests.py
similarity index 97%
rename from meta/lib/oeqa/selftest/sstatetests.py
rename to meta/lib/oeqa/selftest/cases/sstatetests.py
index e35ddff..8d05e30 100644
--- a/meta/lib/oeqa/selftest/sstatetests.py
+++ b/meta/lib/oeqa/selftest/cases/sstatetests.py
@@ -1,16 +1,12 @@
-import datetime
-import unittest
 import os
-import re
 import shutil
 import glob
 import subprocess
 
-import oeqa.utils.ftools as ftools
-from oeqa.selftest.base import oeSelfTest
+from oeqa.selftest.case import OESelftestTestCase
 from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_test_layer
-from oeqa.selftest.sstate import SStateBase
-from oeqa.utils.decorators import testcase
+from oeqa.selftest.cases.sstate import SStateBase
+from oeqa.core.decorator.oeid import OETestID
 
 class SStateTests(SStateBase):
 
@@ -39,19 +35,19 @@ class SStateTests(SStateBase):
         else:
             self.assertTrue(not file_tracker , msg="Found sstate files in the wrong place for: %s (found %s)" % (', '.join(map(str, targets)), str(file_tracker)))
 
-    @testcase(975)
+    @OETestID(975)
     def test_sstate_creation_distro_specific_pass(self):
         self.run_test_sstate_creation(['binutils-cross-'+ self.tune_arch, 'binutils-native'], distro_specific=True, distro_nonspecific=False, temp_sstate_location=True)
 
-    @testcase(1374)
+    @OETestID(1374)
     def test_sstate_creation_distro_specific_fail(self):
         self.run_test_sstate_creation(['binutils-cross-'+ self.tune_arch, 'binutils-native'], distro_specific=False, distro_nonspecific=True, temp_sstate_location=True, should_pass=False)
 
-    @testcase(976)
+    @OETestID(976)
     def test_sstate_creation_distro_nonspecific_pass(self):
         self.run_test_sstate_creation(['linux-libc-headers'], distro_specific=False, distro_nonspecific=True, temp_sstate_location=True)
 
-    @testcase(1375)
+    @OETestID(1375)
     def test_sstate_creation_distro_nonspecific_fail(self):
         self.run_test_sstate_creation(['linux-libc-headers'], distro_specific=True, distro_nonspecific=False, temp_sstate_location=True, should_pass=False)
 
@@ -72,17 +68,17 @@ class SStateTests(SStateBase):
         tgz_removed = self.search_sstate('|'.join(map(str, [s + '.*?\.tgz$' for s in targets])), distro_specific, distro_nonspecific)
         self.assertTrue(not tgz_removed, msg="do_cleansstate didn't remove .tgz sstate files for: %s (%s)" % (', '.join(map(str, targets)), str(tgz_removed)))
 
-    @testcase(977)
+    @OETestID(977)
     def test_cleansstate_task_distro_specific_nonspecific(self):
         targets = ['binutils-cross-'+ self.tune_arch, 'binutils-native']
         targets.append('linux-libc-headers')
         self.run_test_cleansstate_task(targets, distro_specific=True, distro_nonspecific=True, temp_sstate_location=True)
 
-    @testcase(1376)
+    @OETestID(1376)
     def test_cleansstate_task_distro_nonspecific(self):
         self.run_test_cleansstate_task(['linux-libc-headers'], distro_specific=False, distro_nonspecific=True, temp_sstate_location=True)
 
-    @testcase(1377)
+    @OETestID(1377)
     def test_cleansstate_task_distro_specific(self):
         targets = ['binutils-cross-'+ self.tune_arch, 'binutils-native']
         targets.append('linux-libc-headers')
@@ -121,15 +117,15 @@ class SStateTests(SStateBase):
         created_once = [x for x in file_tracker_2 if x not in file_tracker_1]
         self.assertTrue(created_once == [], msg="The following sstate files ware created only in the second run: %s" % ', '.join(map(str, created_once)))
 
-    @testcase(175)
+    @OETestID(175)
     def test_rebuild_distro_specific_sstate_cross_native_targets(self):
         self.run_test_rebuild_distro_specific_sstate(['binutils-cross-' + self.tune_arch, 'binutils-native'], temp_sstate_location=True)
 
-    @testcase(1372)
+    @OETestID(1372)
     def test_rebuild_distro_specific_sstate_cross_target(self):
         self.run_test_rebuild_distro_specific_sstate(['binutils-cross-' + self.tune_arch], temp_sstate_location=True)
 
-    @testcase(1373)
+    @OETestID(1373)
     def test_rebuild_distro_specific_sstate_native_target(self):
         self.run_test_rebuild_distro_specific_sstate(['binutils-native'], temp_sstate_location=True)
 
@@ -176,7 +172,7 @@ class SStateTests(SStateBase):
         expected_not_actual = [x for x in expected_remaining_sstate if x not in actual_remaining_sstate]
         self.assertFalse(expected_not_actual, msg="Extra files ware removed: %s" ', '.join(map(str, expected_not_actual)))
 
-    @testcase(973)
+    @OETestID(973)
     def test_sstate_cache_management_script_using_pr_1(self):
         global_config = []
         target_config = []
@@ -184,7 +180,7 @@ class SStateTests(SStateBase):
         target_config.append('PR = "0"')
         self.run_test_sstate_cache_management_script('m4', global_config,  target_config, ignore_patterns=['populate_lic'])
 
-    @testcase(978)
+    @OETestID(978)
     def test_sstate_cache_management_script_using_pr_2(self):
         global_config = []
         target_config = []
@@ -194,7 +190,7 @@ class SStateTests(SStateBase):
         target_config.append('PR = "1"')
         self.run_test_sstate_cache_management_script('m4', global_config,  target_config, ignore_patterns=['populate_lic'])
 
-    @testcase(979)
+    @OETestID(979)
     def test_sstate_cache_management_script_using_pr_3(self):
         global_config = []
         target_config = []
@@ -206,7 +202,7 @@ class SStateTests(SStateBase):
         target_config.append('PR = "1"')
         self.run_test_sstate_cache_management_script('m4', global_config,  target_config, ignore_patterns=['populate_lic'])
 
-    @testcase(974)
+    @OETestID(974)
     def test_sstate_cache_management_script_using_machine(self):
         global_config = []
         target_config = []
@@ -216,7 +212,7 @@ class SStateTests(SStateBase):
         target_config.append('')
         self.run_test_sstate_cache_management_script('m4', global_config,  target_config, ignore_patterns=['populate_lic'])
 
-    @testcase(1270)
+    @OETestID(1270)
     def test_sstate_32_64_same_hash(self):
         """
         The sstate checksums for both native and target should not vary whether
@@ -263,7 +259,7 @@ PACKAGE_CLASSES = "package_rpm package_ipk package_deb"
         self.assertCountEqual(files1, files2)
 
 
-    @testcase(1271)
+    @OETestID(1271)
     def test_sstate_nativelsbstring_same_hash(self):
         """
         The sstate checksums should be independent of whichever NATIVELSBSTRING is
@@ -295,7 +291,7 @@ NATIVELSBSTRING = \"DistroB\"
         self.maxDiff = None
         self.assertCountEqual(files1, files2)
 
-    @testcase(1368)
+    @OETestID(1368)
     def test_sstate_allarch_samesigs(self):
         """
         The sstate checksums of allarch packages should be independent of whichever
@@ -369,7 +365,7 @@ MULTILIBS = \"\"
         self.maxDiff = None
         self.assertEqual(files1, files2)
 
-    @testcase(1369)
+    @OETestID(1369)
     def test_sstate_sametune_samesigs(self):
         """
         The sstate checksums of two identical machines (using the same tune) should be the
diff --git a/meta/lib/oeqa/selftest/tinfoil.py b/meta/lib/oeqa/selftest/cases/tinfoil.py
similarity index 96%
rename from meta/lib/oeqa/selftest/tinfoil.py
rename to meta/lib/oeqa/selftest/cases/tinfoil.py
index 73a0c3b..1394d42 100644
--- a/meta/lib/oeqa/selftest/tinfoil.py
+++ b/meta/lib/oeqa/selftest/cases/tinfoil.py
@@ -1,16 +1,15 @@
-import unittest
 import os
 import re
 import bb.tinfoil
 
-from oeqa.selftest.base import oeSelfTest
+from oeqa.selftest.case import OESelftestTestCase
 from oeqa.utils.commands import runCmd
-from oeqa.utils.decorators import testcase
+from oeqa.core.decorator.oeid import OETestID
 
-class TinfoilTests(oeSelfTest):
+class TinfoilTests(OESelftestTestCase):
     """ Basic tests for the tinfoil API """
 
-    @testcase(1568)
+    @OETestID(1568)
     def test_getvar(self):
         with bb.tinfoil.Tinfoil() as tinfoil:
             tinfoil.prepare(True)
@@ -18,7 +17,7 @@ class TinfoilTests(oeSelfTest):
             if not machine:
                 self.fail('Unable to get MACHINE value - returned %s' % machine)
 
-    @testcase(1569)
+    @OETestID(1569)
     def test_expand(self):
         with bb.tinfoil.Tinfoil() as tinfoil:
             tinfoil.prepare(True)
@@ -27,7 +26,7 @@ class TinfoilTests(oeSelfTest):
             if not pid:
                 self.fail('Unable to expand "%s" - returned %s' % (expr, pid))
 
-    @testcase(1570)
+    @OETestID(1570)
     def test_getvar_bb_origenv(self):
         with bb.tinfoil.Tinfoil() as tinfoil:
             tinfoil.prepare(True)
@@ -36,7 +35,7 @@ class TinfoilTests(oeSelfTest):
                 self.fail('Unable to get BB_ORIGENV value - returned %s' % origenv)
             self.assertEqual(origenv.getVar('HOME', False), os.environ['HOME'])
 
-    @testcase(1571)
+    @OETestID(1571)
     def test_parse_recipe(self):
         with bb.tinfoil.Tinfoil() as tinfoil:
             tinfoil.prepare(config_only=False, quiet=2)
@@ -47,7 +46,7 @@ class TinfoilTests(oeSelfTest):
             rd = tinfoil.parse_recipe_file(best[3])
             self.assertEqual(testrecipe, rd.getVar('PN'))
 
-    @testcase(1572)
+    @OETestID(1572)
     def test_parse_recipe_copy_expand(self):
         with bb.tinfoil.Tinfoil() as tinfoil:
             tinfoil.prepare(config_only=False, quiet=2)
@@ -66,7 +65,7 @@ class TinfoilTests(oeSelfTest):
             localdata.setVar('PN', 'hello')
             self.assertEqual('hello', localdata.getVar('BPN'))
 
-    @testcase(1573)
+    @OETestID(1573)
     def test_parse_recipe_initial_datastore(self):
         with bb.tinfoil.Tinfoil() as tinfoil:
             tinfoil.prepare(config_only=False, quiet=2)
@@ -80,7 +79,7 @@ class TinfoilTests(oeSelfTest):
             # Check we can get variable values
             self.assertEqual('somevalue', rd.getVar('MYVARIABLE'))
 
-    @testcase(1574)
+    @OETestID(1574)
     def test_list_recipes(self):
         with bb.tinfoil.Tinfoil() as tinfoil:
             tinfoil.prepare(config_only=False, quiet=2)
@@ -99,7 +98,7 @@ class TinfoilTests(oeSelfTest):
             if checkpns:
                 self.fail('Unable to find pkg_fn entries for: %s' % ', '.join(checkpns))
 
-    @testcase(1575)
+    @OETestID(1575)
     def test_wait_event(self):
         with bb.tinfoil.Tinfoil() as tinfoil:
             tinfoil.prepare(config_only=True)
@@ -130,7 +129,7 @@ class TinfoilTests(oeSelfTest):
             self.assertNotEqual(waitcount, 0, 'Timed out waiting for CommandCompleted event from bitbake server')
             self.assertTrue(eventreceived, 'Did not receive FilesMatchingFound event from bitbake server')
 
-    @testcase(1576)
+    @OETestID(1576)
     def test_setvariable_clean(self):
         # First check that setVariable affects the datastore
         with bb.tinfoil.Tinfoil() as tinfoil:
diff --git a/meta/lib/oeqa/selftest/wic.py b/meta/lib/oeqa/selftest/cases/wic.py
similarity index 97%
rename from meta/lib/oeqa/selftest/wic.py
rename to meta/lib/oeqa/selftest/cases/wic.py
index cdec80c..4040cf7 100644
--- a/meta/lib/oeqa/selftest/wic.py
+++ b/meta/lib/oeqa/selftest/cases/wic.py
@@ -32,9 +32,9 @@ from shutil import rmtree
 from functools import wraps, lru_cache
 from tempfile import NamedTemporaryFile
 
-from oeqa.selftest.base import oeSelfTest
+from oeqa.selftest.case import OESelftestTestCase
 from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_bb_vars, runqemu
-from oeqa.utils.decorators import testcase
+from oeqa.core.decorator.oeid import OETestID
 
 
 @lru_cache(maxsize=32)
@@ -61,7 +61,7 @@ def only_for_arch(archs, image='core-image-minimal'):
     return wrapper
 
 
-class Wic(oeSelfTest):
+class Wic(OESelftestTestCase):
     """Wic test class."""
 
     resultdir = "/var/tmp/wic.oe-selftest/"
@@ -71,6 +71,7 @@ class Wic(oeSelfTest):
 
     def setUpLocal(self):
         """This code is executed before each test method."""
+        super(Wic, self).setUpLocal()
         if not self.native_sysroot:
             Wic.native_sysroot = get_bb_var('STAGING_DIR_NATIVE', 'wic-tools')
 
@@ -91,64 +92,65 @@ class Wic(oeSelfTest):
     def tearDownLocal(self):
         """Remove resultdir as it may contain images."""
         rmtree(self.resultdir, ignore_errors=True)
+        super(Wic, self).tearDownLocal()
 
-    @testcase(1552)
+    @OETestID(1552)
     def test_version(self):
         """Test wic --version"""
         self.assertEqual(0, runCmd('wic --version').status)
 
-    @testcase(1208)
+    @OETestID(1208)
     def test_help(self):
         """Test wic --help and wic -h"""
         self.assertEqual(0, runCmd('wic --help').status)
         self.assertEqual(0, runCmd('wic -h').status)
 
-    @testcase(1209)
+    @OETestID(1209)
     def test_createhelp(self):
         """Test wic create --help"""
         self.assertEqual(0, runCmd('wic create --help').status)
 
-    @testcase(1210)
+    @OETestID(1210)
     def test_listhelp(self):
         """Test wic list --help"""
         self.assertEqual(0, runCmd('wic list --help').status)
 
-    @testcase(1553)
+    @OETestID(1553)
     def test_help_create(self):
         """Test wic help create"""
         self.assertEqual(0, runCmd('wic help create').status)
 
-    @testcase(1554)
+    @OETestID(1554)
     def test_help_list(self):
         """Test wic help list"""
         self.assertEqual(0, runCmd('wic help list').status)
 
-    @testcase(1215)
+    @OETestID(1215)
     def test_help_overview(self):
         """Test wic help overview"""
         self.assertEqual(0, runCmd('wic help overview').status)
 
-    @testcase(1216)
+    @OETestID(1216)
     def test_help_plugins(self):
         """Test wic help plugins"""
         self.assertEqual(0, runCmd('wic help plugins').status)
 
-    @testcase(1217)
+    @OETestID(1217)
     def test_help_kickstart(self):
         """Test wic help kickstart"""
         self.assertEqual(0, runCmd('wic help kickstart').status)
 
-    @testcase(1555)
+    @OETestID(1555)
     def test_list_images(self):
         """Test wic list images"""
         self.assertEqual(0, runCmd('wic list images').status)
 
-    @testcase(1556)
+    @OETestID(1556)
     def test_list_source_plugins(self):
         """Test wic list source-plugins"""
         self.assertEqual(0, runCmd('wic list source-plugins').status)
 
-    @testcase(1557)
+    @OETestID(1557)
     def test_listed_images_help(self):
         """Test wic listed images help"""
         output = runCmd('wic list images').output
@@ -156,24 +158,24 @@ class Wic(oeSelfTest):
         for image in imagelist:
             self.assertEqual(0, runCmd('wic list %s help' % image).status)
 
-    @testcase(1213)
+    @OETestID(1213)
     def test_unsupported_subcommand(self):
         """Test unsupported subcommand"""
         self.assertNotEqual(0, runCmd('wic unsupported', ignore_status=True).status)
 
-    @testcase(1214)
+    @OETestID(1214)
     def test_no_command(self):
         """Test wic without command"""
         self.assertEqual(1, runCmd('wic', ignore_status=True).status)
 
-    @testcase(1211)
+    @OETestID(1211)
     def test_build_image_name(self):
         """Test wic create wictestdisk --image-name=core-image-minimal"""
         cmd = "wic create wictestdisk --image-name=core-image-minimal -o %s" % self.resultdir
         self.assertEqual(0, runCmd(cmd).status)
         self.assertEqual(1, len(glob(self.resultdir + "wictestdisk-*.direct")))
 
-    @testcase(1157)
+    @OETestID(1157)
     @only_for_arch(['i586', 'i686', 'x86_64'])
     def test_gpt_image(self):
         """Test creation of core-image-minimal with gpt table and UUID boot"""
@@ -181,7 +183,7 @@ class Wic(oeSelfTest):
         self.assertEqual(0, runCmd(cmd).status)
         self.assertEqual(1, len(glob(self.resultdir + "directdisk-*.direct")))
 
-    @testcase(1346)
+    @OETestID(1346)
     @only_for_arch(['i586', 'i686', 'x86_64'])
     def test_iso_image(self):
         """Test creation of hybrid iso image with legacy and EFI boot"""
@@ -195,7 +197,7 @@ class Wic(oeSelfTest):
         self.assertEqual(1, len(glob(self.resultdir + "HYBRID_ISO_IMG-*.direct")))
         self.assertEqual(1, len(glob(self.resultdir + "HYBRID_ISO_IMG-*.iso")))
 
-    @testcase(1348)
+    @OETestID(1348)
     @only_for_arch(['i586', 'i686', 'x86_64'])
     def test_qemux86_directdisk(self):
         """Test creation of qemux-86-directdisk image"""
@@ -203,7 +205,7 @@ class Wic(oeSelfTest):
         self.assertEqual(0, runCmd(cmd).status)
         self.assertEqual(1, len(glob(self.resultdir + "qemux86-directdisk-*direct")))
 
-    @testcase(1350)
+    @OETestID(1350)
     @only_for_arch(['i586', 'i686', 'x86_64'])
     def test_mkefidisk(self):
         """Test creation of mkefidisk image"""
@@ -211,7 +213,7 @@ class Wic(oeSelfTest):
         self.assertEqual(0, runCmd(cmd).status)
         self.assertEqual(1, len(glob(self.resultdir + "mkefidisk-*direct")))
 
-    @testcase(1385)
+    @OETestID(1385)
     @only_for_arch(['i586', 'i686', 'x86_64'])
     def test_bootloader_config(self):
         """Test creation of directdisk-bootloader-config image"""
@@ -219,7 +221,7 @@ class Wic(oeSelfTest):
         self.assertEqual(0, runCmd(cmd).status)
         self.assertEqual(1, len(glob(self.resultdir + "directdisk-bootloader-config-*direct")))
 
-    @testcase(1560)
+    @OETestID(1560)
     @only_for_arch(['i586', 'i686', 'x86_64'])
     def test_systemd_bootdisk(self):
         """Test creation of systemd-bootdisk image"""
@@ -231,7 +233,7 @@ class Wic(oeSelfTest):
         self.assertEqual(0, runCmd(cmd).status)
         self.assertEqual(1, len(glob(self.resultdir + "systemd-bootdisk-*direct")))
 
-    @testcase(1561)
+    @OETestID(1561)
     def test_sdimage_bootpart(self):
         """Test creation of sdimage-bootpart image"""
         cmd = "wic create sdimage-bootpart -e core-image-minimal -o %s" % self.resultdir
@@ -240,7 +242,7 @@ class Wic(oeSelfTest):
         self.assertEqual(0, runCmd(cmd).status)
         self.assertEqual(1, len(glob(self.resultdir + "sdimage-bootpart-*direct")))
 
-    @testcase(1562)
+    @OETestID(1562)
     @only_for_arch(['i586', 'i686', 'x86_64'])
     def test_default_output_dir(self):
         """Test default output location"""
@@ -250,7 +252,7 @@ class Wic(oeSelfTest):
         self.assertEqual(0, runCmd(cmd).status)
         self.assertEqual(1, len(glob("directdisk-*.direct")))
 
-    @testcase(1212)
+    @OETestID(1212)
     @only_for_arch(['i586', 'i686', 'x86_64'])
     def test_build_artifacts(self):
         """Test wic create directdisk providing all artifacts."""
@@ -269,7 +271,7 @@ class Wic(oeSelfTest):
         self.assertEqual(0, status)
         self.assertEqual(1, len(glob(self.resultdir + "directdisk-*.direct")))
 
-    @testcase(1264)
+    @OETestID(1264)
     def test_compress_gzip(self):
         """Test compressing an image with gzip"""
         self.assertEqual(0, runCmd("wic create wictestdisk "
@@ -277,7 +279,7 @@ class Wic(oeSelfTest):
                                    "-c gzip -o %s" % self.resultdir).status)
         self.assertEqual(1, len(glob(self.resultdir + "wictestdisk-*.direct.gz")))
 
-    @testcase(1265)
+    @OETestID(1265)
     def test_compress_bzip2(self):
         """Test compressing an image with bzip2"""
         self.assertEqual(0, runCmd("wic create wictestdisk "
@@ -285,7 +287,7 @@ class Wic(oeSelfTest):
                                    "-c bzip2 -o %s" % self.resultdir).status)
         self.assertEqual(1, len(glob(self.resultdir + "wictestdisk-*.direct.bz2")))
 
-    @testcase(1266)
+    @OETestID(1266)
     def test_compress_xz(self):
         """Test compressing an image with xz"""
         self.assertEqual(0, runCmd("wic create wictestdisk "
@@ -293,7 +295,7 @@ class Wic(oeSelfTest):
                                    "--compress-with=xz -o %s" % self.resultdir).status)
         self.assertEqual(1, len(glob(self.resultdir + "wictestdisk-*.direct.xz")))
 
-    @testcase(1267)
+    @OETestID(1267)
     def test_wrong_compressor(self):
         """Test how wic breaks if wrong compressor is provided"""
         self.assertEqual(2, runCmd("wic create wictestdisk "
@@ -301,7 +303,7 @@ class Wic(oeSelfTest):
                                    "-c wrong -o %s" % self.resultdir,
                                    ignore_status=True).status)
 
-    @testcase(1558)
+    @OETestID(1558)
     def test_debug_short(self):
         """Test -D option"""
         self.assertEqual(0, runCmd("wic create wictestdisk "
@@ -316,7 +318,7 @@ class Wic(oeSelfTest):
                                    "--debug -o %s" % self.resultdir).status)
         self.assertEqual(1, len(glob(self.resultdir + "wictestdisk-*.direct")))
 
-    @testcase(1563)
+    @OETestID(1563)
     def test_skip_build_check_short(self):
         """Test -s option"""
         self.assertEqual(0, runCmd("wic create wictestdisk "
@@ -332,7 +334,7 @@ class Wic(oeSelfTest):
                                    "--outdir %s" % self.resultdir).status)
         self.assertEqual(1, len(glob(self.resultdir + "wictestdisk-*.direct")))
 
-    @testcase(1564)
+    @OETestID(1564)
     def test_build_rootfs_short(self):
         """Test -f option"""
         self.assertEqual(0, runCmd("wic create wictestdisk "
@@ -348,7 +350,7 @@ class Wic(oeSelfTest):
                                    "--outdir %s" % self.resultdir).status)
         self.assertEqual(1, len(glob(self.resultdir + "wictestdisk-*.direct")))
 
-    @testcase(1268)
+    @OETestID(1268)
     @only_for_arch(['i586', 'i686', 'x86_64'])
     def test_rootfs_indirect_recipes(self):
         """Test usage of rootfs plugin with rootfs recipes"""
@@ -360,7 +362,7 @@ class Wic(oeSelfTest):
         self.assertEqual(0, status)
         self.assertEqual(1, len(glob(self.resultdir + "directdisk-multi-rootfs*.direct")))
 
-    @testcase(1269)
+    @OETestID(1269)
     @only_for_arch(['i586', 'i686', 'x86_64'])
     def test_rootfs_artifacts(self):
         """Test usage of rootfs plugin with rootfs paths"""
@@ -506,7 +508,7 @@ part /etc --source rootfs --ondisk mmcblk0 --fstype=ext4 --exclude-path bin/ --r
                                       % (wks_file, self.resultdir), ignore_status=True).status)
         os.remove(wks_file)
 
-    @testcase(1496)
+    @OETestID(1496)
     def test_bmap_short(self):
         """Test generation of .bmap file -m option"""
         cmd = "wic create wictestdisk -e core-image-minimal -m -o %s" % self.resultdir
@@ -533,7 +535,7 @@ part /etc --source rootfs --ondisk mmcblk0 --fstype=ext4 --exclude-path bin/ --r
             self.wicenv_cache[image] = os.path.join(stdir, machine, 'imgdata')
         return self.wicenv_cache[image]
 
-    @testcase(1347)
+    @OETestID(1347)
     def test_image_env(self):
         """Test generation of <image>.env files."""
         image = 'core-image-minimal'
@@ -556,7 +558,7 @@ part /etc --source rootfs --ondisk mmcblk0 --fstype=ext4 --exclude-path bin/ --r
                 self.assertTrue(var in content, "%s is not in .env file" % var)
                 self.assertTrue(content[var])
 
-    @testcase(1559)
+    @OETestID(1559)
     def test_image_vars_dir_short(self):
         """Test image vars directory selection -v option"""
         image = 'core-image-minimal'
@@ -578,7 +580,7 @@ part /etc --source rootfs --ondisk mmcblk0 --fstype=ext4 --exclude-path bin/ --r
                                    % (image, imgenvdir, self.resultdir)).status)
         self.assertEqual(1, len(glob(self.resultdir + "wictestdisk-*direct")))
 
-    @testcase(1351)
+    @OETestID(1351)
     @only_for_arch(['i586', 'i686', 'x86_64'])
     def test_wic_image_type(self):
         """Test building wic images by bitbake"""
@@ -599,7 +601,7 @@ part /etc --source rootfs --ondisk mmcblk0 --fstype=ext4 --exclude-path bin/ --r
             self.assertTrue(os.path.islink(path))
             self.assertTrue(os.path.isfile(os.path.realpath(path)))
 
-    @testcase(1422)
+    @OETestID(1422)
     @only_for_arch(['i586', 'i686', 'x86_64'])
     def test_qemu(self):
         """Test wic-image-minimal under qemu"""
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH 36/36] selftest: Migrate systemd_boot test case to the new framework
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (34 preceding siblings ...)
  2017-05-26 20:38 ` [PATCH 35/36] oeqa/selftest/cases: Migrate test cases into the new oe-qa framework Aníbal Limón
@ 2017-05-26 20:38 ` Aníbal Limón
  2017-05-26 21:01 ` ✗ patchtest: failure for OEQA threading support and selftest migration Patchwork
  2017-05-26 23:32 ` [PATCH 00/36] " Richard Purdie
  37 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-26 20:38 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton

- systemd_boot.py: Use the new case class and change decorator for id
- __init__.py: Because isn't needed now

Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
 meta-yocto-bsp/lib/oeqa/selftest/__init__.py               |  0
 .../lib/oeqa/selftest/{ => cases}/systemd_boot.py          | 14 +++++---------
 2 files changed, 5 insertions(+), 9 deletions(-)
 delete mode 100644 meta-yocto-bsp/lib/oeqa/selftest/__init__.py
 rename meta-yocto-bsp/lib/oeqa/selftest/{ => cases}/systemd_boot.py (91%)

diff --git a/meta-yocto-bsp/lib/oeqa/selftest/__init__.py b/meta-yocto-bsp/lib/oeqa/selftest/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/meta-yocto-bsp/lib/oeqa/selftest/systemd_boot.py b/meta-yocto-bsp/lib/oeqa/selftest/cases/systemd_boot.py
similarity index 91%
rename from meta-yocto-bsp/lib/oeqa/selftest/systemd_boot.py
rename to meta-yocto-bsp/lib/oeqa/selftest/cases/systemd_boot.py
index f7f74db..848cdf7 100644
--- a/meta-yocto-bsp/lib/oeqa/selftest/systemd_boot.py
+++ b/meta-yocto-bsp/lib/oeqa/selftest/cases/systemd_boot.py
@@ -1,14 +1,10 @@
-from oeqa.selftest.base import oeSelfTest
-from oeqa.utils.commands import runCmd, bitbake, get_bb_var, runqemu
-from oeqa.utils.decorators import testcase
-import re
 import os
-import sys
-import logging
-
 
-class Systemdboot(oeSelfTest):
+from oeqa.selftest.case import OESelftestTestCase
+from oeqa.core.decorator.oeid import OETestID
+from oeqa.utils.commands import runCmd, bitbake, get_bb_var, runqemu
 
+class Systemdboot(OESelftestTestCase):
     def _common_setup(self):
         """
         Common setup for test cases: 1445, XXXX
@@ -28,7 +24,7 @@ class Systemdboot(oeSelfTest):
         bitbake('mtools-native core-image-minimal')
 
 
-    @testcase(1445)
+    @OETestID(1445)
     def test_efi_systemdboot_images_can_be_built(self):
         """
         Summary:     Check if systemd-boot images can be built correctly
-- 
2.1.4



^ permalink raw reply related	[flat|nested] 43+ messages in thread

* ✗ patchtest: failure for OEQA threading support and selftest migration
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (35 preceding siblings ...)
  2017-05-26 20:38 ` [PATCH 36/36] selftest: Migrate systemd_boot test case to the new framework Aníbal Limón
@ 2017-05-26 21:01 ` Patchwork
  2017-05-26 23:32 ` [PATCH 00/36] " Richard Purdie
  37 siblings, 0 replies; 43+ messages in thread
From: Patchwork @ 2017-05-26 21:01 UTC (permalink / raw)
  To: Aníbal Limón; +Cc: openembedded-core

== Series Details ==

Series: OEQA threading support and selftest migration
Revision: 1
URL   : https://patchwork.openembedded.org/series/6941/
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 12373003cc)

* 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     poky@yoctoproject.org [http://git.yoctoproject.org/cgit/cgit.cgi/poky/]
  Patch's path:    meta-yocto-bsp/lib/oeqa/selftest/systemd_boot.py



If you believe any of these test results are incorrect, please reply to the
mailing list (openembedded-core@lists.openembedded.org) 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



^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH 00/36] OEQA threading support and selftest migration
  2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
                   ` (36 preceding siblings ...)
  2017-05-26 21:01 ` ✗ patchtest: failure for OEQA threading support and selftest migration Patchwork
@ 2017-05-26 23:32 ` Richard Purdie
  2017-05-29 13:15   ` Leonardo Sandoval
  37 siblings, 1 reply; 43+ messages in thread
From: Richard Purdie @ 2017-05-26 23:32 UTC (permalink / raw)
  To: Aníbal Limón, openembedded-core; +Cc: paul.eggleton

On Fri, 2017-05-26 at 15:37 -0500, Aníbal Limón wrote:
> This series is the integration of tree main changes into the OEQA
> module,
> 
> * Implement threading support into OEQA core module
> * Enables OEQA threaded mode into {,e}SDK test component
> * Migrate current oe-selftest to use the same framework

I tried this on the autobuilder:

https://autobuilder.yoctoproject.org/main/builders/nightly-oe-selftest/
builds/901/steps/Running%20oe-selftest/logs/stdio

It was fast, the oe-selftest run which usually takes several hours took
30 mins. The above logs suggest we might have a coverage issue though.

Cheers,

Richard


^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH 00/36] OEQA threading support and selftest migration
  2017-05-26 23:32 ` [PATCH 00/36] " Richard Purdie
@ 2017-05-29 13:15   ` Leonardo Sandoval
  2017-05-29 13:19     ` Richard Purdie
  0 siblings, 1 reply; 43+ messages in thread
From: Leonardo Sandoval @ 2017-05-29 13:15 UTC (permalink / raw)
  To: Richard Purdie; +Cc: paul.eggleton, openembedded-core

On Sat, 2017-05-27 at 00:32 +0100, Richard Purdie wrote:
> On Fri, 2017-05-26 at 15:37 -0500, Aníbal Limón wrote:
> > This series is the integration of tree main changes into the OEQA
> > module,
> > 
> > * Implement threading support into OEQA core module
> > * Enables OEQA threaded mode into {,e}SDK test component
> > * Migrate current oe-selftest to use the same framework
> 
> I tried this on the autobuilder:
> 
> https://autobuilder.yoctoproject.org/main/builders/nightly-oe-selftest/
> builds/901/steps/Running%20oe-selftest/logs/stdio
> 
> It was fast, the oe-selftest run which usually takes several hours took
> 30 mins. The above logs suggest we might have a coverage issue though.

BTW, the new OE/QA threading support does not support (yet, Anibal is
planning to work on it) the selftest test cases (because only one
bitbake instance can be running at a time) so we should see similar
times as before with this migration. So, those 30 minutes just comes
from executing a subset, so something may be wrong in the series.


Leo

> 
> Cheers,
> 
> Richard




^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH 00/36] OEQA threading support and selftest migration
  2017-05-29 13:15   ` Leonardo Sandoval
@ 2017-05-29 13:19     ` Richard Purdie
  2017-05-29 14:08       ` Leonardo Sandoval
  0 siblings, 1 reply; 43+ messages in thread
From: Richard Purdie @ 2017-05-29 13:19 UTC (permalink / raw)
  To: Leonardo Sandoval; +Cc: paul.eggleton, openembedded-core

On Mon, 2017-05-29 at 08:15 -0500, Leonardo Sandoval wrote:
> On Sat, 2017-05-27 at 00:32 +0100, Richard Purdie wrote:
> > 
> > On Fri, 2017-05-26 at 15:37 -0500, Aníbal Limón wrote:
> > > 
> > > This series is the integration of tree main changes into the OEQA
> > > module,
> > > 
> > > * Implement threading support into OEQA core module
> > > * Enables OEQA threaded mode into {,e}SDK test component
> > > * Migrate current oe-selftest to use the same framework
> > I tried this on the autobuilder:
> > 
> > https://autobuilder.yoctoproject.org/main/builders/nightly-oe-selft
> > est/
> > builds/901/steps/Running%20oe-selftest/logs/stdio
> > 
> > It was fast, the oe-selftest run which usually takes several hours
> > took
> > 30 mins. The above logs suggest we might have a coverage issue
> > though.
> BTW, the new OE/QA threading support does not support (yet, Anibal is
> planning to work on it) the selftest test cases (because only one
> bitbake instance can be running at a time) so we should see similar
> times as before with this migration. So, those 30 minutes just comes
> from executing a subset, so something may be wrong in the series.

The above was British understatement ;-).

If you look at the log it went from 200+ tests to executing just one.
There is something *very* wrong with the series.

I have Anibal's piece of the series queued in -next and may merge that
ahead of the selftest pieces whilst you figure out the issue there.

Cheers,

Richard


^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH 00/36] OEQA threading support and selftest migration
  2017-05-29 13:19     ` Richard Purdie
@ 2017-05-29 14:08       ` Leonardo Sandoval
  2017-05-29 15:52         ` Aníbal Limón
  0 siblings, 1 reply; 43+ messages in thread
From: Leonardo Sandoval @ 2017-05-29 14:08 UTC (permalink / raw)
  To: Richard Purdie; +Cc: paul.eggleton, openembedded-core

On Mon, 2017-05-29 at 14:19 +0100, Richard Purdie wrote:
> On Mon, 2017-05-29 at 08:15 -0500, Leonardo Sandoval wrote:
> > On Sat, 2017-05-27 at 00:32 +0100, Richard Purdie wrote:
> > > 
> > > On Fri, 2017-05-26 at 15:37 -0500, Aníbal Limón wrote:
> > > > 
> > > > This series is the integration of tree main changes into the OEQA
> > > > module,
> > > > 
> > > > * Implement threading support into OEQA core module
> > > > * Enables OEQA threaded mode into {,e}SDK test component
> > > > * Migrate current oe-selftest to use the same framework
> > > I tried this on the autobuilder:
> > > 
> > > https://autobuilder.yoctoproject.org/main/builders/nightly-oe-selft
> > > est/
> > > builds/901/steps/Running%20oe-selftest/logs/stdio
> > > 
> > > It was fast, the oe-selftest run which usually takes several hours
> > > took
> > > 30 mins. The above logs suggest we might have a coverage issue
> > > though.
> > BTW, the new OE/QA threading support does not support (yet, Anibal is
> > planning to work on it) the selftest test cases (because only one
> > bitbake instance can be running at a time) so we should see similar
> > times as before with this migration. So, those 30 minutes just comes
> > from executing a subset, so something may be wrong in the series.
> 
> The above was British understatement ;-).
> 
> If you look at the log it went from 200+ tests to executing just one.
> There is something *very* wrong with the series.

I rebased Anibal's series on top of current master and executed
oe-selftest -a at my host, and tests are added correctly and start
executing as expected, so there may be something going on on the AB.
Also several local AB builds were launched prior sending the series into
the mailing list and no errors were seen. Will work on this to figure
out the root cause.

Leo


> 
> I have Anibal's piece of the series queued in -next and may merge that
> ahead of the selftest pieces whilst you figure out the issue there.
> 
> Cheers,
> 
> Richard




^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH 00/36] OEQA threading support and selftest migration
  2017-05-29 14:08       ` Leonardo Sandoval
@ 2017-05-29 15:52         ` Aníbal Limón
  0 siblings, 0 replies; 43+ messages in thread
From: Aníbal Limón @ 2017-05-29 15:52 UTC (permalink / raw)
  To: Leonardo Sandoval, Richard Purdie; +Cc: paul.eggleton, openembedded-core


[-- Attachment #1.1: Type: text/plain, Size: 2518 bytes --]



On 05/29/2017 09:08 AM, Leonardo Sandoval wrote:
> On Mon, 2017-05-29 at 14:19 +0100, Richard Purdie wrote:
>> On Mon, 2017-05-29 at 08:15 -0500, Leonardo Sandoval wrote:
>>> On Sat, 2017-05-27 at 00:32 +0100, Richard Purdie wrote:
>>>>
>>>> On Fri, 2017-05-26 at 15:37 -0500, Aníbal Limón wrote:
>>>>>
>>>>> This series is the integration of tree main changes into the OEQA
>>>>> module,
>>>>>
>>>>> * Implement threading support into OEQA core module
>>>>> * Enables OEQA threaded mode into {,e}SDK test component
>>>>> * Migrate current oe-selftest to use the same framework
>>>> I tried this on the autobuilder:
>>>>
>>>> https://autobuilder.yoctoproject.org/main/builders/nightly-oe-selft
>>>> est/
>>>> builds/901/steps/Running%20oe-selftest/logs/stdio
>>>>
>>>> It was fast, the oe-selftest run which usually takes several hours
>>>> took
>>>> 30 mins. The above logs suggest we might have a coverage issue
>>>> though.
>>> BTW, the new OE/QA threading support does not support (yet, Anibal is
>>> planning to work on it) the selftest test cases (because only one
>>> bitbake instance can be running at a time) so we should see similar
>>> times as before with this migration. So, those 30 minutes just comes
>>> from executing a subset, so something may be wrong in the series.
>>
>> The above was British understatement ;-).
>>
>> If you look at the log it went from 200+ tests to executing just one.
>> There is something *very* wrong with the series.

I executed the branch into the local AB and everything goes well, see
attached log.

May be was an integration issue because we have two patches for migrate
test cases, one for oe-core and other for meta-yocto-bsp. [1]. I
re-launched the build into the local AB to test again and see what happens.

[1]
http://git.yoctoproject.org/cgit/cgit.cgi/poky-contrib/log/?h=alimon/oeqa_integration

Cheers,
	Anibal

> 
> I rebased Anibal's series on top of current master and executed
> oe-selftest -a at my host, and tests are added correctly and start
> executing as expected, so there may be something going on on the AB.
> Also several local AB builds were launched prior sending the series into
> the mailing list and no errors were seen. Will work on this to figure
> out the root cause.
> 
> Leo
> 
> 
>>
>> I have Anibal's piece of the series queued in -next and may merge that
>> ahead of the selftest pieces whilst you figure out the issue there.
>>
>> Cheers,
>>
>> Richard
> 
> 

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.2: oeqa_integration_ab.log --]
[-- Type: text/x-log; name="oeqa_integration_ab.log", Size: 163971 bytes --]


### Shell environment set up for builds. ###

You can now run 'bitbake <target>'

Common targets are:
    core-image-minimal
    core-image-sato
    meta-toolchain
    meta-ide-support

You can also run generated qemu images with a command like 'runqemu qemux86'
2017-05-26 13:27:47,172 - oe-selftest - INFO - Adding layer libraries:
2017-05-26 13:27:47,172 - oe-selftest - INFO - 	/home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/meta/lib
2017-05-26 13:27:47,172 - oe-selftest - INFO - 	/home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/meta-yocto-bsp/lib
2017-05-26 13:27:47,172 - oe-selftest - INFO - 	/home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/meta-selftest/lib
2017-05-26 13:27:47,174 - oe-selftest - INFO - Running bitbake -p
2017-05-26 13:27:55,509 - oe-selftest - INFO - 
2017-05-26 13:27:55,510 - oe-selftest - INFO - Running tests...
2017-05-26 13:27:55,510 - oe-selftest - INFO - ----------------------------------------------------------------------
2017-05-26 13:27:55,511 - oe-selftest - INFO - Adding: "include selftest.inc" in /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/conf/local.conf
2017-05-26 13:27:55,511 - oe-selftest - INFO - Adding: "include bblayers.inc" in bblayers.conf
2017-05-26 13:31:54,563 - oe-selftest - INFO -   test_archiver_allows_to_filter_on_recipe_name (archiver.Archiver) ... OK (239.052s)
2017-05-26 13:32:06,511 - oe-selftest - INFO -   test_bitbakelayers_add_remove (bblayers.BitbakeLayers) ... OK (11.947s)
2017-05-26 13:32:19,932 - oe-selftest - INFO -   test_bitbakelayers_flatten (bblayers.BitbakeLayers) ... OK (13.420s)
2017-05-26 13:32:25,713 - oe-selftest - INFO -   test_bitbakelayers_showappends (bblayers.BitbakeLayers) ... OK (5.780s)
2017-05-26 13:33:11,085 - oe-selftest - INFO -   test_bitbakelayers_showcrossdepends (bblayers.BitbakeLayers) ... OK (45.372s)
2017-05-26 13:33:12,187 - oe-selftest - INFO -   test_bitbakelayers_showlayers (bblayers.BitbakeLayers) ... OK (1.101s)
2017-05-26 13:33:15,036 - oe-selftest - INFO -   test_bitbakelayers_showoverlayed (bblayers.BitbakeLayers) ... OK (2.849s)
2017-05-26 13:33:30,382 - oe-selftest - INFO -   test_bitbakelayers_showrecipes (bblayers.BitbakeLayers) ... OK (15.345s)
2017-05-26 13:33:36,262 - oe-selftest - INFO -   test_bbappend_order (bbtests.BitbakeTests) ... OK (5.879s)
2017-05-26 13:33:41,614 - oe-selftest - INFO -   test_bitbake_g (bbtests.BitbakeTests) ... OK (5.352s)
2017-05-26 13:33:42,532 - oe-selftest - INFO -   test_bitbake_invalid_recipe (bbtests.BitbakeTests) ... OK (0.917s)
2017-05-26 13:33:44,489 - oe-selftest - INFO -   test_bitbake_invalid_target (bbtests.BitbakeTests) ... OK (1.957s)
2017-05-26 13:33:49,290 - oe-selftest - INFO -   test_checkuri (bbtests.BitbakeTests) ... OK (4.801s)
2017-05-26 13:34:06,252 - oe-selftest - INFO -   test_continue (bbtests.BitbakeTests) ... OK (16.961s)
2017-05-26 13:34:10,056 - oe-selftest - INFO -   test_dry_run (bbtests.BitbakeTests) ... OK (3.803s)
2017-05-26 13:34:11,336 - oe-selftest - INFO -   test_environment (bbtests.BitbakeTests) ... OK (1.280s)
2017-05-26 13:34:20,593 - oe-selftest - INFO -   test_event_handler (bbtests.BitbakeTests) ... OK (9.257s)
2017-05-26 13:35:01,117 - oe-selftest - INFO -   test_force_task_1 (bbtests.BitbakeTests) ... OK (40.524s)
2017-05-26 13:35:23,984 - oe-selftest - INFO -   test_force_task_2 (bbtests.BitbakeTests) ... OK (22.866s)
2017-05-26 13:35:37,179 - oe-selftest - INFO -   test_image_manifest (bbtests.BitbakeTests) ... OK (13.194s)
2017-05-26 13:35:50,630 - oe-selftest - INFO -   test_invalid_patch (bbtests.BitbakeTests) ... OK (13.451s)
2017-05-26 13:36:06,734 - oe-selftest - INFO -   test_invalid_recipe_src_uri (bbtests.BitbakeTests) ... OK (16.103s)
2017-05-26 13:36:10,623 - oe-selftest - INFO -   test_just_parse (bbtests.BitbakeTests) ... OK (3.889s)
2017-05-26 13:36:24,276 - oe-selftest - INFO -   test_local_sstate (bbtests.BitbakeTests) ... OK (13.653s)
2017-05-26 13:36:44,590 - oe-selftest - INFO -   test_non_gplv3 (bbtests.BitbakeTests) ... OK (20.313s)
2017-05-26 13:36:45,855 - oe-selftest - INFO -   test_postfile (bbtests.BitbakeTests) ... OK (1.265s)
2017-05-26 13:36:52,229 - oe-selftest - INFO -   test_prefile (bbtests.BitbakeTests) ... OK (6.373s)
2017-05-26 13:37:01,058 - oe-selftest - INFO -   test_rename_downloaded_file (bbtests.BitbakeTests) ... OK (8.828s)
2017-05-26 13:37:02,345 - oe-selftest - INFO -   test_run_bitbake_from_dir_1 (bbtests.BitbakeTests) ... OK (1.287s)
2017-05-26 13:37:03,658 - oe-selftest - INFO -   test_run_bitbake_from_dir_2 (bbtests.BitbakeTests) ... OK (1.312s)
2017-05-26 13:37:25,978 - oe-selftest - INFO -   test_setscene_only (bbtests.BitbakeTests) ... OK (22.320s)
2017-05-26 13:37:28,507 - oe-selftest - INFO -   test_version (bbtests.BitbakeTests) ... OK (2.528s)
2017-05-26 13:37:29,450 - oe-selftest - INFO -   test_warnings_errors (bbtests.BitbakeTests) ... OK (0.942s)
2017-05-26 13:37:50,831 - oe-selftest - INFO -   test_arch_work_dir_and_export_source (buildoptions.ArchiverTest) ... OK (21.381s)
2017-05-26 13:38:11,672 - oe-selftest - INFO -   test_buildhistory_basic (buildoptions.BuildhistoryTests) ... OK (20.840s)
2017-05-26 13:38:58,009 - oe-selftest - INFO -   test_buildhistory_buildtime_pr_backwards (buildoptions.BuildhistoryTests) ... OK (46.337s)
2017-05-26 13:39:26,605 - oe-selftest - INFO -   test_stoptask_behavior (buildoptions.DiskMonTest) ... OK (28.595s)
2017-05-26 13:58:56,097 - oe-selftest - INFO -   test_ccache_tool (buildoptions.ImageOptionsTests) ... OK (1169.491s)
2017-05-26 14:01:47,085 - oe-selftest - INFO -   test_incremental_image_generation (buildoptions.ImageOptionsTests) ... OK (170.987s)
2017-05-26 14:35:42,505 - oe-selftest - INFO -   test_read_only_image (buildoptions.ImageOptionsTests) ... OK (2035.420s)
2017-05-26 14:36:04,557 - oe-selftest - INFO -   test_layer_without_git_dir (buildoptions.SanityOptionsTest) ... OK (22.036s)
2017-05-26 14:36:26,492 - oe-selftest - INFO -   test_options_warnqa_errorqa_switch (buildoptions.SanityOptionsTest) ... OK (21.935s)
2017-05-26 14:37:34,000 - oe-selftest - INFO -   test_sanity_unsafe_script_references (buildoptions.SanityOptionsTest) ... OK (67.508s)
2017-05-26 14:38:36,144 - oe-selftest - INFO -   test_expected_files (containerimage.ContainerImageTests) ... OK (62.142s)
2017-05-26 14:38:45,135 - oe-selftest - INFO -   test_create_workspace (devtool.DevtoolTests) ... OK (7.616s)
2017-05-26 14:39:38,062 - oe-selftest - INFO -   test_devtool_add (devtool.DevtoolTests) ... OK (52.926s)
2017-05-26 14:40:38,974 - oe-selftest - INFO -   test_devtool_add_fetch (devtool.DevtoolTests) ... OK (60.911s)
2017-05-26 14:41:30,352 - oe-selftest - INFO -   test_devtool_add_fetch_git (devtool.DevtoolTests) ... OK (51.377s)
2017-05-26 14:41:46,555 - oe-selftest - INFO -   test_devtool_add_fetch_simple (devtool.DevtoolTests) ... OK (16.202s)
2017-05-26 14:42:01,042 - oe-selftest - INFO -   test_devtool_add_git_local (devtool.DevtoolTests) ... OK (14.486s)
2017-05-26 14:47:53,406 - oe-selftest - INFO -   test_devtool_add_library (devtool.DevtoolTests) ... OK (352.364s)
2017-05-26 14:50:45,513 - oe-selftest - INFO -   test_devtool_build_image (devtool.DevtoolTests) ... OK (172.106s)
2017-05-26 14:52:53,283 - oe-selftest - INFO -   test_devtool_buildclean (devtool.DevtoolTests) ... OK (127.770s)
rootfs file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/oe-selftest-image-qemux86-64.ext4
Qemu log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/oe-selftest-image/1.0-r0/testimage/qemu_boot_log.20170526195432
SSH log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/oe-selftest-image/1.0-r0/testimage/ssh_target_log.20170526195432
Using kvm for runqemu
Created listening socket for qemu serial console on: 127.0.0.1:39685
Created listening socket for qemu serial console on: 127.0.0.1:58030
launchcmd=runqemu snapshot   kvm qemux86-64 /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/oe-selftest-image-qemux86-64.ext4 tcpserial=58030 bootparams="console=tty1 console=ttyS0,115200n8 printk.time=1" qemuparams="-serial tcp:127.0.0.1:39685"
runqemu started, pid is 2196
waiting at most 60 seconds for qemu pid
qemu started - qemu procces pid is 2216
qemu cmdline used:
tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64-devicevirtio-net-pci,netdev=net0,mac=52:54:00:12:34:02-netdevtap,id=net0,ifname=tap0,script=no,downscript=no-drivefile=/home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/oe-selftest-image-qemux86-64.ext4,if=virtio,format=raw-vgavmware-show-cursor-usb-usbdevicetablet-devicevirtio-rng-pci-serialtcp:127.0.0.1:39685-cpukvm64-enable-kvm-m256-serialtcp:127.0.0.1:58030-snapshot-kerneltmp/deploy/images/qemux86-64/bzImage--4.10.15+git0+4d929fac34_d2c1ed3c0c-r0-qemux86-64-20170526174439.bin-appendroot=/dev/vda rw highres=off  mem=256M ip=192.168.7.2::192.168.7.1:255.255.255.0 vga=0 uvesafb.mode_option=640x480-32 oprofile.timer=1 uvesafb.task_timeout=-1 console=tty1 console=ttyS0,115200n8 printk.time=1
Target IP: 192.168.7.2
Server IP: 192.168.7.1
Starting logging thread
Starting thread event loop
Connection request received
Setting connection established event
Output from runqemu:
runqemu - INFO - CONFFILE: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/oe-selftest-image-qemux86-64.qemuboot.conf
runqemu - INFO - Continuing with the following parameters:

stty: standard input: Inappropriate ioctl for device
runqemu - INFO - Running /bin/ip link...
runqemu - INFO - Acquiring lockfile /tmp/qemu-tap-locks/tap0.lock...
runqemu - INFO - Using preconfigured tap device tap0
runqemu - INFO - If this is not intended, touch /tmp/qemu-tap-locks/tap0.skip to make runqemu skip tap0.
runqemu - INFO - Network configuration: 192.168.7.2::192.168.7.1:255.255.255.0
runqemu - INFO - Running ldd tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64...
runqemu - INFO - Running tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64 -device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:02 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -drive file=/home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/oe-selftest-image-qemux86-64.ext4,if=virtio,format=raw -vga vmware -show-cursor -usb -usbdevice tablet -device virtio-rng-pci  -serial tcp:127.0.0.1:39685  -cpu kvm64 -enable-kvm -m 256 -serial tcp:127.0.0.1:58030 -snapshot -kernel tmp/deploy/images/qemux86-64/bzImage--4.10.15+git0+4d929fac34_d2c1ed3c0c-r0-qemux86-64-20170526174439.bin -append 'root=/dev/vda rw highres=off  mem=256M ip=192.168.7.2::192.168.7.1:255.255.255.0 vga=0 uvesafb.mode_option=640x480-32 oprofile.timer=1 uvesafb.task_timeout=-1 console=tty1 console=ttyS0,115200n8 printk.time=1'

Waiting at most 1000 seconds for login banner
Connection from 127.0.0.1:46988
Reached login banner
Logged as root in serial console
Stopping logging thread
Stop event received
Tearing down logging thread
Sending SIGTERM to runqemu
2017-05-26 14:55:13,751 - oe-selftest - INFO -   test_devtool_deploy_target (devtool.DevtoolTests) ... OK (140.467s)
2017-05-26 14:55:35,998 - oe-selftest - INFO -   test_devtool_extract (devtool.DevtoolTests) ... OK (22.247s)
2017-05-26 14:55:55,753 - oe-selftest - INFO -   test_devtool_extract_virtual (devtool.DevtoolTests) ... OK (19.755s)
2017-05-26 14:56:34,819 - oe-selftest - INFO -   test_devtool_finish_modify_origlayer (devtool.DevtoolTests) ... OK (39.065s)
2017-05-26 14:57:16,072 - oe-selftest - INFO -   test_devtool_finish_modify_otherlayer (devtool.DevtoolTests) ... OK (41.253s)
2017-05-26 14:57:50,714 - oe-selftest - INFO -   test_devtool_finish_upgrade_origlayer (devtool.DevtoolTests) ... OK (34.641s)
2017-05-26 14:58:28,068 - oe-selftest - INFO -   test_devtool_finish_upgrade_otherlayer (devtool.DevtoolTests) ... OK (37.354s)
2017-05-26 14:58:30,345 - oe-selftest - INFO -   test_devtool_layer_plugins (devtool.DevtoolTests) ... OK (2.277s)
2017-05-26 14:58:43,279 - oe-selftest - INFO -   test_devtool_load_plugin (devtool.DevtoolTests) ... OK (12.933s)
2017-05-26 15:00:13,053 - oe-selftest - INFO -   test_devtool_modify (devtool.DevtoolTests) ... OK (89.773s)
2017-05-26 15:01:06,769 - oe-selftest - INFO -   test_devtool_modify_git (devtool.DevtoolTests) ... OK (53.716s)
2017-05-26 15:02:32,912 - oe-selftest - INFO -   test_devtool_modify_invalid (devtool.DevtoolTests) ... OK (86.142s)
2017-05-26 15:04:03,297 - oe-selftest - INFO -   test_devtool_modify_localfiles (devtool.DevtoolTests) ... OK (90.384s)
2017-05-26 15:07:54,157 - oe-selftest - INFO -   test_devtool_modify_native (devtool.DevtoolTests) ... OK (230.860s)
2017-05-26 15:08:15,140 - oe-selftest - INFO -   test_devtool_modify_virtual (devtool.DevtoolTests) ... OK (20.983s)
2017-05-26 15:09:05,711 - oe-selftest - INFO -   test_devtool_rename (devtool.DevtoolTests) ... OK (50.571s)
2017-05-26 15:10:46,005 - oe-selftest - INFO -   test_devtool_reset_all (devtool.DevtoolTests) ... OK (100.293s)
2017-05-26 15:11:16,393 - oe-selftest - INFO -   test_devtool_update_recipe (devtool.DevtoolTests) ... OK (30.388s)
2017-05-26 15:12:09,332 - oe-selftest - INFO -   test_devtool_update_recipe_append (devtool.DevtoolTests) ... OK (52.939s)
2017-05-26 15:13:00,276 - oe-selftest - INFO -   test_devtool_update_recipe_append_git (devtool.DevtoolTests) ... OK (50.943s)
2017-05-26 15:13:32,376 - oe-selftest - INFO -   test_devtool_update_recipe_git (devtool.DevtoolTests) ... OK (32.100s)
2017-05-26 15:14:09,867 - oe-selftest - INFO -   test_devtool_update_recipe_local_files (devtool.DevtoolTests) ... OK (37.490s)
2017-05-26 15:14:38,820 - oe-selftest - INFO -   test_devtool_update_recipe_local_files_2 (devtool.DevtoolTests) ... OK (28.953s)
2017-05-26 15:15:04,539 - oe-selftest - INFO -   test_devtool_update_recipe_local_files_3 (devtool.DevtoolTests) ... OK (25.719s)
2017-05-26 15:15:26,285 - oe-selftest - INFO -   test_devtool_update_recipe_local_files_subdir (devtool.DevtoolTests) ... OK (21.745s)
2017-05-26 15:15:52,574 - oe-selftest - INFO -   test_devtool_update_recipe_local_patch_gz (devtool.DevtoolTests) ... OK (26.288s)
2017-05-26 15:16:27,959 - oe-selftest - INFO -   test_devtool_upgrade (devtool.DevtoolTests) ... OK (35.385s)
2017-05-26 15:16:53,494 - oe-selftest - INFO -   test_devtool_upgrade_git (devtool.DevtoolTests) ... OK (25.535s)
2017-05-26 15:35:39,820 - oe-selftest - INFO -   test_devtool_virtual_kernel_modify (devtool.DevtoolTests) ... OK (1126.325s)
2017-05-26 16:06:56,825 - oe-selftest - INFO -   test_image_generation_binary_feeds (eSDK.oeSDKExtSelfTest) ... OK (49.079s)
2017-05-26 16:07:04,853 - oe-selftest - INFO -   test_install_libraries_headers (eSDK.oeSDKExtSelfTest) ... OK (8.026s)
2017-05-26 16:07:16,977 - oe-selftest - INFO -   test_conversion_typedep_added (image_typedep.ImageTypeDepTests) ... OK (9.022s)
rootfs file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.ext4
Qemu log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/qemu_boot_log.20170526210803
SSH log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/ssh_target_log.20170526210803
Using kvm for runqemu
Created listening socket for qemu serial console on: 127.0.0.1:49538
Created listening socket for qemu serial console on: 127.0.0.1:56344
launchcmd=runqemu snapshot   kvm qemux86-64 /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.ext4 tcpserial=56344 bootparams="console=tty1 console=ttyS0,115200n8 printk.time=1" qemuparams="-serial tcp:127.0.0.1:49538"
runqemu started, pid is 12008
waiting at most 60 seconds for qemu pid
qemu started - qemu procces pid is 12028
qemu cmdline used:
tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64-devicevirtio-net-pci,netdev=net0,mac=52:54:00:12:34:02-netdevtap,id=net0,ifname=tap0,script=no,downscript=no-drivefile=/home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.ext4,if=virtio,format=raw-vgavmware-show-cursor-usb-usbdevicetablet-devicevirtio-rng-pci-serialtcp:127.0.0.1:49538-cpukvm64-enable-kvm-m256-serialtcp:127.0.0.1:56344-snapshot-kerneltmp/deploy/images/qemux86-64/bzImage--4.10.15+git0+4d929fac34_d2c1ed3c0c-r0-qemux86-64-20170526174439.bin-appendroot=/dev/vda rw highres=off  mem=256M ip=192.168.7.2::192.168.7.1:255.255.255.0 vga=0 uvesafb.mode_option=640x480-32 oprofile.timer=1 uvesafb.task_timeout=-1 console=tty1 console=ttyS0,115200n8 printk.time=1
Target IP: 192.168.7.2
Server IP: 192.168.7.1
Starting logging thread
Starting thread event loop
Connection request received
Setting connection established event
Output from runqemu:
runqemu - INFO - CONFFILE: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.qemuboot.conf
runqemu - INFO - Continuing with the following parameters:

stty: standard input: Inappropriate ioctl for device
runqemu - INFO - Running /bin/ip link...
runqemu - INFO - Acquiring lockfile /tmp/qemu-tap-locks/tap0.lock...
runqemu - INFO - Using preconfigured tap device tap0
runqemu - INFO - If this is not intended, touch /tmp/qemu-tap-locks/tap0.skip to make runqemu skip tap0.
runqemu - INFO - Network configuration: 192.168.7.2::192.168.7.1:255.255.255.0
runqemu - INFO - Running ldd tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64...
runqemu - INFO - Running tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64 -device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:02 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -drive file=/home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.ext4,if=virtio,format=raw -vga vmware -show-cursor -usb -usbdevice tablet -device virtio-rng-pci  -serial tcp:127.0.0.1:49538  -cpu kvm64 -enable-kvm -m 256 -serial tcp:127.0.0.1:56344 -snapshot -kernel tmp/deploy/images/qemux86-64/bzImage--4.10.15+git0+4d929fac34_d2c1ed3c0c-r0-qemux86-64-20170526174439.bin -append 'root=/dev/vda rw highres=off  mem=256M ip=192.168.7.2::192.168.7.1:255.255.255.0 vga=0 uvesafb.mode_option=640x480-32 oprofile.timer=1 uvesafb.task_timeout=-1 console=tty1 console=ttyS0,115200n8 printk.time=1'

Waiting at most 1000 seconds for login banner
Connection from 127.0.0.1:39126
Reached login banner
Couldn't login into serial console as root using blank password
Stopping logging thread
Stop event received
Tearing down logging thread
Sending SIGTERM to runqemu
2017-05-26 16:08:23,624 - oe-selftest - INFO -   test_all_users_can_connect_via_ssh_without_password (imagefeatures.ImageFeatures) ... OK (66.646s)
2017-05-26 16:09:24,778 - oe-selftest - INFO -   test_bmap (imagefeatures.ImageFeatures) ... OK (61.153s)
2017-05-26 16:14:42,891 - oe-selftest - INFO -   test_clutter_image_can_be_built (imagefeatures.ImageFeatures) ... OK (318.112s)
rootfs file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.ext4
Qemu log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/qemu_boot_log.20170526211531
SSH log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/ssh_target_log.20170526211531
Using kvm for runqemu
Created listening socket for qemu serial console on: 127.0.0.1:55927
Created listening socket for qemu serial console on: 127.0.0.1:43950
launchcmd=runqemu snapshot   kvm qemux86-64 /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.ext4 tcpserial=43950 bootparams="console=tty1 console=ttyS0,115200n8 printk.time=1" qemuparams="-serial tcp:127.0.0.1:55927"
runqemu started, pid is 20702
waiting at most 60 seconds for qemu pid
qemu started - qemu procces pid is 20722
qemu cmdline used:
tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64-devicevirtio-net-pci,netdev=net0,mac=52:54:00:12:34:02-netdevtap,id=net0,ifname=tap0,script=no,downscript=no-drivefile=/home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.ext4,if=virtio,format=raw-vgavmware-show-cursor-usb-usbdevicetablet-devicevirtio-rng-pci-serialtcp:127.0.0.1:55927-cpukvm64-enable-kvm-m256-serialtcp:127.0.0.1:43950-snapshot-kerneltmp/deploy/images/qemux86-64/bzImage--4.10.15+git0+4d929fac34_d2c1ed3c0c-r0-qemux86-64-20170526174439.bin-appendroot=/dev/vda rw highres=off  mem=256M ip=192.168.7.2::192.168.7.1:255.255.255.0 vga=0 uvesafb.mode_option=640x480-32 oprofile.timer=1 uvesafb.task_timeout=-1 console=tty1 console=ttyS0,115200n8 printk.time=1
Target IP: 192.168.7.2
Server IP: 192.168.7.1
Starting logging thread
Starting thread event loop
Connection request received
Setting connection established event
Output from runqemu:
runqemu - INFO - CONFFILE: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.qemuboot.conf
runqemu - INFO - Continuing with the following parameters:

stty: standard input: Inappropriate ioctl for device
runqemu - INFO - Running /bin/ip link...
runqemu - INFO - Acquiring lockfile /tmp/qemu-tap-locks/tap0.lock...
runqemu - INFO - Using preconfigured tap device tap0
runqemu - INFO - If this is not intended, touch /tmp/qemu-tap-locks/tap0.skip to make runqemu skip tap0.
runqemu - INFO - Network configuration: 192.168.7.2::192.168.7.1:255.255.255.0
runqemu - INFO - Running ldd tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64...
runqemu - INFO - Running tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64 -device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:02 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -drive file=/home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.ext4,if=virtio,format=raw -vga vmware -show-cursor -usb -usbdevice tablet -device virtio-rng-pci  -serial tcp:127.0.0.1:55927  -cpu kvm64 -enable-kvm -m 256 -serial tcp:127.0.0.1:43950 -snapshot -kernel tmp/deploy/images/qemux86-64/bzImage--4.10.15+git0+4d929fac34_d2c1ed3c0c-r0-qemux86-64-20170526174439.bin -append 'root=/dev/vda rw highres=off  mem=256M ip=192.168.7.2::192.168.7.1:255.255.255.0 vga=0 uvesafb.mode_option=640x480-32 oprofile.timer=1 uvesafb.task_timeout=-1 console=tty1 console=ttyS0,115200n8 printk.time=1'

Waiting at most 1000 seconds for login banner
Connection from 127.0.0.1:35394
Reached login banner
Logged as root in serial console
Stopping logging thread
Stop event received
Tearing down logging thread
Sending SIGTERM to runqemu
2017-05-26 16:15:45,517 - oe-selftest - INFO -   test_non_root_user_can_connect_via_ssh_without_password (imagefeatures.ImageFeatures) ... OK (62.626s)
2017-05-26 16:18:20,878 - oe-selftest - INFO -   test_wayland_support_in_image (imagefeatures.ImageFeatures) ... OK (155.360s)
2017-05-26 16:18:56,147 - oe-selftest - INFO -   test_layer_appends (layerappend.LayerAppendTests) ... OK (35.267s)
2017-05-26 16:18:57,492 - oe-selftest - INFO -   test_copy_hardlink_tree_count (liboe.LibOE) ... OK (0.020s)
2017-05-26 16:18:57,504 - oe-selftest - INFO -   test_copy_tree_special (liboe.LibOE) ... OK (0.011s)
2017-05-26 16:19:05,197 - oe-selftest - INFO -   test_copy_tree_xattr (liboe.LibOE) ... OK (7.692s)
2017-05-26 16:19:16,447 - oe-selftest - INFO -   test_nonmatching_checksum (lic_checksum.LicenseTests) ... OK (11.249s)
2017-05-26 16:19:16,448 - oe-selftest - INFO - VerifyManifest: doing bitbake core-image-minimal as a prerequisite of the test
2017-05-26 16:33:41,222 - oe-selftest - INFO -   test_SDK_manifest_entries (manifest.VerifyManifest) ... OK (828.832s)
2017-05-26 16:33:52,679 - oe-selftest - INFO -   test_image_manifest_entries (manifest.VerifyManifest) ... OK (11.440s)
2017-05-26 16:33:54,899 - oe-selftest - INFO -   test_blob_to_dict (oelib.buildhistory.TestBlobParsing) ... OK (2.219s)
2017-05-26 16:33:56,281 - oe-selftest - INFO -   test_compare_dict_blobs (oelib.buildhistory.TestBlobParsing) ... OK (1.382s)
2017-05-26 16:33:57,642 - oe-selftest - INFO -   test_compare_dict_blobs_default (oelib.buildhistory.TestBlobParsing) ... OK (1.360s)
2017-05-26 16:33:57,645 - oe-selftest - INFO -   test_machine_name (oelib.elf.TestElf) ... OK (0.002s)
2017-05-26 16:33:57,649 - oe-selftest - INFO -   test_tests (oelib.license.TestComplexCombinations) ... OK (0.003s)
2017-05-26 16:33:57,652 - oe-selftest - INFO -   test_tests (oelib.license.TestSimpleCombinations) ... OK (0.002s)
2017-05-26 16:33:57,654 - oe-selftest - INFO -   test_invalid_licenses (oelib.license.TestSingleLicense) ... OK (0.002s)
2017-05-26 16:33:57,657 - oe-selftest - INFO -   test_single_licenses (oelib.license.TestSingleLicense) ... OK (0.002s)
2017-05-26 16:33:57,662 - oe-selftest - INFO -   test_loop (oelib.path.TestRealPath) ... OK (0.004s)
2017-05-26 16:33:57,666 - oe-selftest - INFO -   test_norm (oelib.path.TestRealPath) ... OK (0.004s)
2017-05-26 16:33:57,667 - oe-selftest - INFO -   test_phys (oelib.path.TestRealPath) ... OK (0.001s)
2017-05-26 16:33:57,670 - oe-selftest - INFO -   test_bool_equality (oelib.types.TestBooleanType) ... OK (0.002s)
2017-05-26 16:33:57,672 - oe-selftest - INFO -   test_false (oelib.types.TestBooleanType) ... OK (0.002s)
2017-05-26 16:33:57,674 - oe-selftest - INFO -   test_invalid (oelib.types.TestBooleanType) ... OK (0.002s)
2017-05-26 16:33:57,676 - oe-selftest - INFO -   test_true (oelib.types.TestBooleanType) ... OK (0.002s)
2017-05-26 16:33:57,678 - oe-selftest - INFO -   test_list_nosep (oelib.types.TestList) ... OK (0.002s)
2017-05-26 16:33:57,680 - oe-selftest - INFO -   test_list_usersep (oelib.types.TestList) ... OK (0.002s)
2017-05-26 16:33:57,682 - oe-selftest - INFO -   test_filter (oelib.utils.TestPackagesFilterOutSystem) ... OK (0.002s)
2017-05-26 16:33:57,685 - oe-selftest - INFO -   test_num_exception (oelib.utils.TestTrimVersion) ... OK (0.002s)
2017-05-26 16:33:57,686 - oe-selftest - INFO -   test_valid (oelib.utils.TestTrimVersion) ... OK (0.002s)
2017-05-26 16:33:57,688 - oe-selftest - INFO -   test_version_exception (oelib.utils.TestTrimVersion) ... OK (0.002s)
2017-05-26 16:34:30,006 - oe-selftest - INFO -   test_buildhistory_diff (oescripts.BuildhistoryDiffTests) ... OK (32.317s)
2017-05-26 16:34:47,052 - oe-selftest - INFO -   test_dpkg (package.VersionOrdering) ... OK (0.110s)
2017-05-26 16:34:47,162 - oe-selftest - INFO -   test_opkg (package.VersionOrdering) ... OK (0.109s)
2017-05-26 16:34:47,582 - oe-selftest - INFO -   test_rpm (package.VersionOrdering) ... OK (0.419s)
2017-05-26 16:34:47,583 - oe-selftest - INFO - Running bitbake to generate pkgdata
2017-05-26 16:35:45,912 - oe-selftest - INFO -   test_find_path (pkgdata.OePkgdataUtilTests) ... OK (53.144s)
2017-05-26 16:35:49,250 - oe-selftest - INFO -   test_glob (pkgdata.OePkgdataUtilTests) ... OK (3.338s)
2017-05-26 16:35:57,010 - oe-selftest - INFO -   test_list_pkg_files (pkgdata.OePkgdataUtilTests) ... OK (7.759s)
2017-05-26 16:36:06,409 - oe-selftest - INFO -   test_list_pkgs (pkgdata.OePkgdataUtilTests) ... OK (9.398s)
2017-05-26 16:36:12,620 - oe-selftest - INFO -   test_lookup_pkg (pkgdata.OePkgdataUtilTests) ... OK (6.211s)
2017-05-26 16:36:15,761 - oe-selftest - INFO -   test_lookup_recipe (pkgdata.OePkgdataUtilTests) ... OK (3.140s)
2017-05-26 16:36:18,822 - oe-selftest - INFO -   test_read_value (pkgdata.OePkgdataUtilTests) ... OK (3.060s)
2017-05-26 16:36:20,364 - oe-selftest - INFO -   test_specify_pkgdatadir (pkgdata.OePkgdataUtilTests) ... OK (1.542s)
2017-05-26 16:37:54,344 - oe-selftest - INFO -   test_import_export_override_db (prservice.BitbakePrTests) ... OK (92.598s)
2017-05-26 16:38:46,112 - oe-selftest - INFO -   test_import_export_replace_db (prservice.BitbakePrTests) ... OK (51.768s)
2017-05-26 16:40:32,995 - oe-selftest - INFO -   test_pr_service_deb_arch_dep (prservice.BitbakePrTests) ... OK (106.883s)
2017-05-26 16:41:08,206 - oe-selftest - INFO -   test_pr_service_deb_arch_indep (prservice.BitbakePrTests) ... OK (35.210s)
2017-05-26 16:41:49,325 - oe-selftest - INFO -   test_pr_service_ipk_arch_dep (prservice.BitbakePrTests) ... OK (41.118s)
2017-05-26 16:42:14,486 - oe-selftest - INFO -   test_pr_service_ipk_arch_indep (prservice.BitbakePrTests) ... OK (25.161s)
2017-05-26 16:42:43,749 - oe-selftest - INFO -   test_pr_service_rpm_arch_dep (prservice.BitbakePrTests) ... OK (29.262s)
2017-05-26 16:43:08,593 - oe-selftest - INFO -   test_pr_service_rpm_arch_indep (prservice.BitbakePrTests) ... OK (24.843s)
2017-05-26 16:43:10,025 - oe-selftest - INFO -   test_stopping_prservice_message (prservice.BitbakePrTests) ... OK (1.432s)
2017-05-26 16:43:27,101 - oe-selftest - INFO -   test_recipetool_appendsrcfile_basic (recipetool.RecipetoolAppendsrcTests) ... OK (15.751s)
2017-05-26 16:43:43,804 - oe-selftest - INFO -   test_recipetool_appendsrcfile_basic_wildcard (recipetool.RecipetoolAppendsrcTests) ... OK (16.702s)
2017-05-26 16:43:56,627 - oe-selftest - INFO -   test_recipetool_appendsrcfile_existing_in_src_uri (recipetool.RecipetoolAppendsrcTests) ... OK (12.823s)
2017-05-26 16:44:09,299 - oe-selftest - INFO -   test_recipetool_appendsrcfile_existing_in_src_uri_diff_params (recipetool.RecipetoolAppendsrcTests) ... OK (12.671s)
2017-05-26 16:44:31,277 - oe-selftest - INFO -   test_recipetool_appendsrcfile_replace_file_srcdir (recipetool.RecipetoolAppendsrcTests) ... OK (21.978s)
2017-05-26 16:44:44,883 - oe-selftest - INFO -   test_recipetool_appendsrcfile_srcdir_basic (recipetool.RecipetoolAppendsrcTests) ... OK (13.605s)
2017-05-26 16:44:55,019 - oe-selftest - INFO -   test_recipetool_appendsrcfile_subdir_basic (recipetool.RecipetoolAppendsrcTests) ... OK (10.135s)
2017-05-26 16:45:05,094 - oe-selftest - INFO -   test_recipetool_appendsrcfile_subdir_basic_dirdest (recipetool.RecipetoolAppendsrcTests) ... OK (10.075s)
2017-05-26 16:45:22,202 - oe-selftest - INFO -   test_recipetool_appendsrcfiles_basic (recipetool.RecipetoolAppendsrcTests) ... OK (17.107s)
2017-05-26 16:45:39,589 - oe-selftest - INFO -   test_recipetool_appendsrcfiles_basic_subdir (recipetool.RecipetoolAppendsrcTests) ... OK (17.387s)
2017-05-26 16:45:39,591 - oe-selftest - INFO - Running bitbake to generate pkgdata
2017-05-26 16:46:11,957 - oe-selftest - INFO -   test_recipetool_appendfile_add (recipetool.RecipetoolTests) ... OK (19.147s)
2017-05-26 16:46:21,956 - oe-selftest - INFO -   test_recipetool_appendfile_add_bindir (recipetool.RecipetoolTests) ... OK (9.999s)
2017-05-26 16:46:35,743 - oe-selftest - INFO -   test_recipetool_appendfile_add_machine (recipetool.RecipetoolTests) ... OK (13.786s)
2017-05-26 16:47:00,134 - oe-selftest - INFO -   test_recipetool_appendfile_alternatives (recipetool.RecipetoolTests) ... OK (24.390s)
2017-05-26 16:47:11,479 - oe-selftest - INFO -   test_recipetool_appendfile_basic (recipetool.RecipetoolTests) ... OK (11.345s)
2017-05-26 16:47:15,266 - oe-selftest - INFO -   test_recipetool_appendfile_binary (recipetool.RecipetoolTests) ... OK (3.786s)
2017-05-26 16:47:19,558 - oe-selftest - INFO -   test_recipetool_appendfile_extlayer (recipetool.RecipetoolTests) ... OK (4.291s)
2017-05-26 16:47:30,396 - oe-selftest - INFO -   test_recipetool_appendfile_inst_func (recipetool.RecipetoolTests) ... OK (10.838s)
2017-05-26 16:47:41,230 - oe-selftest - INFO -   test_recipetool_appendfile_inst_glob (recipetool.RecipetoolTests) ... OK (10.833s)
2017-05-26 16:47:52,719 - oe-selftest - INFO -   test_recipetool_appendfile_inst_todir_glob (recipetool.RecipetoolTests) ... OK (11.488s)
2017-05-26 16:48:01,752 - oe-selftest - INFO -   test_recipetool_appendfile_invalid (recipetool.RecipetoolTests) ... OK (9.032s)
2017-05-26 16:48:12,204 - oe-selftest - INFO -   test_recipetool_appendfile_orig (recipetool.RecipetoolTests) ... OK (10.451s)
2017-05-26 16:48:23,676 - oe-selftest - INFO -   test_recipetool_appendfile_patch (recipetool.RecipetoolTests) ... OK (11.471s)
2017-05-26 16:48:37,399 - oe-selftest - INFO -   test_recipetool_appendfile_postinstall (recipetool.RecipetoolTests) ... OK (13.723s)
2017-05-26 16:48:48,894 - oe-selftest - INFO -   test_recipetool_appendfile_renamed (recipetool.RecipetoolTests) ... OK (11.494s)
2017-05-26 16:49:00,386 - oe-selftest - INFO -   test_recipetool_appendfile_script (recipetool.RecipetoolTests) ... OK (11.492s)
2017-05-26 16:49:11,651 - oe-selftest - INFO -   test_recipetool_appendfile_src_glob (recipetool.RecipetoolTests) ... OK (11.264s)
2017-05-26 16:49:22,487 - oe-selftest - INFO -   test_recipetool_appendfile_subdir (recipetool.RecipetoolTests) ... OK (10.836s)
2017-05-26 16:49:33,750 - oe-selftest - INFO -   test_recipetool_appendfile_todir (recipetool.RecipetoolTests) ... OK (11.263s)
2017-05-26 16:49:45,599 - oe-selftest - INFO -   test_recipetool_appendfile_wildcard (recipetool.RecipetoolTests) ... OK (11.848s)
2017-05-26 16:50:15,057 - oe-selftest - INFO -   test_recipetool_create (recipetool.RecipetoolTests) ... OK (29.458s)
2017-05-26 16:50:27,357 - oe-selftest - INFO -   test_recipetool_create_cmake (recipetool.RecipetoolTests) ... OK (12.299s)
2017-05-26 16:50:53,594 - oe-selftest - INFO -   test_recipetool_create_git (recipetool.RecipetoolTests) ... OK (26.237s)
2017-05-26 16:51:07,445 - oe-selftest - INFO -   test_recipetool_create_git_http (recipetool.RecipetoolTests) ... OK (13.849s)
2017-05-26 16:51:43,822 - oe-selftest - INFO -   test_recipetool_create_github (recipetool.RecipetoolTests) ... OK (36.377s)
2017-05-26 16:51:58,240 - oe-selftest - INFO -   test_recipetool_create_github_tarball (recipetool.RecipetoolTests) ... OK (14.417s)
2017-05-26 16:52:13,669 - oe-selftest - INFO -   test_recipetool_create_simple (recipetool.RecipetoolTests) ... OK (15.429s)
2017-05-26 16:52:31,879 - oe-selftest - INFO -   test_recipetool_load_plugin (recipetool.RecipetoolTests) ... OK (18.209s)
rootfs file: 
Qemu log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/qemu_boot_log.20170526220744
SSH log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/ssh_target_log.20170526220744
Created listening socket for qemu serial console on: 127.0.0.1:45377
Created listening socket for qemu serial console on: 127.0.0.1:51781
launchcmd=runqemu nographic /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64 tcpserial=51781 bootparams="console=tty1 console=ttyS0,115200n8 printk.time=1" qemuparams="-serial tcp:127.0.0.1:45377"
runqemu started, pid is 29543
waiting at most 60 seconds for qemu pid
qemu started - qemu procces pid is 29565
Starting logging thread
Starting thread event loop
Connection request received
Setting connection established event
Output from runqemu:
runqemu - INFO - DEPLOY_DIR_IMAGE: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64
runqemu - INFO - Running ls -t /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/*.qemuboot.conf...
runqemu - INFO - CONFFILE: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64-20170526215243.qemuboot.conf
runqemu - INFO - Continuing with the following parameters:

stty: standard input: Inappropriate ioctl for device
runqemu - INFO - Running /bin/ip link...
runqemu - INFO - Acquiring lockfile /tmp/qemu-tap-locks/tap0.lock...
runqemu - INFO - Using preconfigured tap device tap0
runqemu - INFO - If this is not intended, touch /tmp/qemu-tap-locks/tap0.skip to make runqemu skip tap0.
runqemu - INFO - Network configuration: 192.168.7.2::192.168.7.1:255.255.255.0
runqemu - INFO - Running ldd tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64...
runqemu - INFO - Running tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64 -device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:02 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -drive file=tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64-20170526215243.rootfs.ext4,if=virtio,format=raw -vga vmware -show-cursor -usb -usbdevice tablet -device virtio-rng-pci  -nographic -serial tcp:127.0.0.1:45377  -cpu core2duo -m 256 -serial tcp:127.0.0.1:51781 -kernel tmp/deploy/images/qemux86-64/bzImage--4.10.15+git0+4d929fac34_d2c1ed3c0c-r0-qemux86-64-20170526174439.bin -append 'root=/dev/vda rw highres=off  console=ttyS0 mem=256M ip=192.168.7.2::192.168.7.1:255.255.255.0 vga=0 uvesafb.mode_option=640x480-32 oprofile.timer=1 uvesafb.task_timeout=-1 console=tty1 console=ttyS0,115200n8 printk.time=1'
QEMU 2.8.1.1 monitor - type 'help' for more information
(qemu) 
Waiting at most 1000 seconds for login banner
Connection from 127.0.0.1:44344
Reached login banner
Logged as root in serial console
Stopping logging thread
Stop event received
Tearing down logging thread
Sending SIGTERM to runqemu
2017-05-26 17:08:02,719 - oe-selftest - INFO -   test_boot_deploy (runqemu.RunqemuTests) ... OK (929.537s)
rootfs file: 
Qemu log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/qemu_boot_log.20170526220803
SSH log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/ssh_target_log.20170526220803
Created listening socket for qemu serial console on: 127.0.0.1:43716
Created listening socket for qemu serial console on: 127.0.0.1:38091
launchcmd=runqemu nographic /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64 hddimg tcpserial=38091 bootparams="console=tty1 console=ttyS0,115200n8 printk.time=1" qemuparams="-serial tcp:127.0.0.1:43716"
runqemu started, pid is 29585
waiting at most 60 seconds for qemu pid
qemu started - qemu procces pid is 29607
Starting logging thread
Starting thread event loop
Connection request received
Setting connection established event
Output from runqemu:
runqemu - INFO - DEPLOY_DIR_IMAGE: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64
runqemu - INFO - Running ls -t /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/*.qemuboot.conf...
runqemu - INFO - CONFFILE: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64-20170526215243.qemuboot.conf
runqemu - INFO - Continuing with the following parameters:

stty: standard input: Inappropriate ioctl for device
runqemu - INFO - Running /bin/ip link...
runqemu - INFO - Acquiring lockfile /tmp/qemu-tap-locks/tap0.lock...
runqemu - INFO - Using preconfigured tap device tap0
runqemu - INFO - If this is not intended, touch /tmp/qemu-tap-locks/tap0.skip to make runqemu skip tap0.
runqemu - INFO - Network configuration: 192.168.7.2::192.168.7.1:255.255.255.0
runqemu - INFO - Using scsi drive
runqemu - INFO - Running ldd tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64...
runqemu - INFO - Running tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64 -device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:02 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -drive if=none,id=hd,file=tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64-20170526215243.hddimg,format=raw -device virtio-scsi-pci,id=scsi -device scsi-hd,drive=hd -no-reboot -vga vmware -show-cursor -usb -usbdevice tablet -device virtio-rng-pci  -nographic -serial tcp:127.0.0.1:43716  -cpu core2duo -m 256 -serial tcp:127.0.0.1:38091 
QEMU 2.8.1.1 monitor - type 'help' for more information
(qemu) 
Waiting at most 1000 seconds for login banner
Connection from 127.0.0.1:52208
Reached login banner
Logged as root in serial console
Stopping logging thread
Stop event received
Tearing down logging thread
Sending SIGTERM to runqemu
2017-05-26 17:08:26,428 - oe-selftest - INFO -   test_boot_deploy_hddimg (runqemu.RunqemuTests) ... OK (23.709s)
rootfs file: 
Qemu log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/qemu_boot_log.20170526220826
SSH log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/ssh_target_log.20170526220826
Created listening socket for qemu serial console on: 127.0.0.1:53919
Created listening socket for qemu serial console on: 127.0.0.1:52102
launchcmd=runqemu nographic qemux86-64 tcpserial=52102 bootparams="console=tty1 console=ttyS0,115200n8 printk.time=1" qemuparams="-serial tcp:127.0.0.1:53919"
runqemu started, pid is 29627
waiting at most 60 seconds for qemu pid
qemu started - qemu procces pid is 29664
Starting logging thread
Starting thread event loop
Connection request received
Setting connection established event
Output from runqemu:
runqemu - INFO - Assuming MACHINE = qemux86-64
runqemu - INFO - Running MACHINE=qemux86-64 bitbake -e...
runqemu - INFO - MACHINE: qemux86-64
runqemu - INFO - DEPLOY_DIR_IMAGE: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64
runqemu - INFO - Running ls -t /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/*.qemuboot.conf...
runqemu - INFO - CONFFILE: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64-20170526215243.qemuboot.conf
runqemu - INFO - Continuing with the following parameters:

stty: standard input: Inappropriate ioctl for device
runqemu - INFO - Running /bin/ip link...
runqemu - INFO - Acquiring lockfile /tmp/qemu-tap-locks/tap0.lock...
runqemu - INFO - Using preconfigured tap device tap0
runqemu - INFO - If this is not intended, touch /tmp/qemu-tap-locks/tap0.skip to make runqemu skip tap0.
runqemu - INFO - Network configuration: 192.168.7.2::192.168.7.1:255.255.255.0
runqemu - INFO - Running ldd tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64...
runqemu - INFO - Running tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64 -device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:02 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -drive file=tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64-20170526215243.rootfs.ext4,if=virtio,format=raw -vga vmware -show-cursor -usb -usbdevice tablet -device virtio-rng-pci  -nographic -serial tcp:127.0.0.1:53919  -cpu core2duo -m 256 -serial tcp:127.0.0.1:52102 -kernel tmp/deploy/images/qemux86-64/bzImage--4.10.15+git0+4d929fac34_d2c1ed3c0c-r0-qemux86-64-20170526174439.bin -append 'root=/dev/vda rw highres=off  console=ttyS0 mem=256M ip=192.168.7.2::192.168.7.1:255.255.255.0 vga=0 uvesafb.mode_option=640x480-32 oprofile.timer=1 uvesafb.task_timeout=-1 console=tty1 console=ttyS0,115200n8 printk.time=1'
QEMU 2.8.1.1 monitor - type 'help' for more information
(qemu) 
Waiting at most 1000 seconds for login banner
Connection from 127.0.0.1:42790
Reached login banner
Logged as root in serial console
Stopping logging thread
Stop event received
Tearing down logging thread
Sending SIGTERM to runqemu
2017-05-26 17:08:45,306 - oe-selftest - INFO -   test_boot_machine (runqemu.RunqemuTests) ... OK (18.877s)
rootfs file: 
Qemu log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/qemu_boot_log.20170526220845
SSH log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/ssh_target_log.20170526220845
Created listening socket for qemu serial console on: 127.0.0.1:41561
Created listening socket for qemu serial console on: 127.0.0.1:51638
launchcmd=runqemu nographic qemux86-64 ext4 tcpserial=51638 bootparams="console=tty1 console=ttyS0,115200n8 printk.time=1" qemuparams="-serial tcp:127.0.0.1:41561"
runqemu started, pid is 29685
waiting at most 60 seconds for qemu pid
qemu started - qemu procces pid is 29722
Starting logging thread
Starting thread event loop
Connection request received
Setting connection established event
Output from runqemu:
runqemu - INFO - Assuming MACHINE = qemux86-64
runqemu - INFO - Running MACHINE=qemux86-64 bitbake -e...
runqemu - INFO - MACHINE: qemux86-64
runqemu - INFO - DEPLOY_DIR_IMAGE: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64
runqemu - INFO - Running ls -t /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/*.qemuboot.conf...
runqemu - INFO - CONFFILE: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64-20170526215243.qemuboot.conf
runqemu - INFO - Continuing with the following parameters:

stty: standard input: Inappropriate ioctl for device
runqemu - INFO - Running /bin/ip link...
runqemu - INFO - Acquiring lockfile /tmp/qemu-tap-locks/tap0.lock...
runqemu - INFO - Using preconfigured tap device tap0
runqemu - INFO - If this is not intended, touch /tmp/qemu-tap-locks/tap0.skip to make runqemu skip tap0.
runqemu - INFO - Network configuration: 192.168.7.2::192.168.7.1:255.255.255.0
runqemu - INFO - Running ldd tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64...
runqemu - INFO - Running tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64 -device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:02 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -drive file=tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64-20170526215243.rootfs.ext4,if=virtio,format=raw -vga vmware -show-cursor -usb -usbdevice tablet -device virtio-rng-pci  -nographic -serial tcp:127.0.0.1:41561  -cpu core2duo -m 256 -serial tcp:127.0.0.1:51638 -kernel tmp/deploy/images/qemux86-64/bzImage--4.10.15+git0+4d929fac34_d2c1ed3c0c-r0-qemux86-64-20170526174439.bin -append 'root=/dev/vda rw highres=off  console=ttyS0 mem=256M ip=192.168.7.2::192.168.7.1:255.255.255.0 vga=0 uvesafb.mode_option=640x480-32 oprofile.timer=1 uvesafb.task_timeout=-1 console=tty1 console=ttyS0,115200n8 printk.time=1'
QEMU 2.8.1.1 monitor - type 'help' for more information
(qemu) 
Waiting at most 1000 seconds for login banner
Connection from 127.0.0.1:40568
Reached login banner
Logged as root in serial console
Stopping logging thread
Stop event received
Tearing down logging thread
Sending SIGTERM to runqemu
2017-05-26 17:09:03,585 - oe-selftest - INFO -   test_boot_machine_ext4 (runqemu.RunqemuTests) ... OK (18.278s)
rootfs file: 
Qemu log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/qemu_boot_log.20170526220903
SSH log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/ssh_target_log.20170526220903
Created listening socket for qemu serial console on: 127.0.0.1:45543
Created listening socket for qemu serial console on: 127.0.0.1:38058
launchcmd=runqemu nographic qemux86-64 iso tcpserial=38058 bootparams="console=tty1 console=ttyS0,115200n8 printk.time=1" qemuparams="-serial tcp:127.0.0.1:45543"
runqemu started, pid is 29742
waiting at most 60 seconds for qemu pid
qemu started - qemu procces pid is 29779
Starting logging thread
Starting thread event loop
Connection request received
Setting connection established event
Output from runqemu:
runqemu - INFO - Assuming MACHINE = qemux86-64
runqemu - INFO - Running MACHINE=qemux86-64 bitbake -e...
runqemu - INFO - MACHINE: qemux86-64
runqemu - INFO - DEPLOY_DIR_IMAGE: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64
runqemu - INFO - Running ls -t /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/*.qemuboot.conf...
runqemu - INFO - CONFFILE: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64-20170526215243.qemuboot.conf
runqemu - INFO - Continuing with the following parameters:

stty: standard input: Inappropriate ioctl for device
runqemu - INFO - Running /bin/ip link...
runqemu - INFO - Acquiring lockfile /tmp/qemu-tap-locks/tap0.lock...
runqemu - INFO - Using preconfigured tap device tap0
runqemu - INFO - If this is not intended, touch /tmp/qemu-tap-locks/tap0.skip to make runqemu skip tap0.
runqemu - INFO - Network configuration: 192.168.7.2::192.168.7.1:255.255.255.0
runqemu - INFO - Running ldd tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64...
runqemu - INFO - Running tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64 -device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:02 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -cdrom tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64-20170526215243.iso -no-reboot -vga vmware -show-cursor -usb -usbdevice tablet -device virtio-rng-pci  -nographic -serial tcp:127.0.0.1:45543  -cpu core2duo -m 256 -serial tcp:127.0.0.1:38058 
QEMU 2.8.1.1 monitor - type 'help' for more information
(qemu) 
Waiting at most 1000 seconds for login banner
Connection from 127.0.0.1:41596
Reached login banner
Logged as root in serial console
Stopping logging thread
Stop event received
Tearing down logging thread
Sending SIGTERM to runqemu
2017-05-26 17:09:26,581 - oe-selftest - INFO -   test_boot_machine_iso (runqemu.RunqemuTests) ... OK (22.995s)
rootfs file: 
Qemu log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/qemu_boot_log.20170526220926
SSH log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/ssh_target_log.20170526220926
Created listening socket for qemu serial console on: 127.0.0.1:47827
Created listening socket for qemu serial console on: 127.0.0.1:53394
launchcmd=runqemu nographic slirp qemux86-64 tcpserial=53394 bootparams="console=tty1 console=ttyS0,115200n8 printk.time=1" qemuparams="-serial tcp:127.0.0.1:47827"
runqemu started, pid is 29799
waiting at most 60 seconds for qemu pid
qemu started - qemu procces pid is 29834
Starting logging thread
Starting thread event loop
Connection request received
Setting connection established event
Output from runqemu:
runqemu - INFO - Assuming MACHINE = qemux86-64
runqemu - INFO - Running MACHINE=qemux86-64 bitbake -e...
runqemu - INFO - MACHINE: qemux86-64
runqemu - INFO - DEPLOY_DIR_IMAGE: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64
runqemu - INFO - Running ls -t /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/*.qemuboot.conf...
runqemu - INFO - CONFFILE: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64-20170526215243.qemuboot.conf
runqemu - INFO - Continuing with the following parameters:

stty: standard input: Inappropriate ioctl for device
runqemu - INFO - Port forward: hostfwd=tcp::2222-:22 hostfwd=tcp::2323-:23
runqemu - INFO - Running ldd tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64...
runqemu - INFO - Running tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64 -device virtio-net-pci,netdev=net0,mac=52:54:00:12:35:02 -netdev user,id=net0,hostfwd=tcp::2222-:22,hostfwd=tcp::2323-:23,tftp=tmp/deploy/images/qemux86-64 -drive file=tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64-20170526215243.rootfs.ext4,if=virtio,format=raw -vga vmware -show-cursor -usb -usbdevice tablet -device virtio-rng-pci  -nographic -serial tcp:127.0.0.1:47827  -cpu core2duo -m 256 -serial tcp:127.0.0.1:53394 -kernel tmp/deploy/images/qemux86-64/bzImage--4.10.15+git0+4d929fac34_d2c1ed3c0c-r0-qemux86-64-20170526174439.bin -append 'root=/dev/vda rw highres=off  console=ttyS0 mem=256M ip=dhcp vga=0 uvesafb.mode_option=640x480-32 oprofile.timer=1 uvesafb.task_timeout=-1 console=tty1 console=ttyS0,115200n8 printk.time=1'
QEMU 2.8.1.1 monitor - type 'help' for more information
(qemu) 
Waiting at most 1000 seconds for login banner
Connection from 127.0.0.1:52471
Reached login banner
Logged as root in serial console
Stopping logging thread
Stop event received
Tearing down logging thread
Sending SIGTERM to runqemu
2017-05-26 17:09:46,047 - oe-selftest - INFO -   test_boot_machine_slirp (runqemu.RunqemuTests) ... OK (19.466s)
rootfs file: 
Qemu log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/qemu_boot_log.20170526220946
SSH log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/ssh_target_log.20170526220946
Created listening socket for qemu serial console on: 127.0.0.1:40945
Created listening socket for qemu serial console on: 127.0.0.1:40741
launchcmd=runqemu nographic slirp qcow2 qemux86-64 tcpserial=40741 bootparams="console=tty1 console=ttyS0,115200n8 printk.time=1" qemuparams="-serial tcp:127.0.0.1:40945"
runqemu started, pid is 29857
waiting at most 60 seconds for qemu pid
qemu started - qemu procces pid is 29892
Starting logging thread
Starting thread event loop
Connection request received
Setting connection established event
Output from runqemu:
runqemu - INFO - Assuming MACHINE = qemux86-64
runqemu - INFO - Running MACHINE=qemux86-64 bitbake -e...
runqemu - INFO - MACHINE: qemux86-64
runqemu - INFO - DEPLOY_DIR_IMAGE: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64
runqemu - INFO - Running ls -t /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/*.qemuboot.conf...
runqemu - INFO - CONFFILE: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64-20170526215243.qemuboot.conf
runqemu - INFO - Continuing with the following parameters:

stty: standard input: Inappropriate ioctl for device
runqemu - INFO - Port forward: hostfwd=tcp::2222-:22 hostfwd=tcp::2323-:23
runqemu - INFO - Using scsi drive
runqemu - INFO - Running ldd tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64...
runqemu - INFO - Running tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64 -device virtio-net-pci,netdev=net0,mac=52:54:00:12:35:02 -netdev user,id=net0,hostfwd=tcp::2222-:22,hostfwd=tcp::2323-:23,tftp=tmp/deploy/images/qemux86-64 -drive if=none,id=hd,file=tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64-20170526215243.qcow2,format=qcow2 -device virtio-scsi-pci,id=scsi -device scsi-hd,drive=hd -no-reboot -vga vmware -show-cursor -usb -usbdevice tablet -device virtio-rng-pci  -nographic -serial tcp:127.0.0.1:40945  -cpu core2duo -m 256 -serial tcp:127.0.0.1:40741 
QEMU 2.8.1.1 monitor - type 'help' for more information
(qemu) 
Waiting at most 1000 seconds for login banner
Connection from 127.0.0.1:40077
Reached login banner
Logged as root in serial console
Stopping logging thread
Stop event received
Tearing down logging thread
Sending SIGTERM to runqemu
2017-05-26 17:10:07,241 - oe-selftest - INFO -   test_boot_machine_slirp_qcow2 (runqemu.RunqemuTests) ... OK (21.194s)
rootfs file: 
Qemu log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/qemu_boot_log.20170526221007
SSH log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/ssh_target_log.20170526221007
Created listening socket for qemu serial console on: 127.0.0.1:53433
Created listening socket for qemu serial console on: 127.0.0.1:49815
launchcmd=runqemu nographic /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.qemuboot.conf tcpserial=49815 bootparams="console=tty1 console=ttyS0,115200n8 printk.time=1" qemuparams="-serial tcp:127.0.0.1:53433"
runqemu started, pid is 29912
waiting at most 60 seconds for qemu pid
qemu started - qemu procces pid is 29947
Starting logging thread
Starting thread event loop
Connection request received
Setting connection established event
Output from runqemu:
runqemu - INFO - Running bitbake -e...
runqemu - INFO - CONFFILE: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.qemuboot.conf
runqemu - INFO - Continuing with the following parameters:

stty: standard input: Inappropriate ioctl for device
runqemu - INFO - Running /bin/ip link...
runqemu - INFO - Acquiring lockfile /tmp/qemu-tap-locks/tap0.lock...
runqemu - INFO - Using preconfigured tap device tap0
runqemu - INFO - If this is not intended, touch /tmp/qemu-tap-locks/tap0.skip to make runqemu skip tap0.
runqemu - INFO - Network configuration: 192.168.7.2::192.168.7.1:255.255.255.0
runqemu - INFO - Running ldd tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64...
runqemu - INFO - Running tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64 -device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:02 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -drive file=tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64-20170526215243.rootfs.ext4,if=virtio,format=raw -vga vmware -show-cursor -usb -usbdevice tablet -device virtio-rng-pci  -nographic -serial tcp:127.0.0.1:53433  -cpu core2duo -m 256 -serial tcp:127.0.0.1:49815 -kernel tmp/deploy/images/qemux86-64/bzImage--4.10.15+git0+4d929fac34_d2c1ed3c0c-r0-qemux86-64-20170526174439.bin -append 'root=/dev/vda rw highres=off  console=ttyS0 mem=256M ip=192.168.7.2::192.168.7.1:255.255.255.0 vga=0 uvesafb.mode_option=640x480-32 oprofile.timer=1 uvesafb.task_timeout=-1 console=tty1 console=ttyS0,115200n8 printk.time=1'
QEMU 2.8.1.1 monitor - type 'help' for more information
(qemu) 
Waiting at most 1000 seconds for login banner
Connection from 127.0.0.1:33673
Reached login banner
Logged as root in serial console
Stopping logging thread
Stop event received
Tearing down logging thread
Sending SIGTERM to runqemu
2017-05-26 17:10:26,298 - oe-selftest - INFO -   test_boot_qemu_boot (runqemu.RunqemuTests) ... OK (19.056s)
rootfs file: 
Qemu log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/qemu_boot_log.20170526221026
SSH log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/ssh_target_log.20170526221026
Created listening socket for qemu serial console on: 127.0.0.1:57286
Created listening socket for qemu serial console on: 127.0.0.1:55675
launchcmd=runqemu nographic core-image-minimal tcpserial=55675 bootparams="console=tty1 console=ttyS0,115200n8 printk.time=1" qemuparams="-serial tcp:127.0.0.1:57286"
runqemu started, pid is 29967
waiting at most 60 seconds for qemu pid
qemu started - qemu procces pid is 30002
Starting logging thread
Starting thread event loop
Connection request received
Setting connection established event
Output from runqemu:
runqemu - INFO - Running bitbake -e...
runqemu - INFO - CONFFILE: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.qemuboot.conf
runqemu - INFO - Continuing with the following parameters:

stty: standard input: Inappropriate ioctl for device
runqemu - INFO - Running /bin/ip link...
runqemu - INFO - Acquiring lockfile /tmp/qemu-tap-locks/tap0.lock...
runqemu - INFO - Using preconfigured tap device tap0
runqemu - INFO - If this is not intended, touch /tmp/qemu-tap-locks/tap0.skip to make runqemu skip tap0.
runqemu - INFO - Network configuration: 192.168.7.2::192.168.7.1:255.255.255.0
runqemu - INFO - Running ldd tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64...
runqemu - INFO - Running tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64 -device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:02 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -drive file=tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.ext4,if=virtio,format=raw -vga vmware -show-cursor -usb -usbdevice tablet -device virtio-rng-pci  -nographic -serial tcp:127.0.0.1:57286  -cpu core2duo -m 256 -serial tcp:127.0.0.1:55675 -kernel tmp/deploy/images/qemux86-64/bzImage--4.10.15+git0+4d929fac34_d2c1ed3c0c-r0-qemux86-64-20170526174439.bin -append 'root=/dev/vda rw highres=off  console=ttyS0 mem=256M ip=192.168.7.2::192.168.7.1:255.255.255.0 vga=0 uvesafb.mode_option=640x480-32 oprofile.timer=1 uvesafb.task_timeout=-1 console=tty1 console=ttyS0,115200n8 printk.time=1'
QEMU 2.8.1.1 monitor - type 'help' for more information
(qemu) 
Waiting at most 1000 seconds for login banner
Connection from 127.0.0.1:59872
Reached login banner
Logged as root in serial console
Stopping logging thread
Stop event received
Tearing down logging thread
Sending SIGTERM to runqemu
2017-05-26 17:10:44,998 - oe-selftest - INFO -   test_boot_recipe_image (runqemu.RunqemuTests) ... OK (18.699s)
rootfs file: 
Qemu log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/qemu_boot_log.20170526221045
SSH log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/ssh_target_log.20170526221045
Created listening socket for qemu serial console on: 127.0.0.1:59168
Created listening socket for qemu serial console on: 127.0.0.1:41893
launchcmd=runqemu nographic core-image-minimal vdi tcpserial=41893 bootparams="console=tty1 console=ttyS0,115200n8 printk.time=1" qemuparams="-serial tcp:127.0.0.1:59168"
runqemu started, pid is 30023
waiting at most 60 seconds for qemu pid
qemu started - qemu procces pid is 30058
Starting logging thread
Starting thread event loop
Connection request received
Setting connection established event
Output from runqemu:
runqemu - INFO - Running bitbake -e...
runqemu - INFO - CONFFILE: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.qemuboot.conf
runqemu - INFO - Continuing with the following parameters:

stty: standard input: Inappropriate ioctl for device
runqemu - INFO - Running /bin/ip link...
runqemu - INFO - Acquiring lockfile /tmp/qemu-tap-locks/tap0.lock...
runqemu - INFO - Using preconfigured tap device tap0
runqemu - INFO - If this is not intended, touch /tmp/qemu-tap-locks/tap0.skip to make runqemu skip tap0.
runqemu - INFO - Network configuration: 192.168.7.2::192.168.7.1:255.255.255.0
runqemu - INFO - Using scsi drive
runqemu - INFO - Running ldd tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64...
runqemu - INFO - Running tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64 -device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:02 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -drive if=none,id=hd,file=tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.vdi,format=vdi -device virtio-scsi-pci,id=scsi -device scsi-hd,drive=hd -no-reboot -vga vmware -show-cursor -usb -usbdevice tablet -device virtio-rng-pci  -nographic -serial tcp:127.0.0.1:59168  -cpu core2duo -m 256 -serial tcp:127.0.0.1:41893 
QEMU 2.8.1.1 monitor - type 'help' for more information
(qemu) 
Waiting at most 1000 seconds for login banner
Connection from 127.0.0.1:33649
Reached login banner
Logged as root in serial console
Stopping logging thread
Stop event received
Tearing down logging thread
Sending SIGTERM to runqemu
2017-05-26 17:11:05,027 - oe-selftest - INFO -   test_boot_recipe_image_vdi (runqemu.RunqemuTests) ... OK (20.029s)
rootfs file: 
Qemu log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/qemu_boot_log.20170526221105
SSH log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/ssh_target_log.20170526221105
Created listening socket for qemu serial console on: 127.0.0.1:41047
Created listening socket for qemu serial console on: 127.0.0.1:44611
launchcmd=runqemu nographic core-image-minimal vmdk tcpserial=44611 bootparams="console=tty1 console=ttyS0,115200n8 printk.time=1" qemuparams="-serial tcp:127.0.0.1:41047"
runqemu started, pid is 30079
waiting at most 60 seconds for qemu pid
qemu started - qemu procces pid is 30114
Starting logging thread
Starting thread event loop
Connection request received
Setting connection established event
Output from runqemu:
runqemu - INFO - Running bitbake -e...
runqemu - INFO - CONFFILE: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.qemuboot.conf
runqemu - INFO - Continuing with the following parameters:

stty: standard input: Inappropriate ioctl for device
runqemu - INFO - Running /bin/ip link...
runqemu - INFO - Acquiring lockfile /tmp/qemu-tap-locks/tap0.lock...
runqemu - INFO - Using preconfigured tap device tap0
runqemu - INFO - If this is not intended, touch /tmp/qemu-tap-locks/tap0.skip to make runqemu skip tap0.
runqemu - INFO - Network configuration: 192.168.7.2::192.168.7.1:255.255.255.0
runqemu - INFO - Using scsi drive
runqemu - INFO - Running ldd tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64...
runqemu - INFO - Running tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64 -device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:02 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -drive if=none,id=hd,file=tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.vmdk,format=vmdk -device virtio-scsi-pci,id=scsi -device scsi-hd,drive=hd -no-reboot -vga vmware -show-cursor -usb -usbdevice tablet -device virtio-rng-pci  -nographic -serial tcp:127.0.0.1:41047  -cpu core2duo -m 256 -serial tcp:127.0.0.1:44611 
QEMU 2.8.1.1 monitor - type 'help' for more information
(qemu) 
Waiting at most 1000 seconds for login banner
Connection from 127.0.0.1:45001
Reached login banner
Logged as root in serial console
Stopping logging thread
Stop event received
Tearing down logging thread
Sending SIGTERM to runqemu
2017-05-26 17:11:25,553 - oe-selftest - INFO -   test_boot_recipe_image_vmdk (runqemu.RunqemuTests) ... OK (20.525s)
rootfs file: 
Qemu log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/qemu_boot_log.20170526221125
SSH log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/ssh_target_log.20170526221125
Created listening socket for qemu serial console on: 127.0.0.1:45809
Created listening socket for qemu serial console on: 127.0.0.1:32962
launchcmd=runqemu nographic /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.ext4 tcpserial=32962 bootparams="console=tty1 console=ttyS0,115200n8 printk.time=1" qemuparams="-serial tcp:127.0.0.1:45809"
runqemu started, pid is 30134
waiting at most 60 seconds for qemu pid
qemu started - qemu procces pid is 30169
Starting logging thread
Starting thread event loop
Connection request received
Setting connection established event
Output from runqemu:
runqemu - INFO - Running bitbake -e...
runqemu - INFO - CONFFILE: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.qemuboot.conf
runqemu - INFO - Continuing with the following parameters:

stty: standard input: Inappropriate ioctl for device
runqemu - INFO - Running /bin/ip link...
runqemu - INFO - Acquiring lockfile /tmp/qemu-tap-locks/tap0.lock...
runqemu - INFO - Using preconfigured tap device tap0
runqemu - INFO - If this is not intended, touch /tmp/qemu-tap-locks/tap0.skip to make runqemu skip tap0.
runqemu - INFO - Network configuration: 192.168.7.2::192.168.7.1:255.255.255.0
runqemu - INFO - Running ldd tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64...
runqemu - INFO - Running tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64 -device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:02 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -drive file=/home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.ext4,if=virtio,format=raw -vga vmware -show-cursor -usb -usbdevice tablet -device virtio-rng-pci  -nographic -serial tcp:127.0.0.1:45809  -cpu core2duo -m 256 -serial tcp:127.0.0.1:32962 -kernel tmp/deploy/images/qemux86-64/bzImage--4.10.15+git0+4d929fac34_d2c1ed3c0c-r0-qemux86-64-20170526174439.bin -append 'root=/dev/vda rw highres=off  console=ttyS0 mem=256M ip=192.168.7.2::192.168.7.1:255.255.255.0 vga=0 uvesafb.mode_option=640x480-32 oprofile.timer=1 uvesafb.task_timeout=-1 console=tty1 console=ttyS0,115200n8 printk.time=1'
QEMU 2.8.1.1 monitor - type 'help' for more information
(qemu) 
Waiting at most 1000 seconds for login banner
Connection from 127.0.0.1:39834
Reached login banner
Logged as root in serial console
Stopping logging thread
Stop event received
Tearing down logging thread
Sending SIGTERM to runqemu
2017-05-26 17:11:44,005 - oe-selftest - INFO -   test_boot_rootfs (runqemu.RunqemuTests) ... OK (18.452s)
WARNING: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/bitbake/lib/bb/parse/ast.py:304: ResourceWarning: unclosed file <_io.FileIO name=47 mode='wb'>
  statements.append(DataNode(filename, lineno, groupd))

WARNING: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/bitbake/lib/bb/parse/ast.py:304: ResourceWarning: unclosed file <_io.FileIO name=47 mode='wb'>
  statements.append(DataNode(filename, lineno, groupd))

rootfs file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86/core-image-minimal-qemux86.ext4
Qemu log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86-poky-linux/core-image-minimal/1.0-r0/testimage/qemu_boot_log.20170526223416
SSH log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86-poky-linux/core-image-minimal/1.0-r0/testimage/ssh_target_log.20170526223416
Using kvm for runqemu
Created listening socket for qemu serial console on: 127.0.0.1:39709
Created listening socket for qemu serial console on: 127.0.0.1:32861
launchcmd=runqemu snapshot   kvm qemux86 /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86/core-image-minimal-qemux86.ext4 tcpserial=32861 bootparams="console=tty1 console=ttyS0,115200n8 printk.time=1" qemuparams="-serial tcp:127.0.0.1:39709"
runqemu started, pid is 12952
waiting at most 60 seconds for qemu pid
qemu started - qemu procces pid is 12972
qemu cmdline used:
tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-i386-devicevirtio-net-pci,netdev=net0,mac=52:54:00:12:34:02-netdevtap,id=net0,ifname=tap0,script=no,downscript=no-drivefile=/home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86/core-image-minimal-qemux86.ext4,if=virtio,format=raw-vgavmware-show-cursor-usb-usbdevicetablet-devicevirtio-rng-pci-serialtcp:127.0.0.1:39709-cpukvm32-enable-kvm-m256-serialtcp:127.0.0.1:32861-snapshot-kerneltmp/deploy/images/qemux86/bzImage--4.10.15+git0+4d929fac34_d2c1ed3c0c-r0-qemux86-20170526221151.bin-appendroot=/dev/vda rw highres=off  mem=256M ip=192.168.7.2::192.168.7.1:255.255.255.0 vga=0 uvesafb.mode_option=640x480-32 oprofile.timer=1 uvesafb.task_timeout=-1 console=tty1 console=ttyS0,115200n8 printk.time=1
Target IP: 192.168.7.2
Server IP: 192.168.7.1
Starting logging thread
Starting thread event loop
Connection request received
Setting connection established event
Output from runqemu:
runqemu - INFO - CONFFILE: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86/core-image-minimal-qemux86.qemuboot.conf
runqemu - INFO - Continuing with the following parameters:

stty: standard input: Inappropriate ioctl for device
runqemu - INFO - Running /bin/ip link...
runqemu - INFO - Acquiring lockfile /tmp/qemu-tap-locks/tap0.lock...
runqemu - INFO - Using preconfigured tap device tap0
runqemu - INFO - If this is not intended, touch /tmp/qemu-tap-locks/tap0.skip to make runqemu skip tap0.
runqemu - INFO - Network configuration: 192.168.7.2::192.168.7.1:255.255.255.0
runqemu - INFO - Running ldd tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-i386...
runqemu - INFO - Running tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-i386 -device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:02 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -drive file=/home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86/core-image-minimal-qemux86.ext4,if=virtio,format=raw -vga vmware -show-cursor -usb -usbdevice tablet -device virtio-rng-pci  -serial tcp:127.0.0.1:39709  -cpu kvm32 -enable-kvm -m 256 -serial tcp:127.0.0.1:32861 -snapshot -kernel tmp/deploy/images/qemux86/bzImage--4.10.15+git0+4d929fac34_d2c1ed3c0c-r0-qemux86-20170526221151.bin -append 'root=/dev/vda rw highres=off  mem=256M ip=192.168.7.2::192.168.7.1:255.255.255.0 vga=0 uvesafb.mode_option=640x480-32 oprofile.timer=1 uvesafb.task_timeout=-1 console=tty1 console=ttyS0,115200n8 printk.time=1'

Waiting at most 1000 seconds for login banner
Connection from 127.0.0.1:51616
Reached login banner
Logged as root in serial console
Stopping logging thread
Stop event received
Tearing down logging thread
Sending SIGTERM to runqemu
rootfs file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86/core-image-minimal-qemux86.ext4
Qemu log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86-poky-linux/core-image-minimal/1.0-r0/testimage/qemu_boot_log.20170526223612
SSH log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86-poky-linux/core-image-minimal/1.0-r0/testimage/ssh_target_log.20170526223612
Using kvm for runqemu
Created listening socket for qemu serial console on: 127.0.0.1:52143
Created listening socket for qemu serial console on: 127.0.0.1:56554
launchcmd=runqemu snapshot   kvm qemux86 /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86/core-image-minimal-qemux86.ext4 tcpserial=56554 bootparams="console=tty1 console=ttyS0,115200n8 printk.time=1" qemuparams="-serial tcp:127.0.0.1:52143"
runqemu started, pid is 27103
waiting at most 60 seconds for qemu pid
qemu started - qemu procces pid is 27124
qemu cmdline used:
tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-i386-devicevirtio-net-pci,netdev=net0,mac=52:54:00:12:34:02-netdevtap,id=net0,ifname=tap0,script=no,downscript=no-drivefile=/home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86/core-image-minimal-qemux86.ext4,if=virtio,format=raw-vgavmware-show-cursor-usb-usbdevicetablet-devicevirtio-rng-pci-serialtcp:127.0.0.1:52143-cpukvm32-enable-kvm-m256-serialtcp:127.0.0.1:56554-snapshot-kerneltmp/deploy/images/qemux86/bzImage--4.10.15+git0+4d929fac34_d2c1ed3c0c-r0-qemux86-20170526221151.bin-appendroot=/dev/vda rw highres=off  mem=256M ip=192.168.7.2::192.168.7.1:255.255.255.0 vga=0 uvesafb.mode_option=640x480-32 oprofile.timer=1 uvesafb.task_timeout=-1 console=tty1 console=ttyS0,115200n8 printk.time=1
Target IP: 192.168.7.2
Server IP: 192.168.7.1
Starting logging thread
Starting thread event loop
Connection request received
Setting connection established event
Output from runqemu:
runqemu - INFO - CONFFILE: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86/core-image-minimal-qemux86.qemuboot.conf
runqemu - INFO - Continuing with the following parameters:

stty: standard input: Inappropriate ioctl for device
runqemu - INFO - Running /bin/ip link...
runqemu - INFO - Acquiring lockfile /tmp/qemu-tap-locks/tap0.lock...
runqemu - INFO - Using preconfigured tap device tap0
runqemu - INFO - If this is not intended, touch /tmp/qemu-tap-locks/tap0.skip to make runqemu skip tap0.
runqemu - INFO - Network configuration: 192.168.7.2::192.168.7.1:255.255.255.0
runqemu - INFO - Running ldd tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-i386...
runqemu - INFO - Running tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-i386 -device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:02 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -drive file=/home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86/core-image-minimal-qemux86.ext4,if=virtio,format=raw -vga vmware -show-cursor -usb -usbdevice tablet -device virtio-rng-pci  -serial tcp:127.0.0.1:52143  -cpu kvm32 -enable-kvm -m 256 -serial tcp:127.0.0.1:56554 -snapshot -kernel tmp/deploy/images/qemux86/bzImage--4.10.15+git0+4d929fac34_d2c1ed3c0c-r0-qemux86-20170526221151.bin -append 'root=/dev/vda rw highres=off  mem=256M ip=192.168.7.2::192.168.7.1:255.255.255.0 vga=0 uvesafb.mode_option=640x480-32 oprofile.timer=1 uvesafb.task_timeout=-1 console=tty1 console=ttyS0,115200n8 printk.time=1'

Waiting at most 1000 seconds for login banner
Connection from 127.0.0.1:38363
Reached login banner
Logged as root in serial console
Stopping logging thread
Stop event received
Tearing down logging thread
Sending SIGTERM to runqemu
WARNING: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/bitbake/lib/bb/data_smart.py:598: ResourceWarning: unclosed file <_io.TextIOWrapper name=54 mode='w' encoding='UTF-8'>
  self.overridedata[shortvar] = list(self.overridedata[shortvar])

WARNING: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/bitbake/lib/bb/data_smart.py:598: ResourceWarning: unclosed file <_io.TextIOWrapper name=54 mode='w' encoding='UTF-8'>
  self.overridedata[shortvar] = list(self.overridedata[shortvar])

rootfs file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86/core-image-minimal-qemux86.ext4
Qemu log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86-poky-linux/core-image-minimal/1.0-r0/testimage/qemu_boot_log.20170526223721
SSH log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86-poky-linux/core-image-minimal/1.0-r0/testimage/ssh_target_log.20170526223721
Using kvm for runqemu
Created listening socket for qemu serial console on: 127.0.0.1:44633
Created listening socket for qemu serial console on: 127.0.0.1:52807
launchcmd=runqemu snapshot   kvm qemux86 /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86/core-image-minimal-qemux86.ext4 tcpserial=52807 bootparams="console=tty1 console=ttyS0,115200n8 printk.time=1" qemuparams="-serial tcp:127.0.0.1:44633"
runqemu started, pid is 1777
waiting at most 60 seconds for qemu pid
qemu started - qemu procces pid is 1797
qemu cmdline used:
tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-i386-devicevirtio-net-pci,netdev=net0,mac=52:54:00:12:34:02-netdevtap,id=net0,ifname=tap0,script=no,downscript=no-drivefile=/home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86/core-image-minimal-qemux86.ext4,if=virtio,format=raw-vgavmware-show-cursor-usb-usbdevicetablet-devicevirtio-rng-pci-serialtcp:127.0.0.1:44633-cpukvm32-enable-kvm-m256-serialtcp:127.0.0.1:52807-snapshot-kerneltmp/deploy/images/qemux86/bzImage--4.10.15+git0+4d929fac34_d2c1ed3c0c-r0-qemux86-20170526221151.bin-appendroot=/dev/vda rw highres=off  mem=256M ip=192.168.7.2::192.168.7.1:255.255.255.0 vga=0 uvesafb.mode_option=640x480-32 oprofile.timer=1 uvesafb.task_timeout=-1 console=tty1 console=ttyS0,115200n8 printk.time=1
Target IP: 192.168.7.2
Server IP: 192.168.7.1
Starting logging thread
Starting thread event loop
Connection request received
Setting connection established event
Output from runqemu:
runqemu - INFO - CONFFILE: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86/core-image-minimal-qemux86.qemuboot.conf
runqemu - INFO - Continuing with the following parameters:

stty: standard input: Inappropriate ioctl for device
runqemu - INFO - Running /bin/ip link...
runqemu - INFO - Acquiring lockfile /tmp/qemu-tap-locks/tap0.lock...
runqemu - INFO - Using preconfigured tap device tap0
runqemu - INFO - If this is not intended, touch /tmp/qemu-tap-locks/tap0.skip to make runqemu skip tap0.
runqemu - INFO - Network configuration: 192.168.7.2::192.168.7.1:255.255.255.0
runqemu - INFO - Running ldd tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-i386...
runqemu - INFO - Running tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-i386 -device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:02 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -drive file=/home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86/core-image-minimal-qemux86.ext4,if=virtio,format=raw -vga vmware -show-cursor -usb -usbdevice tablet -device virtio-rng-pci  -serial tcp:127.0.0.1:44633  -cpu kvm32 -enable-kvm -m 256 -serial tcp:127.0.0.1:52807 -snapshot -kernel tmp/deploy/images/qemux86/bzImage--4.10.15+git0+4d929fac34_d2c1ed3c0c-r0-qemux86-20170526221151.bin -append 'root=/dev/vda rw highres=off  mem=256M ip=192.168.7.2::192.168.7.1:255.255.255.0 vga=0 uvesafb.mode_option=640x480-32 oprofile.timer=1 uvesafb.task_timeout=-1 console=tty1 console=ttyS0,115200n8 printk.time=1'

Waiting at most 1000 seconds for login banner
Connection from 127.0.0.1:40041
Reached login banner
Logged as root in serial console
Stopping logging thread
Stop event received
Tearing down logging thread
Sending SIGTERM to runqemu
WARNING: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/bitbake/lib/bb/data_smart.py:598: ResourceWarning: unclosed file <_io.TextIOWrapper name=54 mode='w' encoding='UTF-8'>
  self.overridedata[shortvar] = list(self.overridedata[shortvar])

WARNING: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/bitbake/lib/bb/data_smart.py:598: ResourceWarning: unclosed file <_io.TextIOWrapper name=61 mode='w' encoding='UTF-8'>
  self.overridedata[shortvar] = list(self.overridedata[shortvar])

WARNING: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/bitbake/lib/bb/data_smart.py:598: ResourceWarning: unclosed file <_io.TextIOWrapper name=54 mode='w' encoding='UTF-8'>
  self.overridedata[shortvar] = list(self.overridedata[shortvar])

WARNING: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/bitbake/lib/bb/data_smart.py:598: ResourceWarning: unclosed file <_io.TextIOWrapper name=61 mode='w' encoding='UTF-8'>
  self.overridedata[shortvar] = list(self.overridedata[shortvar])

rootfs file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86/core-image-minimal-qemux86.ext4
Qemu log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86-poky-linux/core-image-minimal/1.0-r0/testimage/qemu_boot_log.20170526230136
SSH log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86-poky-linux/core-image-minimal/1.0-r0/testimage/ssh_target_log.20170526230136
Using kvm for runqemu
Created listening socket for qemu serial console on: 127.0.0.1:37198
Created listening socket for qemu serial console on: 127.0.0.1:36904
launchcmd=runqemu snapshot   kvm qemux86 /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86/core-image-minimal-qemux86.ext4 tcpserial=36904 bootparams="console=tty1 console=ttyS0,115200n8 printk.time=1" qemuparams="-serial tcp:127.0.0.1:37198"
runqemu started, pid is 5925
waiting at most 60 seconds for qemu pid
qemu started - qemu procces pid is 5945
qemu cmdline used:
tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-i386-devicevirtio-net-pci,netdev=net0,mac=52:54:00:12:34:02-netdevtap,id=net0,ifname=tap0,script=no,downscript=no-drivefile=/home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86/core-image-minimal-qemux86.ext4,if=virtio,format=raw-vgavmware-show-cursor-usb-usbdevicetablet-devicevirtio-rng-pci-serialtcp:127.0.0.1:37198-cpukvm32-enable-kvm-m256-serialtcp:127.0.0.1:36904-snapshot-kerneltmp/deploy/images/qemux86/bzImage--4.10.15+git0+4d929fac34_d2c1ed3c0c-r0-qemux86-20170526221151.bin-appendroot=/dev/vda rw highres=off  mem=256M ip=192.168.7.2::192.168.7.1:255.255.255.0 vga=0 uvesafb.mode_option=640x480-32 oprofile.timer=1 uvesafb.task_timeout=-1 console=tty1 console=ttyS0,115200n8 printk.time=1
Target IP: 192.168.7.2
Server IP: 192.168.7.1
Starting logging thread
Starting thread event loop
Connection request received
Setting connection established event
Output from runqemu:
runqemu - INFO - CONFFILE: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86/core-image-minimal-qemux86.qemuboot.conf
runqemu - INFO - Continuing with the following parameters:

stty: standard input: Inappropriate ioctl for device
runqemu - INFO - Running /bin/ip link...
runqemu - INFO - Acquiring lockfile /tmp/qemu-tap-locks/tap0.lock...
runqemu - INFO - Using preconfigured tap device tap0
runqemu - INFO - If this is not intended, touch /tmp/qemu-tap-locks/tap0.skip to make runqemu skip tap0.
runqemu - INFO - Network configuration: 192.168.7.2::192.168.7.1:255.255.255.0
runqemu - INFO - Running ldd tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-i386...
runqemu - INFO - Running tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-i386 -device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:02 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -drive file=/home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86/core-image-minimal-qemux86.ext4,if=virtio,format=raw -vga vmware -show-cursor -usb -usbdevice tablet -device virtio-rng-pci  -serial tcp:127.0.0.1:37198  -cpu kvm32 -enable-kvm -m 256 -serial tcp:127.0.0.1:36904 -snapshot -kernel tmp/deploy/images/qemux86/bzImage--4.10.15+git0+4d929fac34_d2c1ed3c0c-r0-qemux86-20170526221151.bin -append 'root=/dev/vda rw highres=off  mem=256M ip=192.168.7.2::192.168.7.1:255.255.255.0 vga=0 uvesafb.mode_option=640x480-32 oprofile.timer=1 uvesafb.task_timeout=-1 console=tty1 console=ttyS0,115200n8 printk.time=1'

Waiting at most 1000 seconds for login banner
Connection from 127.0.0.1:52981
Reached login banner
Logged as root in serial console
Stopping logging thread
Stop event received
Tearing down logging thread
Sending SIGTERM to runqemu
WARNING: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/bitbake/lib/bb/cache.py:449: ResourceWarning: unclosed file <_io.TextIOWrapper name=68 mode='w' encoding='UTF-8'>
  value = pickled.load()

WARNING: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/bitbake/lib/bb/cache.py:449: ResourceWarning: unclosed file <_io.TextIOWrapper name=68 mode='w' encoding='UTF-8'>
  value = pickled.load()

rootfs file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86/core-image-minimal-qemux86.ext4
Qemu log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86-poky-linux/core-image-minimal/1.0-r0/testimage/qemu_boot_log.20170526230249
SSH log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86-poky-linux/core-image-minimal/1.0-r0/testimage/ssh_target_log.20170526230249
Using kvm for runqemu
Created listening socket for qemu serial console on: 127.0.0.1:47578
Created listening socket for qemu serial console on: 127.0.0.1:38453
launchcmd=runqemu snapshot   kvm qemux86 /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86/core-image-minimal-qemux86.ext4 tcpserial=38453 bootparams="console=tty1 console=ttyS0,115200n8 printk.time=1" qemuparams="-serial tcp:127.0.0.1:47578"
runqemu started, pid is 13970
waiting at most 60 seconds for qemu pid
qemu started - qemu procces pid is 13990
qemu cmdline used:
tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-i386-devicevirtio-net-pci,netdev=net0,mac=52:54:00:12:34:02-netdevtap,id=net0,ifname=tap0,script=no,downscript=no-drivefile=/home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86/core-image-minimal-qemux86.ext4,if=virtio,format=raw-vgavmware-show-cursor-usb-usbdevicetablet-devicevirtio-rng-pci-serialtcp:127.0.0.1:47578-cpukvm32-enable-kvm-m256-serialtcp:127.0.0.1:38453-snapshot-kerneltmp/deploy/images/qemux86/bzImage--4.10.15+git0+4d929fac34_d2c1ed3c0c-r0-qemux86-20170526221151.bin-appendroot=/dev/vda rw highres=off  mem=256M ip=192.168.7.2::192.168.7.1:255.255.255.0 vga=0 uvesafb.mode_option=640x480-32 oprofile.timer=1 uvesafb.task_timeout=-1 console=tty1 console=ttyS0,115200n8 printk.time=1
Target IP: 192.168.7.2
Server IP: 192.168.7.1
Starting logging thread
Starting thread event loop
Connection request received
Setting connection established event
Output from runqemu:
runqemu - INFO - CONFFILE: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86/core-image-minimal-qemux86.qemuboot.conf
runqemu - INFO - Continuing with the following parameters:

stty: standard input: Inappropriate ioctl for device
runqemu - INFO - Running /bin/ip link...
runqemu - INFO - Acquiring lockfile /tmp/qemu-tap-locks/tap0.lock...
runqemu - INFO - Using preconfigured tap device tap0
runqemu - INFO - If this is not intended, touch /tmp/qemu-tap-locks/tap0.skip to make runqemu skip tap0.
runqemu - INFO - Network configuration: 192.168.7.2::192.168.7.1:255.255.255.0
runqemu - INFO - Running ldd tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-i386...
runqemu - INFO - Running tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-i386 -device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:02 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -drive file=/home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86/core-image-minimal-qemux86.ext4,if=virtio,format=raw -vga vmware -show-cursor -usb -usbdevice tablet -device virtio-rng-pci  -serial tcp:127.0.0.1:47578  -cpu kvm32 -enable-kvm -m 256 -serial tcp:127.0.0.1:38453 -snapshot -kernel tmp/deploy/images/qemux86/bzImage--4.10.15+git0+4d929fac34_d2c1ed3c0c-r0-qemux86-20170526221151.bin -append 'root=/dev/vda rw highres=off  mem=256M ip=192.168.7.2::192.168.7.1:255.255.255.0 vga=0 uvesafb.mode_option=640x480-32 oprofile.timer=1 uvesafb.task_timeout=-1 console=tty1 console=ttyS0,115200n8 printk.time=1'

Waiting at most 1000 seconds for login banner
Connection from 127.0.0.1:55759
Reached login banner
Logged as root in serial console
Stopping logging thread
Stop event received
Tearing down logging thread
Sending SIGTERM to runqemu
WARNING: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/bitbake/lib/bb/cache.py:449: ResourceWarning: unclosed file <_io.TextIOWrapper name=68 mode='w' encoding='UTF-8'>
  value = pickled.load()

WARNING: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/bitbake/lib/bb/cache.py:449: ResourceWarning: unclosed file <_io.TextIOWrapper name=68 mode='w' encoding='UTF-8'>
  value = pickled.load()

WARNING: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/bitbake/lib/bb/cache.py:449: ResourceWarning: unclosed file <_io.TextIOWrapper name=45 mode='w' encoding='UTF-8'>
  value = pickled.load()

WARNING: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/bitbake/lib/bb/cache.py:449: ResourceWarning: unclosed file <_io.TextIOWrapper name=45 mode='w' encoding='UTF-8'>
  value = pickled.load()

rootfs file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86/core-image-minimal-qemux86.ext4
Qemu log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86-poky-linux/core-image-minimal/1.0-r0/testimage/qemu_boot_log.20170526230359
SSH log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86-poky-linux/core-image-minimal/1.0-r0/testimage/ssh_target_log.20170526230359
Using kvm for runqemu
Created listening socket for qemu serial console on: 127.0.0.1:39808
Created listening socket for qemu serial console on: 127.0.0.1:57229
launchcmd=runqemu snapshot   kvm qemux86 /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86/core-image-minimal-qemux86.ext4 tcpserial=57229 bootparams="console=tty1 console=ttyS0,115200n8 printk.time=1" qemuparams="-serial tcp:127.0.0.1:39808"
runqemu started, pid is 21309
waiting at most 60 seconds for qemu pid
qemu started - qemu procces pid is 21329
qemu cmdline used:
tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-i386-devicevirtio-net-pci,netdev=net0,mac=52:54:00:12:34:02-netdevtap,id=net0,ifname=tap0,script=no,downscript=no-drivefile=/home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86/core-image-minimal-qemux86.ext4,if=virtio,format=raw-vgavmware-show-cursor-usb-usbdevicetablet-devicevirtio-rng-pci-serialtcp:127.0.0.1:39808-cpukvm32-enable-kvm-m256-serialtcp:127.0.0.1:57229-snapshot-kerneltmp/deploy/images/qemux86/bzImage--4.10.15+git0+4d929fac34_d2c1ed3c0c-r0-qemux86-20170526221151.bin-appendroot=/dev/vda rw highres=off  mem=256M ip=192.168.7.2::192.168.7.1:255.255.255.0 vga=0 uvesafb.mode_option=640x480-32 oprofile.timer=1 uvesafb.task_timeout=-1 console=tty1 console=ttyS0,115200n8 printk.time=1
Target IP: 192.168.7.2
Server IP: 192.168.7.1
Starting logging thread
Starting thread event loop
Connection request received
Setting connection established event
Output from runqemu:
runqemu - INFO - CONFFILE: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86/core-image-minimal-qemux86.qemuboot.conf
runqemu - INFO - Continuing with the following parameters:

stty: standard input: Inappropriate ioctl for device
runqemu - INFO - Running /bin/ip link...
runqemu - INFO - Acquiring lockfile /tmp/qemu-tap-locks/tap0.lock...
runqemu - INFO - Using preconfigured tap device tap0
runqemu - INFO - If this is not intended, touch /tmp/qemu-tap-locks/tap0.skip to make runqemu skip tap0.
runqemu - INFO - Network configuration: 192.168.7.2::192.168.7.1:255.255.255.0
runqemu - INFO - Running ldd tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-i386...
runqemu - INFO - Running tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-i386 -device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:02 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -drive file=/home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86/core-image-minimal-qemux86.ext4,if=virtio,format=raw -vga vmware -show-cursor -usb -usbdevice tablet -device virtio-rng-pci  -serial tcp:127.0.0.1:39808  -cpu kvm32 -enable-kvm -m 256 -serial tcp:127.0.0.1:57229 -snapshot -kernel tmp/deploy/images/qemux86/bzImage--4.10.15+git0+4d929fac34_d2c1ed3c0c-r0-qemux86-20170526221151.bin -append 'root=/dev/vda rw highres=off  mem=256M ip=192.168.7.2::192.168.7.1:255.255.255.0 vga=0 uvesafb.mode_option=640x480-32 oprofile.timer=1 uvesafb.task_timeout=-1 console=tty1 console=ttyS0,115200n8 printk.time=1'

Waiting at most 1000 seconds for login banner
Connection from 127.0.0.1:55680
Reached login banner
Logged as root in serial console
Stopping logging thread
Stop event received
Tearing down logging thread
Sending SIGTERM to runqemu
2017-05-26 18:04:16,907 - oe-selftest - INFO -   test_postinst_rootfs_and_boot (runtime_test.Postinst) ... OK (3152.901s)
rootfs file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.ext4
Qemu log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/qemu_boot_log.20170526230530
SSH log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/ssh_target_log.20170526230530
Using kvm for runqemu
Created listening socket for qemu serial console on: 127.0.0.1:56404
Created listening socket for qemu serial console on: 127.0.0.1:51416
launchcmd=runqemu snapshot   kvm qemux86-64 /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.ext4 tcpserial=51416 bootparams="console=tty1 console=ttyS0,115200n8 printk.time=1" qemuparams="-serial tcp:127.0.0.1:56404"
runqemu started, pid is 28060
waiting at most 60 seconds for qemu pid
qemu started - qemu procces pid is 28080
qemu cmdline used:
tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64-devicevirtio-net-pci,netdev=net0,mac=52:54:00:12:34:02-netdevtap,id=net0,ifname=tap0,script=no,downscript=no-drivefile=/home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.ext4,if=virtio,format=raw-vgavmware-show-cursor-usb-usbdevicetablet-devicevirtio-rng-pci-serialtcp:127.0.0.1:56404-cpukvm64-enable-kvm-m256-serialtcp:127.0.0.1:51416-snapshot-kerneltmp/deploy/images/qemux86-64/bzImage--4.10.15+git0+4d929fac34_d2c1ed3c0c-r0-qemux86-64-20170526174439.bin-appendroot=/dev/vda rw highres=off  mem=256M ip=192.168.7.2::192.168.7.1:255.255.255.0 vga=0 uvesafb.mode_option=640x480-32 oprofile.timer=1 uvesafb.task_timeout=-1 console=tty1 console=ttyS0,115200n8 printk.time=1
Target IP: 192.168.7.2
Server IP: 192.168.7.1
Starting logging thread
Starting thread event loop
Connection request received
Setting connection established event
Output from runqemu:
runqemu - INFO - CONFFILE: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.qemuboot.conf
runqemu - INFO - Continuing with the following parameters:

stty: standard input: Inappropriate ioctl for device
runqemu - INFO - Running /bin/ip link...
runqemu - INFO - Acquiring lockfile /tmp/qemu-tap-locks/tap0.lock...
runqemu - INFO - Using preconfigured tap device tap0
runqemu - INFO - If this is not intended, touch /tmp/qemu-tap-locks/tap0.skip to make runqemu skip tap0.
runqemu - INFO - Network configuration: 192.168.7.2::192.168.7.1:255.255.255.0
runqemu - INFO - Running ldd tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64...
runqemu - INFO - Running tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64 -device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:02 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -drive file=/home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.ext4,if=virtio,format=raw -vga vmware -show-cursor -usb -usbdevice tablet -device virtio-rng-pci  -serial tcp:127.0.0.1:56404  -cpu kvm64 -enable-kvm -m 256 -serial tcp:127.0.0.1:51416 -snapshot -kernel tmp/deploy/images/qemux86-64/bzImage--4.10.15+git0+4d929fac34_d2c1ed3c0c-r0-qemux86-64-20170526174439.bin -append 'root=/dev/vda rw highres=off  mem=256M ip=192.168.7.2::192.168.7.1:255.255.255.0 vga=0 uvesafb.mode_option=640x480-32 oprofile.timer=1 uvesafb.task_timeout=-1 console=tty1 console=ttyS0,115200n8 printk.time=1'

Waiting at most 1000 seconds for login banner
Connection from 127.0.0.1:47651
Reached login banner
Logged as root in serial console
Stopping logging thread
Stop event received
Tearing down logging thread
Sending SIGTERM to runqemu
2017-05-26 18:05:43,835 - oe-selftest - INFO -   test_verify_postinst (runtime_test.Postinst) ... OK (86.926s)
WARNING: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/bitbake/lib/bb/data_smart.py:566: ResourceWarning: unclosed file <_io.TextIOWrapper name=68 mode='w' encoding='UTF-8'>
  self._setvar_update_overrides(var, **loginfo)

WARNING: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/bitbake/lib/bb/data_smart.py:566: ResourceWarning: unclosed file <_io.TextIOWrapper name=45 mode='w' encoding='UTF-8'>
  self._setvar_update_overrides(var, **loginfo)

WARNING: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/bitbake/lib/bb/data_smart.py:566: ResourceWarning: unclosed file <_io.TextIOWrapper name=54 mode='w' encoding='UTF-8'>
  self._setvar_update_overrides(var, **loginfo)

WARNING: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/bitbake/lib/bb/data_smart.py:566: ResourceWarning: unclosed file <_io.TextIOWrapper name=68 mode='w' encoding='UTF-8'>
  self._setvar_update_overrides(var, **loginfo)

WARNING: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/bitbake/lib/bb/data_smart.py:566: ResourceWarning: unclosed file <_io.TextIOWrapper name=45 mode='w' encoding='UTF-8'>
  self._setvar_update_overrides(var, **loginfo)

WARNING: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/bitbake/lib/bb/data_smart.py:566: ResourceWarning: unclosed file <_io.TextIOWrapper name=54 mode='w' encoding='UTF-8'>
  self._setvar_update_overrides(var, **loginfo)

rootfs file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.ext4
Qemu log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/qemu_boot_log.20170526230734
SSH log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/ssh_target_log.20170526230734
Using kvm for runqemu
Created listening socket for qemu serial console on: 127.0.0.1:57566
Created listening socket for qemu serial console on: 127.0.0.1:36354
launchcmd=runqemu snapshot   kvm qemux86-64 /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.ext4 tcpserial=36354 bootparams="console=tty1 console=ttyS0,115200n8 printk.time=1" qemuparams="-serial tcp:127.0.0.1:57566"
runqemu started, pid is 12348
waiting at most 60 seconds for qemu pid
qemu started - qemu procces pid is 12368
qemu cmdline used:
tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64-devicevirtio-net-pci,netdev=net0,mac=52:54:00:12:34:02-netdevtap,id=net0,ifname=tap0,script=no,downscript=no-drivefile=/home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.ext4,if=virtio,format=raw-vgavmware-show-cursor-usb-usbdevicetablet-devicevirtio-rng-pci-serialtcp:127.0.0.1:57566-cpukvm64-enable-kvm-m256-serialtcp:127.0.0.1:36354-snapshot-kerneltmp/deploy/images/qemux86-64/bzImage--4.10.15+git0+4d929fac34_d2c1ed3c0c-r0-qemux86-64-20170526174439.bin-appendroot=/dev/vda rw highres=off  mem=256M ip=192.168.7.2::192.168.7.1:255.255.255.0 vga=0 uvesafb.mode_option=640x480-32 oprofile.timer=1 uvesafb.task_timeout=-1 console=tty1 console=ttyS0,115200n8 printk.time=1
Target IP: 192.168.7.2
Server IP: 192.168.7.1
Starting logging thread
Starting thread event loop
Connection request received
Setting connection established event
Output from runqemu:
runqemu - INFO - CONFFILE: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.qemuboot.conf
runqemu - INFO - Continuing with the following parameters:

stty: standard input: Inappropriate ioctl for device
runqemu - INFO - Running /bin/ip link...
runqemu - INFO - Acquiring lockfile /tmp/qemu-tap-locks/tap0.lock...
runqemu - INFO - Using preconfigured tap device tap0
runqemu - INFO - If this is not intended, touch /tmp/qemu-tap-locks/tap0.skip to make runqemu skip tap0.
runqemu - INFO - Network configuration: 192.168.7.2::192.168.7.1:255.255.255.0
runqemu - INFO - Running ldd tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64...
runqemu - INFO - Running tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64 -device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:02 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -drive file=/home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.ext4,if=virtio,format=raw -vga vmware -show-cursor -usb -usbdevice tablet -device virtio-rng-pci  -serial tcp:127.0.0.1:57566  -cpu kvm64 -enable-kvm -m 256 -serial tcp:127.0.0.1:36354 -snapshot -kernel tmp/deploy/images/qemux86-64/bzImage--4.10.15+git0+4d929fac34_d2c1ed3c0c-r0-qemux86-64-20170526174439.bin -append 'root=/dev/vda rw highres=off  mem=256M ip=192.168.7.2::192.168.7.1:255.255.255.0 vga=0 uvesafb.mode_option=640x480-32 oprofile.timer=1 uvesafb.task_timeout=-1 console=tty1 console=ttyS0,115200n8 printk.time=1'

Waiting at most 1000 seconds for login banner
Connection from 127.0.0.1:47752
Reached login banner
Logged as root in serial console
Stopping logging thread
Stop event received
Tearing down logging thread
Sending SIGTERM to runqemu
2017-05-26 18:07:48,521 - oe-selftest - INFO -   test_testexport_basic (runtime_test.TestExport) ... OK (124.685s)
2017-05-26 18:09:37,328 - oe-selftest - INFO -   test_testexport_sdk (runtime_test.TestExport) ... OK (108.806s)
2017-05-26 18:14:30,546 - oe-selftest - INFO -   test_testimage_install (runtime_test.TestImage) ... OK (293.209s)
2017-05-26 18:14:57,046 - oe-selftest - INFO -   test_locked_signatures (signing.LockedSignatures) ... OK (26.499s)
2017-05-26 18:25:06,875 - oe-selftest - INFO -   test_signing_packages (signing.Signing) ... OK (609.402s)
2017-05-26 18:26:32,525 - oe-selftest - INFO -   test_signing_sstate_archive (signing.Signing) ... OK (85.649s)
2017-05-26 18:27:11,102 - oe-selftest - INFO -   test_cleansstate_task_distro_nonspecific (sstatetests.SStateTests) ... OK (38.576s)
2017-05-26 18:27:40,323 - oe-selftest - INFO -   test_cleansstate_task_distro_specific (sstatetests.SStateTests) ... OK (29.221s)
2017-05-26 18:27:59,037 - oe-selftest - INFO -   test_cleansstate_task_distro_specific_nonspecific (sstatetests.SStateTests) ... OK (18.713s)
2017-05-26 18:28:22,423 - oe-selftest - INFO -   test_rebuild_distro_specific_sstate_cross_native_targets (sstatetests.SStateTests) ... OK (23.385s)
2017-05-26 18:28:45,360 - oe-selftest - INFO -   test_rebuild_distro_specific_sstate_cross_target (sstatetests.SStateTests) ... OK (22.937s)
2017-05-26 18:29:07,829 - oe-selftest - INFO -   test_rebuild_distro_specific_sstate_native_target (sstatetests.SStateTests) ... OK (22.469s)
2017-05-26 18:30:04,069 - oe-selftest - INFO -   test_sstate_32_64_same_hash (sstatetests.SStateTests) ... OK (56.239s)
2017-05-26 18:31:24,485 - oe-selftest - INFO -   test_sstate_allarch_samesigs (sstatetests.SStateTests) ... OK (80.416s)
2017-05-26 18:33:21,330 - oe-selftest - INFO -   test_sstate_allarch_samesigs_multilib (sstatetests.SStateTests) ... OK (116.844s)
2017-05-26 18:39:04,415 - oe-selftest - INFO -   test_sstate_cache_management_script_using_machine (sstatetests.SStateTests) ... OK (343.085s)
2017-05-26 18:40:14,154 - oe-selftest - INFO -   test_sstate_cache_management_script_using_pr_1 (sstatetests.SStateTests) ... OK (69.739s)
2017-05-26 18:42:16,630 - oe-selftest - INFO -   test_sstate_cache_management_script_using_pr_2 (sstatetests.SStateTests) ... OK (122.475s)
2017-05-26 18:45:24,021 - oe-selftest - INFO -   test_sstate_cache_management_script_using_pr_3 (sstatetests.SStateTests) ... OK (187.390s)
2017-05-26 18:45:38,310 - oe-selftest - INFO -   test_sstate_creation_distro_nonspecific_fail (sstatetests.SStateTests) ... OK (14.289s)
2017-05-26 18:45:51,845 - oe-selftest - INFO -   test_sstate_creation_distro_nonspecific_pass (sstatetests.SStateTests) ... OK (13.534s)
2017-05-26 18:46:05,260 - oe-selftest - INFO -   test_sstate_creation_distro_specific_fail (sstatetests.SStateTests) ... OK (13.415s)
2017-05-26 18:46:18,699 - oe-selftest - INFO -   test_sstate_creation_distro_specific_pass (sstatetests.SStateTests) ... OK (13.439s)
2017-05-26 18:47:15,210 - oe-selftest - INFO -   test_sstate_nativelsbstring_same_hash (sstatetests.SStateTests) ... OK (56.510s)
2017-05-26 18:48:30,541 - oe-selftest - INFO -   test_sstate_noop_samesigs (sstatetests.SStateTests) ... OK (75.330s)
2017-05-26 18:50:54,264 - oe-selftest - INFO -   test_sstate_sametune_samesigs (sstatetests.SStateTests) ... OK (143.723s)
2017-05-26 18:50:54,617 - oe-selftest - INFO -   test_datastore_operations (tinfoil.TinfoilTests) ... OK (0.352s)
2017-05-26 18:50:55,005 - oe-selftest - INFO -   test_expand (tinfoil.TinfoilTests) ... OK (0.388s)
2017-05-26 18:50:55,379 - oe-selftest - INFO -   test_getvar (tinfoil.TinfoilTests) ... OK (0.374s)
2017-05-26 18:50:55,753 - oe-selftest - INFO -   test_getvar_bb_origenv (tinfoil.TinfoilTests) ... OK (0.373s)
2017-05-26 18:50:57,265 - oe-selftest - INFO -   test_list_recipes (tinfoil.TinfoilTests) ... OK (1.511s)
2017-05-26 18:50:58,904 - oe-selftest - INFO -   test_parse_recipe (tinfoil.TinfoilTests) ... OK (1.639s)
2017-05-26 18:51:00,522 - oe-selftest - INFO -   test_parse_recipe_copy_expand (tinfoil.TinfoilTests) ... OK (1.618s)
2017-05-26 18:51:02,220 - oe-selftest - INFO -   test_parse_recipe_initial_datastore (tinfoil.TinfoilTests) ... OK (1.698s)
2017-05-26 18:51:03,378 - oe-selftest - INFO -   test_setvariable_clean (tinfoil.TinfoilTests) ... OK (1.157s)
2017-05-26 18:51:04,007 - oe-selftest - INFO -   test_wait_event (tinfoil.TinfoilTests) ... OK (0.629s)
2017-05-26 18:56:22,956 - oe-selftest - INFO -   test_bmap_long (wic.Wic) ... OK (318.947s)
2017-05-26 18:56:32,436 - oe-selftest - INFO -   test_bmap_short (wic.Wic) ... OK (9.479s)
2017-05-26 18:56:47,367 - oe-selftest - INFO -   test_bootloader_config (wic.Wic) ... OK (14.931s)
2017-05-26 18:57:03,103 - oe-selftest - INFO -   test_build_artifacts (wic.Wic) ... OK (15.735s)
2017-05-26 18:57:12,347 - oe-selftest - INFO -   test_build_image_name (wic.Wic) ... OK (9.243s)
2017-05-26 18:57:30,735 - oe-selftest - INFO -   test_build_rootfs_long (wic.Wic) ... OK (18.388s)
2017-05-26 18:57:48,004 - oe-selftest - INFO -   test_build_rootfs_short (wic.Wic) ... OK (17.268s)
2017-05-26 18:57:58,771 - oe-selftest - INFO -   test_compress_bzip2 (wic.Wic) ... OK (10.766s)
2017-05-26 18:58:08,734 - oe-selftest - INFO -   test_compress_gzip (wic.Wic) ... OK (9.962s)
2017-05-26 18:58:22,543 - oe-selftest - INFO -   test_compress_xz (wic.Wic) ... OK (13.808s)
2017-05-26 18:58:22,965 - oe-selftest - INFO -   test_createhelp (wic.Wic) ... OK (0.422s)
2017-05-26 18:58:31,999 - oe-selftest - INFO -   test_debug_long (wic.Wic) ... OK (9.033s)
2017-05-26 18:58:41,201 - oe-selftest - INFO -   test_debug_short (wic.Wic) ... OK (9.201s)
2017-05-26 18:58:51,242 - oe-selftest - INFO -   test_default_output_dir (wic.Wic) ... OK (10.041s)
2017-05-26 18:59:09,145 - oe-selftest - INFO -   test_exclude_path (wic.Wic) ... OK (17.902s)
2017-05-26 18:59:18,840 - oe-selftest - INFO -   test_exclude_path_errors (wic.Wic) ... OK (9.694s)
2017-05-26 18:59:28,370 - oe-selftest - INFO -   test_fixed_size (wic.Wic) ... OK (9.530s)
2017-05-26 18:59:32,957 - oe-selftest - INFO -   test_fixed_size_error (wic.Wic) ... OK (4.587s)
2017-05-26 18:59:46,614 - oe-selftest - INFO -   test_fs_types (wic.Wic) ... OK (13.656s)
2017-05-26 18:59:58,307 - oe-selftest - INFO -   test_gpt_image (wic.Wic) ... OK (11.693s)
2017-05-26 18:59:59,005 - oe-selftest - INFO -   test_help (wic.Wic) ... OK (0.697s)
2017-05-26 18:59:59,313 - oe-selftest - INFO -   test_help_create (wic.Wic) ... OK (0.308s)
2017-05-26 18:59:59,621 - oe-selftest - INFO -   test_help_kickstart (wic.Wic) ... OK (0.307s)
2017-05-26 19:00:00,058 - oe-selftest - INFO -   test_help_list (wic.Wic) ... OK (0.437s)
2017-05-26 19:00:00,453 - oe-selftest - INFO -   test_help_overview (wic.Wic) ... OK (0.394s)
2017-05-26 19:00:00,894 - oe-selftest - INFO -   test_help_plugins (wic.Wic) ... OK (0.440s)
2017-05-26 19:00:21,652 - oe-selftest - INFO -   test_image_bootpart_globbed (wic.Wic) ... OK (20.758s)
2017-05-26 19:00:39,034 - oe-selftest - INFO -   test_image_env (wic.Wic) ... OK (17.381s)
2017-05-26 19:00:40,304 - oe-selftest - INFO -   test_image_vars_dir_long (wic.Wic) ... OK (1.270s)
2017-05-26 19:00:41,482 - oe-selftest - INFO -   test_image_vars_dir_short (wic.Wic) ... OK (1.177s)
2017-05-26 19:07:02,600 - oe-selftest - INFO -   test_iso_image (wic.Wic) ... OK (381.118s)
2017-05-26 19:07:13,827 - oe-selftest - INFO -   test_kickstart_parser (wic.Wic) ... OK (11.227s)
2017-05-26 19:07:15,996 - oe-selftest - INFO -   test_list_images (wic.Wic) ... OK (2.168s)
2017-05-26 19:07:18,108 - oe-selftest - INFO -   test_list_source_plugins (wic.Wic) ... OK (2.111s)
2017-05-26 19:07:50,120 - oe-selftest - INFO -   test_listed_images_help (wic.Wic) ... OK (32.012s)
2017-05-26 19:07:50,559 - oe-selftest - INFO -   test_listhelp (wic.Wic) ... OK (0.438s)
2017-05-26 19:08:03,380 - oe-selftest - INFO -   test_mkefidisk (wic.Wic) ... OK (12.821s)
2017-05-26 19:08:03,832 - oe-selftest - INFO -   test_no_command (wic.Wic) ... OK (0.452s)
rootfs file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/wic-image-minimal-qemux86-64.wic
Qemu log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/wic-image-minimal/1.0-r0/testimage/qemu_boot_log.20170527000913
SSH log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/wic-image-minimal/1.0-r0/testimage/ssh_target_log.20170527000913
Using kvm for runqemu
Created listening socket for qemu serial console on: 127.0.0.1:42684
Created listening socket for qemu serial console on: 127.0.0.1:57473
launchcmd=runqemu snapshot   kvm qemux86-64 /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/wic-image-minimal-qemux86-64.wic tcpserial=57473 bootparams="console=tty1 console=ttyS0,115200n8 printk.time=1" qemuparams="-serial tcp:127.0.0.1:42684"
runqemu started, pid is 21666
waiting at most 60 seconds for qemu pid
qemu started - qemu procces pid is 21686
Starting logging thread
Starting thread event loop
Connection request received
Setting connection established event
Output from runqemu:
runqemu - INFO - CONFFILE: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/wic-image-minimal-qemux86-64.qemuboot.conf
runqemu - INFO - Continuing with the following parameters:

stty: standard input: Inappropriate ioctl for device
runqemu - INFO - Running /bin/ip link...
runqemu - INFO - Acquiring lockfile /tmp/qemu-tap-locks/tap0.lock...
runqemu - INFO - Using preconfigured tap device tap0
runqemu - INFO - If this is not intended, touch /tmp/qemu-tap-locks/tap0.skip to make runqemu skip tap0.
runqemu - INFO - Network configuration: 192.168.7.2::192.168.7.1:255.255.255.0
runqemu - INFO - Using scsi drive
runqemu - INFO - Running ldd tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64...
runqemu - INFO - Running tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64 -device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:02 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -drive if=none,id=hd,file=/home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/wic-image-minimal-qemux86-64.wic,format=raw -device virtio-scsi-pci,id=scsi -device scsi-hd,drive=hd -no-reboot -vga vmware -show-cursor -usb -usbdevice tablet -device virtio-rng-pci  -serial tcp:127.0.0.1:42684  -cpu kvm64 -enable-kvm -m 256 -serial tcp:127.0.0.1:57473 -snapshot 

Waiting at most 1000 seconds for login banner
Connection from 127.0.0.1:34825
Reached login banner
Logged as root in serial console
Stopping logging thread
Stop event received
Tearing down logging thread
Sending SIGTERM to runqemu
2017-05-26 19:09:27,517 - oe-selftest - INFO -   test_qemu (wic.Wic) ... OK (83.684s)
WARNING: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/bitbake/lib/bb/data_smart.py:513: ResourceWarning: unclosed file <_io.TextIOWrapper name=41 mode='w' encoding='UTF-8'>
  self.expand_cache = {}

WARNING: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/bitbake/lib/bb/data_smart.py:513: ResourceWarning: unclosed file <_io.TextIOWrapper name=41 mode='w' encoding='UTF-8'>
  self.expand_cache = {}

rootfs file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.wic
Qemu log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/qemu_boot_log.20170527001207
SSH log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/ssh_target_log.20170527001207
Using kvm for runqemu
Created listening socket for qemu serial console on: 127.0.0.1:43972
Created listening socket for qemu serial console on: 127.0.0.1:58733
launchcmd=runqemu snapshot ovmf  kvm qemux86-64 /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.wic tcpserial=58733 bootparams="console=tty1 console=ttyS0,115200n8 printk.time=1" qemuparams="-serial tcp:127.0.0.1:43972"
runqemu started, pid is 16737
waiting at most 60 seconds for qemu pid
qemu started - qemu procces pid is 16757
Starting logging thread
Starting thread event loop
Connection request received
Setting connection established event
Output from runqemu:
runqemu - INFO - CONFFILE: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.qemuboot.conf
runqemu - INFO - Continuing with the following parameters:

stty: standard input: Inappropriate ioctl for device
runqemu - INFO - Running /bin/ip link...
runqemu - INFO - Acquiring lockfile /tmp/qemu-tap-locks/tap0.lock...
runqemu - INFO - Using preconfigured tap device tap0
runqemu - INFO - If this is not intended, touch /tmp/qemu-tap-locks/tap0.skip to make runqemu skip tap0.
runqemu - INFO - Network configuration: 192.168.7.2::192.168.7.1:255.255.255.0
runqemu - INFO - Using scsi drive
runqemu - INFO - Running ldd tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64...
runqemu - INFO - Running tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64 -device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:02 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -drive if=none,id=hd,file=/home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.wic,format=raw -device virtio-scsi-pci,id=scsi -device scsi-hd,drive=hd -no-reboot -vga vmware -show-cursor -usb -usbdevice tablet -device virtio-rng-pci -drive if=pflash,format=qcow2,file=tmp/deploy/images/qemux86-64/ovmf.qcow2 -vga std  -serial tcp:127.0.0.1:43972  -cpu kvm64 -enable-kvm -m 256 -serial tcp:127.0.0.1:58733 -snapshot 

Waiting at most 1000 seconds for login banner
Connection from 127.0.0.1:43742
Reached login banner
Logged as root in serial console
Stopping logging thread
Stop event received
Tearing down logging thread
Sending SIGTERM to runqemu
2017-05-26 19:12:39,657 - oe-selftest - INFO -   test_qemu_efi (wic.Wic) ... OK (192.139s)
2017-05-26 19:12:50,531 - oe-selftest - INFO -   test_qemux86_directdisk (wic.Wic) ... OK (10.874s)
2017-05-26 19:13:04,103 - oe-selftest - INFO -   test_rawcopy_plugin (wic.Wic) ... OK (13.571s)
rootfs file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.wic
Qemu log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/qemu_boot_log.20170527001448
SSH log file: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/testimage/ssh_target_log.20170527001448
Using kvm for runqemu
Created listening socket for qemu serial console on: 127.0.0.1:51228
Created listening socket for qemu serial console on: 127.0.0.1:55547
launchcmd=runqemu snapshot   kvm qemux86-64 /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.wic tcpserial=55547 bootparams="console=tty1 console=ttyS0,115200n8 printk.time=1" qemuparams="-serial tcp:127.0.0.1:51228"
runqemu started, pid is 29832
waiting at most 60 seconds for qemu pid
qemu started - qemu procces pid is 29852
Starting logging thread
Starting thread event loop
Connection request received
Setting connection established event
Output from runqemu:
runqemu - INFO - CONFFILE: /home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.qemuboot.conf
runqemu - INFO - Continuing with the following parameters:

stty: standard input: Inappropriate ioctl for device
runqemu - INFO - Running /bin/ip link...
runqemu - INFO - Acquiring lockfile /tmp/qemu-tap-locks/tap0.lock...
runqemu - INFO - Using preconfigured tap device tap0
runqemu - INFO - If this is not intended, touch /tmp/qemu-tap-locks/tap0.skip to make runqemu skip tap0.
runqemu - INFO - Network configuration: 192.168.7.2::192.168.7.1:255.255.255.0
runqemu - INFO - Using scsi drive
runqemu - INFO - Running ldd tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64...
runqemu - INFO - Running tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-system-x86_64 -device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:02 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -drive if=none,id=hd,file=/home/ab/autobuilder/yocto-worker/nightly-oe-selftest/build/build/tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.wic,format=raw -device virtio-scsi-pci,id=scsi -device scsi-hd,drive=hd -no-reboot -vga vmware -show-cursor -usb -usbdevice tablet -device virtio-rng-pci  -serial tcp:127.0.0.1:51228  -cpu kvm64 -enable-kvm -m 256 -serial tcp:127.0.0.1:55547 -snapshot 

Waiting at most 1000 seconds for login banner
Connection from 127.0.0.1:37063
Reached login banner
Logged as root in serial console
Stopping logging thread
Stop event received
Tearing down logging thread
Sending SIGTERM to runqemu
2017-05-26 19:15:00,712 - oe-selftest - INFO -   test_rawcopy_plugin_qemu (wic.Wic) ... OK (116.609s)
2017-05-26 19:15:17,735 - oe-selftest - INFO -   test_rootfs_artifacts (wic.Wic) ... OK (17.022s)
2017-05-26 19:15:27,748 - oe-selftest - INFO -   test_rootfs_indirect_recipes (wic.Wic) ... OK (10.012s)
2017-05-26 19:15:48,396 - oe-selftest - INFO -   test_sdimage_bootpart (wic.Wic) ... OK (20.648s)
2017-05-26 19:15:57,938 - oe-selftest - INFO -   test_skip_build_check_long (wic.Wic) ... OK (9.542s)
2017-05-26 19:16:07,210 - oe-selftest - INFO -   test_skip_build_check_short (wic.Wic) ... OK (9.271s)
2017-05-26 19:16:08,997 - oe-selftest - INFO -   test_sparse_copy (wic.Wic) ... OK (1.787s)
2017-05-26 19:17:13,666 - oe-selftest - INFO -   test_systemd_bootdisk (wic.Wic) ... OK (64.669s)
2017-05-26 19:17:14,111 - oe-selftest - INFO -   test_unsupported_subcommand (wic.Wic) ... OK (0.444s)
2017-05-26 19:17:14,499 - oe-selftest - INFO -   test_version (wic.Wic) ... OK (0.388s)
2017-05-26 19:17:25,863 - oe-selftest - INFO -   test_wic_image_type (wic.Wic) ... OK (11.363s)
2017-05-26 19:17:26,316 - oe-selftest - INFO -   test_wrong_compressor (wic.Wic) ... OK (0.452s)
2017-05-26 19:24:06,484 - oe-selftest - INFO -   test_efi_systemdboot_images_can_be_built (systemd_boot.Systemdboot) ... OK (400.166s)
2017-05-26 19:24:06,485 - oe-selftest - INFO - 
2017-05-26 19:24:06,485 - oe-selftest - INFO - ----------------------------------------------------------------------
2017-05-26 19:24:06,485 - oe-selftest - INFO - Ran 282 tests in 21370.974s
2017-05-26 19:24:06,485 - oe-selftest - INFO - 
2017-05-26 19:24:06,485 - oe-selftest - INFO - OK
2017-05-26 19:24:06,485 - oe-selftest - INFO - 
2017-05-26 19:24:06,486 - oe-selftest - INFO - Generating XML reports...
2017-05-26 19:24:06,896 - oe-selftest - INFO - SUMMARY:
2017-05-26 19:24:06,896 - oe-selftest - INFO - oe-selftest () - Ran 282 tests in 21371.387s
2017-05-26 19:24:06,896 - oe-selftest - INFO - oe-selftest - OK - All required tests passed
2017-05-26 19:24:06,896 - oe-selftest - INFO - RESULTS:
2017-05-26 19:24:06,897 - oe-selftest - INFO - RESULTS - archiver.Archiver.test_archiver_allows_to_filter_on_recipe_name - Testcase 1345: PASSED
2017-05-26 19:24:06,897 - oe-selftest - INFO - RESULTS - bblayers.BitbakeLayers.test_bitbakelayers_add_remove - Testcase 1195: PASSED
2017-05-26 19:24:06,897 - oe-selftest - INFO - RESULTS - bblayers.BitbakeLayers.test_bitbakelayers_flatten - Testcase 95: PASSED
2017-05-26 19:24:06,897 - oe-selftest - INFO - RESULTS - bblayers.BitbakeLayers.test_bitbakelayers_showappends - Testcase 93: PASSED
2017-05-26 19:24:06,897 - oe-selftest - INFO - RESULTS - bblayers.BitbakeLayers.test_bitbakelayers_showcrossdepends - Testcase 756: PASSED
2017-05-26 19:24:06,897 - oe-selftest - INFO - RESULTS - bblayers.BitbakeLayers.test_bitbakelayers_showlayers - Testcase 83: PASSED
2017-05-26 19:24:06,897 - oe-selftest - INFO - RESULTS - bblayers.BitbakeLayers.test_bitbakelayers_showoverlayed - Testcase 90: PASSED
2017-05-26 19:24:06,897 - oe-selftest - INFO - RESULTS - bblayers.BitbakeLayers.test_bitbakelayers_showrecipes - Testcase 1384: PASSED
2017-05-26 19:24:06,898 - oe-selftest - INFO - RESULTS - bbtests.BitbakeTests.test_bbappend_order - Testcase 1425: PASSED
2017-05-26 19:24:06,898 - oe-selftest - INFO - RESULTS - bbtests.BitbakeTests.test_bitbake_g - Testcase 167: PASSED
2017-05-26 19:24:06,898 - oe-selftest - INFO - RESULTS - bbtests.BitbakeTests.test_bitbake_invalid_recipe - Testcase 105: PASSED
2017-05-26 19:24:06,898 - oe-selftest - INFO - RESULTS - bbtests.BitbakeTests.test_bitbake_invalid_target - Testcase 107: PASSED
2017-05-26 19:24:06,898 - oe-selftest - INFO - RESULTS - bbtests.BitbakeTests.test_checkuri - Testcase 1034: PASSED
2017-05-26 19:24:06,898 - oe-selftest - INFO - RESULTS - bbtests.BitbakeTests.test_continue - Testcase 1035: PASSED
2017-05-26 19:24:06,898 - oe-selftest - INFO - RESULTS - bbtests.BitbakeTests.test_dry_run - Testcase 1029: PASSED
2017-05-26 19:24:06,898 - oe-selftest - INFO - RESULTS - bbtests.BitbakeTests.test_environment - Testcase 1028: PASSED
2017-05-26 19:24:06,899 - oe-selftest - INFO - RESULTS - bbtests.BitbakeTests.test_event_handler - Testcase 806: PASSED
2017-05-26 19:24:06,899 - oe-selftest - INFO - RESULTS - bbtests.BitbakeTests.test_force_task_1 - Testcase 1354: PASSED
2017-05-26 19:24:06,899 - oe-selftest - INFO - RESULTS - bbtests.BitbakeTests.test_force_task_2 - Testcase 163: PASSED
2017-05-26 19:24:06,899 - oe-selftest - INFO - RESULTS - bbtests.BitbakeTests.test_image_manifest - Testcase 899: PASSED
2017-05-26 19:24:06,899 - oe-selftest - INFO - RESULTS - bbtests.BitbakeTests.test_invalid_patch - Testcase 108: PASSED
2017-05-26 19:24:06,899 - oe-selftest - INFO - RESULTS - bbtests.BitbakeTests.test_invalid_recipe_src_uri - Testcase 168: PASSED
2017-05-26 19:24:06,899 - oe-selftest - INFO - RESULTS - bbtests.BitbakeTests.test_just_parse - Testcase 1030: PASSED
2017-05-26 19:24:06,899 - oe-selftest - INFO - RESULTS - bbtests.BitbakeTests.test_local_sstate - Testcase 103: PASSED
2017-05-26 19:24:06,899 - oe-selftest - INFO - RESULTS - bbtests.BitbakeTests.test_non_gplv3 - Testcase 1119: PASSED
2017-05-26 19:24:06,900 - oe-selftest - INFO - RESULTS - bbtests.BitbakeTests.test_postfile - Testcase 1033: PASSED
2017-05-26 19:24:06,900 - oe-selftest - INFO - RESULTS - bbtests.BitbakeTests.test_prefile - Testcase 1032: PASSED
2017-05-26 19:24:06,900 - oe-selftest - INFO - RESULTS - bbtests.BitbakeTests.test_rename_downloaded_file - Testcase 171: PASSED
2017-05-26 19:24:06,900 - oe-selftest - INFO - RESULTS - bbtests.BitbakeTests.test_run_bitbake_from_dir_1 - Testcase 789: PASSED
2017-05-26 19:24:06,900 - oe-selftest - INFO - RESULTS - bbtests.BitbakeTests.test_run_bitbake_from_dir_2 - Testcase 790: PASSED
2017-05-26 19:24:06,900 - oe-selftest - INFO - RESULTS - bbtests.BitbakeTests.test_setscene_only - Testcase 1422: PASSED
2017-05-26 19:24:06,900 - oe-selftest - INFO - RESULTS - bbtests.BitbakeTests.test_version - Testcase 1031: PASSED
2017-05-26 19:24:06,900 - oe-selftest - INFO - RESULTS - bbtests.BitbakeTests.test_warnings_errors - Testcase 106: PASSED
2017-05-26 19:24:06,901 - oe-selftest - INFO - RESULTS - buildoptions.ArchiverTest.test_arch_work_dir_and_export_source - Testcase 926: PASSED
2017-05-26 19:24:06,901 - oe-selftest - INFO - RESULTS - buildoptions.BuildhistoryTests.test_buildhistory_basic - Testcase 293: PASSED
2017-05-26 19:24:06,901 - oe-selftest - INFO - RESULTS - buildoptions.BuildhistoryTests.test_buildhistory_buildtime_pr_backwards - Testcase 294: PASSED
2017-05-26 19:24:06,901 - oe-selftest - INFO - RESULTS - buildoptions.DiskMonTest.test_stoptask_behavior - Testcase 277: PASSED
2017-05-26 19:24:06,901 - oe-selftest - INFO - RESULTS - buildoptions.ImageOptionsTests.test_ccache_tool - Testcase 286: PASSED
2017-05-26 19:24:06,901 - oe-selftest - INFO - RESULTS - buildoptions.ImageOptionsTests.test_incremental_image_generation - Testcase 761: PASSED
2017-05-26 19:24:06,901 - oe-selftest - INFO - RESULTS - buildoptions.ImageOptionsTests.test_read_only_image - Testcase 1435: PASSED
2017-05-26 19:24:06,901 - oe-selftest - INFO - RESULTS - buildoptions.SanityOptionsTest.test_layer_without_git_dir - Testcase 1421: PASSED
2017-05-26 19:24:06,901 - oe-selftest - INFO - RESULTS - buildoptions.SanityOptionsTest.test_options_warnqa_errorqa_switch - Testcase 927: PASSED
2017-05-26 19:24:06,902 - oe-selftest - INFO - RESULTS - buildoptions.SanityOptionsTest.test_sanity_unsafe_script_references - Testcase 278: PASSED
2017-05-26 19:24:06,902 - oe-selftest - INFO - RESULTS - containerimage.ContainerImageTests.test_expected_files - Testcase -1: PASSED
2017-05-26 19:24:06,902 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_create_workspace - Testcase 1158: PASSED
2017-05-26 19:24:06,902 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_add - Testcase 1159: PASSED
2017-05-26 19:24:06,902 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_add_fetch - Testcase 1160: PASSED
2017-05-26 19:24:06,902 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_add_fetch_git - Testcase 1161: PASSED
2017-05-26 19:24:06,902 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_add_fetch_simple - Testcase 1391: PASSED
2017-05-26 19:24:06,902 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_add_git_local - Testcase 1423: PASSED
2017-05-26 19:24:06,903 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_add_library - Testcase 1162: PASSED
2017-05-26 19:24:06,903 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_build_image - Testcase 1366: PASSED
2017-05-26 19:24:06,903 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_buildclean - Testcase -1: PASSED
2017-05-26 19:24:06,903 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_deploy_target - Testcase 1272: PASSED
2017-05-26 19:24:06,903 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_extract - Testcase 1163: PASSED
2017-05-26 19:24:06,903 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_extract_virtual - Testcase 1379: PASSED
2017-05-26 19:24:06,903 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_finish_modify_origlayer - Testcase -1: PASSED
2017-05-26 19:24:06,903 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_finish_modify_otherlayer - Testcase -1: PASSED
2017-05-26 19:24:06,904 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_finish_upgrade_origlayer - Testcase -1: PASSED
2017-05-26 19:24:06,904 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_finish_upgrade_otherlayer - Testcase -1: PASSED
2017-05-26 19:24:06,904 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_layer_plugins - Testcase 1352: PASSED
2017-05-26 19:24:06,904 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_load_plugin - Testcase -1: PASSED
2017-05-26 19:24:06,904 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_modify - Testcase 1164: PASSED
2017-05-26 19:24:06,904 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_modify_git - Testcase 1165: PASSED
2017-05-26 19:24:06,904 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_modify_invalid - Testcase 1166: PASSED
2017-05-26 19:24:06,904 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_modify_localfiles - Testcase 1167: PASSED
2017-05-26 19:24:06,904 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_modify_native - Testcase 1365: PASSED
2017-05-26 19:24:06,905 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_modify_virtual - Testcase 1378: PASSED
2017-05-26 19:24:06,905 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_rename - Testcase -1: PASSED
2017-05-26 19:24:06,905 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_reset_all - Testcase 1168: PASSED
2017-05-26 19:24:06,905 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_update_recipe - Testcase 1169: PASSED
2017-05-26 19:24:06,905 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_update_recipe_append - Testcase 1170: PASSED
2017-05-26 19:24:06,905 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_update_recipe_append_git - Testcase 1171: PASSED
2017-05-26 19:24:06,905 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_update_recipe_git - Testcase 1172: PASSED
2017-05-26 19:24:06,905 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_update_recipe_local_files - Testcase 1370: PASSED
2017-05-26 19:24:06,905 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_update_recipe_local_files_2 - Testcase 1371: PASSED
2017-05-26 19:24:06,905 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_update_recipe_local_files_3 - Testcase -1: PASSED
2017-05-26 19:24:06,906 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_update_recipe_local_files_subdir - Testcase -1: PASSED
2017-05-26 19:24:06,906 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_update_recipe_local_patch_gz - Testcase -1: PASSED
2017-05-26 19:24:06,906 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_upgrade - Testcase 1367: PASSED
2017-05-26 19:24:06,906 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_upgrade_git - Testcase 1433: PASSED
2017-05-26 19:24:06,906 - oe-selftest - INFO - RESULTS - devtool.DevtoolTests.test_devtool_virtual_kernel_modify - Testcase 1577: PASSED
2017-05-26 19:24:06,906 - oe-selftest - INFO - RESULTS - eSDK.oeSDKExtSelfTest.test_image_generation_binary_feeds - Testcase 1603: PASSED
2017-05-26 19:24:06,906 - oe-selftest - INFO - RESULTS - eSDK.oeSDKExtSelfTest.test_install_libraries_headers - Testcase 1602: PASSED
2017-05-26 19:24:06,906 - oe-selftest - INFO - RESULTS - image_typedep.ImageTypeDepTests.test_conversion_typedep_added - Testcase -1: PASSED
2017-05-26 19:24:06,907 - oe-selftest - INFO - RESULTS - imagefeatures.ImageFeatures.test_all_users_can_connect_via_ssh_without_password - Testcase 1115: PASSED
2017-05-26 19:24:06,907 - oe-selftest - INFO - RESULTS - imagefeatures.ImageFeatures.test_bmap - Testcase -1: PASSED
2017-05-26 19:24:06,907 - oe-selftest - INFO - RESULTS - imagefeatures.ImageFeatures.test_clutter_image_can_be_built - Testcase 1116: PASSED
2017-05-26 19:24:06,907 - oe-selftest - INFO - RESULTS - imagefeatures.ImageFeatures.test_non_root_user_can_connect_via_ssh_without_password - Testcase 1107: PASSED
2017-05-26 19:24:06,907 - oe-selftest - INFO - RESULTS - imagefeatures.ImageFeatures.test_wayland_support_in_image - Testcase 1117: PASSED
2017-05-26 19:24:06,907 - oe-selftest - INFO - RESULTS - layerappend.LayerAppendTests.test_layer_appends - Testcase 1196: PASSED
2017-05-26 19:24:06,907 - oe-selftest - INFO - RESULTS - liboe.LibOE.test_copy_hardlink_tree_count - Testcase -1: PASSED
2017-05-26 19:24:06,907 - oe-selftest - INFO - RESULTS - liboe.LibOE.test_copy_tree_special - Testcase -1: PASSED
2017-05-26 19:24:06,907 - oe-selftest - INFO - RESULTS - liboe.LibOE.test_copy_tree_xattr - Testcase -1: PASSED
2017-05-26 19:24:06,908 - oe-selftest - INFO - RESULTS - lic_checksum.LicenseTests.test_nonmatching_checksum - Testcase 1197: PASSED
2017-05-26 19:24:06,908 - oe-selftest - INFO - RESULTS - manifest.VerifyManifest.test_SDK_manifest_entries - Testcase 1380: PASSED
2017-05-26 19:24:06,908 - oe-selftest - INFO - RESULTS - manifest.VerifyManifest.test_image_manifest_entries - Testcase 1381: PASSED
2017-05-26 19:24:06,908 - oe-selftest - INFO - RESULTS - oelib.buildhistory.TestBlobParsing.test_blob_to_dict - Testcase -1: PASSED
2017-05-26 19:24:06,908 - oe-selftest - INFO - RESULTS - oelib.buildhistory.TestBlobParsing.test_compare_dict_blobs - Testcase -1: PASSED
2017-05-26 19:24:06,908 - oe-selftest - INFO - RESULTS - oelib.buildhistory.TestBlobParsing.test_compare_dict_blobs_default - Testcase -1: PASSED
2017-05-26 19:24:06,908 - oe-selftest - INFO - RESULTS - oelib.elf.TestElf.test_machine_name - Testcase -1: PASSED
2017-05-26 19:24:06,908 - oe-selftest - INFO - RESULTS - oelib.license.TestComplexCombinations.test_tests - Testcase -1: PASSED
2017-05-26 19:24:06,908 - oe-selftest - INFO - RESULTS - oelib.license.TestSimpleCombinations.test_tests - Testcase -1: PASSED
2017-05-26 19:24:06,909 - oe-selftest - INFO - RESULTS - oelib.license.TestSingleLicense.test_invalid_licenses - Testcase -1: PASSED
2017-05-26 19:24:06,909 - oe-selftest - INFO - RESULTS - oelib.license.TestSingleLicense.test_single_licenses - Testcase -1: PASSED
2017-05-26 19:24:06,909 - oe-selftest - INFO - RESULTS - oelib.path.TestRealPath.test_loop - Testcase -1: PASSED
2017-05-26 19:24:06,909 - oe-selftest - INFO - RESULTS - oelib.path.TestRealPath.test_norm - Testcase -1: PASSED
2017-05-26 19:24:06,909 - oe-selftest - INFO - RESULTS - oelib.path.TestRealPath.test_phys - Testcase -1: PASSED
2017-05-26 19:24:06,909 - oe-selftest - INFO - RESULTS - oelib.types.TestBooleanType.test_bool_equality - Testcase -1: PASSED
2017-05-26 19:24:06,909 - oe-selftest - INFO - RESULTS - oelib.types.TestBooleanType.test_false - Testcase -1: PASSED
2017-05-26 19:24:06,909 - oe-selftest - INFO - RESULTS - oelib.types.TestBooleanType.test_invalid - Testcase -1: PASSED
2017-05-26 19:24:06,909 - oe-selftest - INFO - RESULTS - oelib.types.TestBooleanType.test_true - Testcase -1: PASSED
2017-05-26 19:24:06,910 - oe-selftest - INFO - RESULTS - oelib.types.TestList.test_list_nosep - Testcase -1: PASSED
2017-05-26 19:24:06,910 - oe-selftest - INFO - RESULTS - oelib.types.TestList.test_list_usersep - Testcase -1: PASSED
2017-05-26 19:24:06,910 - oe-selftest - INFO - RESULTS - oelib.utils.TestPackagesFilterOutSystem.test_filter - Testcase -1: PASSED
2017-05-26 19:24:06,910 - oe-selftest - INFO - RESULTS - oelib.utils.TestTrimVersion.test_num_exception - Testcase -1: PASSED
2017-05-26 19:24:06,910 - oe-selftest - INFO - RESULTS - oelib.utils.TestTrimVersion.test_valid - Testcase -1: PASSED
2017-05-26 19:24:06,910 - oe-selftest - INFO - RESULTS - oelib.utils.TestTrimVersion.test_version_exception - Testcase -1: PASSED
2017-05-26 19:24:06,910 - oe-selftest - INFO - RESULTS - oescripts.BuildhistoryDiffTests.test_buildhistory_diff - Testcase 295: PASSED
2017-05-26 19:24:06,910 - oe-selftest - INFO - RESULTS - package.VersionOrdering.test_dpkg - Testcase -1: PASSED
2017-05-26 19:24:06,911 - oe-selftest - INFO - RESULTS - package.VersionOrdering.test_opkg - Testcase -1: PASSED
2017-05-26 19:24:06,911 - oe-selftest - INFO - RESULTS - package.VersionOrdering.test_rpm - Testcase -1: PASSED
2017-05-26 19:24:06,911 - oe-selftest - INFO - RESULTS - pkgdata.OePkgdataUtilTests.test_find_path - Testcase 1198: PASSED
2017-05-26 19:24:06,911 - oe-selftest - INFO - RESULTS - pkgdata.OePkgdataUtilTests.test_glob - Testcase 1200: PASSED
2017-05-26 19:24:06,911 - oe-selftest - INFO - RESULTS - pkgdata.OePkgdataUtilTests.test_list_pkg_files - Testcase 1201: PASSED
2017-05-26 19:24:06,911 - oe-selftest - INFO - RESULTS - pkgdata.OePkgdataUtilTests.test_list_pkgs - Testcase 1202: PASSED
2017-05-26 19:24:06,911 - oe-selftest - INFO - RESULTS - pkgdata.OePkgdataUtilTests.test_lookup_pkg - Testcase 1203: PASSED
2017-05-26 19:24:06,911 - oe-selftest - INFO - RESULTS - pkgdata.OePkgdataUtilTests.test_lookup_recipe - Testcase 1204: PASSED
2017-05-26 19:24:06,911 - oe-selftest - INFO - RESULTS - pkgdata.OePkgdataUtilTests.test_read_value - Testcase 1205: PASSED
2017-05-26 19:24:06,912 - oe-selftest - INFO - RESULTS - pkgdata.OePkgdataUtilTests.test_specify_pkgdatadir - Testcase 1206: PASSED
2017-05-26 19:24:06,912 - oe-selftest - INFO - RESULTS - prservice.BitbakePrTests.test_import_export_override_db - Testcase 931: PASSED
2017-05-26 19:24:06,912 - oe-selftest - INFO - RESULTS - prservice.BitbakePrTests.test_import_export_replace_db - Testcase 930: PASSED
2017-05-26 19:24:06,912 - oe-selftest - INFO - RESULTS - prservice.BitbakePrTests.test_pr_service_deb_arch_dep - Testcase 934: PASSED
2017-05-26 19:24:06,912 - oe-selftest - INFO - RESULTS - prservice.BitbakePrTests.test_pr_service_deb_arch_indep - Testcase 937: PASSED
2017-05-26 19:24:06,912 - oe-selftest - INFO - RESULTS - prservice.BitbakePrTests.test_pr_service_ipk_arch_dep - Testcase 933: PASSED
2017-05-26 19:24:06,912 - oe-selftest - INFO - RESULTS - prservice.BitbakePrTests.test_pr_service_ipk_arch_indep - Testcase 936: PASSED
2017-05-26 19:24:06,912 - oe-selftest - INFO - RESULTS - prservice.BitbakePrTests.test_pr_service_rpm_arch_dep - Testcase 932: PASSED
2017-05-26 19:24:06,912 - oe-selftest - INFO - RESULTS - prservice.BitbakePrTests.test_pr_service_rpm_arch_indep - Testcase 935: PASSED
2017-05-26 19:24:06,913 - oe-selftest - INFO - RESULTS - prservice.BitbakePrTests.test_stopping_prservice_message - Testcase 1419: PASSED
2017-05-26 19:24:06,913 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolAppendsrcTests.test_recipetool_appendsrcfile_basic - Testcase 1273: PASSED
2017-05-26 19:24:06,913 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolAppendsrcTests.test_recipetool_appendsrcfile_basic_wildcard - Testcase 1274: PASSED
2017-05-26 19:24:06,913 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolAppendsrcTests.test_recipetool_appendsrcfile_existing_in_src_uri - Testcase 1275: PASSED
2017-05-26 19:24:06,913 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolAppendsrcTests.test_recipetool_appendsrcfile_existing_in_src_uri_diff_params - Testcase 1276: PASSED
2017-05-26 19:24:06,913 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolAppendsrcTests.test_recipetool_appendsrcfile_replace_file_srcdir - Testcase 1277: PASSED
2017-05-26 19:24:06,913 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolAppendsrcTests.test_recipetool_appendsrcfile_srcdir_basic - Testcase 1280: PASSED
2017-05-26 19:24:06,913 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolAppendsrcTests.test_recipetool_appendsrcfile_subdir_basic - Testcase 1281: PASSED
2017-05-26 19:24:06,913 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolAppendsrcTests.test_recipetool_appendsrcfile_subdir_basic_dirdest - Testcase 1282: PASSED
2017-05-26 19:24:06,914 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolAppendsrcTests.test_recipetool_appendsrcfiles_basic - Testcase 1278: PASSED
2017-05-26 19:24:06,914 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolAppendsrcTests.test_recipetool_appendsrcfiles_basic_subdir - Testcase 1279: PASSED
2017-05-26 19:24:06,914 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolTests.test_recipetool_appendfile_add - Testcase 1173: PASSED
2017-05-26 19:24:06,914 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolTests.test_recipetool_appendfile_add_bindir - Testcase 1174: PASSED
2017-05-26 19:24:06,914 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolTests.test_recipetool_appendfile_add_machine - Testcase 1175: PASSED
2017-05-26 19:24:06,914 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolTests.test_recipetool_appendfile_alternatives - Testcase 1176: PASSED
2017-05-26 19:24:06,914 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolTests.test_recipetool_appendfile_basic - Testcase 1177: PASSED
2017-05-26 19:24:06,914 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolTests.test_recipetool_appendfile_binary - Testcase 1178: PASSED
2017-05-26 19:24:06,914 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolTests.test_recipetool_appendfile_extlayer - Testcase 1179: PASSED
2017-05-26 19:24:06,915 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolTests.test_recipetool_appendfile_inst_func - Testcase 1180: PASSED
2017-05-26 19:24:06,915 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolTests.test_recipetool_appendfile_inst_glob - Testcase 1181: PASSED
2017-05-26 19:24:06,915 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolTests.test_recipetool_appendfile_inst_todir_glob - Testcase 1182: PASSED
2017-05-26 19:24:06,915 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolTests.test_recipetool_appendfile_invalid - Testcase 1183: PASSED
2017-05-26 19:24:06,915 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolTests.test_recipetool_appendfile_orig - Testcase 1184: PASSED
2017-05-26 19:24:06,915 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolTests.test_recipetool_appendfile_patch - Testcase 1185: PASSED
2017-05-26 19:24:06,915 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolTests.test_recipetool_appendfile_postinstall - Testcase 1186: PASSED
2017-05-26 19:24:06,915 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolTests.test_recipetool_appendfile_renamed - Testcase 1187: PASSED
2017-05-26 19:24:06,915 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolTests.test_recipetool_appendfile_script - Testcase 1188: PASSED
2017-05-26 19:24:06,916 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolTests.test_recipetool_appendfile_src_glob - Testcase 1189: PASSED
2017-05-26 19:24:06,916 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolTests.test_recipetool_appendfile_subdir - Testcase 1190: PASSED
2017-05-26 19:24:06,916 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolTests.test_recipetool_appendfile_todir - Testcase 1191: PASSED
2017-05-26 19:24:06,916 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolTests.test_recipetool_appendfile_wildcard - Testcase 1192: PASSED
2017-05-26 19:24:06,916 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolTests.test_recipetool_create - Testcase 1193: PASSED
2017-05-26 19:24:06,916 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolTests.test_recipetool_create_cmake - Testcase 1418: PASSED
2017-05-26 19:24:06,916 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolTests.test_recipetool_create_git - Testcase 1194: PASSED
2017-05-26 19:24:06,916 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolTests.test_recipetool_create_git_http - Testcase -1: PASSED
2017-05-26 19:24:06,916 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolTests.test_recipetool_create_github - Testcase -1: PASSED
2017-05-26 19:24:06,917 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolTests.test_recipetool_create_github_tarball - Testcase -1: PASSED
2017-05-26 19:24:06,917 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolTests.test_recipetool_create_simple - Testcase 1392: PASSED
2017-05-26 19:24:06,917 - oe-selftest - INFO - RESULTS - recipetool.RecipetoolTests.test_recipetool_load_plugin - Testcase -1: PASSED
2017-05-26 19:24:06,917 - oe-selftest - INFO - RESULTS - runqemu.RunqemuTests.test_boot_deploy - Testcase 2007: PASSED
2017-05-26 19:24:06,917 - oe-selftest - INFO - RESULTS - runqemu.RunqemuTests.test_boot_deploy_hddimg - Testcase 2008: PASSED
2017-05-26 19:24:06,917 - oe-selftest - INFO - RESULTS - runqemu.RunqemuTests.test_boot_machine - Testcase 2001: PASSED
2017-05-26 19:24:06,917 - oe-selftest - INFO - RESULTS - runqemu.RunqemuTests.test_boot_machine_ext4 - Testcase 2002: PASSED
2017-05-26 19:24:06,917 - oe-selftest - INFO - RESULTS - runqemu.RunqemuTests.test_boot_machine_iso - Testcase 2003: PASSED
2017-05-26 19:24:06,917 - oe-selftest - INFO - RESULTS - runqemu.RunqemuTests.test_boot_machine_slirp - Testcase 2009: PASSED
2017-05-26 19:24:06,917 - oe-selftest - INFO - RESULTS - runqemu.RunqemuTests.test_boot_machine_slirp_qcow2 - Testcase 2009: PASSED
2017-05-26 19:24:06,918 - oe-selftest - INFO - RESULTS - runqemu.RunqemuTests.test_boot_qemu_boot - Testcase 2010: PASSED
2017-05-26 19:24:06,918 - oe-selftest - INFO - RESULTS - runqemu.RunqemuTests.test_boot_recipe_image - Testcase 2004: PASSED
2017-05-26 19:24:06,918 - oe-selftest - INFO - RESULTS - runqemu.RunqemuTests.test_boot_recipe_image_vdi - Testcase 2006: PASSED
2017-05-26 19:24:06,918 - oe-selftest - INFO - RESULTS - runqemu.RunqemuTests.test_boot_recipe_image_vmdk - Testcase 2005: PASSED
2017-05-26 19:24:06,918 - oe-selftest - INFO - RESULTS - runqemu.RunqemuTests.test_boot_rootfs - Testcase 2011: PASSED
2017-05-26 19:24:06,918 - oe-selftest - INFO - RESULTS - runtime_test.Postinst.test_postinst_rootfs_and_boot - Testcase 1545: PASSED
2017-05-26 19:24:06,918 - oe-selftest - INFO - RESULTS - runtime_test.Postinst.test_verify_postinst - Testcase 1540: PASSED
2017-05-26 19:24:06,918 - oe-selftest - INFO - RESULTS - runtime_test.TestExport.test_testexport_basic - Testcase -1: PASSED
2017-05-26 19:24:06,918 - oe-selftest - INFO - RESULTS - runtime_test.TestExport.test_testexport_sdk - Testcase -1: PASSED
2017-05-26 19:24:06,918 - oe-selftest - INFO - RESULTS - runtime_test.TestImage.test_testimage_install - Testcase -1: PASSED
2017-05-26 19:24:06,919 - oe-selftest - INFO - RESULTS - signing.LockedSignatures.test_locked_signatures - Testcase 1420: PASSED
2017-05-26 19:24:06,919 - oe-selftest - INFO - RESULTS - signing.Signing.test_signing_packages - Testcase 1362: PASSED
2017-05-26 19:24:06,919 - oe-selftest - INFO - RESULTS - signing.Signing.test_signing_sstate_archive - Testcase 1382: PASSED
2017-05-26 19:24:06,919 - oe-selftest - INFO - RESULTS - sstatetests.SStateTests.test_cleansstate_task_distro_nonspecific - Testcase 1376: PASSED
2017-05-26 19:24:06,919 - oe-selftest - INFO - RESULTS - sstatetests.SStateTests.test_cleansstate_task_distro_specific - Testcase 1377: PASSED
2017-05-26 19:24:06,919 - oe-selftest - INFO - RESULTS - sstatetests.SStateTests.test_cleansstate_task_distro_specific_nonspecific - Testcase 977: PASSED
2017-05-26 19:24:06,919 - oe-selftest - INFO - RESULTS - sstatetests.SStateTests.test_rebuild_distro_specific_sstate_cross_native_targets - Testcase 175: PASSED
2017-05-26 19:24:06,919 - oe-selftest - INFO - RESULTS - sstatetests.SStateTests.test_rebuild_distro_specific_sstate_cross_target - Testcase 1372: PASSED
2017-05-26 19:24:06,919 - oe-selftest - INFO - RESULTS - sstatetests.SStateTests.test_rebuild_distro_specific_sstate_native_target - Testcase 1373: PASSED
2017-05-26 19:24:06,920 - oe-selftest - INFO - RESULTS - sstatetests.SStateTests.test_sstate_32_64_same_hash - Testcase 1270: PASSED
2017-05-26 19:24:06,920 - oe-selftest - INFO - RESULTS - sstatetests.SStateTests.test_sstate_allarch_samesigs - Testcase 1368: PASSED
2017-05-26 19:24:06,920 - oe-selftest - INFO - RESULTS - sstatetests.SStateTests.test_sstate_allarch_samesigs_multilib - Testcase -1: PASSED
2017-05-26 19:24:06,920 - oe-selftest - INFO - RESULTS - sstatetests.SStateTests.test_sstate_cache_management_script_using_machine - Testcase 974: PASSED
2017-05-26 19:24:06,920 - oe-selftest - INFO - RESULTS - sstatetests.SStateTests.test_sstate_cache_management_script_using_pr_1 - Testcase 973: PASSED
2017-05-26 19:24:06,920 - oe-selftest - INFO - RESULTS - sstatetests.SStateTests.test_sstate_cache_management_script_using_pr_2 - Testcase 978: PASSED
2017-05-26 19:24:06,920 - oe-selftest - INFO - RESULTS - sstatetests.SStateTests.test_sstate_cache_management_script_using_pr_3 - Testcase 979: PASSED
2017-05-26 19:24:06,920 - oe-selftest - INFO - RESULTS - sstatetests.SStateTests.test_sstate_creation_distro_nonspecific_fail - Testcase 1375: PASSED
2017-05-26 19:24:06,920 - oe-selftest - INFO - RESULTS - sstatetests.SStateTests.test_sstate_creation_distro_nonspecific_pass - Testcase 976: PASSED
2017-05-26 19:24:06,921 - oe-selftest - INFO - RESULTS - sstatetests.SStateTests.test_sstate_creation_distro_specific_fail - Testcase 1374: PASSED
2017-05-26 19:24:06,921 - oe-selftest - INFO - RESULTS - sstatetests.SStateTests.test_sstate_creation_distro_specific_pass - Testcase 975: PASSED
2017-05-26 19:24:06,921 - oe-selftest - INFO - RESULTS - sstatetests.SStateTests.test_sstate_nativelsbstring_same_hash - Testcase 1271: PASSED
2017-05-26 19:24:06,921 - oe-selftest - INFO - RESULTS - sstatetests.SStateTests.test_sstate_noop_samesigs - Testcase -1: PASSED
2017-05-26 19:24:06,921 - oe-selftest - INFO - RESULTS - sstatetests.SStateTests.test_sstate_sametune_samesigs - Testcase 1369: PASSED
2017-05-26 19:24:06,921 - oe-selftest - INFO - RESULTS - tinfoil.TinfoilTests.test_datastore_operations - Testcase -1: PASSED
2017-05-26 19:24:06,921 - oe-selftest - INFO - RESULTS - tinfoil.TinfoilTests.test_expand - Testcase 1569: PASSED
2017-05-26 19:24:06,921 - oe-selftest - INFO - RESULTS - tinfoil.TinfoilTests.test_getvar - Testcase 1568: PASSED
2017-05-26 19:24:06,921 - oe-selftest - INFO - RESULTS - tinfoil.TinfoilTests.test_getvar_bb_origenv - Testcase 1570: PASSED
2017-05-26 19:24:06,921 - oe-selftest - INFO - RESULTS - tinfoil.TinfoilTests.test_list_recipes - Testcase 1574: PASSED
2017-05-26 19:24:06,922 - oe-selftest - INFO - RESULTS - tinfoil.TinfoilTests.test_parse_recipe - Testcase 1571: PASSED
2017-05-26 19:24:06,922 - oe-selftest - INFO - RESULTS - tinfoil.TinfoilTests.test_parse_recipe_copy_expand - Testcase 1572: PASSED
2017-05-26 19:24:06,922 - oe-selftest - INFO - RESULTS - tinfoil.TinfoilTests.test_parse_recipe_initial_datastore - Testcase 1573: PASSED
2017-05-26 19:24:06,922 - oe-selftest - INFO - RESULTS - tinfoil.TinfoilTests.test_setvariable_clean - Testcase 1576: PASSED
2017-05-26 19:24:06,922 - oe-selftest - INFO - RESULTS - tinfoil.TinfoilTests.test_wait_event - Testcase 1575: PASSED
2017-05-26 19:24:06,922 - oe-selftest - INFO - RESULTS - wic.Wic.test_bmap_long - Testcase -1: PASSED
2017-05-26 19:24:06,922 - oe-selftest - INFO - RESULTS - wic.Wic.test_bmap_short - Testcase 1496: PASSED
2017-05-26 19:24:06,922 - oe-selftest - INFO - RESULTS - wic.Wic.test_bootloader_config - Testcase 1385: PASSED
2017-05-26 19:24:06,922 - oe-selftest - INFO - RESULTS - wic.Wic.test_build_artifacts - Testcase 1212: PASSED
2017-05-26 19:24:06,923 - oe-selftest - INFO - RESULTS - wic.Wic.test_build_image_name - Testcase 1211: PASSED
2017-05-26 19:24:06,923 - oe-selftest - INFO - RESULTS - wic.Wic.test_build_rootfs_long - Testcase -1: PASSED
2017-05-26 19:24:06,923 - oe-selftest - INFO - RESULTS - wic.Wic.test_build_rootfs_short - Testcase 1564: PASSED
2017-05-26 19:24:06,923 - oe-selftest - INFO - RESULTS - wic.Wic.test_compress_bzip2 - Testcase 1265: PASSED
2017-05-26 19:24:06,923 - oe-selftest - INFO - RESULTS - wic.Wic.test_compress_gzip - Testcase 1264: PASSED
2017-05-26 19:24:06,923 - oe-selftest - INFO - RESULTS - wic.Wic.test_compress_xz - Testcase 1266: PASSED
2017-05-26 19:24:06,923 - oe-selftest - INFO - RESULTS - wic.Wic.test_createhelp - Testcase 1209: PASSED
2017-05-26 19:24:06,923 - oe-selftest - INFO - RESULTS - wic.Wic.test_debug_long - Testcase -1: PASSED
2017-05-26 19:24:06,923 - oe-selftest - INFO - RESULTS - wic.Wic.test_debug_short - Testcase 1558: PASSED
2017-05-26 19:24:06,923 - oe-selftest - INFO - RESULTS - wic.Wic.test_default_output_dir - Testcase 1562: PASSED
2017-05-26 19:24:06,924 - oe-selftest - INFO - RESULTS - wic.Wic.test_exclude_path - Testcase -1: PASSED
2017-05-26 19:24:06,924 - oe-selftest - INFO - RESULTS - wic.Wic.test_exclude_path_errors - Testcase -1: PASSED
2017-05-26 19:24:06,924 - oe-selftest - INFO - RESULTS - wic.Wic.test_fixed_size - Testcase -1: PASSED
2017-05-26 19:24:06,924 - oe-selftest - INFO - RESULTS - wic.Wic.test_fixed_size_error - Testcase -1: PASSED
2017-05-26 19:24:06,924 - oe-selftest - INFO - RESULTS - wic.Wic.test_fs_types - Testcase -1: PASSED
2017-05-26 19:24:06,924 - oe-selftest - INFO - RESULTS - wic.Wic.test_gpt_image - Testcase 1157: PASSED
2017-05-26 19:24:06,924 - oe-selftest - INFO - RESULTS - wic.Wic.test_help - Testcase 1208: PASSED
2017-05-26 19:24:06,924 - oe-selftest - INFO - RESULTS - wic.Wic.test_help_create - Testcase 1553: PASSED
2017-05-26 19:24:06,924 - oe-selftest - INFO - RESULTS - wic.Wic.test_help_kickstart - Testcase 1217: PASSED
2017-05-26 19:24:06,924 - oe-selftest - INFO - RESULTS - wic.Wic.test_help_list - Testcase 1554: PASSED
2017-05-26 19:24:06,925 - oe-selftest - INFO - RESULTS - wic.Wic.test_help_overview - Testcase 1215: PASSED
2017-05-26 19:24:06,925 - oe-selftest - INFO - RESULTS - wic.Wic.test_help_plugins - Testcase 1216: PASSED
2017-05-26 19:24:06,925 - oe-selftest - INFO - RESULTS - wic.Wic.test_image_bootpart_globbed - Testcase -1: PASSED
2017-05-26 19:24:06,925 - oe-selftest - INFO - RESULTS - wic.Wic.test_image_env - Testcase 1347: PASSED
2017-05-26 19:24:06,925 - oe-selftest - INFO - RESULTS - wic.Wic.test_image_vars_dir_long - Testcase -1: PASSED
2017-05-26 19:24:06,925 - oe-selftest - INFO - RESULTS - wic.Wic.test_image_vars_dir_short - Testcase 1559: PASSED
2017-05-26 19:24:06,925 - oe-selftest - INFO - RESULTS - wic.Wic.test_iso_image - Testcase 1346: PASSED
2017-05-26 19:24:06,925 - oe-selftest - INFO - RESULTS - wic.Wic.test_kickstart_parser - Testcase -1: PASSED
2017-05-26 19:24:06,925 - oe-selftest - INFO - RESULTS - wic.Wic.test_list_images - Testcase 1555: PASSED
2017-05-26 19:24:06,926 - oe-selftest - INFO - RESULTS - wic.Wic.test_list_source_plugins - Testcase 1556: PASSED
2017-05-26 19:24:06,926 - oe-selftest - INFO - RESULTS - wic.Wic.test_listed_images_help - Testcase 1557: PASSED
2017-05-26 19:24:06,926 - oe-selftest - INFO - RESULTS - wic.Wic.test_listhelp - Testcase 1210: PASSED
2017-05-26 19:24:06,926 - oe-selftest - INFO - RESULTS - wic.Wic.test_mkefidisk - Testcase 1350: PASSED
2017-05-26 19:24:06,926 - oe-selftest - INFO - RESULTS - wic.Wic.test_no_command - Testcase 1214: PASSED
2017-05-26 19:24:06,926 - oe-selftest - INFO - RESULTS - wic.Wic.test_qemu - Testcase 1422: PASSED
2017-05-26 19:24:06,926 - oe-selftest - INFO - RESULTS - wic.Wic.test_qemu_efi - Testcase -1: PASSED
2017-05-26 19:24:06,926 - oe-selftest - INFO - RESULTS - wic.Wic.test_qemux86_directdisk - Testcase 1348: PASSED
2017-05-26 19:24:06,926 - oe-selftest - INFO - RESULTS - wic.Wic.test_rawcopy_plugin - Testcase -1: PASSED
2017-05-26 19:24:06,926 - oe-selftest - INFO - RESULTS - wic.Wic.test_rawcopy_plugin_qemu - Testcase -1: PASSED
2017-05-26 19:24:06,927 - oe-selftest - INFO - RESULTS - wic.Wic.test_rootfs_artifacts - Testcase 1269: PASSED
2017-05-26 19:24:06,927 - oe-selftest - INFO - RESULTS - wic.Wic.test_rootfs_indirect_recipes - Testcase 1268: PASSED
2017-05-26 19:24:06,927 - oe-selftest - INFO - RESULTS - wic.Wic.test_sdimage_bootpart - Testcase 1561: PASSED
2017-05-26 19:24:06,927 - oe-selftest - INFO - RESULTS - wic.Wic.test_skip_build_check_long - Testcase -1: PASSED
2017-05-26 19:24:06,927 - oe-selftest - INFO - RESULTS - wic.Wic.test_skip_build_check_short - Testcase 1563: PASSED
2017-05-26 19:24:06,927 - oe-selftest - INFO - RESULTS - wic.Wic.test_sparse_copy - Testcase -1: PASSED
2017-05-26 19:24:06,927 - oe-selftest - INFO - RESULTS - wic.Wic.test_systemd_bootdisk - Testcase 1560: PASSED
2017-05-26 19:24:06,927 - oe-selftest - INFO - RESULTS - wic.Wic.test_unsupported_subcommand - Testcase 1213: PASSED
2017-05-26 19:24:06,927 - oe-selftest - INFO - RESULTS - wic.Wic.test_version - Testcase 1552: PASSED
2017-05-26 19:24:06,927 - oe-selftest - INFO - RESULTS - wic.Wic.test_wic_image_type - Testcase 1351: PASSED
2017-05-26 19:24:06,928 - oe-selftest - INFO - RESULTS - wic.Wic.test_wrong_compressor - Testcase 1267: PASSED
2017-05-26 19:24:06,928 - oe-selftest - INFO - RESULTS - systemd_boot.Systemdboot.test_efi_systemdboot_images_can_be_built - Testcase 1445: PASSED

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 43+ messages in thread

end of thread, other threads:[~2017-05-29 15:52 UTC | newest]

Thread overview: 43+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-05-26 20:37 [PATCH 00/36] OEQA threading support and selftest migration Aníbal Limón
2017-05-26 20:37 ` [PATCH 01/36] testsdk.bbclass: Remove unused import of OEStreamLogger Aníbal Limón
2017-05-26 20:37 ` [PATCH 02/36] oeqa/sdk/context.py: Import argparse_oe at OESDKTestContext.run method Aníbal Limón
2017-05-26 20:37 ` [PATCH 03/36] oeqa/sdk/context.py: Add return to OESDKTestContext.run() method Aníbal Limón
2017-05-26 20:37 ` [PATCH 04/36] oeqa/core: Don't expose OEStreamLogger in OETestContext Aníbal Limón
2017-05-26 20:37 ` [PATCH 05/36] oeqa/core/runner: OETestResult remove unneeded override of startTest Aníbal Limón
2017-05-26 20:37 ` [PATCH 06/36] oeqa/core: Move OETestContext.log{Summary, Details} into OETestResult Aníbal Limón
2017-05-26 20:37 ` [PATCH 07/36] oeqa/core/threaded: Add new module with OETestLoaderThreaded Aníbal Limón
2017-05-26 20:37 ` [PATCH 08/36] oeqa/core/threaded: Add OEStreamLoggerThreaded class Aníbal Limón
2017-05-26 20:37 ` [PATCH 09/36] oeqa/core/runner: OETestResult add internal _tc_map_results Aníbal Limón
2017-05-26 20:37 ` [PATCH 10/36] oeqa/core/threaded: Add OETestResultThreaded{, Internal} classes Aníbal Limón
2017-05-26 20:37 ` [PATCH 11/36] oeqa/core/threaded: Add support of OETestRunnerThreaded Aníbal Limón
2017-05-26 20:37 ` [PATCH 12/36] oeqa/core/threaded: Add OETestContextThreaded class Aníbal Limón
2017-05-26 20:37 ` [PATCH 13/36] oeqa/core/decorator/depends: Add support for threading mode Aníbal Limón
2017-05-26 20:37 ` [PATCH 14/36] oeqa/core/decorator/oetimeout: Add support for OEQA threaded mode Aníbal Limón
2017-05-26 20:37 ` [PATCH 15/36] oeqa/core/tests: Add tests of OEQA Threaded mode Aníbal Limón
2017-05-26 20:37 ` [PATCH 16/36] oeqa/sdkext/cases: Move sdk_update test into devtool module Aníbal Limón
2017-05-26 20:37 ` [PATCH 17/36] oeqa/sdk: Enable usage of OEQA thread mode Aníbal Limón
2017-05-26 20:37 ` [PATCH 18/36] oeqa/core: Add list tests support in context and runner Aníbal Limón
2017-05-26 20:37 ` [PATCH 19/36] oeqa/core: Add support for run tests by module, class and name Aníbal Limón
2017-05-26 20:37 ` [PATCH 20/36] classes/test{export, images}: Change modules to list Aníbal Limón
2017-05-26 20:37 ` [PATCH 21/36] oeqa/runtime/case: Don't use OEQA framework internal methods Aníbal Limón
2017-05-26 20:37 ` [PATCH 22/36] oeqa/core/README: Improve documentation Aníbal Limón
2017-05-26 20:37 ` [PATCH 23/36] oeqa/core/case: fix typo on comment about exception name Aníbal Limón
2017-05-26 20:37 ` [PATCH 24/36] oeqa/core/context: Raise exception when a manifest is specified but missing Aníbal Limón
2017-05-26 20:37 ` [PATCH 25/36] oeqa/core/context: Use a default iterable modules object Aníbal Limón
2017-05-26 20:37 ` [PATCH 26/36] oeqa/core/context: Omit docstring output on XMLResult Aníbal Limón
2017-05-26 20:37 ` [PATCH 27/36] oeqa/core/context: Include a _pre_run method Aníbal Limón
2017-05-26 20:37 ` [PATCH 28/36] scripts/oe-test: Move load_test_components to oeqa.utils Aníbal Limón
2017-05-26 20:37 ` [PATCH 29/36] oeqa/selftest: Move base class to case module Aníbal Limón
2017-05-26 20:37 ` [PATCH 30/36] oeqa/selftest/case: Migrate case class to the new OEQA framework Aníbal Limón
2017-05-26 20:37 ` [PATCH 31/36] scripts/oe-selftest: Move {add, remove}_include files to case Aníbal Limón
2017-05-26 20:37 ` [PATCH 32/36] oeqa/selftest/case.py: Remove machine selection logic Aníbal Limón
2017-05-26 20:37 ` [PATCH 33/36] oeqa/selftest/case: Don't figure out the testlayer inside Aníbal Limón
2017-05-26 20:38 ` [PATCH 34/36] scripts/oe-selftest: Migrate to new framework into oeqa.selftest.context Aníbal Limón
2017-05-26 20:38 ` [PATCH 35/36] oeqa/selftest/cases: Migrate test cases into the new oe-qa framework Aníbal Limón
2017-05-26 20:38 ` [PATCH 36/36] selftest: Migrate systemd_boot test case to the new framework Aníbal Limón
2017-05-26 21:01 ` ✗ patchtest: failure for OEQA threading support and selftest migration Patchwork
2017-05-26 23:32 ` [PATCH 00/36] " Richard Purdie
2017-05-29 13:15   ` Leonardo Sandoval
2017-05-29 13:19     ` Richard Purdie
2017-05-29 14:08       ` Leonardo Sandoval
2017-05-29 15:52         ` Aníbal Limón

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.