| # Welcome to kvm-unit-tests |
| |
| See http://www.linux-kvm.org/page/KVM-unit-tests for a high-level |
| description of this project, as well as running tests and adding |
| tests HOWTOs. |
| |
| # Building the tests |
| |
| This directory contains sources for a KVM test suite. |
| |
| To create the test images do: |
| |
| ./configure |
| make |
| |
| in this directory. Test images are created in ./ARCH/\*.flat |
| |
| NOTE: GCC cross-compiler is required for [build on macOS](README.macOS.md). |
| |
| ## Standalone tests |
| |
| The tests can be built as standalone. To create and use standalone tests do: |
| |
| ./configure |
| make standalone |
| (send tests/some-test somewhere) |
| (go to somewhere) |
| ./some-test |
| |
| `make install` will install all tests in PREFIX/share/kvm-unit-tests/tests, |
| each as a standalone test. |
| |
| |
| # Running the tests |
| |
| Then use the runner script to detect the correct invocation and |
| invoke the test: |
| |
| ./x86-run ./x86/msr.flat |
| or: |
| |
| ./run_tests.sh |
| |
| to run them all. |
| |
| By default the runner script searches for a suitable QEMU binary in the system. |
| To select a specific QEMU binary though, specify the QEMU=path/to/binary |
| environment variable: |
| |
| QEMU=/tmp/qemu/x86_64-softmmu/qemu-system-x86_64 ./x86-run ./x86/msr.flat |
| |
| To select an accelerator, for example "kvm", "hvf" or "tcg", specify the |
| ACCEL=name environment variable: |
| |
| ACCEL=kvm ./x86-run ./x86/msr.flat |
| |
| For running tests that involve migration from one QEMU instance to another |
| you also need to have the "ncat" binary (from the nmap.org project) installed, |
| otherwise the related tests will be skipped. |
| |
| ## Running the tests with UEFI |
| |
| Check [x86/efi/README.md](./x86/efi/README.md). |
| |
| # Tests configuration file |
| |
| The test case may need specific runtime configurations, for |
| example, extra QEMU parameters and time to execute limited, the |
| runner script reads those information from a configuration file found |
| at ./ARCH/unittests.cfg. |
| |
| The configuration file also contain the groups (if any) each test belong |
| to. So that a given group can be executed by specifying its name in the |
| runner's -g option. |
| |
| # Unit test inputs |
| |
| Unit tests use QEMU's '-append args...' parameter for command line |
| inputs, i.e. all args will be available as argv strings in main(). |
| Additionally a file of the form |
| |
| KEY=VAL |
| KEY2=VAL |
| ... |
| |
| may be passed with '-initrd file' to become the unit test's environ, |
| which can then be accessed in the usual ways, e.g. VAL = getenv("KEY"). |
| Any key=val strings can be passed, but some have reserved meanings in |
| the framework. The list of reserved environment variables is below |
| |
| QEMU_ACCEL either kvm, hvf or tcg |
| QEMU_VERSION_STRING string of the form `qemu -h | head -1` |
| KERNEL_VERSION_STRING string of the form `uname -r` |
| |
| Additionally these self-explanatory variables are reserved |
| |
| QEMU_MAJOR, QEMU_MINOR, QEMU_MICRO, KERNEL_VERSION, KERNEL_PATCHLEVEL, |
| KERNEL_SUBLEVEL, KERNEL_EXTRAVERSION |
| |
| # Guarding unsafe tests |
| |
| Some tests are not safe to run by default, as they may crash the |
| host. kvm-unit-tests provides two ways to handle tests like those. |
| |
| 1) Adding 'nodefault' to the groups field for the unit test in the |
| unittests.cfg file. When a unit test is in the nodefault group |
| it is only run when invoked |
| |
| a) independently, `ARCH-run ARCH/test` |
| |
| b) by specifying any other non-nodefault group it is in, |
| groups = nodefault mygroup : `./run_tests.sh -g mygroup` |
| |
| c) by specifying all tests should be run, `./run_tests.sh -a` |
| |
| 2) Making the test conditional on errata in the code, |
| ``` |
| if (ERRATA(abcdef012345)) { |
| do_unsafe_test(); |
| } |
| ``` |
| |
| With the errata condition the unsafe unit test is only run |
| when |
| |
| a) the ERRATA_abcdef012345 environment variable is provided and 'y' |
| |
| b) the ERRATA_FORCE environment variable is provided and 'y' |
| |
| c) by specifying all tests should be run, `./run_tests.sh -a` |
| (The -a switch ensures the ERRATA_FORCE is provided and set |
| to 'y'.) |
| |
| The ./errata.txt file provides a mapping of the commits needed by errata |
| conditionals to their respective minimum kernel versions. By default, |
| when the user does not provide an environ, then an environ generated |
| from the ./errata.txt file and the host's kernel version is provided to |
| all unit tests. |
| |
| # Contributing |
| |
| ## Directory structure |
| |
| .: configure script, top-level Makefile, and run_tests.sh |
| ./scripts: general architecture neutral helper scripts for building and running tests |
| ./scripts/<ARCH>: architecture dependent helper scripts for building and running tests |
| ./lib: general architecture neutral services for the tests |
| ./lib/<ARCH>: architecture dependent services for the tests |
| ./<ARCH>: the sources of the tests and the created objects/images |
| |
| See ./ARCH/README for architecture specific documentation. |
| |
| ## Style |
| |
| Currently there is a mix of indentation styles so any changes to |
| existing files should be consistent with the existing style. For new |
| files: |
| |
| - C: please use standard linux-with-tabs, see Linux kernel |
| doc Documentation/process/coding-style.rst |
| - Shell: use TABs for indentation |
| |
| Exceptions: |
| |
| - While the kernel standard requires 80 columns, we allow up to 120. |
| |
| Header guards: |
| |
| Please try to adhere to the following patterns when adding |
| "#ifndef <...> #define <...>" header guards: |
| ./lib: _HEADER_H_ |
| ./lib/<ARCH>: _ARCH_HEADER_H_ |
| ./lib/<ARCH>/asm: _ASMARCH_HEADER_H_ |
| ./<ARCH>: ARCH_HEADER_H |
| |
| ## Patches |
| |
| Patches are welcome at the KVM mailing list <kvm@vger.kernel.org>. |
| |
| Please prefix messages with: [kvm-unit-tests PATCH] |
| |
| You can add the following to .git/config to do this automatically for you: |
| |
| [format] |
| subjectprefix = kvm-unit-tests PATCH |
| |
| Additionally it's helpful to have a common order of file types in patches. |
| Our chosen order attempts to place the more declarative files before |
| the code files. We also start with common code and finish with unit test |
| code. git-diff's orderFile feature allows us to specify the order in a |
| file. The orderFile we use is `scripts/git.difforder`; adding the config |
| with `git config diff.orderFile scripts/git.difforder` enables it. |
| |
| We strive to follow the Linux kernels coding style so it's recommended |
| to run the kernel's ./scripts/checkpatch.pl on new patches. |
| |
| Also run `make shellcheck` before submitting a patch which touches bash |
| scripts. |