From 6477cc64216a902b7f588300d4745102d9bfee13 Mon Sep 17 00:00:00 2001 From: Ralf Habacker Date: Sat, 14 May 2016 10:49:52 +0200 Subject: [PATCH] Migrate platform specific spawn tests into cross platform tests. Bug: https://bugs.freedesktop.org/show_bug.cgi?id=95191 --- cmake/dbus/CMakeLists.txt | 1 + dbus/Makefile.am | 3 +- dbus/dbus-spawn-win.c | 272 +--------------------------------------------- dbus/dbus-spawn.c | 252 +----------------------------------------- dbus/dbus-spawn.h | 1 + 5 files changed, 6 insertions(+), 523 deletions(-) diff --git a/cmake/dbus/CMakeLists.txt b/cmake/dbus/CMakeLists.txt index 519186b..b4af52d 100644 --- a/cmake/dbus/CMakeLists.txt +++ b/cmake/dbus/CMakeLists.txt @@ -175,6 +175,7 @@ if (DBUS_ENABLE_EMBEDDED_TESTS) set (DBUS_UTIL_SOURCES ${DBUS_UTIL_SOURCES} ${DBUS_DIR}/dbus-test.c + ${DBUS_DIR}/dbus-spawn-test.c ) endif (DBUS_ENABLE_EMBEDDED_TESTS) diff --git a/dbus/Makefile.am b/dbus/Makefile.am index a7b3491..a631dca 100644 --- a/dbus/Makefile.am +++ b/dbus/Makefile.am @@ -266,7 +266,8 @@ DBUS_UTIL_SOURCES= \ dbus-string-util.c \ dbus-sysdeps-util.c \ dbus-test.c \ - dbus-test.h + dbus-test.h \ + dbus-spawn-test.c libdbus_1_la_SOURCES= \ $(DBUS_LIB_SOURCES) \ diff --git a/dbus/dbus-spawn-win.c b/dbus/dbus-spawn-win.c index d8568f1..12998c7 100644 --- a/dbus/dbus-spawn-win.c +++ b/dbus/dbus-spawn-win.c @@ -756,280 +756,10 @@ _dbus_babysitter_set_result_function (DBusBabysitter *sitter, sitter->finished_data = user_data; } -#ifdef DBUS_ENABLE_EMBEDDED_TESTS - -static char * -get_test_exec (const char *exe, - DBusString *scratch_space) -{ - const char *dbus_test_exec; - - dbus_test_exec = _dbus_getenv ("DBUS_TEST_EXEC"); - - if (dbus_test_exec == NULL) - dbus_test_exec = DBUS_TEST_EXEC; - - if (!_dbus_string_init (scratch_space)) - return NULL; - - if (!_dbus_string_append_printf (scratch_space, "%s/%s%s", - dbus_test_exec, exe, DBUS_EXEEXT)) - { - _dbus_string_free (scratch_space); - return NULL; - } - - return _dbus_string_get_data (scratch_space); -} - #define LIVE_CHILDREN(sitter) ((sitter)->child_handle != NULL) -static void +void _dbus_babysitter_block_for_child_exit (DBusBabysitter *sitter) { WaitForSingleObject (sitter->thread_handle, INFINITE); } - -static dbus_bool_t -check_spawn_nonexistent (void *data) -{ - char *argv[4] = { NULL, NULL, NULL, NULL }; - DBusBabysitter *sitter; - DBusError error; - - sitter = NULL; - - dbus_error_init (&error); - - /*** Test launching nonexistent binary */ - - argv[0] = "/this/does/not/exist/32542sdgafgafdg"; - if (_dbus_spawn_async_with_babysitter (&sitter, "spawn_nonexistent", argv, NULL, - NULL, NULL, - &error)) - { - _dbus_babysitter_block_for_child_exit (sitter); - _dbus_babysitter_set_child_exit_error (sitter, &error); - } - - if (sitter) - _dbus_babysitter_unref (sitter); - - if (!dbus_error_is_set (&error)) - { - _dbus_warn ("Did not get an error launching nonexistent executable\n"); - return FALSE; - } - - if (!(dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY) || - dbus_error_has_name (&error, DBUS_ERROR_SPAWN_EXEC_FAILED))) - { - _dbus_warn ("Not expecting error when launching nonexistent executable: %s: %s\n", - error.name, error.message); - dbus_error_free (&error); - return FALSE; - } - - dbus_error_free (&error); - - return TRUE; -} - -static dbus_bool_t -check_spawn_segfault (void *data) -{ - char *argv[4] = { NULL, NULL, NULL, NULL }; - DBusBabysitter *sitter; - DBusError error; - DBusString argv0; - - sitter = NULL; - - dbus_error_init (&error); - - /*** Test launching segfault binary */ - - argv[0] = get_test_exec ("test-segfault", &argv0); - - if (argv[0] == NULL) - { - /* OOM was simulated, never mind */ - return TRUE; - } - - if (_dbus_spawn_async_with_babysitter (&sitter, "spawn_segfault", argv, NULL, - NULL, NULL, - &error)) - { - _dbus_babysitter_block_for_child_exit (sitter); - _dbus_babysitter_set_child_exit_error (sitter, &error); - } - - _dbus_string_free (&argv0); - - if (sitter) - _dbus_babysitter_unref (sitter); - - if (!dbus_error_is_set (&error)) - { - _dbus_warn ("Did not get an error launching segfaulting binary\n"); - return FALSE; - } - - if (!(dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY) || - dbus_error_has_name (&error, DBUS_ERROR_SPAWN_CHILD_EXITED))) - { - _dbus_warn ("Not expecting error when launching segfaulting executable: %s: %s\n", - error.name, error.message); - dbus_error_free (&error); - return FALSE; - } - - dbus_error_free (&error); - - return TRUE; -} - -static dbus_bool_t -check_spawn_exit (void *data) -{ - char *argv[4] = { NULL, NULL, NULL, NULL }; - DBusBabysitter *sitter; - DBusError error; - DBusString argv0; - - sitter = NULL; - - dbus_error_init (&error); - - /*** Test launching exit failure binary */ - - argv[0] = get_test_exec ("test-exit", &argv0); - - if (argv[0] == NULL) - { - /* OOM was simulated, never mind */ - return TRUE; - } - - if (_dbus_spawn_async_with_babysitter (&sitter, "spawn_exit", argv, NULL, - NULL, NULL, - &error)) - { - _dbus_babysitter_block_for_child_exit (sitter); - _dbus_babysitter_set_child_exit_error (sitter, &error); - } - - _dbus_string_free (&argv0); - - if (sitter) - _dbus_babysitter_unref (sitter); - - if (!dbus_error_is_set (&error)) - { - _dbus_warn ("Did not get an error launching binary that exited with failure code\n"); - return FALSE; - } - - if (!(dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY) || - dbus_error_has_name (&error, DBUS_ERROR_SPAWN_CHILD_EXITED))) - { - _dbus_warn ("Not expecting error when launching exiting executable: %s: %s\n", - error.name, error.message); - dbus_error_free (&error); - return FALSE; - } - - dbus_error_free (&error); - - return TRUE; -} - -static dbus_bool_t -check_spawn_and_kill (void *data) -{ - char *argv[4] = { NULL, NULL, NULL, NULL }; - DBusBabysitter *sitter; - DBusError error; - DBusString argv0; - - sitter = NULL; - - dbus_error_init (&error); - - /*** Test launching sleeping binary then killing it */ - - argv[0] = get_test_exec ("test-sleep-forever", &argv0); - - if (argv[0] == NULL) - { - /* OOM was simulated, never mind */ - return TRUE; - } - - if (_dbus_spawn_async_with_babysitter (&sitter, "spawn_and_kill", argv, NULL, - NULL, NULL, - &error)) - { - _dbus_babysitter_kill_child (sitter); - - _dbus_babysitter_block_for_child_exit (sitter); - - _dbus_babysitter_set_child_exit_error (sitter, &error); - } - - _dbus_string_free (&argv0); - - if (sitter) - _dbus_babysitter_unref (sitter); - - if (!dbus_error_is_set (&error)) - { - _dbus_warn ("Did not get an error after killing spawned binary\n"); - return FALSE; - } - - if (!(dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY) || - dbus_error_has_name (&error, DBUS_ERROR_SPAWN_CHILD_EXITED))) - { - _dbus_warn ("Not expecting error when killing executable: %s: %s\n", - error.name, error.message); - dbus_error_free (&error); - return FALSE; - } - - dbus_error_free (&error); - - return TRUE; -} - -dbus_bool_t -_dbus_spawn_test (const char *test_data_dir) -{ - if (!_dbus_test_oom_handling ("spawn_nonexistent", - check_spawn_nonexistent, - NULL)) - return FALSE; - - /* Don't run the obnoxious segfault test by default, - * it's a pain to have to click all those error boxes. - */ - if (getenv ("DO_SEGFAULT_TEST")) - if (!_dbus_test_oom_handling ("spawn_segfault", - check_spawn_segfault, - NULL)) - return FALSE; - - if (!_dbus_test_oom_handling ("spawn_exit", - check_spawn_exit, - NULL)) - return FALSE; - - if (!_dbus_test_oom_handling ("spawn_and_kill", - check_spawn_and_kill, - NULL)) - return FALSE; - - return TRUE; -} -#endif diff --git a/dbus/dbus-spawn.c b/dbus/dbus-spawn.c index e591e69..afdcd68 100644 --- a/dbus/dbus-spawn.c +++ b/dbus/dbus-spawn.c @@ -1450,259 +1450,9 @@ _dbus_babysitter_set_result_function (DBusBabysitter *sitter, /** @} */ -#ifdef DBUS_ENABLE_EMBEDDED_TESTS - -static char * -get_test_exec (const char *exe, - DBusString *scratch_space) -{ - const char *dbus_test_exec; - - dbus_test_exec = _dbus_getenv ("DBUS_TEST_EXEC"); - - if (dbus_test_exec == NULL) - dbus_test_exec = DBUS_TEST_EXEC; - - if (!_dbus_string_init (scratch_space)) - return NULL; - - if (!_dbus_string_append_printf (scratch_space, "%s/%s%s", - dbus_test_exec, exe, DBUS_EXEEXT)) - { - _dbus_string_free (scratch_space); - return NULL; - } - - return _dbus_string_get_data (scratch_space); -} - -static void +void _dbus_babysitter_block_for_child_exit (DBusBabysitter *sitter) { while (LIVE_CHILDREN (sitter)) babysitter_iteration (sitter, TRUE); } - -static dbus_bool_t -check_spawn_nonexistent (void *data) -{ - char *argv[4] = { NULL, NULL, NULL, NULL }; - DBusBabysitter *sitter = NULL; - DBusError error = DBUS_ERROR_INIT; - - /*** Test launching nonexistent binary */ - - argv[0] = "/this/does/not/exist/32542sdgafgafdg"; - if (_dbus_spawn_async_with_babysitter (&sitter, "spawn_nonexistent", argv, - NULL, NULL, NULL, - &error)) - { - _dbus_babysitter_block_for_child_exit (sitter); - _dbus_babysitter_set_child_exit_error (sitter, &error); - } - - if (sitter) - _dbus_babysitter_unref (sitter); - - if (!dbus_error_is_set (&error)) - { - _dbus_warn ("Did not get an error launching nonexistent executable\n"); - return FALSE; - } - - if (!(dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY) || - dbus_error_has_name (&error, DBUS_ERROR_SPAWN_EXEC_FAILED))) - { - _dbus_warn ("Not expecting error when launching nonexistent executable: %s: %s\n", - error.name, error.message); - dbus_error_free (&error); - return FALSE; - } - - dbus_error_free (&error); - - return TRUE; -} - -static dbus_bool_t -check_spawn_segfault (void *data) -{ - char *argv[4] = { NULL, NULL, NULL, NULL }; - DBusBabysitter *sitter = NULL; - DBusError error = DBUS_ERROR_INIT; - DBusString argv0; - - /*** Test launching segfault binary */ - - argv[0] = get_test_exec ("test-segfault", &argv0); - - if (argv[0] == NULL) - { - /* OOM was simulated, never mind */ - return TRUE; - } - - if (_dbus_spawn_async_with_babysitter (&sitter, "spawn_segfault", argv, - NULL, NULL, NULL, - &error)) - { - _dbus_babysitter_block_for_child_exit (sitter); - _dbus_babysitter_set_child_exit_error (sitter, &error); - } - - _dbus_string_free (&argv0); - - if (sitter) - _dbus_babysitter_unref (sitter); - - if (!dbus_error_is_set (&error)) - { - _dbus_warn ("Did not get an error launching segfaulting binary\n"); - return FALSE; - } - - if (!(dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY) || - dbus_error_has_name (&error, DBUS_ERROR_SPAWN_CHILD_SIGNALED))) - { - _dbus_warn ("Not expecting error when launching segfaulting executable: %s: %s\n", - error.name, error.message); - dbus_error_free (&error); - return FALSE; - } - - dbus_error_free (&error); - - return TRUE; -} - -static dbus_bool_t -check_spawn_exit (void *data) -{ - char *argv[4] = { NULL, NULL, NULL, NULL }; - DBusBabysitter *sitter = NULL; - DBusError error = DBUS_ERROR_INIT; - DBusString argv0; - - /*** Test launching exit failure binary */ - - argv[0] = get_test_exec ("test-exit", &argv0); - - if (argv[0] == NULL) - { - /* OOM was simulated, never mind */ - return TRUE; - } - - if (_dbus_spawn_async_with_babysitter (&sitter, "spawn_exit", argv, - NULL, NULL, NULL, - &error)) - { - _dbus_babysitter_block_for_child_exit (sitter); - _dbus_babysitter_set_child_exit_error (sitter, &error); - } - - _dbus_string_free (&argv0); - - if (sitter) - _dbus_babysitter_unref (sitter); - - if (!dbus_error_is_set (&error)) - { - _dbus_warn ("Did not get an error launching binary that exited with failure code\n"); - return FALSE; - } - - if (!(dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY) || - dbus_error_has_name (&error, DBUS_ERROR_SPAWN_CHILD_EXITED))) - { - _dbus_warn ("Not expecting error when launching exiting executable: %s: %s\n", - error.name, error.message); - dbus_error_free (&error); - return FALSE; - } - - dbus_error_free (&error); - - return TRUE; -} - -static dbus_bool_t -check_spawn_and_kill (void *data) -{ - char *argv[4] = { NULL, NULL, NULL, NULL }; - DBusBabysitter *sitter = NULL; - DBusError error = DBUS_ERROR_INIT; - DBusString argv0; - - /*** Test launching sleeping binary then killing it */ - - argv[0] = get_test_exec ("test-sleep-forever", &argv0); - - if (argv[0] == NULL) - { - /* OOM was simulated, never mind */ - return TRUE; - } - - if (_dbus_spawn_async_with_babysitter (&sitter, "spawn_and_kill", argv, - NULL, NULL, NULL, - &error)) - { - _dbus_babysitter_kill_child (sitter); - - _dbus_babysitter_block_for_child_exit (sitter); - - _dbus_babysitter_set_child_exit_error (sitter, &error); - } - - _dbus_string_free (&argv0); - - if (sitter) - _dbus_babysitter_unref (sitter); - - if (!dbus_error_is_set (&error)) - { - _dbus_warn ("Did not get an error after killing spawned binary\n"); - return FALSE; - } - - if (!(dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY) || - dbus_error_has_name (&error, DBUS_ERROR_SPAWN_CHILD_SIGNALED))) - { - _dbus_warn ("Not expecting error when killing executable: %s: %s\n", - error.name, error.message); - dbus_error_free (&error); - return FALSE; - } - - dbus_error_free (&error); - - return TRUE; -} - -dbus_bool_t -_dbus_spawn_test (const char *test_data_dir) -{ - if (!_dbus_test_oom_handling ("spawn_nonexistent", - check_spawn_nonexistent, - NULL)) - return FALSE; - - if (!_dbus_test_oom_handling ("spawn_segfault", - check_spawn_segfault, - NULL)) - return FALSE; - - if (!_dbus_test_oom_handling ("spawn_exit", - check_spawn_exit, - NULL)) - return FALSE; - - if (!_dbus_test_oom_handling ("spawn_and_kill", - check_spawn_and_kill, - NULL)) - return FALSE; - - return TRUE; -} -#endif diff --git a/dbus/dbus-spawn.h b/dbus/dbus-spawn.h index e6baae9..12ea586 100644 --- a/dbus/dbus-spawn.h +++ b/dbus/dbus-spawn.h @@ -62,6 +62,7 @@ dbus_bool_t _dbus_babysitter_set_watch_functions (DBusBabysitter *si DBusWatchToggledFunction toggled_function, void *data, DBusFreeFunction free_data_function); +void _dbus_babysitter_block_for_child_exit (DBusBabysitter *sitter); DBUS_END_DECLS -- 2.6.6