All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH V2 0/9] Revive ptest and add result to buildhistory
@ 2017-08-22  1:23 Robert Yang
  2017-08-22  1:23 ` [PATCH V2 1/9] runtime/cases/_ptest.py: revive it Robert Yang
                   ` (8 more replies)
  0 siblings, 9 replies; 13+ messages in thread
From: Robert Yang @ 2017-08-22  1:23 UTC (permalink / raw)
  To: openembedded-core

* V2:
  - Fix Paul's comments
  - Fix RP's comments

* V1:
  - Initial version

// Robert

The following changes since commit 5c9ef0734d23909b5694ed43cdbb205c2ba9ca95:

  devtool/copy_buildsystem: adds meta-skeleton layer in the eSDK installation. (2017-08-19 22:15:25 +0100)

are available in the git repository at:

  git://git.openembedded.org/openembedded-core-contrib rbt/ptest
  http://cgit.openembedded.org/openembedded-core-contrib/log/?h=rbt/ptest

Robert Yang (9):
  runtime/cases/_ptest.py: revive it
  oeqa/utils/logparser.py: add skip status
  runtime/cases/_ptest.py: add skip status
  runtime/cases/_ptest.py: rename it to ptest.py
  utils/logparser.py: fix section check
  core/target/ssh.py: replace decode errors
  buildhistory.bbclass: print message when no commit
  testimage.bbclass: update comments
  buildhistory.bbclass: add ptest

 meta/classes/buildhistory.bbclass     |  32 +++++++++++
 meta/classes/testimage.bbclass        |   4 +-
 meta/lib/oeqa/core/target/ssh.py      |   4 +-
 meta/lib/oeqa/runtime/cases/_ptest.py | 103 ----------------------------------
 meta/lib/oeqa/runtime/cases/ptest.py  |  82 +++++++++++++++++++++++++++
 meta/lib/oeqa/utils/logparser.py      |   7 ++-
 6 files changed, 122 insertions(+), 110 deletions(-)
 delete mode 100644 meta/lib/oeqa/runtime/cases/_ptest.py
 create mode 100644 meta/lib/oeqa/runtime/cases/ptest.py

-- 
2.10.2



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

* [PATCH V2 1/9] runtime/cases/_ptest.py: revive it
  2017-08-22  1:23 [PATCH V2 0/9] Revive ptest and add result to buildhistory Robert Yang
