forked from avocado-framework/avocado-vt
-
Notifications
You must be signed in to change notification settings - Fork 1
BuildingTestApplications.rst
Xu Tian edited this page Dec 30, 2016
·
1 revision
Building test applications
==========================
This is a description of how to build test applications from a test case.
Dependencies
------------
If you write an application that is supposed to be run on the test-target,
place it in the directory `../deps//` relative to where your test case is
placed. The easiest way to obtain the full path to this directory is by calling
`data_dir.get_deps_dir("")`. Don't forget to add `from virttest import
data_dir` to your test case.
Besides the source file, create a Makefile that will be used to build your test
application. The below example shows a Makefile for the application for the
timedrift test cases. The `remote_build` module requires that a Makefile is
included with all test applications.
.. code-block:: makefile
CFLAGS+=-Wall
LDLIBS+=-lrt
.PHONY: clean
all: clktest get_tsc
clktest: clktest.o
get_tsc: get_tsc.o
clean:
rm -f clktest get_tsc
remote_build
------------
To simplify the building of applications on target, and to simplify avoiding the
building of applications on target when they are installed pre-built, use the
`remote_build` module. This module handles both the transfer of files, and
running `make` on target.
A simple example:
.. code-block:: python
address = vm.get_address(0)
source_dir = data_dir.get_deps_dir("")
builder = remote_build.Builder(params, address, source_dir)
full_build_path = builder.build()
In this case, we utilize the `.build()` method, which execute the necessary
methods in `builder` to copy all files to target and run make (if needed). When
done, `.build()` will return the full path on target to the application that
was just built. Be sure to use this path when running your test application, as
the path is changed if the parameters of the build is changed. For example:
.. code-block:: python
session.cmd_status("%s --test" % os.path.join(full_build_path, "testapp"))
The `remote_build.Builder` class can give you fine-grained control over your
build process as well. Another way to write the above `.build()` invocation
above is:
.. code-block:: python
builder = remote_build.Builder(params, address, source_dir)
if builder.sync_directories():
builder.make()
full_build_path = builder.full_build_path
This pattern can be useful if you e.g. would like to add an additional command
to run before `builder.make()`, perhaps to install some extra dependencies.