testimage: use the new targetcontrol.py module for running tests

This patch makes the necessary changes for using the targetcontrol.py module
so that one can run the same tests on a qemu instance or a remote machine
based on the value of TEST_TARGET variable: "qemu" or "simpleremote".
The default value is "qemu" which starts a qemu instance and it's the
with what we currently have.

With "simpleremote", the remote machine must be up with network and ssh
and you need to set TEST_TARGET_IP with the IP address of the remote machine
(it can still be a qemu instance that was manually started).

Basically testimage.bbclass now does something along the lines of:
 - load tests -> deploy (prepare) / start target -> run tests.
There were a couple of changes necessary for tests and
also some cleanups/renames that were needed to adjust this change. (use
ip everywhere when refering to target and server_ip when refering to host/build machine)
Also two unnecessary and unsed methods were dropped from sshcontrol.

[ YOCTO #5554 ]

(From OE-Core rev: a7820350fa3271d78ed7476e02f4aef593be1125)

Signed-off-by: Stefan Stanacar <stefanx.stanacar@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Stefan Stanacar
2013-11-26 11:18:22 +02:00
committed by Richard Purdie
parent fd2d16519d
commit b4d9b4208b
7 changed files with 89 additions and 118 deletions

View File

@@ -34,13 +34,19 @@ TEST_SUITES ?= "${DEFAULT_TEST_SUITES}"
TEST_QEMUBOOT_TIMEOUT ?= "1000"
TEST_TARGET ?= "qemu"
TEST_TARGET_IP ?= ""
TEST_SERVER_IP ?= ""
TESTIMAGEDEPENDS = ""
TESTIMAGEDEPENDS_qemuall = "qemu-native:do_populate_sysroot qemu-helper-native:do_populate_sysroot"
python do_testimage() {
testimage_main(d)
}
addtask testimage
do_testimage[nostamp] = "1"
do_testimage[depends] += "qemu-native:do_populate_sysroot"
do_testimage[depends] += "qemu-helper-native:do_populate_sysroot"
do_testimage[depends] += "${TESTIMAGEDEPENDS}"
def get_tests_list(d):
@@ -83,15 +89,12 @@ def testimage_main(d):
import unittest
import os
import oeqa.runtime
import re
import shutil
import time
from oeqa.oetest import runTests
from oeqa.utils.sshcontrol import SSHControl
from oeqa.utils.qemurunner import QemuRunner
from oeqa.oetest import loadTests, runTests
from oeqa.targetcontrol import get_target_controller
testdir = d.getVar("TEST_LOG_DIR", True)
bb.utils.mkdirhier(testdir)
pn = d.getVar("PN", True)
bb.utils.mkdirhier(d.getVar("TEST_LOG_DIR", True))
# tests in TEST_SUITES become required tests
# they won't be skipped even if they aren't suitable for a image (like xorg for minimal)
@@ -99,81 +102,46 @@ def testimage_main(d):
testslist = get_tests_list(d)
testsrequired = [t for t in d.getVar("TEST_SUITES", True).split() if t != "auto"]
# the robot dance
target = get_target_controller(d)
class TestContext:
def __init__(self):
self.d = d
self.testslist = testslist
self.testsrequired = testsrequired
self.filesdir = os.path.join(os.path.dirname(os.path.abspath(oeqa.runtime.__file__)),"files")
self.target = target
# test context
tc = TestContext()
# prepare qemu instance
# and boot each supported fs type
machine=d.getVar("MACHINE", True)
#will handle fs type eventually, stick with ext3 for now
#make a copy of the original rootfs and use that for tests
origrootfs=os.path.join(d.getVar("DEPLOY_DIR_IMAGE", True), d.getVar("IMAGE_LINK_NAME",True) + '.ext3')
testrootfs=os.path.join(testdir, d.getVar("IMAGE_LINK_NAME", True) + '-testimage.ext3')
# this is a dummy load of tests
# we are doing that to find compile errors in the tests themselves
# before booting the image
try:
shutil.copyfile(origrootfs, testrootfs)
loadTests(tc)
except Exception as e:
bb.fatal("Error copying rootfs: %s" % e)
bb.fatal("Loading tests failed:\n %s" % e)
target.deploy()
try:
boottime = int(d.getVar("TEST_QEMUBOOT_TIMEOUT", True))
except ValueError:
boottime = 1000
qemu = QemuRunner(machine=machine, rootfs=testrootfs,
tmpdir = d.getVar("TMPDIR", True),
deploy_dir_image = d.getVar("DEPLOY_DIR_IMAGE", True),
display = d.getVar("BB_ORIGENV", False).getVar("DISPLAY", True),
logfile = os.path.join(testdir, "qemu_boot_log.%s" % d.getVar('DATETIME', True)),
boottime = boottime)
qemuloglink = os.path.join(testdir, "qemu_boot_log")
if os.path.islink(qemuloglink):
os.unlink(qemuloglink)
os.symlink(qemu.logfile, qemuloglink)
sshlog = os.path.join(testdir, "ssh_target_log.%s" % d.getVar('DATETIME', True))
sshloglink = os.path.join(testdir, "ssh_target_log")
if os.path.islink(sshloglink):
os.unlink(sshloglink)
os.symlink(sshlog, sshloglink)
bb.note("DISPLAY value: %s" % qemu.display)
bb.note("rootfs file: %s" % qemu.rootfs)
bb.note("Qemu log file: %s" % qemu.logfile)
bb.note("SSH log file: %s" % sshlog)
pn = d.getVar("PN", True)
#catch exceptions when loading or running tests (mostly our own errors)
try:
if qemu.launch():
# set more context - ssh instance and qemu
# we do these here because we needed qemu to boot and get the ip
tc.qemu = qemu
tc.target = SSHControl(host=qemu.ip,logfile=sshlog)
# run tests and get the results
starttime = time.time()
result = runTests(tc)
stoptime = time.time()
if result.wasSuccessful():
bb.plain("%s - Ran %d test%s in %.3fs" % (pn, result.testsRun, result.testsRun != 1 and "s" or "", stoptime - starttime))
msg = "%s - OK - All required tests passed" % pn
skipped = len(result.skipped)
if skipped:
msg += " (skipped=%d)" % skipped
bb.plain(msg)
else:
raise bb.build.FuncFailed("%s - FAILED - check the task log and the ssh log" % pn )
target.start()
# run tests and get the results
starttime = time.time()
result = runTests(tc)
stoptime = time.time()
if result.wasSuccessful():
bb.plain("%s - Ran %d test%s in %.3fs" % (pn, result.testsRun, result.testsRun != 1 and "s" or "", stoptime - starttime))
msg = "%s - OK - All required tests passed" % pn
skipped = len(result.skipped)
if skipped:
msg += " (skipped=%d)" % skipped
bb.plain(msg)
else:
raise bb.build.FuncFailed("%s - FAILED to start qemu - check the task log and the boot log" % pn)
raise bb.build.FuncFailed("%s - FAILED - check the task log and the ssh log" % pn )
finally:
qemu.kill()
target.stop()
testimage_main[vardepsexclude] =+ "BB_ORIGENV"