@ 2017-08-22  1:23 ` Robert Yang
  2017-08-22  1:23 ` [PATCH V2 2/9] oeqa/utils/logparser.py: add skip status Robert Yang
                   ` (7 subsequent siblings)
  8 siblings, 0 replies; 13+ messages in thread
From: Robert Yang @ 2017-08-22  1:23 UTC (permalink / raw)
  To: openembedded-core

* Make it work with current oeqa
* Skip the test if ptest is not in DISTRO_FEATURES
* Skip the test if ptest-pkgs is not in IMAGE_FEATURES
* The logs are saved to:
  testimage/ptest_log -> testimage/ptest_log.<datetime>
* This provides data that could be used to detect regressions in ptest results

[YOCTO #11547]

Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
---
 meta/lib/oeqa/runtime/cases/_ptest.py | 96 +++++++++++++----------------------
 1 file changed, 35 insertions(+), 61 deletions(-)

diff --git a/meta/lib/oeqa/runtime/cases/_ptest.py b/meta/lib/oeqa/runtime/cases/_ptest.py
index aaed9a5..6d23949 100644
--- a/meta/lib/oeqa/runtime/cases/_ptest.py
+++ b/meta/lib/oeqa/runtime/cases/_ptest.py
@@ -1,28 +1,10 @@
-import os
-import shutil
-import subprocess
-
 from oeqa.runtime.case import OERuntimeTestCase
 from oeqa.core.decorator.depends import OETestDepends
 from oeqa.core.decorator.oeid import OETestID
-from oeqa.core.decorator.data import skipIfNotDataVar, skipIfNotFeature
-from oeqa.runtime.decorator.package import OEHasPackage
-
-from oeqa.runtime.cases.dnf import DnfTest
-from oeqa.utils.logparser import *
-from oeqa.utils.httpserver import HTTPService
-
-class PtestRunnerTest(DnfTest):
+from oeqa.core.decorator.data import skipIfNotFeature
+from oeqa.utils.logparser import Lparser, Result
 
-    @classmethod
-    def setUpClass(cls):
-        rpm_deploy = os.path.join(cls.tc.td['DEPLOY_DIR'], 'rpm')
-        cls.repo_server = HTTPService(rpm_deploy, cls.tc.target.server_ip)
-        cls.repo_server.start()
-
-    @classmethod
-    def tearDownClass(cls):
-        cls.repo_server.stop()
+class PtestRunnerTest(OERuntimeTestCase):
 
     # a ptest log parser
     def parse_ptest(self, logfile):
@@ -59,45 +41,37 @@ class PtestRunnerTest(DnfTest):
         result.sort_tests()
         return result
 
-    def _install_ptest_packages(self):
-        # Get ptest packages that can be installed in the image.
-        packages_dir = os.path.join(self.tc.td['DEPLOY_DIR'], 'rpm')
-        ptest_pkgs = [pkg[:pkg.find('-ptest')+6]
-                          for _, _, filenames in os.walk(packages_dir)
-                          for pkg in filenames
-                          if 'ptest' in pkg
-                          and pkg[:pkg.find('-ptest')] in self.tc.image_packages]
-
-        repo_url = 'http://%s:%s' % (self.target.server_ip,
-                                     self.repo_server.port)
-        dnf_options = ('--repofrompath=oe-ptest-repo,%s '
-                       '--nogpgcheck '
-                       'install -y' % repo_url)
-        self.dnf('%s %s ptest-runner' % (dnf_options, ' '.join(ptest_pkgs)))
-
-    @skipIfNotFeature('package-management',
-                      'Test requires package-management to be in DISTRO_FEATURES')
-    @skipIfNotFeature('ptest',
-                      'Test requires package-management to be in DISTRO_FEATURES')
-    @skipIfNotDataVar('IMAGE_PKGTYPE', 'rpm',
-                      'RPM is not the primary package manager')
-    @OEHasPackage(['dnf'])
+    @OETestID(1600)
+    @skipIfNotFeature('ptest', 'Test requires ptest to be in DISTRO_FEATURES')
+    @skipIfNotFeature('ptest-pkgs', 'Test requires ptest-pkgs to be in IMAGE_FEATURES')
     @OETestDepends(['ssh.SSHTest.test_ssh'])
     def test_ptestrunner(self):
-        self.ptest_log = os.path.join(self.tc.td['TEST_LOG_DIR'],
-                                      'ptest-%s.log' % self.tc.td['DATETIME'])
-        self._install_ptest_packages()
-
-        (runnerstatus, result) = self.target.run('/usr/bin/ptest-runner > /tmp/ptest.log 2>&1', 0)
-        #exit code is !=0 even if ptest-runner executes because some ptest tests fail.
-        self.assertTrue(runnerstatus != 127, msg="Cannot execute ptest-runner!")
-        self.target.copyFrom('/tmp/ptest.log', self.ptest_log)
-        shutil.copyfile(self.ptest_log, "ptest.log")
-
-        result = self.parse_ptest("ptest.log")
-        log_results_to_location = "./results"
-        if os.path.exists(log_results_to_location):
-            shutil.rmtree(log_results_to_location)
-        os.makedirs(log_results_to_location)
-
-        result.log_as_files(log_results_to_location, test_status = ['pass','fail'])
+        import datetime
+
+        test_log_dir = self.td.get('TEST_LOG_DIR', '')
+        # The TEST_LOG_DIR maybe NULL when testimage is added after
+        # testdata.json is generated.
+        if not test_log_dir:
+            test_log_dir = os.path.join(self.td.get('WORKDIR', ''), 'testimage')
+        # Don't use self.td.get('DATETIME'), it's from testdata.json, not
+        # up-to-date, and may cause "File exists" when re-reun.
+        datetime = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
+        ptest_log_dir_link = os.path.join(test_log_dir, 'ptest_log')
+        ptest_log_dir = '%s.%s' % (ptest_log_dir_link, datetime)
+        ptest_runner_log = os.path.join(ptest_log_dir, 'ptest-runner.log')
+
+        status, output = self.target.run('ptest-runner', 0)
+        os.makedirs(ptest_log_dir)
+        with open(ptest_runner_log, 'w') as f:
+            f.write(output)
+
+        # status != 0 is OK since some ptest tests may fail
+        self.assertTrue(status != 127, msg="Cannot execute ptest-runner!")
+
+        # Parse and save results
+        parse_result = self.parse_ptest(ptest_runner_log)
+        parse_result.log_as_files(ptest_log_dir, test_status = ['pass','fail'])
+        if os.path.exists(ptest_log_dir_link):
+            # Remove the old link to create a new one
+            os.remove(ptest_log_dir_link)
+        os.symlink(os.path.basename(ptest_log_dir), ptest_log_dir_link)
-- 
2.10.2



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

* [PATCH V2 2/9] oeqa/utils/logparser.py: add skip status
  2017-08-22  1:23 [PATCH V2 0/9] Revive ptest and add result to buildhistory Robert Yang
  2017-08-22  1:23 ` [PATCH V2 1/9] runtime/cases/_ptest.py: revive it Robert Yang
