summaryrefslogtreecommitdiffstats
path: root/import-layers/yocto-poky/meta/lib/oeqa/runtime/cases/_ptest.py
diff options
context:
space:
mode:
Diffstat (limited to 'import-layers/yocto-poky/meta/lib/oeqa/runtime/cases/_ptest.py')
-rw-r--r--import-layers/yocto-poky/meta/lib/oeqa/runtime/cases/_ptest.py103
1 files changed, 103 insertions, 0 deletions
diff --git a/import-layers/yocto-poky/meta/lib/oeqa/runtime/cases/_ptest.py b/import-layers/yocto-poky/meta/lib/oeqa/runtime/cases/_ptest.py
new file mode 100644
index 000000000..aaed9a535
--- /dev/null
+++ b/import-layers/yocto-poky/meta/lib/oeqa/runtime/cases/_ptest.py
@@ -0,0 +1,103 @@
+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):
+
+ @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()
+
+ # a ptest log parser
+ def parse_ptest(self, logfile):
+ parser = Lparser(test_0_pass_regex="^PASS:(.+)",
+ test_0_fail_regex="^FAIL:(.+)",
+ section_0_begin_regex="^BEGIN: .*/(.+)/ptest",
+ section_0_end_regex="^END: .*/(.+)/ptest")
+ parser.init()
+ result = Result()
+
+ with open(logfile, errors='replace') as f:
+ for line in f:
+ result_tuple = parser.parse_line(line)
+ if not result_tuple:
+ continue
+ result_tuple = line_type, category, status, name = parser.parse_line(line)
+
+ if line_type == 'section' and status == 'begin':
+ current_section = name
+ continue
+
+ if line_type == 'section' and status == 'end':
+ current_section = None
+ continue
+
+ if line_type == 'test' and status == 'pass':
+ result.store(current_section, name, status)
+ continue
+
+ if line_type == 'test' and status == 'fail':
+ result.store(current_section, name, status)
+ continue
+
+ 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'])
+ @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'])
OpenPOWER on IntegriCloud