diff options
author | Hongxu Jia <hongxu.jia@windriver.com> | 2018-11-09 00:36:20 -0800 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2018-11-14 11:14:39 +0000 |
commit | d40767ac831cb3e20b43a87a47e772026f6d19f6 (patch) | |
tree | 666fc89a2d23c87b5902fd891a236e1fb2fb8a7b /meta/lib/oeqa/sdk/cases | |
parent | 6b7227b68a7ecdf20829e555440a9cfed14db176 (diff) | |
download | poky-d40767ac831cb3e20b43a87a47e772026f6d19f6.tar.gz |
testsdk: fix skipped testcase output "UNKNOWN" status while multiprocess execution
Usually skipped testcase output "SKIPPED"
[snip serial execution]
|RESULTS - buildgalculator.GalculatorTest.test_galculator - Testcase -1: SKIPPED (0.01s)
|RESULTS - python.PythonTest.test_python3 - Testcase -1: SKIPPED (0.01s)
[snip serial execution]
But if enable multiprocess execution, skipped testcase output "UNKNOWN" status
[snip enable multiprocess execution]
|RESULTS - buildgalculator.GalculatorTest.test_galculator - Testcase -1: UNKNOWN
|RESULTS - python.PythonTest.test_python3 - Testcase -1: UNKNOWN
[snip enable multiprocess execution]
Here is my investigation:
There is a class pairs TestProtocolClient and TestProtocolServer
provided by python3-subunit. The TestProtocolClient generates a
subunit stream of TestResult from a test run, and TestProtocolServer
parses the stream of subunit TestResult.
The class ProtocolTestCase is a unittest.TestCase adapter and it
uses TestProtocolServer to parse the stream of subunit TestResult.
In Yocto testsdk, it forks multiple processes to execute testcases
and use TestProtocolClient to generate TestResult stream; and then
it creates multiple threads to use ProtocolTestCase to parse stream
of subunit TestResult through pipe; finally it passes multiple
ProtocolTestCase as TestCase instance to main process and output
status result.
The problem point is TestProtocolServer parses `skip:' directive
after reading a `test:' directive. Without `test:' directive,
`skip:' directive will be ignored. All above requires SkipTest should
be raised inside a test method rather than setUpClass method.
Throwing SkipTest inside setUp works correctly
(From OE-Core rev: 4828a88556d59e4d06933164c2ebeb9361b7450e)
Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/lib/oeqa/sdk/cases')
-rw-r--r-- | meta/lib/oeqa/sdk/cases/assimp.py | 3 | ||||
-rw-r--r-- | meta/lib/oeqa/sdk/cases/buildcpio.py | 1 | ||||
-rw-r--r-- | meta/lib/oeqa/sdk/cases/buildgalculator.py | 3 | ||||
-rw-r--r-- | meta/lib/oeqa/sdk/cases/buildlzip.py | 1 | ||||
-rw-r--r-- | meta/lib/oeqa/sdk/cases/perl.py | 3 | ||||
-rw-r--r-- | meta/lib/oeqa/sdk/cases/python.py | 3 |
6 files changed, 6 insertions, 8 deletions
diff --git a/meta/lib/oeqa/sdk/cases/assimp.py b/meta/lib/oeqa/sdk/cases/assimp.py index 26c1df089c..f5c7547b88 100644 --- a/meta/lib/oeqa/sdk/cases/assimp.py +++ b/meta/lib/oeqa/sdk/cases/assimp.py | |||
@@ -12,8 +12,7 @@ class BuildAssimp(OESDKTestCase): | |||
12 | 12 | ||
13 | td_vars = ['DATETIME', 'TARGET_OS', 'TARGET_ARCH'] | 13 | td_vars = ['DATETIME', 'TARGET_OS', 'TARGET_ARCH'] |
14 | 14 | ||
15 | @classmethod | 15 | def setUp(self): |
16 | def setUpClass(self): | ||
17 | if not (self.tc.hasHostPackage("nativesdk-cmake") or | 16 | if not (self.tc.hasHostPackage("nativesdk-cmake") or |
18 | self.tc.hasHostPackage("cmake-native")): | 17 | self.tc.hasHostPackage("cmake-native")): |
19 | raise unittest.SkipTest("Needs cmake") | 18 | raise unittest.SkipTest("Needs cmake") |
diff --git a/meta/lib/oeqa/sdk/cases/buildcpio.py b/meta/lib/oeqa/sdk/cases/buildcpio.py index 333dc7c226..f348ac5d90 100644 --- a/meta/lib/oeqa/sdk/cases/buildcpio.py +++ b/meta/lib/oeqa/sdk/cases/buildcpio.py | |||
@@ -14,6 +14,7 @@ class BuildCpioTest(OESDKTestCase): | |||
14 | self.tc.sdk_dir, self.td['DATETIME'], dl_dir=dl_dir) | 14 | self.tc.sdk_dir, self.td['DATETIME'], dl_dir=dl_dir) |
15 | self.project.download_archive() | 15 | self.project.download_archive() |
16 | 16 | ||
17 | def setUp(self): | ||
17 | machine = self.td.get("MACHINE") | 18 | machine = self.td.get("MACHINE") |
18 | if not self.tc.hasHostPackage("packagegroup-cross-canadian-%s" % machine): | 19 | if not self.tc.hasHostPackage("packagegroup-cross-canadian-%s" % machine): |
19 | raise unittest.SkipTest("SDK doesn't contain a cross-canadian toolchain") | 20 | raise unittest.SkipTest("SDK doesn't contain a cross-canadian toolchain") |
diff --git a/meta/lib/oeqa/sdk/cases/buildgalculator.py b/meta/lib/oeqa/sdk/cases/buildgalculator.py index 050d1b3b52..9e12b3ac10 100644 --- a/meta/lib/oeqa/sdk/cases/buildgalculator.py +++ b/meta/lib/oeqa/sdk/cases/buildgalculator.py | |||
@@ -6,8 +6,7 @@ from oeqa.sdk.utils.sdkbuildproject import SDKBuildProject | |||
6 | class GalculatorTest(OESDKTestCase): | 6 | class GalculatorTest(OESDKTestCase): |
7 | td_vars = ['DATETIME'] | 7 | td_vars = ['DATETIME'] |
8 | 8 | ||
9 | @classmethod | 9 | def setUp(self): |
10 | def setUpClass(self): | ||
11 | if not (self.tc.hasTargetPackage("gtk+3", multilib=True) or \ | 10 | if not (self.tc.hasTargetPackage("gtk+3", multilib=True) or \ |
12 | self.tc.hasTargetPackage("libgtk-3.0", multilib=True)): | 11 | self.tc.hasTargetPackage("libgtk-3.0", multilib=True)): |
13 | raise unittest.SkipTest("GalculatorTest class: SDK don't support gtk+3") | 12 | raise unittest.SkipTest("GalculatorTest class: SDK don't support gtk+3") |
diff --git a/meta/lib/oeqa/sdk/cases/buildlzip.py b/meta/lib/oeqa/sdk/cases/buildlzip.py index b28cc3a595..9d137f30eb 100644 --- a/meta/lib/oeqa/sdk/cases/buildlzip.py +++ b/meta/lib/oeqa/sdk/cases/buildlzip.py | |||
@@ -15,6 +15,7 @@ class BuildLzipTest(OESDKTestCase): | |||
15 | self.tc.sdk_dir, self.td['DATETIME'], dl_dir=dl_dir) | 15 | self.tc.sdk_dir, self.td['DATETIME'], dl_dir=dl_dir) |
16 | self.project.download_archive() | 16 | self.project.download_archive() |
17 | 17 | ||
18 | def setUp(self): | ||
18 | machine = self.td.get("MACHINE") | 19 | machine = self.td.get("MACHINE") |
19 | 20 | ||
20 | if not (self.tc.hasHostPackage("packagegroup-cross-canadian-%s" % machine) or | 21 | if not (self.tc.hasHostPackage("packagegroup-cross-canadian-%s" % machine) or |
diff --git a/meta/lib/oeqa/sdk/cases/perl.py b/meta/lib/oeqa/sdk/cases/perl.py index ff50b46800..e1d2bc159a 100644 --- a/meta/lib/oeqa/sdk/cases/perl.py +++ b/meta/lib/oeqa/sdk/cases/perl.py | |||
@@ -2,8 +2,7 @@ import unittest | |||
2 | from oeqa.sdk.case import OESDKTestCase | 2 | from oeqa.sdk.case import OESDKTestCase |
3 | 3 | ||
4 | class PerlTest(OESDKTestCase): | 4 | class PerlTest(OESDKTestCase): |
5 | @classmethod | 5 | def setUp(self): |
6 | def setUpClass(self): | ||
7 | if not (self.tc.hasHostPackage("nativesdk-perl") or | 6 | if not (self.tc.hasHostPackage("nativesdk-perl") or |
8 | self.tc.hasHostPackage("perl-native")): | 7 | self.tc.hasHostPackage("perl-native")): |
9 | raise unittest.SkipTest("No perl package in the SDK") | 8 | raise unittest.SkipTest("No perl package in the SDK") |
diff --git a/meta/lib/oeqa/sdk/cases/python.py b/meta/lib/oeqa/sdk/cases/python.py index bd5f1f67be..7c1d183e52 100644 --- a/meta/lib/oeqa/sdk/cases/python.py +++ b/meta/lib/oeqa/sdk/cases/python.py | |||
@@ -2,8 +2,7 @@ import subprocess, unittest | |||
2 | from oeqa.sdk.case import OESDKTestCase | 2 | from oeqa.sdk.case import OESDKTestCase |
3 | 3 | ||
4 | class PythonTest(OESDKTestCase): | 4 | class PythonTest(OESDKTestCase): |
5 | @classmethod | 5 | def setUp(self): |
6 | def setUpClass(self): | ||
7 | if not (self.tc.hasHostPackage("nativesdk-python3") or | 6 | if not (self.tc.hasHostPackage("nativesdk-python3") or |
8 | self.tc.hasHostPackage("python3-native")): | 7 | self.tc.hasHostPackage("python3-native")): |
9 | raise unittest.SkipTest("No python package in the SDK") | 8 | raise unittest.SkipTest("No python package in the SDK") |