Respawns the test program to run only test_path in a subprocess with
a given environment.
This can be used for a test case that might not return, or that
might abort.
If test_path is NULL then the same test is re-run in a subprocess.
You can use GLib.test_subprocess to determine whether the test
is in a subprocess or not.
test_path can also be the name of the parent test, followed by
"/subprocess/" and then a name for the specific subtest (or just
ending with "/subprocess" if the test only has one child test);
tests with names of this form will automatically be skipped in the
parent process.
If envp is NULL, the parent process’ environment will be inherited.
If usec_timeout is non-0, the test subprocess is aborted and
considered failing if its run time exceeds it.
You can use methods such as GLib.test_trap_assert_passed,
GLib.test_trap_assert_failed, and GLib.test_trap_assert_stderr to
check the results of the subprocess. (But note that
GLib.test_trap_assert_stdout and GLib.test_trap_assert_stderr
cannot be used if test_flags specifies that the child should
inherit the parent stdout/stderr.)
If your main () needs to behave differently in the subprocess, you can
call GLib.test_subprocess (after calling GLib.test_init)
to see whether you are in a subprocess.
Internally, this function tracks the child process using
GLib.child_watch_source_new, so your process must not ignore
SIGCHLD, and must not attempt to watch or wait for the child process
via another mechanism.
The following example tests that calling my_object_new(1000000) will
abort with an error message.
// Reruns this same test in a subprocess g_test_trap_subprocess (NULL, 0, G_TEST_SUBPROCESS_DEFAULT); g_test_trap_assert_failed (); g_test_trap_assert_stderr ("*ERROR*too large*"); }
staticvoid test_different_username (void) { if (g_test_subprocess ()) { // Code under test goes here g_message ("Username is now simulated as %s", g_getenv ("USER")); return; }
// Reruns this same test in a subprocess g_auto(GStrv) envp = g_get_environ (); envp = g_environ_setenv (g_steal_pointer (&envp), "USER", "charlie", TRUE); g_test_trap_subprocess_with_envp (NULL, envp, 0, G_TEST_SUBPROCESS_DEFAULT); g_test_trap_assert_passed (); g_test_trap_assert_stdout ("Username is now simulated as charlie"); }
int main (intargc, char **argv) { g_test_init (&argc, &argv, NULL);
Respawns the test program to run only
test_pathin a subprocess with a given environment.This can be used for a test case that might not return, or that might abort.
If
test_pathisNULLthen the same test is re-run in a subprocess. You can use GLib.test_subprocess to determine whether the test is in a subprocess or not.test_pathcan also be the name of the parent test, followed by "/subprocess/" and then a name for the specific subtest (or just ending with "/subprocess" if the test only has one child test); tests with names of this form will automatically be skipped in the parent process.If
envpisNULL, the parent process’ environment will be inherited.If
usec_timeoutis non-0, the test subprocess is aborted and considered failing if its run time exceeds it.The subprocess behavior can be configured with GLib.TestSubprocessFlags flags.
You can use methods such as GLib.test_trap_assert_passed, GLib.test_trap_assert_failed, and GLib.test_trap_assert_stderr to check the results of the subprocess. (But note that GLib.test_trap_assert_stdout and GLib.test_trap_assert_stderr cannot be used if
test_flagsspecifies that the child should inherit the parent stdout/stderr.)If your
main ()needs to behave differently in the subprocess, you can call GLib.test_subprocess (after calling GLib.test_init) to see whether you are in a subprocess.Internally, this function tracks the child process using GLib.child_watch_source_new, so your process must not ignore
SIGCHLD, and must not attempt to watch or wait for the child process via another mechanism.The following example tests that calling
my_object_new(1000000)will abort with an error message.