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'])