diff options
author | Brian J. Tarricone <brian@tarricone.org> | 2009-09-18 15:48:19 -0700 |
---|---|---|
committer | Brian J. Tarricone <brian@tarricone.org> | 2009-09-18 16:41:06 -0700 |
commit | f7aebe04aec59c3c5583fd81a0320c09ac13ff3a (patch) | |
tree | 7d5b1099e9a89ff4136cbf03080b22fa04e1cd84 | |
parent | 0f90faf47b40fd22e36815392b130ee193dbab28 (diff) | |
download | xfconf-f7aebe04aec59c3c5583fd81a0320c09ac13ff3a.tar.gz |
fix test framework, hopefully for the last time
add a --daemon option to xfconfd that forks(), prints its new child pid,
and quits. this lets us move xfconfd launching into the test script and
out of the C file. also we make sure to kill xfconfd and dbus-daemon
after each test run. this seems to work without any weird dbus errors.
-rw-r--r-- | tests/Makefile.inc | 3 | ||||
-rw-r--r-- | tests/test-template.sh.in | 35 | ||||
-rw-r--r-- | tests/tests-common.h | 19 | ||||
-rw-r--r-- | xfconfd/main.c | 23 |
4 files changed, 55 insertions, 25 deletions
diff --git a/tests/Makefile.inc b/tests/Makefile.inc index 408b15f..59fda73 100644 --- a/tests/Makefile.inc +++ b/tests/Makefile.inc @@ -1,10 +1,9 @@ check_SCRIPTS = $(addsuffix .sh,$(check_PROGRAMS)) TESTS = $(check_SCRIPTS) -TESTS_ENVIRONMENT = XDG_CONFIG_HOME="$(top_builddir)/tests/test-xdg_config_home" +TESTS_ENVIRONMENT = XDG_CONFIG_HOME="$(top_builddir)/tests/test-xdg_config_home" XFCONFD="$(top_builddir)/xfconfd/xfconfd" AM_CFLAGS = \ - -DXFCONFD=\"$(top_builddir)/xfconfd/xfconfd\" \ -I$(top_srcdir) \ -I$(top_srcdir)/tests \ $(GLIB_CFLAGS) \ diff --git a/tests/test-template.sh.in b/tests/test-template.sh.in index c1753a2..5d2a3a6 100644 --- a/tests/test-template.sh.in +++ b/tests/test-template.sh.in @@ -1,15 +1,42 @@ #!/bin/bash +cleanup() { + if [ "$XFCONFD_PID" ]; then + kill -TERM $XFCONFD_PID 2>/dev/null + sleep 1 + kill -KILL $XFCONFD_PID 2>/dev/null + fi + + kill -TERM $DBUS_SESSION_BUS_PID 2>/dev/null + sleep 1 + kill -KILL $DBUS_SESSION_BUS_PID 2>/dev/null +} + +die() { + [ "$1" ] && echo "$1" >&2 + cleanup + exit 1 +} + +unset DBUS_SESSION_BUS_ADDRESS +unset DBUS_SESSION_BUS_PID +unset XFCONFD_PID + eval `dbus-launch --sh-syntax` export DBUS_SESSION_BUS_ADDRESS export DBUS_SESSION_BUS_PID +[ "$DBUS_SESSION_BUS_PID" ] || die "DBus failed to start" + +trap "die Interrupted" INT + +eval `$XFCONFD --daemon 2>/dev/null` || die "Failed to start xfconfd" + export XDG_CONFIG_HOME # make sure it's exported from the makefile export XDG_CONFIG_DIRS="" -./@TEST_NAME@ -ret=$? +./@TEST_NAME@ || die "Test Failed" -kill -TERM $DBUS_SESSION_BUS_PID +cleanup -exit $ret +exit 0 diff --git a/tests/tests-common.h b/tests/tests-common.h index fc221d1..3c036e0 100644 --- a/tests/tests-common.h +++ b/tests/tests-common.h @@ -55,8 +55,6 @@ } \ }G_STMT_END -static GPid xfconfd_pid = -1; - /* don't use static to avoid compiler warnings in tests that don't use * all of them */ const gchar *test_string_property = "/test/stringtest/string"; @@ -76,21 +74,14 @@ const gchar *test_array_property = "/test/arrayprop"; static inline void xfconf_tests_end(); static inline gboolean -xfconf_tests_start() +xfconf_tests_start(void) { - gchar *argv[2] = { XFCONFD, NULL }; DBusConnection *dbus_conn; DBusMessage *msg, *ret; DBusError derror; GTimeVal start, now; GError *error = NULL; - if(!g_spawn_async(NULL, argv, NULL, 0, NULL, NULL, &xfconfd_pid, &error)) { - g_critical("Failed to launch xfconfd (%s): %s", XFCONFD, error->message); - g_error_free(error); - return FALSE; - } - /* wait until xfconfd finishes starting */ dbus_error_init(&derror); dbus_conn = dbus_bus_get(DBUS_BUS_SESSION, NULL); @@ -132,15 +123,9 @@ xfconf_tests_start() } static inline void -xfconf_tests_end() +xfconf_tests_end(void) { xfconf_shutdown(); - - if(xfconfd_pid != -1) { - kill(xfconfd_pid, SIGTERM); - waitpid(xfconfd_pid, NULL, 0); - xfconfd_pid = -1; - } } #endif /* __XFCONF_TESTS_COMMON_H__ */ diff --git a/xfconfd/main.c b/xfconfd/main.c index 7ca223e..cbdc269 100644 --- a/xfconfd/main.c +++ b/xfconfd/main.c @@ -127,12 +127,16 @@ main(int argc, GOptionContext *opt_ctx; gchar **backends = NULL; gboolean print_version = FALSE; + gboolean do_daemon = FALSE; GOptionEntry options[] = { - { "version", 'V', 0, G_OPTION_ARG_NONE, &print_version, + { "version", 'V', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &print_version, N_("Prints the xfconfd version."), NULL }, - { "backends", 'b', 0, G_OPTION_ARG_STRING_ARRAY, &backends, + { "backends", 'b', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_STRING_ARRAY, &backends, N_("Configuration backends to use. The first backend specified " \ "is opened read/write; the others, read-only."), NULL }, + { "daemon", 0, G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &do_daemon, + N_("Fork into background after starting; only useful for " \ + "testing purposes"), NULL }, { NULL, 0, 0, 0, 0, NULL, NULL }, }; @@ -208,6 +212,21 @@ main(int argc, return EXIT_FAILURE; } g_strfreev(backends); + + if(do_daemon) { + pid_t child_pid; + + child_pid = fork(); + if(child_pid < 0) { + g_printerr("Failed to fork()\n"); + return 1; + } else if(child_pid > 0) { + fprintf(stdout, "XFCONFD_PID=%d; export XFCONFD_PID;", child_pid); + exit(0); + } + + close(fileno(stdout)); + } g_main_loop_run(mloop); |