xdg-desktop-portal test suite
=============================

## Unit tests

This directory contains a number of unit tests. The tests are written in C and
are using the glib testing framework (https://docs.gtk.org/glib/testing.html).

The files follow the pattern `test-$NAME.c` and are compiled by meson. The tests
can be run with `meson test --suite unit`.

## Integration tests

The integration tests usually test a specific portal in a fully integrated
environment. The tests are written in python using the pytest framework.

The files follow the pattern `test_$NAME.py`. The tests can be run with
`meson test --suite integration` or with `run-test.sh` in the source directory.

The environment is being set up by fixtures in `conftest.py` which can be
overwritten or parameterized by the tests themselves. There are a bunch of
convenient functions and classes in `__init__.py`. The portal backends are
implemented using dbusmock templates in the `templates` directory.

### Environment

Some environment variables need to be set for the integration tests to function
properly and the harness will refuse to launch if they are not set. If the
harness is executed by meson or run-test.sh, they will be set automatically.

* `XDG_DESKTOP_PORTAL_PATH`: The path to the xdg-desktop-portal binary

* `XDG_PERMISSION_STORE_PATH`: The path to the xdg-permission-store binary

* `XDG_DOCUMENT_PORTAL_PATH`: The path to the xdg-document-portal binary

* `XDP_VALIDATE_ICON`: The path to the xdg-desktop-portal-validate-icon binary

* `XDP_VALIDATE_SOUND`: The path to the xdg-desktop-portal-validate-sound binary

* `XDP_VALIDATE_AUTO`: If set, automatically discovers the icon and sound
    validators (only useful for installed tests) instead of using
    `XDP_VALIDATE_ICON` and `XDP_VALIDATE_SOUND`.

Some optional environment variables that can be set to influence how the test
harness behaves.

* `XDP_TEST_IN_CI`: If set (to any value), some unreliable tests might get
    skipped and some tests might run less iterations or otherwise test less
    thoroughly.
    Set this for automated QA testing, leave it unset during development.

* `XDP_TEST_RUN_LONG`: If set (to any value), some tests will run more
    iterations or otherwise test more thoroughly

* `FLATPAK_BWRAP`: Path to the **bwrap**(1) executable
    (default: discovered at build-time)

* `XDP_VALIDATE_ICON_INSECURE`: If set (to any value), x-d-p doesn't
    sandbox the icon validator using **bwrap**(1), even if sandboxed
    validation was enabled at compile time.
    This can be used to run build-time tests in a chroot or unprivileged
    container environment, where **bwrap**(1) normally can't work.
    It should never be set on a production system that will be validating
    untrusted icons!

* `XDP_VALIDATE_SOUND_INSECURE`: Same as `XDP_VALIDATE_ICON_INSECURE`,
    but for sounds

Some optional environment variables that can be set to help with debugging.

* `XDP_DBUS_MONITOR`: If set, starts dbus-monitor on the test dbus server

* `XDP_DBUS_TIMEOUT`: Maximum timeout for dbus calls in ms (default: 5s)

* `XDG_DESKTOP_PORTAL_WAIT_FOR_DEBUGGER`: Makes xdg-desktop-portal wait for
    a debugger to attach by raising SIGSTOP

* `XDG_DOCUMENT_PORTAL_WAIT_FOR_DEBUGGER`: Makes xdg-document-portal wait
    for a debugger to attach by raising SIGSTOP

* `XDG_PERMISSION_STORE_WAIT_FOR_DEBUGGER`: Makes xdg-permission-store wait
    for a debugger to attach by raising SIGSTOP

Internal environment variables the tests use via pytest fixtures to set up the
environment they need.

* `XDG_DESKTOP_PORTAL_TEST_APP_ID`: If set, the portal will use a host
    XdpAppInfo with the app id set to the variable. This is used to get a
    predictable app id for tests.

* `XDG_DESKTOP_PORTAL_TEST_USB_QUERIES`: The USB queries for the USB device
    portal testing

### Adding new tests

Make sure the required portals are listed in
`xdg_desktop_portal_dir_default_files` in `conftest.py`.

Add a `test_${name}.py` file to this directory and add the file to
`meson.build`.

If the portal that is being tested requires a backend implementation, add
it to the `templates` directory and add the file to `meson.build`. See the
dbusmock documentation for details on those templates.
