Tests¶
While we have a few dedicated tests in the components themselves, most of the
tests are located in the tests root directory (and referenced in
tests/meson.build). Since the Meson build system includes a test system,
that’s what we rely on.
Basic Usage¶
Assuming nope.gl has been configured through the standard procedure (using
configure.py), executing make tests is enough to trigger all the tests
(including the component specific tests). For more information on the bootstrap
procedure, see the installation documentation.
In case of failure, a log will be written and its path indicated on the standard output by meson.
Debugging¶
To run specific tests, you will need to activate the environment (usually
through . venv/bin/ngli-activate) and execute meson test -C builddir/tests YOUR_TEST_NAME. You can also limit the tests to a specific test suite using
the --suite option. For example: meson test -v -C builddir/tests translate --suite opengles.
For a complete list of tests and their respective suite, meson test --list -C builddir/tests can be used (from within the venv and after running make tests-setup or make tests at least once).
Many tests are based on scenes constructed in Python, sometimes available with
specific debugging options. So in order to get a visual feedback, you can
usually test them in ngl-control/ngl-desktop (or ngl-python), for
example: ngl-control -m ./tests/blending.py. For more information on the
controller usage, check out the starter tutorial.
For cue-points or fingerprint based tests, the TESTS_OPTIONS=dump environment
toggle can be used to dump pictures (in <tempdir>/nopegl/tests).
Additional tooling is available, such as GPU capture and code coverage (see associated sections below).
Updating references¶
Sometimes the tests need to be updated and therefore their associated
references too. The REFGEN environment variable makes this operation less
painful. Following are the possible values and their effects:
REFGEN=no: Run the test normally without changing the reference (default)REFGEN=create: Create the reference file if not presentREFGEN=update: Same as “create” and update the reference if the test failsREFGEN=force: Same as “create” and always replace the reference file. This may change the references even if the tests are passing due to the threshold/tolerance mechanism.
Under the hood, these controls affect how ngl-test will behave.
GPU Capture¶
GPU capture is currently available through RenderDoc.
To enable it, you need to build with the gpu_capture debug option
(./configure.py --debug-opts gpu_capture). The configure.py script will
automatically download RenderDoc, it is not required to have it installed on
your system.
On Linux, a typical workflow will look like this:
# Serialize a scene
ngl-serialize pynopegl_utils.examples.misc fibo /tmp/fibo.ngl
# Execute a command with librenderdoc hook and capture enabled
# A renderdoc capture path will be indicated on stdout
LD_PRELOAD=external/renderdoc_Linux/lib/librenderdoc.so NGL_GPU_CAPTURE=yes ngl-render -t 0:30:60 -i /tmp/fibo.ngl
# Study the capture with QRenderDoc
external/renderdoc_Linux/bin/qrenderdoc /tmp/RenderDoc/ngl-render_*_capture.rdc
Code coverage¶
Code coverage can be enabled using ./configure.py --coverage. To study the
coverage of the tests, we can execute the tests with make tests and the run
make coverage-html to generate an HTML report. The coverage-xml rule is
also available for a report meant to be parsed by other tools.
Memory leaks¶
For the native tests, meson test wrapper can be used in combination with
Valgrind. After activating the venv, they can be
executed with Valgrind using: meson test -C builddir/libnopegl --wrap 'valgrind --leak-check=full --show-leak-kinds=all --error-exitcode=1'
Running the Python tests with that method is not well supported currently. It
can be experimented with PYTHONMALLOC=malloc to silence Python errors related
to their internal allocator, but then drivers issues would need to be silenced
manually as well. This is still a work in progress.
Beware that Valgrind only covers heap allocation, nothing GPU related.
To detect GPU memory leaks, one can use the scripts/gl-leaks.sh helper, which
is relying on apitrace as a meson wrap file:
meson test -C builddir/tests --suite opengl --wrap "$(pwd)/scripts/gl-leaks.sh". As the name suggests, this only works with
OpenGL.
Memory failure simulation¶
Sometimes we want to test that error codepaths are properly handled and do not
lead to memory leaks. To achieve that, nope.gl includes a memory failure
simulation that can be enabled at configure time with --buildtype debug --debug-opt mem.
When this option is enabled, we can create artificial memory failures using the
NGL_MEM_ALLOC_FAIL environment variable. A typical workflow will be to count
how many allocations happen for a given execution (using
NGL_MEM_ALLOC_FAIL=count), and make them fail one by one.
For example:
# Serialize a scene
ngl-serialize pynopegl_utils.examples.misc fibo /tmp/fibo.ngl
# Count the number of mallocs (the last lines will contain something like
# MEMCOUNT: 858)
NGL_MEM_ALLOC_FAIL=count ngl-render -t 0:30:60 -i /tmp/fibo.ngl
# Make them fail one by one
for i in $(seq 0 858); do
NGL_MEM_ALLOC_FAIL=$i valgrind --error-exitcode=50 --leak-check=full ngl-render -t 0:30:60 -i /tmp/fibo.ngl
[ $? -eq 50 ] && break
done
If valgrind detects an error (not ngl-render but valgrind itself), the
loop will stop.