We currently run regressions with the following command line ./main.py run [...] <directory> Where <directory> is the positional argument pointing to the tests root directory: Testlib will walk through the directory and load every testsuite it encounters in its path. ./main.py run [...] <directory1> <directory2> ... Allowing testlib to load tests from multiple directories will make it possible to load out of tree regressions (living in an EXTRAS repository for example) JIRA: https://gem5.atlassian.net/browse/GEM5-905 Change-Id: I802d8753a18f4dfb00347252f031b5438e9be672 Signed-off-by: Giacomo Travaglini <giacomo.travaglini@arm.com> Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/40136 Reviewed-by: Bobby R. Bruce <bbruce@ucdavis.edu> Maintainer: Bobby R. Bruce <bbruce@ucdavis.edu> Tested-by: kokoro <noreply+kokoro@google.com>
256 lines
8.4 KiB
Markdown
256 lines
8.4 KiB
Markdown
This file explains how to use gem5's updated testing infrastructure. Running
|
|
tests before submitting a patch is *incredibly important* so unexpected bugs
|
|
don't creep into gem5.
|
|
|
|
gem5's testing infrastructure has the following goals:
|
|
* Simple for *all* users to run
|
|
* Fast execution in the simple case
|
|
* High coverage of gem5 code
|
|
|
|
# Running unit tests
|
|
|
|
gem5 comes with unit tests, created using the Google Test framework. These can
|
|
be built through SCons.
|
|
|
|
To build and run all the unit tests:
|
|
|
|
```shell
|
|
scons build/NULL/unittests.opt
|
|
```
|
|
|
|
All unit tests should be run prior to posting a patch to
|
|
https://gem5-review.googlesource.com
|
|
|
|
To compile and run just one set of tests (e.g. those declared within
|
|
`src/base/bitunion.test.cc`):
|
|
|
|
```shell
|
|
scons build/NULL/base/bitunion.test.opt
|
|
./build/NULL/base/bitunion.test.opt
|
|
```
|
|
|
|
To list the available test functions from a test file:
|
|
|
|
```shell
|
|
./build/NULL/base/bitunion.test.opt --gtest_list_tests
|
|
```
|
|
|
|
To run a specific test function (e.g., BitUnionData.NormalBitfield):
|
|
|
|
```shell
|
|
./build/NULL/base/bitunion.test.opt --gtest_filter=BitUnionData.NormalBitfield
|
|
```
|
|
|
|
# Running system-level tests
|
|
|
|
Within the `tests` directory we have system-level tests. These tests run
|
|
the gem5 framework against various hardware configurations, with different
|
|
ISAs, then verify the simulations execute correctly. These should be seen as
|
|
high-level, coarse-grained tests to compliment the unit-tests.
|
|
|
|
Below is the most common way the tests are run. This will run all of the
|
|
"quick" tests for X86, ARM, and RISC-V. These tests make up our best-supported
|
|
platforms and use cases. When running these tests, you will likely want to us
|
|
the option `-j <CPUs>` where `CPUs` is as large as you can make it.
|
|
Additionally, it is often a good idea to run longer tests (e.g., linux boot)
|
|
before submitting your patch.
|
|
|
|
```shell
|
|
cd tests
|
|
./main.py run
|
|
```
|
|
|
|
The above is the *minumum* you should run before posting a patch to
|
|
https://gem5-review.googlesource.com
|
|
|
|
## Running tests from multiple directories
|
|
|
|
The command line above will walk the directory tree starting from the cwd
|
|
(tests), and it will run every test it encounters in its path. It is possible
|
|
to specify multiple root directories by providing several positional
|
|
arguments:
|
|
|
|
```shell
|
|
./main.py run <directory1> <directory2> [...]
|
|
```
|
|
|
|
This will load every test in directory1 and directory2 (and their
|
|
subdirectories).
|
|
|
|
## Specifying a subset of tests to run
|
|
|
|
You can use the tag query interface to specify the exact tests you want to run.
|
|
For instance, if you want to run only with `gem5.opt`, you can use
|
|
|
|
```shell
|
|
./main.py run --variant opt
|
|
```
|
|
|
|
Or, if you want to just run X86 tests with the `gem5.opt` binary:
|
|
|
|
```shell
|
|
./main.py run --length quick --variant opt --isa X86
|
|
```
|
|
|
|
|
|
To view all of the available tags, use
|
|
|
|
```shell
|
|
./main.py list --all-tags
|
|
```
|
|
|
|
The output is split into tag *types* (e.g., isa, variant, length) and the
|
|
tags for each type are listed after the type name.
|
|
|
|
You can specify "or" between tags within the same type by using the tag flag
|
|
multiple times. For instance, to run everything that is tagged "opt" or "fast"
|
|
use
|
|
|
|
```shell
|
|
./main.py run --variant opt --variant fast
|
|
```
|
|
|
|
You can also specify "and" between different types of tags by specifying more
|
|
than one type on the command line. For instance, this will only run tests with
|
|
both the "X86" and "opt" tags.
|
|
|
|
```shell
|
|
./main.py run --isa X86 --variant opt
|
|
```
|
|
|
|
## Running tests in batch
|
|
|
|
The testing infrastructure provides the two needed methods to run tests in
|
|
batch. First, you can list all of the tests based on the same tags as above in
|
|
a machine-readable format by passing the `-q` flag. This will list all of the
|
|
*suites* that match the given tag(s).
|
|
|
|
```shell
|
|
./main.py list -q --suites
|
|
SuiteUID:tests/gem5/hello_se/test_hello_se.py:testhello64-static-X86-opt
|
|
SuiteUID:tests/gem5/hello_se/test_hello_se.py:testhello64-dynamic-X86-opt
|
|
SuiteUID:tests/gem5/hello_se/test_hello_se.py:testhello32-static-X86-opt
|
|
SuiteUID:tests/gem5/hello_se/test_hello_se.py:testhello64-static-ARM-opt
|
|
SuiteUID:tests/gem5/hello_se/test_hello_se.py:testhello32-static-ARM-opt
|
|
SuiteUID:tests/gem5/m5_util/test_exit.py:m5_exit_test-X86-opt
|
|
SuiteUID:tests/gem5/test_build/test_build.py:build-X86-opt
|
|
SuiteUID:tests/gem5/test_build/test_build.py:build-RISCV-opt
|
|
SuiteUID:tests/gem5/test_build/test_build.py:build-ARM-opt
|
|
```
|
|
|
|
Next, you can run a single *suite* from the command line by passing the option
|
|
`--uid`. For instance,
|
|
|
|
```shell
|
|
./main.py run --skip-build \
|
|
--uid SuiteUID:tests/gem5/m5_util/test_exit.py:m5_exit_test-X86-opt
|
|
```
|
|
|
|
With this method, you can only run a *single* suite at a time. If you want to
|
|
run more than one uid, you must call `./main.py` multiple times.
|
|
|
|
Currently, you must specify `--skip-build` if you want to run a single suite or
|
|
run in batch mode. Otherwise, you will build gem5 for all architectures.
|
|
|
|
## Rerunning failed tests
|
|
|
|
While developing software a common practice is to run tests, make a change, and
|
|
assert that the tests still pass. If tests fail you'll likely want to
|
|
rerun and fix those specific tests without running redundant ones. The testing
|
|
infrastructure allows you to rerun tests which failed in the last execution by
|
|
using the `rerun` command.
|
|
|
|
```shell
|
|
./main.py run
|
|
#
|
|
# Some tests fail...
|
|
#
|
|
|
|
# Rerun only the failed test suites (not the ones which passed).
|
|
./main.py rerun
|
|
```
|
|
|
|
## If something goes wrong
|
|
|
|
The first step is to turn up the verbosity of the output using `-v`. This will
|
|
allow you to see what tests are running and why a test is failing.
|
|
|
|
If a test fails, the temporary directory where the gem5 output was saved is kept
|
|
and the path to the directory is printed in the terminal.
|
|
|
|
## Debugging the testing infrastructure
|
|
|
|
Every command takes an option for the verbosity. `-v`, `-vv`, `-vvv` will
|
|
increase the verbosity level. If something isn't working correctly, you can
|
|
start here.
|
|
|
|
Most of the code for the testing infrastructure is in ext/testlib. This code
|
|
contains the base code for tests, suites, fixtures, etc. The code in tests/gem5
|
|
is *gem5-specific* code. For the most part, the code in tests/gem5 extends the
|
|
structures in ext/testlib.
|
|
|
|
## Common errors
|
|
|
|
You may see a number of lines of output during test discovery that look like
|
|
the following:
|
|
|
|
```shell
|
|
Tried to load tests from ... but failed with an exception.
|
|
Tried to load tests from ... but failed with an exception.
|
|
...
|
|
```
|
|
|
|
The testing library searches all python files in the `tests/` directory. The
|
|
test library executes each python file it finds searching for tests. It's okay
|
|
if the file causes an exception. This means there are no tests in that file
|
|
(e.g., it's not a new-style test).
|
|
|
|
|
|
## Binary test applications
|
|
|
|
The code for some test binaries that are run in the gem5 guest during
|
|
testing can be found in `tests/test-progs`.
|
|
There's one directory per test application.
|
|
The source code is under the `source` directory.
|
|
|
|
You may have a `bin` directory as well.
|
|
The `bin` directory is automatically created when running the test case that
|
|
uses the test binary.
|
|
This is not the case when a test is run via the --bin-path option.
|
|
In that scenario a bin directory will be created in the selected path
|
|
rather than in `tests/test-progs`.
|
|
The binary is downloaded from the gem5 servers the first
|
|
time it is referenced by a test.
|
|
|
|
Some other tests (like Linux-boot) don't have sources inside gem5 and
|
|
are simply downloaded from gem5 servers.
|
|
|
|
## Updating the test binaries
|
|
|
|
The test infrastructure should check with the gem5 servers to ensure you have
|
|
the latest binaries. However, if you believe your binaries are out of date,
|
|
simply delete the `bin` directory and they will be re-downloaded to your local
|
|
machine.
|
|
|
|
## Building (new-style) test binaries
|
|
|
|
In each `src/` directory under `tests/test-progs`, there is a Makefile.
|
|
This Makefile downloads a docker image and builds the test binary for some ISA
|
|
(e.g., Makefile.x86 builds the binary for x86). Additionally, if you run `make
|
|
upload` it will upload the binaries to the gem5 server, if you have access to
|
|
modify the binaries. *If you need to modify the binaries for updating a test or
|
|
adding a new test and you don't have access to the gem5 server, contact a
|
|
maintainer (see MAINTAINERS).*
|
|
|
|
|
|
## Running Tests in Parallel
|
|
|
|
Whimsy has support for parallel testing baked in. This system supports
|
|
running multiple suites at the same time on the same computer. To run
|
|
suites in parallel, supply the `-t <number-tests>` flag to the run command.
|
|
|
|
For example, to run up to three test suites at the same time::
|
|
|
|
./main.py run --skip-build -t 3
|
|
|