Writing and running MATE’s tests

Important

This page is intended for the developers of MATE only – it is not relevant for users.

Note

This page assumes that you have a functional MATE development environment. See Hacking on MATE for build instructions.

MATE’s test suites

The MATE codebase contains multiple suites of unit and integration tests, all of which are controlled by pytest:

  • Unit tests for the CPG live under tests/postgres

  • Dwarfcore-specific tests live under tests/dwarfcore

  • Mantiserve-specific tests live under tests/mantiserve

  • Integration tests live under tests/integration

  • “Legacy” tests (mostly for datastructures) live under frontend/test

Running the tests

All of MATE’s tests are run in the CI, either with each commit or on a schedule (for more intensive integration tests). However, they can all be run locally with a normal MATE development environment as well.

CPG, Dwarfcore, and Mantiserve tests

Running any of these test suites requires a similar setup.

You’ll need two terminal windows available.

In your first window, use docker-compose to bring up the db storage, and mate-runtime-state services:

docker-compose up -V db storage mate-runtime-state

Important

The mate-runtime-state container is vital to the correct execution of tests that use containers for isolation. It exits successfully once its job is finished, so do not be concerned if it does not stay running.

These services are stable: you do not have to bring them up with each test suite invocation.

In your second window, use docker-compose to run the test suite you’re interested in:

  • CPG tests: test

  • Dwarfcore tests: dwarfcore-test

  • Mantiserve tests: mantiserve-test

# CPG tests
docker-compose \
  -f docker-compose.yml \
  -f docker-compose.test.yml \
  run -v "$(pwd):/mate" test

# Dwarfcore tests
docker-compose \
  -f docker-compose.yml \
  -f docker-compose.test.yml \
  run -v "$(pwd):/mate" dwarfcore-test

# Mantiserve tests
docker-compose \
  -f docker-compose.yml \
  -f docker-compose.test.yml \
  run -v "$(pwd):/mate" mantiserve-test

These docker-compose targets run pytest under the hood, so you can pass additional flags to control pytest’s behavior. For example, to run the CPG tests in “fail-fast” mode:

docker-compose \
  -f docker-compose.yml \
  -f docker-compose.test.yml \
  run -v "$(pwd):/mate" test -- -- -x

or to run just a single test (test_allocation_sizes):

docker-compose \
  -f docker-compose.yml \
  -f docker-compose.test.yml \
  run -v "$(pwd):/mate" test -- -- -k test_allocation_sizes

Once you’re done testing, you can bring the entire test environment down with docker-compose:

docker-compose \
  -f docker-compose.yml \
  -f docker-compose.test.yml \
  down -v --remove-orphans

Integration tests

Note

These tests are extremely resource intensive, and should almost never be run locally.

The integration tests are nearly identical to the CPG, etc. tests above. Like above, you’ll need two terminal windows.

In your first window:

docker-compose up -V db storage mate-runtime-state

Separately, you can choose to enable intensive invariant tests in the normal test suite by setting MATE_INTEGRATION_TESTS=1:

docker-compose \
  -f docker-compose.yml \
  -f docker-compose.test.yml \
  run -v "$(pwd):/mate" -e MATE_INTEGRATION_TESTS=1 test

“Legacy” tests

The “legacy” tests do not require access to CPGs, and therefore can be run outside of a docker-compose environment.

To run the “legacy” tests:

docker run --rm -v $(pwd):/mate -it mate-dev:latest ./shake.sh -j pytests -- -- -x