1
0
mirror of https://git.yoctoproject.org/poky synced 2026-06-01 00:59:48 +00:00

oeqa/runtime/cases: Migrate runtime tests.

This migrates current runtime test suite to be used with the new framework.

[YOCTO #10234]

(From OE-Core rev: b39c61f2d442c79d03b73e8ffd104996fcb2177e)

Signed-off-by: Mariano Lopez <mariano.lopez@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Mariano Lopez
2016-11-01 07:48:16 +00:00
committed by Richard Purdie
parent 3857e5c91d
commit b569aa0e00
51 changed files with 1075 additions and 906 deletions
+125
View File
@@ -0,0 +1,125 @@
import unittest, os, shutil
from oeqa.oetest import oeRuntimeTest, skipModule
from oeqa.utils.decorators import *
from oeqa.utils.logparser import *
from oeqa.utils.httpserver import HTTPService
import bb
import glob
from oe.package_manager import RpmPkgsList
import subprocess
def setUpModule():
if not oeRuntimeTest.hasFeature("package-management"):
skipModule("Image doesn't have package management feature")
if not oeRuntimeTest.hasPackage("smartpm"):
skipModule("Image doesn't have smart installed")
if "package_rpm" != oeRuntimeTest.tc.d.getVar("PACKAGE_CLASSES").split()[0]:
skipModule("Rpm is not the primary package manager")
class PtestRunnerTest(oeRuntimeTest):
# 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) 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
@classmethod
def setUpClass(self):
#note the existing channels that are on the board before creating new ones
# self.existingchannels = set()
# (status, result) = oeRuntimeTest.tc.target.run('smart channel --show | grep "\["', 0)
# for x in result.split("\n"):
# self.existingchannels.add(x)
self.repo_server = HTTPService(oeRuntimeTest.tc.d.getVar('DEPLOY_DIR'), oeRuntimeTest.tc.target.server_ip)
self.repo_server.start()
@classmethod
def tearDownClass(self):
self.repo_server.stop()
#remove created channels to be able to repeat the tests on same image
# (status, result) = oeRuntimeTest.tc.target.run('smart channel --show | grep "\["', 0)
# for x in result.split("\n"):
# if x not in self.existingchannels:
# oeRuntimeTest.tc.target.run('smart channel --remove '+x[1:-1]+' -y', 0)
def add_smart_channel(self):
image_pkgtype = self.tc.d.getVar('IMAGE_PKGTYPE')
deploy_url = 'http://%s:%s/%s' %(self.target.server_ip, self.repo_server.port, image_pkgtype)
pkgarchs = self.tc.d.getVar('PACKAGE_ARCHS').replace("-","_").split()
for arch in os.listdir('%s/%s' % (self.repo_server.root_dir, image_pkgtype)):
if arch in pkgarchs:
self.target.run('smart channel -y --add {a} type=rpm-md baseurl={u}/{a}'.format(a=arch, u=deploy_url), 0)
self.target.run('smart update', 0)
def install_complementary(self, globs=None):
installed_pkgs_file = os.path.join(oeRuntimeTest.tc.d.getVar('WORKDIR'),
"installed_pkgs.txt")
self.pkgs_list = RpmPkgsList(oeRuntimeTest.tc.d, oeRuntimeTest.tc.d.getVar('IMAGE_ROOTFS'), oeRuntimeTest.tc.d.getVar('arch_var'), oeRuntimeTest.tc.d.getVar('os_var'))
with open(installed_pkgs_file, "w+") as installed_pkgs:
installed_pkgs.write(self.pkgs_list.list("arch"))
cmd = [bb.utils.which(os.getenv('PATH'), "oe-pkgdata-util"),
"-p", oeRuntimeTest.tc.d.getVar('PKGDATA_DIR'), "glob", installed_pkgs_file,
globs]
try:
bb.note("Installing complementary packages ...")
complementary_pkgs = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
bb.fatal("Could not compute complementary packages list. Command "
"'%s' returned %d:\n%s" %
(' '.join(cmd), e.returncode, e.output))
return complementary_pkgs.split()
def setUpLocal(self):
self.ptest_log = os.path.join(oeRuntimeTest.tc.d.getVar("TEST_LOG_DIR"), "ptest-%s.log" % oeRuntimeTest.tc.d.getVar('DATETIME'))
@skipUnlessPassed('test_ssh')
def test_ptestrunner(self):
self.add_smart_channel()
(runnerstatus, result) = self.target.run('which ptest-runner', 0)
cond = oeRuntimeTest.hasPackage("ptest-runner") and oeRuntimeTest.hasFeature("ptest") and oeRuntimeTest.hasPackageMatch("-ptest") and (runnerstatus != 0)
if cond:
self.install_packages(self.install_complementary("*-ptest"))
self.install_packages(['ptest-runner'])
(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.copy_from('/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'])
+9
View File
@@ -0,0 +1,9 @@
import unittest
from oeqa.oetest import oeRuntimeTest
from oeqa.utils.qemutinyrunner import *
class QemuTinyTest(oeRuntimeTest):
def test_boot_tiny(self):
(status, output) = self.target.run_serial('uname -a')
self.assertTrue("yocto-tiny" in output, msg="Cannot detect poky tiny boot!")
+35
View File
@@ -0,0 +1,35 @@
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 skipIfNotFeature
from oeqa.runtime.utils.targetbuildproject import TargetBuildProject
class BuildCvsTest(OERuntimeTestCase):
@classmethod
def setUpClass(cls):
uri = 'http://ftp.gnu.org/non-gnu/cvs/source/feature/1.12.13'
uri = '%s/cvs-1.12.13.tar.bz2' % uri
cls.project = TargetBuildProject(cls.tc.target,
uri,
dl_dir = cls.tc.td['DL_DIR'])
cls.project.download_archive()
@classmethod
def tearDownClass(cls):
cls.project.clean()
@OETestID(205)
@skipIfNotFeature('tools-sdk',
'Test requires tools-sdk to be in IMAGE_FEATURES')
@OETestDepends(['ssh.SSHTest.test_ssh'])
def test_cvs(self):
self.assertEqual(self.project.run_configure(), 0,
msg="Running configure failed")
self.assertEqual(self.project.run_make(), 0,
msg="Running make failed")
self.assertEqual(self.project.run_install(), 0,
msg="Running make install failed")
@@ -0,0 +1,31 @@
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 skipIfNotFeature
from oeqa.runtime.utils.targetbuildproject import TargetBuildProject
class GalculatorTest(OERuntimeTestCase):
@classmethod
def setUpClass(cls):
uri = 'http://galculator.mnim.org/downloads/galculator-2.1.4.tar.bz2'
cls.project = TargetBuildProject(cls.tc.target,
uri,
dl_dir = cls.tc.td['DL_DIR'])
cls.project.download_archive()
@classmethod
def tearDownClass(cls):
cls.project.clean()
@OETestID(1526)
@skipIfNotFeature('tools-sdk',
'Test requires tools-sdk to be in IMAGE_FEATURES')
@OETestDepends(['ssh.SSHTest.test_ssh'])
def test_galculator(self):
self.assertEqual(self.project.run_configure(), 0,
msg="Running configure failed")
self.assertEqual(self.project.run_make(), 0,
msg="Running make failed")
@@ -0,0 +1,39 @@
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 skipIfNotFeature
from oeqa.runtime.utils.targetbuildproject import TargetBuildProject
class BuildIptablesTest(OERuntimeTestCase):
@classmethod
def setUpClass(cls):
uri = 'http://downloads.yoctoproject.org/mirror/sources'
uri = '%s/iptables-1.4.13.tar.bz2' % uri
cls.project = TargetBuildProject(cls.tc.target,
uri,
dl_dir = cls.tc.td['DL_DIR'])
cls.project.download_archive()
@classmethod
def tearDownClass(cls):
cls.project.clean()
@OETestID(206)
@skipIfNotFeature('tools-sdk',
'Test requires tools-sdk to be in IMAGE_FEATURES')
@OETestDepends(['ssh.SSHTest.test_ssh'])
def test_iptables(self):
self.assertEqual(self.project.run_configure(), 0,
msg="Running configure failed")
self.assertEqual(self.project.run_make(), 0,
msg="Running make failed")
self.assertEqual(self.project.run_install(), 0,
msg="Running make install failed")
@classmethod
def tearDownClass(self):
self.project.clean()
+30
View File
@@ -0,0 +1,30 @@
from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.depends import OETestDepends
from oeqa.core.decorator.oeid import OETestID
from oeqa.runtime.decorator.package import OEHasPackage
class ConnmanTest(OERuntimeTestCase):
def service_status(self, service):
if oeRuntimeTest.hasFeature("systemd"):
(_, output) = self.target.run('systemctl status -l %s' % service)
return output
else:
return "Unable to get status or logs for %s" % service
@OETestID(961)
@OETestDepends(['ssh.SSHTest.test_ssh'])
@OEHasPackage(["connman"])
def test_connmand_help(self):
(status, output) = self.target.run('/usr/sbin/connmand --help')
msg = 'Failed to get connman help. Output: %s' % output
self.assertEqual(status, 0, msg=msg)
@OETestID(221)
@OETestDepends(['connman.ConnmanTest.test_connmand_help'])
def test_connmand_running(self):
cmd = '%s | grep [c]onnmand' % self.tc.target_cmds['ps']
(status, output) = self.target.run(cmd)
if status != 0:
self.logger.info(self.service_status("connman"))
self.fail("No connmand process running")
+38
View File
@@ -0,0 +1,38 @@
import re
from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.depends import OETestDepends
from oeqa.core.decorator.oeid import OETestID
class DateTest(OERuntimeTestCase):
def setUp(self):
if self.tc.td.get('VIRTUAL-RUNTIME_init_manager') == 'systemd':
self.logger.debug('Stopping systemd-timesyncd daemon')
self.target.run('systemctl stop systemd-timesyncd')
def tearDown(self):
if self.tc.td.get('VIRTUAL-RUNTIME_init_manager') == 'systemd':
self.logger.debug('Starting systemd-timesyncd daemon')
self.target.run('systemctl start systemd-timesyncd')
@OETestID(211)
@OETestDepends(['ssh.SSHTest.test_ssh'])
def test_date(self):
(status, output) = self.target.run('date +"%Y-%m-%d %T"')
msg = 'Failed to get initial date, output: %s' % output
self.assertEqual(status, 0, msg=msg)
oldDate = output
sampleDate = '"2016-08-09 10:00:00"'
(status, output) = self.target.run("date -s %s" % sampleDate)
self.assertEqual(status, 0, msg='Date set failed, output: %s' % output)
(status, output) = self.target.run("date -R")
p = re.match('Tue, 09 Aug 2016 10:00:.. \+0000', output)
msg = 'The date was not set correctly, output: %s' % output
self.assertTrue(p, msg=msg)
(status, output) = self.target.run('date -s "%s"' % oldDate)
msg = 'Failed to reset date, output: %s' % output
self.assertEqual(status, 0, msg=msg)
+13
View File
@@ -0,0 +1,13 @@
from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.depends import OETestDepends
from oeqa.core.decorator.oeid import OETestID
class DfTest(OERuntimeTestCase):
@OETestID(234)
@OETestDepends(['ssh.SSHTest.test_ssh'])
def test_df(self):
cmd = "df / | sed -n '2p' | awk '{print $4}'"
(status,output) = self.target.run(cmd)
msg = 'Not enough space on image. Current size is %s' % output
self.assertTrue(int(output)>5120, msg=msg)
+76
View File
@@ -0,0 +1,76 @@
import os
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 skipIfNotFeature
class GccCompileTest(OERuntimeTestCase):
@classmethod
def setUpClass(cls):
dst = '/tmp/'
src = os.path.join(cls.tc.files_dir, 'test.c')
#dst = '/tmp/test.c'
cls.tc.target.copyTo(src, dst)
src = os.path.join(cls.tc.runtime_files_dir, 'testmakefile')
#dst = '/tmp/testmakefile'
cls.tc.target.copyTo(src, dst)
src = os.path.join(cls.tc.files_dir, 'test.cpp')
#dst = '/tmp/test.cpp'
cls.tc.target.copyTo(src, dst)
@classmethod
def tearDownClass(cls):
files = '/tmp/test.c /tmp/test.o /tmp/test /tmp/testmakefile'
cls.tc.target.run('rm %s' % files)
@OETestID(203)
@skipIfNotFeature('tools-sdk',
'Test requires tools-sdk to be in IMAGE_FEATURES')
@OETestDepends(['ssh.SSHTest.test_ssh'])
def test_gcc_compile(self):
status, output = self.target.run('gcc /tmp/test.c -o /tmp/test -lm')
msg = 'gcc compile failed, output: %s' % output
self.assertEqual(status, 0, msg=msg)
status, output = self.target.run('/tmp/test')
msg = 'running compiled file failed, output: %s' % output
self.assertEqual(status, 0, msg=msg)
@OETestID(200)
@skipIfNotFeature('tools-sdk',
'Test requires tools-sdk to be in IMAGE_FEATURES')
@OETestDepends(['ssh.SSHTest.test_ssh'])
def test_gpp_compile(self):
status, output = self.target.run('g++ /tmp/test.c -o /tmp/test -lm')
msg = 'g++ compile failed, output: %s' % output
self.assertEqual(status, 0, msg=msg)
status, output = self.target.run('/tmp/test')
msg = 'running compiled file failed, output: %s' % output
self.assertEqual(status, 0, msg=msg)
@OETestID(1142)
@skipIfNotFeature('tools-sdk',
'Test requires tools-sdk to be in IMAGE_FEATURES')
@OETestDepends(['ssh.SSHTest.test_ssh'])
def test_gpp2_compile(self):
status, output = self.target.run('g++ /tmp/test.cpp -o /tmp/test -lm')
msg = 'g++ compile failed, output: %s' % output
self.assertEqual(status, 0, msg=msg)
status, output = self.target.run('/tmp/test')
msg = 'running compiled file failed, output: %s' % output
self.assertEqual(status, 0, msg=msg)
@OETestID(204)
@skipIfNotFeature('tools-sdk',
'Test requires tools-sdk to be in IMAGE_FEATURES')
@OETestDepends(['ssh.SSHTest.test_ssh'])
def test_make(self):
status, output = self.target.run('cd /tmp; make -f testmakefile')
msg = 'running make failed, output %s' % output
self.assertEqual(status, 0, msg=msg)
@@ -0,0 +1,40 @@
import os
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 skipIfNotFeature
class KernelModuleTest(OERuntimeTestCase):
@classmethod
def setUpClass(cls):
src = os.path.join(cls.tc.runtime_files_dir, 'hellomod.c')
dst = '/tmp/hellomod.c'
cls.tc.target.copyTo(src, dst)
src = os.path.join(cls.tc.runtime_files_dir, 'hellomod_makefile')
dst = '/tmp/Makefile'
cls.tc.target.copyTo(src, dst)
@classmethod
def tearDownClass(cls):
files = '/tmp/Makefile /tmp/hellomod.c'
cls.tc.target.run('rm %s' % files)
@OETestID(1541)
@skipIfNotFeature('tools-sdk',
'Test requires tools-sdk to be in IMAGE_FEATURES')
@OETestDepends(['gcc.GccCompileTest.test_gcc_compile'])
def test_kernel_module(self):
cmds = [
'cd /usr/src/kernel && make scripts',
'cd /tmp && make',
'cd /tmp && insmod hellomod.ko',
'lsmod | grep hellomod',
'dmesg | grep Hello',
'rmmod hellomod', 'dmesg | grep "Cleaning up hellomod"'
]
for cmd in cmds:
status, output = self.target.run(cmd, 900)
self.assertEqual(status, 0, msg='\n'.join([cmd, output]))
+25
View File
@@ -0,0 +1,25 @@
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 skipIfNotFeature
class LddTest(OERuntimeTestCase):
@OETestID(962)
@skipIfNotFeature('tools-sdk',
'Test requires tools-sdk to be in IMAGE_FEATURES')
@OETestDepends(['ssh.SSHTest.test_ssh'])
def test_ldd_exists(self):
status, output = self.target.run('which ldd')
msg = 'ldd does not exist in PATH: which ldd: %s' % output
self.assertEqual(status, 0, msg=msg)
@OETestID(239)
@OETestDepends(['ldd.LddTest.test_ldd_exists'])
def test_ldd_rtldlist_check(self):
cmd = ('for i in $(which ldd | xargs cat | grep "^RTLDLIST"| '
'cut -d\'=\' -f2|tr -d \'"\'); '
'do test -f $i && echo $i && break; done')
status, output = self.target.run(cmd)
msg = "ldd path not correct or RTLDLIST files don't exist."
self.assertEqual(status, 0, msg=msg)
+42
View File
@@ -0,0 +1,42 @@
# This test should cover https://bugzilla.yoctoproject.org/tr_show_case.cgi?case_id=289 testcase
# Note that the image under test must have logrotate installed
from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.depends import OETestDepends
from oeqa.core.decorator.oeid import OETestID
from oeqa.runtime.decorator.package import OEHasPackage
class LogrotateTest(OERuntimeTestCase):
@classmethod
def tearDownClass(cls):
cls.tc.target.run('rm -rf $HOME/logrotate_dir')
@OETestID(1544)
@OETestDepends(['ssh.SSHTest.test_ssh'])
@OEHasPackage(['logrotate'])
def test_1_logrotate_setup(self):
status, output = self.target.run('mkdir $HOME/logrotate_dir')
msg = 'Could not create logrotate_dir. Output: %s' % output
self.assertEqual(status, 0, msg = msg)
cmd = ('sed -i "s#wtmp {#wtmp {\\n olddir $HOME/logrotate_dir#"'
' /etc/logrotate.conf')
status, output = self.target.run(cmd)
msg = ('Could not write to logrotate.conf file. Status and output: '
' %s and %s' % (status, output))
self.assertEqual(status, 0, msg = msg)
@OETestID(1542)
@OETestDepends(['logrotate.LogrotateTest.test_1_logrotate_setup'])
def test_2_logrotate(self):
status, output = self.target.run('logrotate -f /etc/logrotate.conf')
msg = ('logrotate service could not be reloaded. Status and output: '
'%s and %s' % (status, output))
self.assertEqual(status, 0, msg = msg)
_, output = self.target.run('ls -la $HOME/logrotate_dir/ | wc -l')
msg = ('new logfile could not be created. List of files within log '
'directory: %s' % (
self.target.run('ls -la $HOME/logrotate_dir')[1]))
self.assertTrue(int(output)>=3, msg = msg)
+41
View File
@@ -0,0 +1,41 @@
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 skipIfNotInDataVar
from oeqa.runtime.decorator.package import OEHasPackage
class MultilibTest(OERuntimeTestCase):
def archtest(self, binary, arch):
"""
Check that ``binary`` has the ELF class ``arch`` (e.g. ELF32/ELF64).
"""
status, output = self.target.run('readelf -h %s' % binary)
self.assertEqual(status, 0, 'Failed to readelf %s' % binary)
l = [l.split()[1] for l in output.split('\n') if "Class:" in l]
if l:
theclass = l[0]
else:
self.fail('Cannot parse readelf. Output:\n%s' % output)
msg = "%s isn't %s (is %s)" % (binary, arch, theclass)
self.assertEqual(theclass, arch, msg=msg)
@skipIfNotInDataVar('MULTILIBS', 'multilib:lib32',
"This isn't a multilib:lib32 image")
@OETestID(201)
@OETestDepends(['ssh.SSHTest.test_ssh'])
def test_check_multilib_libc(self):
"""
Check that a multilib image has both 32-bit and 64-bit libc in.
"""
self.archtest("/lib/libc.so.6", "ELF32")
self.archtest("/lib64/libc.so.6", "ELF64")
@OETestID(279)
@OETestDepends(['multilib.MultilibTest.test_check_multilib_libc'])
@OEHasPackage(['lib32-connman'])
def test_file_connman(self):
self.archtest("/usr/sbin/connmand", "ELF32")
+33
View File
@@ -0,0 +1,33 @@
# This test should cover https://bugzilla.yoctoproject.org/tr_show_case.cgi?case_id=287 testcase
# Note that the image under test must have "pam" in DISTRO_FEATURES
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 skipIfNotFeature
class PamBasicTest(OERuntimeTestCase):
@OETestID(1543)
@skipIfNotFeature('pam', 'Test requires pam to be in DISTRO_FEATURES')
@OETestDepends(['ssh.SSHTest.test_ssh'])
def test_pam(self):
status, output = self.target.run('login --help')
msg = ('login command does not work as expected. '
'Status and output:%s and %s' % (status, output))
self.assertEqual(status, 1, msg = msg)
status, output = self.target.run('passwd --help')
msg = ('passwd command does not work as expected. '
'Status and output:%s and %s' % (status, output))
self.assertEqual(status, 0, msg = msg)
status, output = self.target.run('su --help')
msg = ('su command does not work as expected. '
'Status and output:%s and %s' % (status, output))
self.assertEqual(status, 0, msg = msg)
status, output = self.target.run('useradd --help')
msg = ('useradd command does not work as expected. '
'Status and output:%s and %s' % (status, output))
self.assertEqual(status, 0, msg = msg)
+358
View File
@@ -0,0 +1,358 @@
import os
from subprocess import check_output
from shutil import rmtree
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 skipIfDataVar
from oeqa.runtime.decorator.package import OEHasPackage
#in the future these lists could be moved outside of module
errors = ["error", "cannot", "can\'t", "failed"]
common_errors = [
"(WW) warning, (EE) error, (NI) not implemented, (??) unknown.",
"dma timeout",
"can\'t add hid device:",
"usbhid: probe of ",
"_OSC failed (AE_ERROR)",
"_OSC failed (AE_SUPPORT)",
"AE_ALREADY_EXISTS",
"ACPI _OSC request failed (AE_SUPPORT)",
"can\'t disable ASPM",
"Failed to load module \"vesa\"",
"Failed to load module vesa",
"Failed to load module \"modesetting\"",
"Failed to load module modesetting",
"Failed to load module \"glx\"",
"Failed to load module \"fbdev\"",
"Failed to load module fbdev",
"Failed to load module glx",
"[drm] Cannot find any crtc or sizes - going 1024x768",
"_OSC failed (AE_NOT_FOUND); disabling ASPM",
"Open ACPI failed (/var/run/acpid.socket) (No such file or directory)",
"NX (Execute Disable) protection cannot be enabled: non-PAE kernel!",
"hd.: possibly failed opcode",
'NETLINK INITIALIZATION FAILED',
'kernel: Cannot find map file',
'omap_hwmod: debugss: _wait_target_disable failed',
'VGA arbiter: cannot open kernel arbiter, no multi-card support',
'Failed to find URL:http://ipv4.connman.net/online/status.html',
'Online check failed for',
'netlink init failed',
'Fast TSC calibration',
"BAR 0-9",
"Failed to load module \"ati\"",
"controller can't do DEVSLP, turning off",
"stmmac_dvr_probe: warning: cannot get CSR clock",
"error: couldn\'t mount because of unsupported optional features",
"GPT: Use GNU Parted to correct GPT errors",
]
video_related = [
"uvesafb",
]
x86_common = [
'[drm:psb_do_init] *ERROR* Debug is',
'wrong ELF class',
'Could not enable PowerButton event',
'probe of LNXPWRBN:00 failed with error -22',
'pmd_set_huge: Cannot satisfy',
'failed to setup card detect gpio',
'amd_nb: Cannot enumerate AMD northbridges',
'failed to retrieve link info, disabling eDP',
'Direct firmware load for iwlwifi',
] + common_errors
qemux86_common = [
'wrong ELF class',
"fail to add MMCONFIG information, can't access extended PCI configuration space under this bridge.",
"can't claim BAR ",
'amd_nb: Cannot enumerate AMD northbridges',
'uvesafb: 5000 ms task timeout, infinitely waiting',
'tsc: HPET/PMTIMER calibration failed',
] + common_errors
ignore_errors = {
'default' : common_errors,
'qemux86' : [
'Failed to access perfctr msr (MSR',
'pci 0000:00:00.0: [Firmware Bug]: reg 0x..: invalid BAR (can\'t size)',
] + qemux86_common,
'qemux86-64' : qemux86_common,
'qemumips' : [
'Failed to load module "glx"',
'pci 0000:00:00.0: [Firmware Bug]: reg 0x..: invalid BAR (can\'t size)',
] + common_errors,
'qemumips64' : [
'pci 0000:00:00.0: [Firmware Bug]: reg 0x..: invalid BAR (can\'t size)',
] + common_errors,
'qemuppc' : [
'PCI 0000:00 Cannot reserve Legacy IO [io 0x0000-0x0fff]',
'host side 80-wire cable detection failed, limiting max speed',
'mode "640x480" test failed',
'Failed to load module "glx"',
'can\'t handle BAR above 4GB',
'Cannot reserve Legacy IO',
] + common_errors,
'qemuarm' : [
'mmci-pl18x: probe of fpga:05 failed with error -22',
'mmci-pl18x: probe of fpga:0b failed with error -22',
'Failed to load module "glx"',
'OF: amba_device_add() failed (-19) for /amba/smc@10100000',
'OF: amba_device_add() failed (-19) for /amba/mpmc@10110000',
'OF: amba_device_add() failed (-19) for /amba/sctl@101e0000',
'OF: amba_device_add() failed (-19) for /amba/watchdog@101e1000',
'OF: amba_device_add() failed (-19) for /amba/sci@101f0000',
'OF: amba_device_add() failed (-19) for /amba/ssp@101f4000',
'OF: amba_device_add() failed (-19) for /amba/fpga/sci@a000',
'Failed to initialize \'/amba/timer@101e3000\': -22',
'jitterentropy: Initialization failed with host not compliant with requirements: 2',
] + common_errors,
'qemuarm64' : [
'Fatal server error:',
'(EE) Server terminated with error (1). Closing log file.',
'dmi: Firmware registration failed.',
'irq: type mismatch, failed to map hwirq-27 for /intc',
] + common_errors,
'emenlow' : [
'[Firmware Bug]: ACPI: No _BQC method, cannot determine initial brightness',
'(EE) Failed to load module "psb"',
'(EE) Failed to load module psb',
'(EE) Failed to load module "psbdrv"',
'(EE) Failed to load module psbdrv',
'(EE) open /dev/fb0: No such file or directory',
'(EE) AIGLX: reverting to software rendering',
] + x86_common,
'intel-core2-32' : [
'ACPI: No _BQC method, cannot determine initial brightness',
'[Firmware Bug]: ACPI: No _BQC method, cannot determine initial brightness',
'(EE) Failed to load module "psb"',
'(EE) Failed to load module psb',
'(EE) Failed to load module "psbdrv"',
'(EE) Failed to load module psbdrv',
'(EE) open /dev/fb0: No such file or directory',
'(EE) AIGLX: reverting to software rendering',
'dmi: Firmware registration failed.',
'ioremap error for 0x78',
] + x86_common,
'intel-corei7-64' : [
'can\'t set Max Payload Size to 256',
'intel_punit_ipc: can\'t request region for resource',
'[drm] parse error at position 4 in video mode \'efifb\'',
'ACPI Error: Could not enable RealTimeClock event',
'ACPI Warning: Could not enable fixed event - RealTimeClock',
'hci_intel INT33E1:00: Unable to retrieve gpio',
'hci_intel: probe of INT33E1:00 failed',
'can\'t derive routing for PCI INT A',
'failed to read out thermal zone',
'Bluetooth: hci0: Setting Intel event mask failed',
'ttyS2 - failed to request DMA',
] + x86_common,
'crownbay' : x86_common,
'genericx86' : x86_common,
'genericx86-64' : [
'Direct firmware load for i915',
'Failed to load firmware i915',
'Failed to fetch GuC',
'Failed to initialize GuC',
'Failed to load DMC firmware',
'The driver is built-in, so to load the firmware you need to',
] + x86_common,
'edgerouter' : [
'Fatal server error:',
] + common_errors,
'jasperforest' : [
'Activated service \'org.bluez\' failed:',
'Unable to find NFC netlink family',
] + common_errors,
}
log_locations = ["/var/log/","/var/log/dmesg", "/tmp/dmesg_output.log"]
class ParseLogsTest(OERuntimeTestCase):
@classmethod
def setUpClass(cls):
cls.errors = errors
# When systemd is enabled we need to notice errors on
# circular dependencies in units.
if 'systemd' in cls.td.get('DISTRO_FEATURES', ''):
cls.errors.extend([
'Found ordering cycle on',
'Breaking ordering cycle by deleting job',
'deleted to break ordering cycle',
'Ordering cycle found, skipping',
])
cls.ignore_errors = ignore_errors
cls.log_locations = log_locations
cls.msg = ''
is_lsb, _ = cls.tc.target.run("which LSB_Test.sh")
if is_lsb == 0:
for machine in cls.ignore_errors:
cls.ignore_errors[machine] = cls.ignore_errors[machine] \
+ video_related
def getMachine(self):
return self.td.get('MACHINE', '')
def getWorkdir(self):
return self.td.get('WORKDIR', '')
# Get some information on the CPU of the machine to display at the
# beginning of the output. This info might be useful in some cases.
def getHardwareInfo(self):
hwi = ""
cmd = ('cat /proc/cpuinfo | grep "model name" | head -n1 | '
" awk 'BEGIN{FS=\":\"}{print $2}'")
_, cpu_name = self.target.run(cmd)
cmd = ('cat /proc/cpuinfo | grep "cpu cores" | head -n1 | '
"awk {'print $4'}")
_, cpu_physical_cores = self.target.run(cmd)
cmd = 'cat /proc/cpuinfo | grep "processor" | wc -l'
_, cpu_logical_cores = self.target.run(cmd)
_, cpu_arch = self.target.run('uname -m')
hwi += 'Machine information: \n'
hwi += '*******************************\n'
hwi += 'Machine name: ' + self.getMachine() + '\n'
hwi += 'CPU: ' + str(cpu_name) + '\n'
hwi += 'Arch: ' + str(cpu_arch)+ '\n'
hwi += 'Physical cores: ' + str(cpu_physical_cores) + '\n'
hwi += 'Logical cores: ' + str(cpu_logical_cores) + '\n'
hwi += '*******************************\n'
return hwi
# Go through the log locations provided and if it's a folder
# create a list with all the .log files in it, if it's a file
# just add it to that list.
def getLogList(self, log_locations):
logs = []
for location in log_locations:
status, _ = self.target.run('test -f ' + str(location))
if status == 0:
logs.append(str(location))
else:
status, _ = self.target.run('test -d ' + str(location))
if status == 0:
cmd = 'find ' + str(location) + '/*.log -maxdepth 1 -type f'
status, output = self.target.run(cmd)
if status == 0:
output = output.splitlines()
for logfile in output:
logs.append(os.path.join(location, str(logfile)))
return logs
# Copy the log files to be parsed locally
def transfer_logs(self, log_list):
workdir = self.getWorkdir()
self.target_logs = workdir + '/' + 'target_logs'
target_logs = self.target_logs
if os.path.exists(target_logs):
rmtree(self.target_logs)
os.makedirs(target_logs)
for f in log_list:
self.target.copyFrom(str(f), target_logs)
# Get the local list of logs
def get_local_log_list(self, log_locations):
self.transfer_logs(self.getLogList(log_locations))
list_dir = os.listdir(self.target_logs)
dir_files = [os.path.join(self.target_logs, f) for f in list_dir]
logs = [f for f in dir_files if os.path.isfile(f)]
return logs
# Build the grep command to be used with filters and exclusions
def build_grepcmd(self, errors, ignore_errors, log):
grepcmd = 'grep '
grepcmd += '-Ei "'
for error in errors:
grepcmd += error + '|'
grepcmd = grepcmd[:-1]
grepcmd += '" ' + str(log) + " | grep -Eiv \'"
try:
errorlist = ignore_errors[self.getMachine()]
except KeyError:
self.msg += 'No ignore list found for this machine, using default\n'
errorlist = ignore_errors['default']
for ignore_error in errorlist:
ignore_error = ignore_error.replace('(', '\(')
ignore_error = ignore_error.replace(')', '\)')
ignore_error = ignore_error.replace("'", '.')
ignore_error = ignore_error.replace('?', '\?')
ignore_error = ignore_error.replace('[', '\[')
ignore_error = ignore_error.replace(']', '\]')
ignore_error = ignore_error.replace('*', '\*')
ignore_error = ignore_error.replace('0-9', '[0-9]')
grepcmd += ignore_error + '|'
grepcmd = grepcmd[:-1]
grepcmd += "\'"
return grepcmd
# Grep only the errors so that their context could be collected.
# Default context is 10 lines before and after the error itself
def parse_logs(self, errors, ignore_errors, logs,
lines_before = 10, lines_after = 10):
results = {}
rez = []
grep_output = ''
for log in logs:
result = None
thegrep = self.build_grepcmd(errors, ignore_errors, log)
try:
result = check_output(thegrep, shell=True).decode('utf-8')
except:
pass
if result is not None:
results[log.replace('target_logs/','')] = {}
rez = result.splitlines()
for xrez in rez:
try:
cmd = ['grep', '-F', xrez, '-B', str(lines_before)]
cmd += ['-A', str(lines_after), log]
grep_output = check_output(cmd).decode('utf-8')
except:
pass
results[log.replace('target_logs/','')][xrez]=grep_output
return results
# Get the output of dmesg and write it in a file.
# This file is added to log_locations.
def write_dmesg(self):
(status, dmesg) = self.target.run('dmesg > /tmp/dmesg_output.log')
@OETestID(1059)
@OETestDepends(['ssh.SSHTest.test_ssh'])
def test_parselogs(self):
self.write_dmesg()
log_list = self.get_local_log_list(self.log_locations)
result = self.parse_logs(self.errors, self.ignore_errors, log_list)
print(self.getHardwareInfo())
errcount = 0
for log in result:
self.msg += 'Log: ' + log + '\n'
self.msg += '-----------------------\n'
for error in result[log]:
errcount += 1
self.msg += 'Central error: ' + str(error) + '\n'
self.msg += '***********************\n'
self.msg += result[str(log)][str(error)] + '\n'
self.msg += '***********************\n'
self.msg += '%s errors found in logs.' % errcount
self.assertEqual(errcount, 0, msg=self.msg)
+37
View File
@@ -0,0 +1,37 @@
import os
from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.depends import OETestDepends
from oeqa.core.decorator.oeid import OETestID
from oeqa.runtime.decorator.package import OEHasPackage
class PerlTest(OERuntimeTestCase):
@classmethod
def setUpClass(cls):
src = os.path.join(cls.tc.files_dir, 'test.pl')
dst = '/tmp/test.pl'
cls.tc.target.copyTo(src, dst)
@classmethod
def tearDownClass(cls):
dst = '/tmp/test.pl'
cls.tc.target.run('rm %s' % dst)
@OETestID(1141)
@OETestDepends(['ssh.SSHTest.test_ssh'])
@OEHasPackage(['perl'])
def test_perl_exists(self):
status, output = self.target.run('which perl')
msg = 'Perl binary not in PATH or not on target.'
self.assertEqual(status, 0, msg=msg)
@OETestID(208)
@OETestDepends(['perl.PerlTest.test_perl_exists'])
def test_perl_works(self):
status, output = self.target.run('perl /tmp/test.pl')
msg = 'Exit status was not 0. Output: %s' % output
self.assertEqual(status, 0, msg=msg)
msg = 'Incorrect output: %s' % output
self.assertEqual(output, "the value of a is 0.01", msg=msg)
+24
View File
@@ -0,0 +1,24 @@
from subprocess import Popen, PIPE
from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.oeid import OETestID
from oeqa.core.decorator.oetimeout import OETimeout
class PingTest(OERuntimeTestCase):
@OETimeout(30)
@OETestID(964)
def test_ping(self):
output = ''
count = 0
while count < 5:
cmd = 'ping -c 1 %s' % self.target.ip
proc = Popen(cmd, shell=True, stdout=PIPE)
output += proc.communicate()[0].decode('utf-8')
if proc.poll() == 0:
count += 1
else:
count = 0
msg = ('Expected 5 consecutive, got %d.\n'
'ping output is:\n%s' % (count,output))
self.assertEqual(count, 5, msg = msg)
+43
View File
@@ -0,0 +1,43 @@
import os
from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.depends import OETestDepends
from oeqa.core.decorator.oeid import OETestID
from oeqa.runtime.decorator.package import OEHasPackage
class PythonTest(OERuntimeTestCase):
@classmethod
def setUpClass(cls):
src = os.path.join(cls.tc.files_dir, 'test.py')
dst = '/tmp/test.py'
cls.tc.target.copyTo(src, dst)
@classmethod
def tearDownClass(cls):
dst = '/tmp/test.py'
cls.tc.target.run('rm %s' % dst)
@OETestID(1145)
@OETestDepends(['ssh.SSHTest.test_ssh'])
@OEHasPackage(['python-core'])
def test_python_exists(self):
status, output = self.target.run('which python')
msg = 'Python binary not in PATH or not on target.'
self.assertEqual(status, 0, msg=msg)
@OETestID(965)
@OETestDepends(['python.PythonTest.test_python_exists'])
def test_python_stdout(self):
status, output = self.target.run('python /tmp/test.py')
msg = 'Exit status was not 0. Output: %s' % output
self.assertEqual(status, 0, msg=msg)
msg = 'Incorrect output: %s' % output
self.assertEqual(output, "the value of a is 0.01", msg=msg)
@OETestID(1146)
@OETestDepends(['python.PythonTest.test_python_stdout'])
def test_python_testfile(self):
status, output = self.target.run('ls /tmp/testfile.python')
self.assertEqual(status, 0, msg='Python test file generate failed.')
+141
View File
@@ -0,0 +1,141 @@
import os
import fnmatch
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 skipIfDataVar
from oeqa.runtime.decorator.package import OEHasPackage
from oeqa.core.utils.path import findFile
class RpmBasicTest(OERuntimeTestCase):
@classmethod
def setUpClass(cls):
if cls.tc.td['PACKAGE_CLASSES'].split()[0] != 'package_rpm':
cls.skipTest('Tests require image to be build from rpm')
@OETestID(960)
@OETestDepends(['ssh.SSHTest.test_ssh'])
def test_rpm_help(self):
status, output = self.target.run('rpm --help')
msg = 'status and output: %s and %s' % (status, output)
self.assertEqual(status, 0, msg=msg)
@OETestID(191)
@OETestDepends(['rpm.RpmBasicTest.test_rpm_help'])
def test_rpm_query(self):
status, output = self.target.run('rpm -q rpm')
msg = 'status and output: %s and %s' % (status, output)
self.assertEqual(status, 0, msg=msg)
class RpmInstallRemoveTest(OERuntimeTestCase):
@classmethod
def setUpClass(cls):
if cls.tc.td['PACKAGE_CLASSES'].split()[0] != 'package_rpm':
cls.skipTest('Tests require image to be build from rpm')
pkgarch = cls.td['TUNE_PKGARCH'].replace('-', '_')
rpmdir = os.path.join(cls.tc.td['DEPLOY_DIR'], 'rpm', pkgarch)
# Pick rpm-doc as a test file to get installed, because it's small
# and it will always be built for standard targets
rpm_doc = 'rpm-doc-*.%s.rpm' % pkgarch
for f in fnmatch.filter(os.listdir(rpmdir), rpm_doc):
test_file = os.path.join(rpmdir, f)
dst = '/tmp/rpm-doc.rpm'
cls.tc.target.copyTo(test_file, dst)
@classmethod
def tearDownClass(cls):
dst = '/tmp/rpm-doc.rpm'
cls.tc.target.run('rm -f %s' % dst)
@OETestID(192)
@OETestDepends(['rpm.RpmBasicTest.test_rpm_help'])
def test_rpm_install(self):
status, output = self.target.run('rpm -ivh /tmp/rpm-doc.rpm')
msg = 'Failed to install rpm-doc package: %s' % output
self.assertEqual(status, 0, msg=msg)
@OETestID(194)
@OETestDepends(['rpm.RpmInstallRemoveTest.test_rpm_install'])
def test_rpm_remove(self):
status,output = self.target.run('rpm -e rpm-doc')
msg = 'Failed to remove rpm-doc package: %s' % output
self.assertEqual(status, 0, msg=msg)
@OETestID(1096)
@OETestDepends(['rpm.RpmBasicTest.test_rpm_query'])
def test_rpm_query_nonroot(self):
def set_up_test_user(u):
status, output = self.target.run('id -u %s' % u)
if status:
status, output = self.target.run('useradd %s' % u)
msg = 'Failed to create new user: %s' % output
self.assertTrue(status == 0, msg=msg)
def exec_as_test_user(u):
status, output = self.target.run('su -c id %s' % u)
msg = 'Failed to execute as new user'
self.assertTrue("({0})".format(u) in output, msg=msg)
status, output = self.target.run('su -c "rpm -qa" %s ' % u)
msg = 'status: %s. Cannot run rpm -qa: %s' % (status, output)
self.assertEqual(status, 0, msg=msg)
def unset_up_test_user(u):
status, output = self.target.run('userdel -r %s' % u)
msg = 'Failed to erase user: %s' % output
self.assertTrue(status == 0, msg=msg)
tuser = 'test1'
try:
set_up_test_user(tuser)
exec_as_test_user(tuser)
finally:
unset_up_test_user(tuser)
@OETestID(195)
@OETestDepends(['rpm.RpmInstallRemoveTest.test_rpm_remove'])
def test_check_rpm_install_removal_log_file_size(self):
"""
Summary: Check rpm install/removal log file size
Expected: There should be some method to keep rpm log in a small size .
Product: BSPs
Author: Alexandru Georgescu <alexandru.c.georgescu@intel.com>
AutomatedBy: Daniel Istrate <daniel.alexandrux.istrate@intel.com>
"""
db_files_cmd = 'ls /var/lib/rpm/__db.*'
get_log_size_cmd = "du /var/lib/rpm/log/log.* | awk '{print $1}'"
# Make sure that some database files are under /var/lib/rpm as '__db.xxx'
status, output = self.target.run(db_files_cmd)
msg = 'Failed to find database files under /var/lib/rpm/ as __db.xxx'
self.assertEqual(0, status, msg=msg)
# Remove the package just in case
self.target.run('rpm -e rpm-doc')
# Install/Remove a package 10 times
for i in range(10):
status, output = self.target.run('rpm -ivh /tmp/rpm-doc.rpm')
msg = 'Failed to install rpm-doc package. Reason: {}'.format(output)
self.assertEqual(0, status, msg=msg)
status, output = self.target.run('rpm -e rpm-doc')
msg = 'Failed to remove rpm-doc package. Reason: {}'.format(output)
self.assertEqual(0, status, msg=msg)
# Get the size of log file
status, output = self.target.run(get_log_size_cmd)
msg = 'Failed to get the final size of the log file.'
self.assertEqual(0, status, msg=msg)
# Compare each log size
for log_file_size in output:
msg = ('Log file size is greater that expected (~10MB), '
'found {} bytes'.format(log_file_size))
self.assertLessEqual(int(log_file_size), 11264, msg=msg)
+26
View File
@@ -0,0 +1,26 @@
from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.depends import OETestDepends
from oeqa.core.decorator.oeid import OETestID
from oeqa.runtime.decorator.package import OEHasPackage
class ScanelfTest(OERuntimeTestCase):
scancmd = 'scanelf --quiet --recursive --mount --ldpath --path'
@OETestID(966)
@OETestDepends(['ssh.SSHTest.test_ssh'])
@OEHasPackage(['pax-utils'])
def test_scanelf_textrel(self):
# print TEXTREL information
cmd = '%s --textrel' % self.scancmd
status, output = self.target.run(cmd)
msg = '\n'.join([cmd, output])
self.assertEqual(output.strip(), '', msg=msg)
@OETestID(967)
@OETestDepends(['scanelf.ScanelfTest.test_scanelf_textrel'])
def test_scanelf_rpath(self):
# print RPATH information
cmd = '%s --textrel --rpath' % self.scancmd
status, output = self.target.run(cmd)
msg = '\n'.join([cmd, output])
self.assertEqual(output.strip(), '', msg=msg)
+33
View File
@@ -0,0 +1,33 @@
import os
from tempfile import mkstemp
from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.depends import OETestDepends
from oeqa.core.decorator.oeid import OETestID
class ScpTest(OERuntimeTestCase):
@classmethod
def setUpClass(cls):
cls.tmp_fd, cls.tmp_path = mkstemp()
with os.fdopen(cls.tmp_fd, 'w') as f:
f.seek(2 ** 22 -1)
f.write(os.linesep)
@classmethod
def tearDownClass(cls):
os.remove(cls.tmp_path)
@OETestID(220)
@OETestDepends(['ssh.SSHTest.test_ssh'])
def test_scp_file(self):
dst = '/tmp/test_scp_file'
(status, output) = self.target.copyTo(self.tmp_path, dst)
msg = 'File could not be copied. Output: %s' % output
self.assertEqual(status, 0, msg=msg)
(status, output) = self.target.run('ls -la %s' % dst)
self.assertEqual(status, 0, msg = 'SCP test failed')
self.target.run('rm %s' % dst)
@@ -0,0 +1,33 @@
# This test should cover https://bugzilla.yoctoproject.org/tr_show_case.cgi?case_id=284
# testcase. Image under test must have meta-skeleton layer in bblayers and
# IMAGE_INSTALL_append = " service" in local.conf
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 skipIfDataVar
from oeqa.runtime.decorator.package import OEHasPackage
class SkeletonBasicTest(OERuntimeTestCase):
@OETestDepends(['ssh.SSHTest.test_ssh'])
@OEHasPackage(['service'])
@skipIfDataVar('VIRTUAL-RUNTIME_init_manager', 'systemd',
'Not appropiate for systemd image')
def test_skeleton_availability(self):
status, output = self.target.run('ls /etc/init.d/skeleton')
msg = 'skeleton init script not found. Output:\n%s' % output
self.assertEqual(status, 0, msg=msg)
status, output = self.target.run('ls /usr/sbin/skeleton-test')
msg = 'skeleton-test not found. Output:\n%s' % output
self.assertEqual(status, 0, msg=msg)
@OETestID(284)
@OETestDepends(['skeletoninit.SkeletonBasicTest.test_skeleton_availability'])
def test_skeleton_script(self):
output1 = self.target.run("/etc/init.d/skeleton start")[1]
cmd = '%s | grep [s]keleton-test' % self.tc.target_cmds['ps']
status, output2 = self.target.run(cmd)
msg = ('Skeleton script could not be started:'
'\n%s\n%s' % (output1, output2))
self.assertEqual(status, 0, msg=msg)
+218
View File
@@ -0,0 +1,218 @@
import unittest
import re
import oe
import subprocess
from oeqa.oetest import oeRuntimeTest, skipModule
from oeqa.utils.decorators import *
from oeqa.utils.httpserver import HTTPService
def setUpModule():
if not oeRuntimeTest.hasFeature("package-management"):
skipModule("Image doesn't have package management feature")
if not oeRuntimeTest.hasPackage("smartpm"):
skipModule("Image doesn't have smart installed")
if "package_rpm" != oeRuntimeTest.tc.d.getVar("PACKAGE_CLASSES").split()[0]:
skipModule("Rpm is not the primary package manager")
class SmartTest(oeRuntimeTest):
@skipUnlessPassed('test_smart_help')
def smart(self, command, expected = 0):
command = 'smart %s' % command
status, output = self.target.run(command, 1500)
message = os.linesep.join([command, output])
self.assertEqual(status, expected, message)
self.assertFalse("Cannot allocate memory" in output, message)
return output
class SmartBasicTest(SmartTest):
@testcase(716)
@skipUnlessPassed('test_ssh')
def test_smart_help(self):
self.smart('--help')
@testcase(968)
def test_smart_version(self):
self.smart('--version')
@testcase(721)
def test_smart_info(self):
self.smart('info python-smartpm')
@testcase(421)
def test_smart_query(self):
self.smart('query python-smartpm')
@testcase(720)
def test_smart_search(self):
self.smart('search python-smartpm')
@testcase(722)
def test_smart_stats(self):
self.smart('stats')
class SmartRepoTest(SmartTest):
@classmethod
def create_index(self, arg):
index_cmd = arg
try:
bb.note("Executing '%s' ..." % index_cmd)
result = subprocess.check_output(index_cmd, stderr=subprocess.STDOUT, shell=True).decode("utf-8")
except subprocess.CalledProcessError as e:
return("Index creation command '%s' failed with return code %d:\n%s" %
(e.cmd, e.returncode, e.output.decode("utf-8")))
if result:
bb.note(result)
return None
@classmethod
def setUpClass(self):
self.repolist = []
# Index RPMs
rpm_createrepo = bb.utils.which(os.getenv('PATH'), "createrepo")
index_cmds = []
rpm_dirs_found = False
archs = (oeRuntimeTest.tc.d.getVar('ALL_MULTILIB_PACKAGE_ARCHS') or "").replace('-', '_').split()
for arch in archs:
rpm_dir = os.path.join(oeRuntimeTest.tc.d.getVar('DEPLOY_DIR_RPM'), arch)
idx_path = os.path.join(oeRuntimeTest.tc.d.getVar('WORKDIR'), 'rpm', arch)
db_path = os.path.join(oeRuntimeTest.tc.d.getVar('WORKDIR'), 'rpmdb', arch)
if not os.path.isdir(rpm_dir):
continue
if os.path.exists(db_path):
bb.utils.remove(dbpath, True)
lockfilename = oeRuntimeTest.tc.d.getVar('DEPLOY_DIR_RPM') + "/rpm.lock"
lf = bb.utils.lockfile(lockfilename, False)
oe.path.copyhardlinktree(rpm_dir, idx_path)
# Full indexes overload a 256MB image so reduce the number of rpms
# in the feed. Filter to p* since we use the psplash packages and
# this leaves some allarch and machine arch packages too.
bb.utils.remove(idx_path + "*/[a-oq-z]*.rpm")
bb.utils.unlockfile(lf)
index_cmds.append("%s --dbpath %s --update -q %s" % (rpm_createrepo, db_path, idx_path))
rpm_dirs_found = True
# Create repodata¬
result = oe.utils.multiprocess_exec(index_cmds, self.create_index)
if result:
bb.fatal('%s' % ('\n'.join(result)))
self.repo_server = HTTPService(oeRuntimeTest.tc.d.getVar('WORKDIR'), oeRuntimeTest.tc.target.server_ip)
self.repo_server.start()
@classmethod
def tearDownClass(self):
self.repo_server.stop()
for i in self.repolist:
oeRuntimeTest.tc.target.run('smart channel -y --remove '+str(i))
@testcase(1143)
def test_smart_channel(self):
self.smart('channel', 1)
@testcase(719)
def test_smart_channel_add(self):
image_pkgtype = self.tc.d.getVar('IMAGE_PKGTYPE')
deploy_url = 'http://%s:%s/%s' %(self.target.server_ip, self.repo_server.port, image_pkgtype)
pkgarchs = self.tc.d.getVar('PACKAGE_ARCHS').replace("-","_").split()
for arch in os.listdir('%s/%s' % (self.repo_server.root_dir, image_pkgtype)):
if arch in pkgarchs:
self.smart('channel -y --add {a} type=rpm-md baseurl={u}/{a}'.format(a=arch, u=deploy_url))
self.repolist.append(arch)
self.smart('update')
@testcase(969)
def test_smart_channel_help(self):
self.smart('channel --help')
@testcase(970)
def test_smart_channel_list(self):
self.smart('channel --list')
@testcase(971)
def test_smart_channel_show(self):
self.smart('channel --show')
@testcase(717)
def test_smart_channel_rpmsys(self):
self.smart('channel --show rpmsys')
self.smart('channel --disable rpmsys')
self.smart('channel --enable rpmsys')
@testcase(1144)
@skipUnlessPassed('test_smart_channel_add')
def test_smart_install(self):
self.smart('remove -y psplash-default')
self.smart('install -y psplash-default')
@testcase(728)
@skipUnlessPassed('test_smart_install')
def test_smart_install_dependency(self):
self.smart('remove -y psplash')
self.smart('install -y psplash-default')
@testcase(723)
@skipUnlessPassed('test_smart_channel_add')
def test_smart_install_from_disk(self):
self.smart('remove -y psplash-default')
self.smart('download psplash-default')
self.smart('install -y ./psplash-default*')
@testcase(725)
@skipUnlessPassed('test_smart_channel_add')
def test_smart_install_from_http(self):
output = self.smart('download --urls psplash-default')
url = re.search('(http://.*/psplash-default.*\.rpm)', output)
self.assertTrue(url, msg="Couln't find download url in %s" % output)
self.smart('remove -y psplash-default')
self.smart('install -y %s' % url.group(0))
@testcase(729)
@skipUnlessPassed('test_smart_install')
def test_smart_reinstall(self):
self.smart('reinstall -y psplash-default')
@testcase(727)
@skipUnlessPassed('test_smart_channel_add')
def test_smart_remote_repo(self):
self.smart('update')
self.smart('install -y psplash')
self.smart('remove -y psplash')
@testcase(726)
def test_smart_local_dir(self):
self.target.run('mkdir /tmp/myrpmdir')
self.smart('channel --add myrpmdir type=rpm-dir path=/tmp/myrpmdir -y')
self.target.run('cd /tmp/myrpmdir')
self.smart('download psplash')
output = self.smart('channel --list')
for i in output.split("\n"):
if ("rpmsys" != str(i)) and ("myrpmdir" != str(i)):
self.smart('channel --disable '+str(i))
self.target.run('cd $HOME')
self.smart('install psplash')
for i in output.split("\n"):
if ("rpmsys" != str(i)) and ("myrpmdir" != str(i)):
self.smart('channel --enable '+str(i))
self.smart('channel --remove myrpmdir -y')
self.target.run("rm -rf /tmp/myrpmdir")
@testcase(718)
def test_smart_add_rpmdir(self):
self.target.run('mkdir /tmp/myrpmdir')
self.smart('channel --add myrpmdir type=rpm-dir path=/tmp/myrpmdir -y')
self.smart('channel --disable myrpmdir -y')
output = self.smart('channel --show myrpmdir')
self.assertTrue("disabled = yes" in output, msg="Failed to disable rpm dir")
self.smart('channel --enable myrpmdir -y')
output = self.smart('channel --show myrpmdir')
self.assertFalse("disabled = yes" in output, msg="Failed to enable rpm dir")
self.smart('channel --remove myrpmdir -y')
self.target.run("rm -rf /tmp/myrpmdir")
@testcase(731)
@skipUnlessPassed('test_smart_channel_add')
def test_smart_remove_package(self):
self.smart('install -y psplash')
self.smart('remove -y psplash')
+15
View File
@@ -0,0 +1,15 @@
from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.depends import OETestDepends
from oeqa.core.decorator.oeid import OETestID
class SSHTest(OERuntimeTestCase):
@OETestID(224)
@OETestDepends(['ping.PingTest.test_ping'])
def test_ssh(self):
(status, output) = self.target.run('uname -a')
self.assertEqual(status, 0, msg='SSH Test failed: %s' % output)
(status, output) = self.target.run('cat /etc/masterimage')
msg = "This isn't the right image - /etc/masterimage " \
"shouldn't be here %s" % output
self.assertEqual(status, 1, msg=msg)
+57
View File
@@ -0,0 +1,57 @@
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 skipIfDataVar
from oeqa.runtime.decorator.package import OEHasPackage
class SyslogTest(OERuntimeTestCase):
@OETestID(201)
@OETestDepends(['ssh.SSHTest.test_ssh'])
@OEHasPackage(["busybox-syslog", "sysklogd"])
def test_syslog_running(self):
cmd = '%s | grep -i [s]yslogd' % self.tc.target_cmds['ps']
status, output = self.target.run(cmd)
msg = "No syslogd process; ps output: %s" % output
self.assertEqual(status, 0, msg=msg)
class SyslogTestConfig(OERuntimeTestCase):
@OETestID(1149)
@OETestDepends(['syslog.SyslogTest.test_syslog_running'])
def test_syslog_logger(self):
status, output = self.target.run('logger foobar')
msg = "Can't log into syslog. Output: %s " % output
self.assertEqual(status, 0, msg=msg)
status, output = self.target.run('grep foobar /var/log/messages')
if status != 0:
if self.tc.td.get("VIRTUAL-RUNTIME_init_manager") == "systemd":
status, output = self.target.run('journalctl -o cat | grep foobar')
else:
status, output = self.target.run('logread | grep foobar')
msg = ('Test log string not found in /var/log/messages or logread.'
' Output: %s ' % output)
self.assertEqual(status, 0, msg=msg)
@OETestID(202)
@OETestDepends(['syslog.SyslogTestConfig.test_syslog_logger'])
@OEHasPackage(["!sysklogd", "busybox"])
@skipIfDataVar('VIRTUAL-RUNTIME_init_manager', 'systemd',
'Not appropiate for systemd image')
def test_syslog_startup_config(self):
cmd = 'echo "LOGFILE=/var/log/test" >> /etc/syslog-startup.conf'
self.target.run(cmd)
status, output = self.target.run('/etc/init.d/syslog restart')
msg = ('Could not restart syslog service. Status and output:'
' %s and %s' % (status,output))
self.assertEqual(status, 0, msg)
cmd = 'logger foobar && grep foobar /var/log/test'
status,output = self.target.run(cmd)
msg = 'Test log string not found. Output: %s ' % output
self.assertEqual(status, 0, msg=msg)
cmd = "sed -i 's#LOGFILE=/var/log/test##' /etc/syslog-startup.conf"
self.target.run(cmd)
self.target.run('/etc/init.d/syslog restart')
+181
View File
@@ -0,0 +1,181 @@
import re
import time
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 skipIfDataVar, skipIfNotDataVar
from oeqa.runtime.decorator.package import OEHasPackage
from oeqa.core.decorator.data import skipIfNotFeature
class SystemdTest(OERuntimeTestCase):
def systemctl(self, action='', target='', expected=0, verbose=False):
command = 'systemctl %s %s' % (action, target)
status, output = self.target.run(command)
message = '\n'.join([command, output])
if status != expected and verbose:
cmd = 'systemctl status --full %s' % target
message += self.target.run(cmd)[1]
self.assertEqual(status, expected, message)
return output
#TODO: use pyjournalctl instead
def journalctl(self, args='',l_match_units=None):
"""
Request for the journalctl output to the current target system
Arguments:
-args, an optional argument pass through argument
-l_match_units, an optional list of units to filter the output
Returns:
-string output of the journalctl command
Raises:
-AssertionError, on remote commands that fail
-ValueError, on a journalctl call with filtering by l_match_units that
returned no entries
"""
query_units=''
if l_match_units:
query_units = ['_SYSTEMD_UNIT='+unit for unit in l_match_units]
query_units = ' '.join(query_units)
command = 'journalctl %s %s' %(args, query_units)
status, output = self.target.run(command)
if status:
raise AssertionError("Command '%s' returned non-zero exit "
'code %d:\n%s' % (command, status, output))
if len(output) == 1 and "-- No entries --" in output:
raise ValueError('List of units to match: %s, returned no entries'
% l_match_units)
return output
class SystemdBasicTests(SystemdTest):
def settle(self):
"""
Block until systemd has finished activating any units being activated,
or until two minutes has elapsed.
Returns a tuple, either (True, '') if all units have finished
activating, or (False, message string) if there are still units
activating (generally, failing units that restart).
"""
endtime = time.time() + (60 * 2)
while True:
status, output = self.target.run('systemctl --state=activating')
if "0 loaded units listed" in output:
return (True, '')
if time.time() >= endtime:
return (False, output)
time.sleep(10)
@skipIfNotFeature('systemd',
'Test requires systemd to be in DISTRO_FEATURES')
@skipIfNotDataVar('VIRTUAL-RUNTIME_init_manager', 'systemd',
'systemd is not the init manager for this image')
@OETestDepends(['ssh.SSHTest.test_ssh'])
def test_systemd_basic(self):
self.systemctl('--version')
@OETestID(551)
@OETestDepends(['systemd.SystemdBasicTests.test_systemd_basic'])
def test_systemd_list(self):
self.systemctl('list-unit-files')
@OETestID(550)
@OETestDepends(['systemd.SystemdBasicTests.test_systemd_basic'])
def test_systemd_failed(self):
settled, output = self.settle()
msg = "Timed out waiting for systemd to settle:\n%s" % output
self.assertTrue(settled, msg=msg)
output = self.systemctl('list-units', '--failed')
match = re.search('0 loaded units listed', output)
if not match:
output += self.systemctl('status --full --failed')
self.assertTrue(match, msg='Some systemd units failed:\n%s' % output)
class SystemdServiceTests(SystemdTest):
@OEHasPackage(['avahi-daemon'])
@OETestDepends(['systemd.SystemdBasicTests.test_systemd_basic'])
def test_systemd_status(self):
self.systemctl('status --full', 'avahi-daemon.service')
@OETestID(695)
@OETestDepends(['systemd.SystemdServiceTests.test_systemd_status'])
def test_systemd_stop_start(self):
self.systemctl('stop', 'avahi-daemon.service')
self.systemctl('is-active', 'avahi-daemon.service',
expected=3, verbose=True)
self.systemctl('start','avahi-daemon.service')
self.systemctl('is-active', 'avahi-daemon.service', verbose=True)
@OETestID(696)
@OETestDepends(['systemd.SystemdServiceTests.test_systemd_status'])
def test_systemd_disable_enable(self):
self.systemctl('disable', 'avahi-daemon.service')
self.systemctl('is-enabled', 'avahi-daemon.service', expected=1)
self.systemctl('enable', 'avahi-daemon.service')
self.systemctl('is-enabled', 'avahi-daemon.service')
class SystemdJournalTests(SystemdTest):
@OETestDepends(['systemd.SystemdBasicTests.test_systemd_basic'])
def test_systemd_journal(self):
status, output = self.target.run('journalctl')
self.assertEqual(status, 0, output)
@OETestDepends(['systemd.SystemdBasicTests.test_systemd_basic'])
def test_systemd_boot_time(self, systemd_TimeoutStartSec=90):
"""
Get the target boot time from journalctl and log it
Arguments:
-systemd_TimeoutStartSec, an optional argument containing systemd's
unit start timeout to compare against
"""
# The expression chain that uniquely identifies the time boot message.
expr_items=['Startup finished', 'kernel', 'userspace','\.$']
try:
output = self.journalctl(args='-o cat --reverse')
except AssertionError:
self.fail('Error occurred while calling journalctl')
if not len(output):
self.fail('Error, unable to get startup time from systemd journal')
# Check for the regular expression items that match the startup time.
for line in output.split('\n'):
check_match = ''.join(re.findall('.*'.join(expr_items), line))
if check_match:
break
# Put the startup time in the test log
if check_match:
self.tc.logger.info('%s' % check_match)
else:
self.skipTest('Error at obtaining the boot time from journalctl')
boot_time_sec = 0
# Get the numeric values from the string and convert them to seconds
# same data will be placed in list and string for manipulation.
l_boot_time = check_match.split(' ')[-2:]
s_boot_time = ' '.join(l_boot_time)
try:
# Obtain the minutes it took to boot.
if l_boot_time[0].endswith('min') and l_boot_time[0][0].isdigit():
boot_time_min = s_boot_time.split('min')[0]
# Convert to seconds and accumulate it.
boot_time_sec += int(boot_time_min) * 60
# Obtain the seconds it took to boot and accumulate.
boot_time_sec += float(l_boot_time[1].split('s')[0])
except ValueError:
self.skipTest('Error when parsing time from boot string')
# Assert the target boot time against systemd's unit start timeout.
if boot_time_sec > systemd_TimeoutStartSec:
msg = ("Target boot time %s exceeds systemd's TimeoutStartSec %s"
% (boot_time_sec, systemd_TimeoutStartSec))
self.tc.logger.info(msg)
+19
View File
@@ -0,0 +1,19 @@
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 skipIfNotInDataVar
class X32libTest(OERuntimeTestCase):
@skipIfNotInDataVar('DEFAULTTUNE', 'x86-64-x32',
'DEFAULTTUNE is not set to x86-64-x32')
@OETestID(281)
@OETestDepends(['ssh.SSHTest.test_ssh'])
def test_x32_file(self):
cmd = 'readelf -h /bin/ls | grep Class | grep ELF32'
status1 = self.target.run(cmd)[0]
cmd = 'readelf -h /bin/ls | grep Machine | grep X86-64'
status2 = self.target.run(cmd)[0]
msg = ("/bin/ls isn't an X86-64 ELF32 binary. readelf says: %s" %
self.target.run("readelf -h /bin/ls")[1])
self.assertTrue(status1 == 0 and status2 == 0, msg=msg)
+17
View File
@@ -0,0 +1,17 @@
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 skipIfNotFeature
class XorgTest(OERuntimeTestCase):
@OETestID(1151)
@skipIfNotFeature('x11-base',
'Test requires x11 to be in IMAGE_FEATURES')
@OETestDepends(['ssh.SSHTest.test_ssh'])
def test_xorg_running(self):
cmd ='%s | grep -v xinit | grep [X]org' % self.tc.target_cmds['ps']
status, output = self.target.run(cmd)
msg = ('Xorg does not appear to be running %s' %
self.target.run(self.tc.target_cmds['ps'])[1])
self.assertEqual(status, 0, msg=msg)