# Testing

[TOC]

## Overview

Hafnium has 4 main kinds of tests:

1.  Host tests
    *   Unit tests of core functionality, e.g. page table manipulation.
    *   Source in `src/*_test.cc`.
    *   Using the [Google Test](https://github.com/google/googletest) framework,
        built against 'fake' architecture (`src/arch/fake`).
1.  Arch tests
    *   Architecture-specific unit tests, e.g. MMU setup.
    *   Source under `test/arch`.
    *   Using our own _hftest_ framework, with `standalone_main.c`.
    *   Build own hypervisor image, run in EL2.
1.  VM API tests
    *   Exercise hypervisor API from both primary and secondary VMs.
    *   Source under `test/vmapi`.
    *   Tests are run from the primary VM under a normal build of the Hafnium
        hypervisor, possibly communicating with a helper service in one or more
        secondary VMs.
    *   Using our own _hftest_ framework, with `standalone_main.c` for the
        primary VM and `hftest_service.c` for secondary VMs.
    *   Build own primary and secondary VMs, run in EL1 under actual Hafnium
        image.
1.  Linux tests
    *   Exercise the Hafnium Linux kernel module.
    *   Source under `test/linux`.
    *   Tests are run from userspace (PID 1) under Linux in the primary VM under
        Hafnium, possibly with other secondary VMs.
    *   Using our own _hftest_ framework, with `linux_main.c`.

Host tests run directly on the host machine where they are built, whereas the
other 3 types can run under an emulator such as QEMU, or on real hardware.

## Presubmit

Presubmit builds everything, runs all tests and checks the source for formatting
and lint errors. This can be run locally with:

```shell
./kokoro/build.sh
```

Or to just run the tests after having built everything manually run:

```shell
./kokoro/test.sh
```

## QEMU tests

These tests boot Hafnium on QEMU and the VMs make calls to Hafnium to test its
behaviour. They can also be run on the Arm [FVP](FVP.md) and in some cases on
real hardware.

### hftest

Having a framework for tests makes them easier to read and write. _hftest_ is a
framework to meet the needs of VM based tests for Hafnium. It consists of:

*   assertions
*   test declarations
*   base VM image
*   driver script

Assertions should be familiar from other testing libraries. They make use of
C11's `_Generic` expressions for type genericity.

Test declarations name the test and the suite that the test is part of.
Declarations are converted into descriptors stored in the `.hftest` section of
the VM image which allows the image to inspect the structure of the tests it
contains. The linker sorts the descriptors by their symbol name which is how
descriptors from the same suite are grouped together for easier parsing.

The base VM image offers a command line interface, via the bootargs, to query
the tests in the image and to run specific tests. The driver script uses this
interface to execute tests, each with a fresh QEMU boot to give a fresh
environment.
