summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian J. Tarricone <brian@tarricone.org>2009-09-18 15:48:19 -0700
committerBrian J. Tarricone <brian@tarricone.org>2009-09-18 16:41:06 -0700
commitf7aebe04aec59c3c5583fd81a0320c09ac13ff3a (patch)
tree7d5b1099e9a89ff4136cbf03080b22fa04e1cd84
parent0f90faf47b40fd22e36815392b130ee193dbab28 (diff)
downloadxfconf-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.inc3
-rw-r--r--tests/test-template.sh.in35
-rw-r--r--tests/tests-common.h19
-rw-r--r--xfconfd/main.c23
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);