@ 2017-08-22  1:23 ` Robert Yang
  2017-08-22  1:23 ` [PATCH V2 3/9] runtime/cases/_ptest.py: " Robert Yang
                   ` (6 subsequent siblings)
  8 siblings, 0 replies; 13+ messages in thread
From: Robert Yang @ 2017-08-22  1:23 UTC (permalink / raw)
  To: openembedded-core

Some test cases maybe skipped, let's parse it.

[YOCTO #11547]

Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
---
 meta/lib/oeqa/utils/logparser.py | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/meta/lib/oeqa/utils/logparser.py b/meta/lib/oeqa/utils/logparser.py
index b377dcd..4355ce0 100644
--- a/meta/lib/oeqa/utils/logparser.py
+++ b/meta/lib/oeqa/utils/logparser.py
@@ -9,7 +9,7 @@ from . import ftools
 # A parser that can be used to identify weather a line is a test result or a section statement.
 class Lparser(object):
 
-    def __init__(self, test_0_pass_regex, test_0_fail_regex, section_0_begin_regex=None, section_0_end_regex=None, **kwargs):
+    def __init__(self, test_0_pass_regex, test_0_fail_regex, test_0_skip_regex, section_0_begin_regex=None, section_0_end_regex=None, **kwargs):
         # Initialize the arguments dictionary
         if kwargs:
             self.args = kwargs
@@ -19,12 +19,13 @@ class Lparser(object):
         # Add the default args to the dictionary
         self.args['test_0_pass_regex'] = test_0_pass_regex
         self.args['test_0_fail_regex'] = test_0_fail_regex
+        self.args['test_0_skip_regex'] = test_0_skip_regex
         if section_0_begin_regex:
             self.args['section_0_begin_regex'] = section_0_begin_regex
         if section_0_end_regex:
             self.args['section_0_end_regex'] = section_0_end_regex
 
-        self.test_possible_status = ['pass', 'fail', 'error']
+        self.test_possible_status = ['pass', 'fail', 'error', 'skip']
         self.section_possible_status = ['begin', 'end']
 
         self.initialized = False
-- 
2.10.2



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

* [PATCH V2 3/9] runtime/cases/_ptest.py: add skip status
  2017-08-22  1:23 [PATCH V2 0/9] Revive ptest and add result to buildhistory Robert Yang
  2017-08-22  1:23 ` [PATCH V2 1/9] runtime/cases/_ptest.py: revive it Robert Yang
  2017-08-22  1:23 ` [PATCH V2 2/9] oeqa/utils/logparser.py: add skip status Robert Yang
@ 2017-08-22  1:23 ` Robert Yang
  2017-08-22  1:23 ` [PATCH V2 4/9] runtime/cases/_ptest.py: rename it to ptest.py Robert Yang
                   ` (5 subsequent siblings)
  8 siblings, 0 replies; 13+ messages in thread
From: Robert Yang @ 2017-08-22  1:23 UTC (permalink / raw)
  To: openembedded-core

The packages' test cases maybe skipped, check and save them.

