OEQA on Arm FVPs

OE-Core's oeqa framework provides a method of performing runtime tests on machines using the testimage Yocto task. meta-arm has good support for writing test cases against Arm FVPs, meaning the runfvp boot configuration can be re-used.

Tests can be configured to run automatically post-build by setting the variable TESTIMAGE_AUTO="1", e.g. in your Kas file or local.conf.

meta-arm provides the OEFVPTarget which must be set up in the machine configuration:

TEST_TARGET = "OEFVPTarget"
TEST_SERVER_IP = "127.0.0.1"
TEST_TARGET_IP = "127.0.0.1:2222"
IMAGE_FEATURES:append = " ssh-server-dropbear"
FVP_CONFIG[bp.virtio_net.hostbridge.userNetPorts] ?= "2222=22"
FVP_CONSOLES[default] = "terminal_0"
FVP_CONSOLES[tf-a] = "s_terminal_0"

The test target also generates a log file with the prefix 'fvp_log' in the image recipe's ${WORKDIR}/testimage containing the FVP's stdout.

OEFVPTarget supports two different test interfaces - SSH and pexpect.

SSH

As in OEQA in OE-core, tests cases can run commands on the machine using SSH. It therefore requires that an SSH server is installed in the image.

This uses the run method on the target, e.g:

(status, output) = self.target.run('uname -a')

which executes a single command on the target (using ssh -c) and returns the status code and the output. It is therefore useful for running tests in a Linux environment.

For examples of test cases, see meta/lib/oeqa/runtime/cases in OE-Core. The majority of test cases depend on ssh.SSHTest.test_ssh, which first validates that the SSH connection is functioning.

pexpect

To support firmware and baremetal testing, OEFVPTarget also allows test cases to make assertions against one or more consoles using the pexpect library.

Internally, this test target launches a Pexpect instance for each entry in FVP_CONSOLES which can be used with the provided alias. The whole Pexpect API is exposed on the target, where the alias is always passed as the first argument, e.g.:

self.target.expect('default', r'root@.*\:~#', timeout=30)
self.assertNotIn(b'ERROR:', self.target.before('tf-a'))

For an example of a full test case, see meta-arm/lib/oeqa/runtime/cases/linuxboot.py This test case can be used to minimally verify that a machine boots to a Linux shell. The default timeout is 10 minutes, but this can be configured with the variable TEST_FVP_LINUX_BOOT_TIMEOUT, which expects a value in seconds.