Support isolating directories for unit tests
This was initially meant to just be a fix for #1601 (closed), but then it spiralled out of control into a complete fix for #538 (closed). It works by adding an internal function to override the XDG dirs returned by
g_get_user_data_dir() and friends:
g_set_user_dirs(). It then calls this for each unit test, iff you’ve passed the
G_TEST_OPTION_ISOLATE_DIRS option to
It requires this explicit opt-in behaviour because developers will need to check any
spawn() calls in their test code (see below), and ensure that any code called by their test code uses
g_get_user_data_dir() rather than checking the
XDG_DATA_HOME environment variable manually, for example.
This branch does not set the
XDG_* environment variables, other than to set them to
/dev/null to catch errors. This branch is, as far as I’m aware, thread safe.
There were various restrictions which prompted this design:
setenv()cannot be used at all after any threads might have been spawned.
- Any test environment needs to be propagated to subprocesses spawned with
- Any test environment needs to be propagatable to subprocesses manually spawned by the test code.
And it has two caveats:
- If test code does manually spawn a subprocess, it’s responsible for setting the appropriate
XDG_*variables in the subprocess’ environment.
- It has to create the directory named in
XDG_RUNTIME_DIR(the spec requires it) for each unit test, so it always creates a nest of directories in
/tmp. They will be cleaned up on a successful test run, though.