[YOCTO #11547]

Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
---
 meta/lib/oeqa/runtime/cases/_ptest.py | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/meta/lib/oeqa/runtime/cases/_ptest.py b/meta/lib/oeqa/runtime/cases/_ptest.py
index 6d23949..ec8c038 100644
--- a/meta/lib/oeqa/runtime/cases/_ptest.py
+++ b/meta/lib/oeqa/runtime/cases/_ptest.py
@@ -10,6 +10,7 @@ class PtestRunnerTest(OERuntimeTestCase):
     def parse_ptest(self, logfile):
         parser = Lparser(test_0_pass_regex="^PASS:(.+)",
                          test_0_fail_regex="^FAIL:(.+)",
+                         test_0_skip_regex="^SKIP:(.+)",
                          section_0_begin_regex="^BEGIN: .*/(.+)/ptest",
                          section_0_end_regex="^END: .*/(.+)/ptest")
         parser.init()
@@ -38,6 +39,10 @@ class PtestRunnerTest(OERuntimeTestCase):
                     result.store(current_section, name, status)
                     continue
 
+                if line_type == 'test' and status == 'skip':
+                    result.store(current_section, name, status)
+                    continue
+
         result.sort_tests()
         return result
 
@@ -70,7 +75,7 @@ class PtestRunnerTest(OERuntimeTestCase):
 
         # Parse and save results
         parse_result = self.parse_ptest(ptest_runner_log)
-        parse_result.log_as_files(ptest_log_dir, test_status = ['pass','fail'])
+        parse_result.log_as_files(ptest_log_dir, test_status = ['pass','fail', 'skip'])
         if os.path.exists(ptest_log_dir_link):
             # Remove the old link to create a new one
             os.remove(ptest_log_dir_link)
-- 
2.10.2



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

* [PATCH V2 4/9] runtime/cases/_ptest.py: rename it to ptest.py
  2017-08-22  1:23 [PATCH V2 0/9] Revive ptest and add result to buildhistory Robert Yang
                   ` (2 preceding siblings ...)
  2017-08-22  1:23 ` [PATCH V2 3/9] runtime/cases/_ptest.py: " Robert Yang
@ 2017-08-22  1:23 ` Robert Yang
  2017-08-22  1:23 ` [PATCH V2 5/9] utils/logparser.py: fix section check Robert Yang
                   ` (4 subsequent siblings)
  8 siblings, 0 replies; 13+ messages in thread
From: Robert Yang @ 2017-08-22  1:23 UTC (permalink / raw)
  To: openembedded-core

It works now.

[YOCTO #11547]

Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
---
 meta/lib/oeqa/runtime/cases/{_ptest.py => ptest.py} | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename meta/lib/oeqa/runtime/cases/{_ptest.py => ptest.py} (100%)

diff --git a/meta/lib/oeqa/runtime/cases/_ptest.py b/meta/lib/oeqa/runtime/cases/ptest.py
similarity index 100%
rename from meta/lib/oeqa/runtime/cases/_ptest.py
rename to meta/lib/oeqa/runtime/cases/ptest.py
-- 
2.10.2



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

* [PATCH V2 5/9] utils/logparser.py: fix section check
  2017-08-22  1:23 [PATCH V2 0/9] Revive ptest and add result to buildhistory Robert Yang
                   ` (3 preceding siblings ...)
  2017-08-22  1:23 ` [PATCH V2 4/9] runtime/cases/_ptest.py: rename it to ptest.py Robert Yang
@ 2017-08-22  1:23 ` Robert Yang
  2017-08-22  1:23 ` [PATCH V2 6/9] core/target/ssh.py: replace decode errors Robert Yang
                   ` (3 subsequent siblings)
  8 siblings, 0 replies; 13+ messages in thread
From: Robert Yang @ 2017-08-22  1:23 UTC (permalink / raw)
  To: openembedded-core

The section might be None or '', so use "if section" for it.

Fixed:
File "/buildarea/lyang1/poky/meta/lib/oeqa/utils/logparser.py", line 113, in log_as_files
    prefix += section
TypeError: Can't convert 'NoneType' object to str implicitly

[YOCTO #11547]

Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
---
 meta/lib/oeqa/utils/logparser.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/meta/lib/oeqa/utils/logparser.py b/meta/lib/oeqa/utils/logparser.py
index 4355ce0..0670627 100644
--- a/meta/lib/oeqa/utils/logparser.py
+++ b/meta/lib/oeqa/utils/logparser.py
@@ -109,7 +109,7 @@ class Result(object):
             prefix = ''
             for x in test_status:
                 prefix +=x+'.'
-            if (section != ''):
+            if section:
                 prefix += section
             section_file = os.path.join(target_dir, prefix)
             # purge the file contents if it exists
-- 
2.10.2



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

* [PATCH V2 6/9] core/target/ssh.py: replace decode errors
  2017-08-22  1:23 [PATCH V2 0/9] Revive ptest and add result to buildhistory Robert Yang
                   ` (4 preceding siblings ...)
  2017-08-22  1:23 ` [PATCH V2 5/9] utils/logparser.py: fix section check Robert Yang
@ 2017-08-22  1:23 ` Robert Yang
  2017-08-22 10:55   ` Paul Eggleton
  2017-08-22  1:23 ` [PATCH V2 7/9] buildhistory.bbclass: print message when no commit Robert Yang
                   ` (2 subsequent siblings)
  8 siblings, 1 reply; 13+ messages in thread
From: Robert Yang @ 2017-08-22  1:23 UTC (permalink / raw)
  To: openembedded-core

There might be wild strings when read from target (especially when
reading ptest results), replace the errors to avoid breaking the test.

Fixed: (Not always happen)
$ bitbake core-image-sato -ctestimage
[snip]
    status, output = self.target.run('ptest-runner', 0)
  File "/buildarea/lyang1/poky/meta/lib/oeqa/core/target/ssh.py", line 84, in run
    status, output = self._run(sshCmd, processTimeout, True)
  File "/buildarea/lyang1/poky/meta/lib/oeqa/core/target/ssh.py", line 55, in _run
    status, output = SSHCall(command, self.logger, timeout)
  File "/buildarea/lyang1/poky/meta/lib/oeqa/core/target/ssh.py", line 258, in SSHCall
    run()
  File "/buildarea/lyang1/poky/meta/lib/oeqa/core/target/ssh.py", line 236, in run
    output = process.communicate()[0].decode("utf-8")
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc3 in position 4906: invalid continuation byte

[YOCTO #11547]

Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
---
 meta/lib/oeqa/core/target/ssh.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/meta/lib/oeqa/core/target/ssh.py b/meta/lib/oeqa/core/target/ssh.py
index b80939c..a2eafcd 100644
--- a/meta/lib/oeqa/core/target/ssh.py
+++ b/meta/lib/oeqa/core/target/ssh.py
@@ -211,7 +211,7 @@ def SSHCall(command, logger, timeout=None, **opts):
                             process.stdout.close()
                             eof = True
                         else:
-                            data = data.decode("utf-8")
+                            data = data.decode("utf-8", errors='replace')
                             output += data
                             logger.debug('Partial data from SSH call: %s' % data)
                             endtime = time.time() + timeout
@@ -233,7 +233,7 @@ def SSHCall(command, logger, timeout=None, **opts):
                 output += lastline
 
         else:
-            output = process.communicate()[0].decode("utf-8")
+            output = process.communicate()[0].decode("utf-8", errors='replace')
             logger.debug('Data from SSH call: %s' % output.rstrip())
 
     options = {
-- 
2.10.2



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

* [PATCH V2 7/9] buildhistory.bbclass: print message when no commit
  2017-08-22  1:23 [PATCH V2 0/9] Revive ptest and add result to buildhistory Robert Yang
                   ` (5 preceding siblings ...)
  2017-08-22  1:23 ` [PATCH V2 6/9] core/target/ssh.py: replace decode errors Robert Yang
@ 2017-08-22  1:23 ` Robert Yang
  2017-08-22  1:23 ` [PATCH V2 8/9] testimage.bbclass: update comments Robert Yang
  2017-08-22  1:23 ` [PATCH V2 9/9] buildhistory.bbclass: add ptest Robert Yang
  8 siblings, 0 replies; 13+ messages in thread
From: Robert Yang @ 2017-08-22  1:23 UTC (permalink / raw)
  To: openembedded-core

This makes the user easier to know how to make commit in buildhistory.

[YOCTO #11547]

Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
---
 meta/classes/buildhistory.bbclass | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/meta/classes/buildhistory.bbclass b/meta/classes/buildhistory.bbclass
index 81784ee..a3e4c7a 100644
--- a/meta/classes/buildhistory.bbclass
+++ b/meta/classes/buildhistory.bbclass
@@ -824,6 +824,8 @@ python buildhistory_eventhandler() {
                 interrupted = getattr(e, '_interrupted', 0)
                 localdata.setVar('BUILDHISTORY_BUILD_INTERRUPTED', str(interrupted))
                 bb.build.exec_func("buildhistory_commit", localdata)
+            else:
+                bb.note("No commit since BUILDHISTORY_COMMIT != '1'")
 }
 
 addhandler buildhistory_eventhandler
-- 
2.10.2



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

* [PATCH V2 8/9] testimage.bbclass: update comments
  2017-08-22  1:23 [PATCH V2 0/9] Revive ptest and add result to buildhistory Robert Yang
                   ` (6 preceding siblings ...)
  2017-08-22  1:23 ` [PATCH V2 7/9] buildhistory.bbclass: print message when no commit Robert Yang
@ 2017-08-22  1:23 ` Robert Yang
  2017-08-22  1:23 ` [PATCH V2 9/9] buildhistory.bbclass: add ptest Robert Yang
  8 siblings, 0 replies; 13+ messages in thread
From: Robert Yang @ 2017-08-22  1:23 UTC (permalink / raw)
  To: openembedded-core

It's very important to add IMAGE_CLASSES += "testimage" in local.conf firstly,
otherwise the var like TEST_LOG_DIR (defined in testimage.bbclass) will not be
in testdata.json.

[YOCTO #11547]

Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
---
 meta/classes/testimage.bbclass | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/meta/classes/testimage.bbclass b/meta/classes/testimage.bbclass
index 0c4a84e..6a43560 100644
--- a/meta/classes/testimage.bbclass
+++ b/meta/classes/testimage.bbclass
@@ -7,8 +7,8 @@
 # Most of the tests are commands run on target image over ssh.
 # To use it add testimage to global inherit and call your target image with -c testimage
 # You can try it out like this:
-# - first build a qemu core-image-sato
-# - add IMAGE_CLASSES += "testimage" in local.conf
+# - first add IMAGE_CLASSES += "testimage" in local.conf
+# - build a qemu core-image-sato
 # - then bitbake core-image-sato -c testimage. That will run a standard suite of tests.
 
 # You can set (or append to) TEST_SUITES in local.conf to select the tests
-- 
2.10.2



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

* [PATCH V2 9/9] buildhistory.bbclass: add ptest
  2017-08-22  1:23 [PATCH V2 0/9] Revive ptest and add result to buildhistory Robert Yang
                   ` (7 preceding siblings ...)
  2017-08-22  1:23 ` [PATCH V2 8/9] testimage.bbclass: update comments Robert Yang
@ 2017-08-22  1:23 ` Robert Yang
  8 siblings, 0 replies; 13+ messages in thread
From: Robert Yang @ 2017-08-22  1:23 UTC (permalink / raw)
  To: openembedded-core

The ptest log will be saved to buildhistory/ptest, we can easily get
the regression result between builds by:

$ git show HEAD ptest/pass.fail.skip.*

[YOCTO #11547]

Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
---
 meta/classes/buildhistory.bbclass | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/meta/classes/buildhistory.bbclass b/meta/classes/buildhistory.bbclass
index a3e4c7a..dbfcc05 100644
--- a/meta/classes/buildhistory.bbclass
+++ b/meta/classes/buildhistory.bbclass
@@ -912,3 +912,33 @@ def write_latest_srcrev(d, pkghistdir):
     else:
         if os.path.exists(srcrevfile):
             os.remove(srcrevfile)
+
+do_testimage[postfuncs] += "write_ptest_result"
+do_testimage[vardepsexclude] += "write_ptest_result"
+
+python write_ptest_result() {
+    write_latest_ptest_result(d, d.getVar('BUILDHISTORY_DIR'))
+}
+
+def write_latest_ptest_result(d, histdir):
+    import glob
+    import subprocess
+    test_log_dir = d.getVar('TEST_LOG_DIR')
+    input_ptest = os.path.join(test_log_dir, 'ptest_log')
+    output_ptest = os.path.join(histdir, 'ptest')
+    if os.path.exists(input_ptest):
+        try:
+            # Lock it avoid race issue
+            lock = bb.utils.lockfile(output_ptest + "/ptest.lock")
+            bb.utils.mkdirhier(output_ptest)
+            oe.path.copytree(input_ptest, output_ptest)
+            # Sort test result
+            for result in glob.glob('%s/pass.fail.*' % output_ptest):
+                bb.debug(1, 'Processing %s' % result)
+                cmd = ['sort', result, '-o', result]
+                bb.debug(1, 'Running %s' % cmd)
+                ret = subprocess.call(cmd)
+                if ret != 0:
+                    bb.error('Failed to run %s!' % cmd)
+        finally:
+            bb.utils.unlockfile(lock)
-- 
2.10.2



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

* Re: [PATCH V2 6/9] core/target/ssh.py: replace decode errors
  2017-08-22  1:23 ` [PATCH V2 6/9] core/target/ssh.py: replace decode errors Robert Yang
@ 2017-08-22 10:55   ` Paul Eggleton
  2017-08-23 13:17     ` Richard Purdie
  0 siblings, 1 reply; 13+ messages in thread
From: Paul Eggleton @ 2017-08-22 10:55 UTC (permalink / raw)
  To: Robert Yang; +Cc: openembedded-core

On Tuesday, 22 August 2017 1:23:10 PM NZST Robert Yang wrote:
> There might be wild strings when read from target (especially when
> reading ptest results), replace the errors to avoid breaking the test.
> 
> Fixed: (Not always happen)
> $ bitbake core-image-sato -ctestimage
> [snip]
>     status, output = self.target.run('ptest-runner', 0)
>   File "/buildarea/lyang1/poky/meta/lib/oeqa/core/target/ssh.py", line 84, in run
>     status, output = self._run(sshCmd, processTimeout, True)
>   File "/buildarea/lyang1/poky/meta/lib/oeqa/core/target/ssh.py", line 55, in _run
>     status, output = SSHCall(command, self.logger, timeout)
>   File "/buildarea/lyang1/poky/meta/lib/oeqa/core/target/ssh.py", line 258, in SSHCall
>     run()
>   File "/buildarea/lyang1/poky/meta/lib/oeqa/core/target/ssh.py", line 236, in run
>     output = process.communicate()[0].decode("utf-8")
> UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc3 in position 4906: invalid continuation byte
> 
> [YOCTO #11547]
> 
> Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
> ---
>  meta/lib/oeqa/core/target/ssh.py | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/meta/lib/oeqa/core/target/ssh.py b/meta/lib/oeqa/core/target/ssh.py
> index b80939c..a2eafcd 100644
> --- a/meta/lib/oeqa/core/target/ssh.py
> +++ b/meta/lib/oeqa/core/target/ssh.py
> @@ -211,7 +211,7 @@ def SSHCall(command, logger, timeout=None, **opts):
>                              process.stdout.close()
>                              eof = True
>                          else:
> -                            data = data.decode("utf-8")
> +                            data = data.decode("utf-8", errors='replace')
>                              output += data
>                              logger.debug('Partial data from SSH call: %s' % data)

Since we're dealing with partial data here, shouldn't we be using a
reader object? e.g.:

  http://git.yoctoproject.org/cgit/cgit.cgi/poky/commit/?id=bfd8c35c3f917e3806c8dfe36c98c70fbccbb3c9

Cheers,
Paul

-- 

Paul Eggleton
Intel Open Source Technology Centre


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

* Re: [PATCH V2 6/9] core/target/ssh.py: replace decode errors
  2017-08-22 10:55   ` Paul Eggleton
@ 2017-08-23 13:17     ` Richard Purdie
  2017-08-24  6:19       ` Robert Yang
  0 siblings, 1 reply; 13+ messages in thread
From: Richard Purdie @ 2017-08-23 13:17 UTC (permalink / raw)
  To: Paul Eggleton, Robert Yang; +Cc: openembedded-core

On Tue, 2017-08-22 at 22:55 +1200, Paul Eggleton wrote:
> On Tuesday, 22 August 2017 1:23:10 PM NZST Robert Yang wrote:
> > 
> > There might be wild strings when read from target (especially when
> > reading ptest results), replace the errors to avoid breaking the
> > test.
> > 
> > Fixed: (Not always happen)
> > $ bitbake core-image-sato -ctestimage
> > [snip]
> >     status, output = self.target.run('ptest-runner', 0)
> >   File "/buildarea/lyang1/poky/meta/lib/oeqa/core/target/ssh.py",
> > line 84, in run
> >     status, output = self._run(sshCmd, processTimeout, True)
> >   File "/buildarea/lyang1/poky/meta/lib/oeqa/core/target/ssh.py",
> > line 55, in _run
> >     status, output = SSHCall(command, self.logger, timeout)
> >   File "/buildarea/lyang1/poky/meta/lib/oeqa/core/target/ssh.py",
> > line 258, in SSHCall
> >     run()
> >   File "/buildarea/lyang1/poky/meta/lib/oeqa/core/target/ssh.py",
> > line 236, in run
> >     output = process.communicate()[0].decode("utf-8")
> > UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc3 in
> > position 4906: invalid continuation byte
> > 
> > [YOCTO #11547]
> > 
> > Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
> > ---
> >  meta/lib/oeqa/core/target/ssh.py | 4 ++--
> >  1 file changed, 2 insertions(+), 2 deletions(-)
> > 
> > diff --git a/meta/lib/oeqa/core/target/ssh.py
> > b/meta/lib/oeqa/core/target/ssh.py
> > index b80939c..a2eafcd 100644
> > --- a/meta/lib/oeqa/core/target/ssh.py
> > +++ b/meta/lib/oeqa/core/target/ssh.py
> > @@ -211,7 +211,7 @@ def SSHCall(command, logger, timeout=None,
> > **opts):
> >                              process.stdout.close()
> >                              eof = True
> >                          else:
> > -                            data = data.decode("utf-8")
> > +                            data = data.decode("utf-8",
> > errors='replace')
> >                              output += data
> >                              logger.debug('Partial data from SSH
> > call: %s' % data)
> Since we're dealing with partial data here, shouldn't we be using a
> reader object? e.g.:
> 
>   http://git.yoctoproject.org/cgit/cgit.cgi/poky/commit/?id=bfd8c35c3
> f917e3806c8dfe36c98c70fbccbb3c9


I've decided to merge this series as it improves the ptest support
substantially however I am expecting a follow up with the tweaks Paul
suggests here please.

Cheers,

Richard



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

* Re: [PATCH V2 6/9] core/target/ssh.py: replace decode errors
  2017-08-23 13:17     ` Richard Purdie
@ 2017-08-24  6:19       ` Robert Yang
  0 siblings, 0 replies; 13+ messages in thread
From: Robert Yang @ 2017-08-24  6:19 UTC (permalink / raw)
  To: Richard Purdie, Paul Eggleton; +Cc: openembedded-core



On 08/23/2017 09:17 PM, Richard Purdie wrote:
> On Tue, 2017-08-22 at 22:55 +1200, Paul Eggleton wrote:
>> On Tuesday, 22 August 2017 1:23:10 PM NZST Robert Yang wrote:
>>>
>>> There might be wild strings when read from target (especially when
>>> reading ptest results), replace the errors to avoid breaking the
>>> test.
>>>
>>> Fixed: (Not always happen)
>>> $ bitbake core-image-sato -ctestimage
>>> [snip]
>>>     status, output = self.target.run('ptest-runner', 0)
>>>   File "/buildarea/lyang1/poky/meta/lib/oeqa/core/target/ssh.py",
>>> line 84, in run
>>>     status, output = self._run(sshCmd, processTimeout, True)
>>>   File "/buildarea/lyang1/poky/meta/lib/oeqa/core/target/ssh.py",
>>> line 55, in _run
>>>     status, output = SSHCall(command, self.logger, timeout)
>>>   File "/buildarea/lyang1/poky/meta/lib/oeqa/core/target/ssh.py",
>>> line 258, in SSHCall
>>>     run()
>>>   File "/buildarea/lyang1/poky/meta/lib/oeqa/core/target/ssh.py",
>>> line 236, in run
>>>     output = process.communicate()[0].decode("utf-8")
>>> UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc3 in
>>> position 4906: invalid continuation byte
>>>
>>> [YOCTO #11547]
>>>
>>> Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
>>> ---
>>>  meta/lib/oeqa/core/target/ssh.py | 4 ++--
>>>  1 file changed, 2 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/meta/lib/oeqa/core/target/ssh.py
>>> b/meta/lib/oeqa/core/target/ssh.py
>>> index b80939c..a2eafcd 100644
>>> --- a/meta/lib/oeqa/core/target/ssh.py
>>> +++ b/meta/lib/oeqa/core/target/ssh.py
>>> @@ -211,7 +211,7 @@ def SSHCall(command, logger, timeout=None,
>>> **opts):
>>>                              process.stdout.close()
>>>                              eof = True
>>>                          else:
>>> -                            data = data.decode("utf-8")
>>> +                            data = data.decode("utf-8",
>>> errors='replace')
>>>                              output += data
>>>                              logger.debug('Partial data from SSH
>>> call: %s' % data)
>> Since we're dealing with partial data here, shouldn't we be using a
>> reader object? e.g.:
>>
>>   http://git.yoctoproject.org/cgit/cgit.cgi/poky/commit/?id=bfd8c35c3
>> f917e3806c8dfe36c98c70fbccbb3c9
>
>
> I've decided to merge this series as it improves the ptest support
> substantially however I am expecting a follow up with the tweaks Paul
> suggests here please.

Thanks, sent:
[OE-core] [PATCH 0/1] core/target/ssh.py: use reader to handle partial data

// Robert

>
> Cheers,
>
> Richard
>
>


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

end of thread, other threads:[~2017-08-24  6:20 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-08-22  1:23 [PATCH V2 0/9] Revive ptest and add result to buildhistory Robert Yang
2017-08-22  1:23 ` [PATCH V2 1/9] runtime/cases/_ptest.py: revive it Robert Yang
2017-08-22  1:23 ` [PATCH V2 2/9] oeqa/utils/logparser.py: add skip status Robert Yang
2017-08-22  1:23 ` [PATCH V2 3/9] runtime/cases/_ptest.py: " Robert Yang
2017-08-22  1:23 ` [PATCH V2 4/9] runtime/cases/_ptest.py: rename it to ptest.py Robert Yang
2017-08-22  1:23 ` [PATCH V2 5/9] utils/logparser.py: fix section check Robert Yang
2017-08-22  1:23 ` [PATCH V2 6/9] core/target/ssh.py: replace decode errors Robert Yang
2017-08-22 10:55   ` Paul Eggleton
2017-08-23 13:17     ` Richard Purdie
2017-08-24  6:19       ` Robert Yang
2017-08-22  1:23 ` [PATCH V2 7/9] buildhistory.bbclass: print message when no commit Robert Yang
2017-08-22  1:23 ` [PATCH V2 8/9] testimage.bbclass: update comments Robert Yang
2017-08-22  1:23 ` [PATCH V2 9/9] buildhistory.bbclass: add ptest Robert Yang

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.