blob: 8df667c245cd6f6840570580eda48ee63c2c87bc [file] [log] [blame]
Paul Beesley24a6bd62019-10-24 11:57:00 +00001Implementing Tests
2==================
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +02003
4This document aims at providing some pointers to help implementing new tests in
5the TFTF image.
6
Jimmy Brisson06b5be42020-04-02 15:19:27 -05007Test Structure
8--------------
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +02009
10A test might be divided into 3 logical parts, detailed in the following
11sections.
12
13Prologue
Jimmy Brisson06b5be42020-04-02 15:19:27 -050014^^^^^^^^
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020015
16A test has a main entry point function, whose type is:
17
18::
19
20 typedef test_result_t (*test_function_t)(void);
21
Jimmy Brisson7b56d302020-04-02 15:19:34 -050022See ``tftf/framework/include/tftf.h``.
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020023
24Only the primary CPU enters this function, while other CPUs are powered down.
25
26First of all, the test function should check whether this test is applicable to
27this platform and environment. Some tests rely on specific hardware features or
28firmware capabilities to be present. If these are not available, the test should
Jimmy Brisson7b56d302020-04-02 15:19:34 -050029be skipped. For example, a multi-core test requires at least 2 CPUs to
30run. Macros and functions are provided in ``include/common/test_helpers.h`` to
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020031help test code verify that their requirements are met.
32
33Core
Jimmy Brisson06b5be42020-04-02 15:19:27 -050034^^^^
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020035
36This is completely dependent on the purpose of the test. The paragraphs below
37just provide some useful, general information.
38
39The primary CPU may power on other CPUs by calling the function
40``tftf_cpu_on()``. It provides an address to which secondary CPUs should jump
41to once they have been initialized by the test framework. This address should be
42different from the primary CPU test function.
43
Jimmy Brisson7b56d302020-04-02 15:19:34 -050044Synchronization primitives are provided in ``include/lib/events.h`` in case CPUs'
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020045execution threads need to be synchronized. Most multi-processing tests will need
46some synchronisation points that all/some CPUs need to reach before test
47execution may continue.
48
49Any CPU that is involved in a test must return from its test function. Failure
Jimmy Brisson7b56d302020-04-02 15:19:34 -050050to do so will put the framework in an unrecoverable state, see the
51:ref:`Change Log & Release Notes` for details on this and other known
52limitations. The return code indicates the test result from the point of view of
53this CPU. At the end of the test, individual CPU results are aggregated and the
54overall test result is derived from that. A test is considered as passed if all
55involved CPUs reported a success status code.
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020056
57Epilogue
Jimmy Brisson06b5be42020-04-02 15:19:27 -050058^^^^^^^^
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020059
60Each test is responsible for releasing any allocated resources and putting the
61system back in a clean state when it finishes. Any change to the system
62configuration (e.g. MMU setup, GIC configuration, system registers, ...) must be
63undone and the original configuration must be restored. This guarantees that the
64next test is not affected by the actions of the previous one.
65
66One exception to this rule is that CPUs powered on as part of a test must not be
67powered down. As already stated above, as soon as a CPU enters the test, the
68framework expects it to return from the test.
69
Jimmy Brisson06b5be42020-04-02 15:19:27 -050070Template Test Code
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020071------------------
72
Jimmy Brisson7b56d302020-04-02 15:19:34 -050073Some template test code is provided in ``tftf/tests/template_tests``. It can be
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020074used as a starting point for developing new tests. Template code for both
75single-core and multi-core tests is provided.
76
Jimmy Brisson06b5be42020-04-02 15:19:27 -050077Build System Integration
78------------------------
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020079
Jimmy Brisson7b56d302020-04-02 15:19:34 -050080All test code is located under the ``tftf/tests`` directory. Tests are usually
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020081divided into categories represented as sub-directories under ``tftf/tests/``.
82
83The source file implementing the new test code should be added to the
Jimmy Brisson7b56d302020-04-02 15:19:34 -050084appropriate tests makefile, see `.*mk` files under ``tftf/tests``.
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020085
86The new test code should also appear in a tests manifest, see ``*.xml`` files
Jimmy Brisson7b56d302020-04-02 15:19:34 -050087under ``tftf/tests``. A unique name and test function must be provided. An
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020088optional description may be provided as well.
89
90For example, to create a test case named "``Foo test case``", whose test
91function is ``foo()``, add the following line in the tests manifest:
92
93::
94
95 <testcase name="Foo test case" function="foo" />
96
97A testcase must be part of a testsuite. The ``testcase`` XML node above must be
98inside a ``testsuite`` XML node. A unique name and a description must be
99provided for the testsuite.
100
101For example, to create a test suite named "``Bar test suite``", whose
102description is: "``An example test suite``", add the following 2 lines:
103
104::
105
106 <testsuite name="Bar test suite" description="An example test suite">
107 </testsuite>
108
Jimmy Brisson7b56d302020-04-02 15:19:34 -0500109See the template test manifest for reference: ``tftf/tests/tests-template.xml``.
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200110
111--------------
112
Sandrine Bailleux5229f232020-04-27 16:43:13 +0200113*Copyright (c) 2018-2020, Arm Limited. All rights reserved.*