← Back to team overview

ayatana-commits team mailing list archive

[Merge] lp:~ted/dbus-test-runner/bustle-data into lp:dbus-test-runner

 

Ted Gould has proposed merging lp:~ted/dbus-test-runner/bustle-data into lp:dbus-test-runner.

    Requested reviews:
    Indicator Applet Developers (indicator-applet-developers)


I'm proposing this branch because well, that's the process.  And I think the process is good.  But this diff may MAKE YOUR EYES BLEED -- don't say I didn't warn you.

This adds support for using bustle-dbus-watcher in a nice way in the dbus-test-runner by having a small parameter for where the data goes.  The filtering doesn't really work, but that's okay, it's easy to do afterwards.  But, now you're saved from this pain and you can get data before your tasks even start running.  And that's cool.
-- 
https://code.launchpad.net/~ted/dbus-test-runner/bustle-data/+merge/15801
Your team ayatana-commits is subscribed to branch lp:dbus-test-runner.
=== modified file '.bzrignore'
--- .bzrignore	2009-12-03 17:39:04 +0000
+++ .bzrignore	2009-12-08 05:35:20 +0000
@@ -15,3 +15,6 @@
 tests/testcat.output.cat2.filtered.txt
 tests/testcat.output.cat2.txt
 tests/testcat.output.txt
+tests/test-bustle
+tests/test-bustle.bustle
+tests/test-bustle.filtered

=== modified file 'src/Makefile.am'
--- src/Makefile.am	2009-04-27 19:26:24 +0000
+++ src/Makefile.am	2009-12-08 05:35:20 +0000
@@ -2,5 +2,7 @@
 bin_PROGRAMS = dbus-test-runner
 
 dbus_test_runner_SOURCES = dbus-test-runner.c
-dbus_test_runner_CFLAGS  = $(DBUS_TEST_RUNNER_CFLAGS) -DDEFAULT_SESSION_CONF="\"$(datadir)/dbus-test-runner/session.conf\""
+dbus_test_runner_CFLAGS  = $(DBUS_TEST_RUNNER_CFLAGS) \
+	-DDEFAULT_SESSION_CONF="\"$(datadir)/dbus-test-runner/session.conf\"" \
+	-Wall -Werror
 dbus_test_runner_LDADD   = $(DBUS_TEST_RUNNER_LIBS)

=== modified file 'src/dbus-test-runner.c'
--- src/dbus-test-runner.c	2009-12-03 19:00:06 +0000
+++ src/dbus-test-runner.c	2009-12-08 05:35:20 +0000
@@ -27,6 +27,196 @@
 
 static void check_task_cleanup (task_t * task, gboolean force);
 
+static gchar * bustle_datafile = NULL;
+static GIOChannel * bustle_stdout = NULL;
+static GIOChannel * bustle_stderr = NULL;
+static GIOChannel * bustle_file = NULL;
+static GPid bustle_pid = 0;
+static GList * bustle_watches = NULL;
+
+#define BUSTLE_ERROR_DEFAULT  "Bustle"
+static gchar * bustle_error = BUSTLE_ERROR_DEFAULT;
+
+static gboolean
+bustle_write_error (GIOChannel * channel, GIOCondition condition, gpointer data)
+{
+	gchar * line;
+	gsize termloc;
+
+	do {
+		GIOStatus status = g_io_channel_read_line (channel, &line, NULL, &termloc, NULL);
+
+		if (status == G_IO_STATUS_EOF) {
+			return FALSE;
+		}
+
+		if (status != G_IO_STATUS_NORMAL) {
+			continue;
+		}
+
+		line[termloc] = '\0';
+
+		g_print("%s: %s\n", bustle_error, line);
+		g_free(line);
+	} while (G_IO_IN & g_io_channel_get_buffer_condition(channel));
+
+	return TRUE;
+}
+
+static gboolean
+bustle_writes (GIOChannel * channel, GIOCondition condition, gpointer data)
+{
+	g_debug("Bustle write");
+	gchar * line;
+	gsize termloc;
+
+	do {
+		GIOStatus status = g_io_channel_read_line (channel, &line, NULL, &termloc, NULL);
+
+		if (status == G_IO_STATUS_EOF) {
+			continue;
+		}
+
+		if (status != G_IO_STATUS_NORMAL) {
+			continue;
+		}
+
+		g_io_channel_write_chars((GIOChannel *)data,
+		                         line,
+		                         termloc,
+		                         NULL,
+		                         NULL);
+		g_io_channel_write_chars((GIOChannel *)data,
+		                         "\n",
+		                         1,
+		                         NULL,
+		                         NULL);
+
+		g_free(line);
+	} while ((G_IO_IN | G_IO_PRI) & g_io_channel_get_buffer_condition(channel));
+
+	return TRUE;
+}
+
+static void
+start_bustling (void)
+{
+	if (bustle_datafile == NULL) {
+		return;
+	}
+
+	GError * error = NULL;
+
+	bustle_file = g_io_channel_new_file(bustle_datafile, "w", &error);
+
+	if (error != NULL) {
+		g_warning("Unable to open bustle file '%s': %s", bustle_datafile, error->message);
+		g_error_free(error);
+		g_free(bustle_datafile);
+		bustle_datafile = NULL;
+		return;
+	}
+
+	gint bustle_stdout_num;
+	gint bustle_stderr_num;
+	
+	gchar ** bustle_monitor = g_new0(gchar *, g_list_length(bustle_watches) + 3);
+	bustle_monitor[0] = "bustle-dbus-monitor";
+	bustle_monitor[1] = "--session";
+	int i;
+	for (i = 0; i < g_list_length(bustle_watches); i++) {
+		bustle_monitor[i + 2] = (gchar *)g_list_nth(bustle_watches, i)->data;
+	}
+
+	g_spawn_async_with_pipes(g_get_current_dir(),
+	                         bustle_monitor, /* argv */
+	                         NULL, /* envp */
+	                         /* G_SPAWN_SEARCH_PATH | G_SPAWN_STDERR_TO_DEV_NULL, */ /* flags */
+	                         G_SPAWN_SEARCH_PATH, /* flags */
+	                         NULL, /* child setup func */
+	                         NULL, /* child setup data */
+	                         &bustle_pid, /* PID */
+	                         NULL, /* stdin */
+	                         &bustle_stdout_num, /* stdout */
+	                         &bustle_stderr_num, /* stderr */
+	                         &error); /* error */
+
+	if (error != NULL) {
+		g_warning("Unable to start bustling data: %s", error->message);
+		return;
+	}
+
+	bustle_stdout = g_io_channel_unix_new(bustle_stdout_num);
+	g_io_add_watch(bustle_stdout,
+	               G_IO_IN | G_IO_PRI, /* conditions */
+	               bustle_writes, /* func */
+	               bustle_file); /* func data */
+
+	bustle_stderr = g_io_channel_unix_new(bustle_stderr_num);
+	g_io_add_watch(bustle_stderr,
+	               G_IO_IN, /* conditions */
+	               bustle_write_error, /* func */
+	               NULL); /* func data */
+
+	return;
+}
+
+static void
+stop_bustling (void)
+{
+	if (bustle_datafile == NULL) {
+		return;
+	}
+
+	gchar * killline = g_strdup_printf("kill -INT %d", bustle_pid);
+	g_spawn_command_line_sync(killline, NULL, NULL, NULL, NULL);
+	g_free(killline);
+
+	gchar * send_stdout = NULL;
+	gchar * send_stderr = NULL;
+	g_spawn_command_line_sync("dbus-send --session --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.ListNames", &send_stdout, &send_stderr, NULL, NULL);
+	if (send_stdout != NULL) {
+		g_free(send_stdout);
+	}
+	if (send_stderr != NULL) {
+		g_free(send_stderr);
+	}
+
+	gchar * line;
+	gsize termloc;
+
+	while (!((G_IO_ERR | G_IO_HUP | G_IO_NVAL) & g_io_channel_get_buffer_condition(bustle_stdout))) {
+		GIOStatus status = g_io_channel_read_line (bustle_stdout, &line, NULL, &termloc, NULL);
+
+		if (status == G_IO_STATUS_EOF) {
+			break;
+		}
+
+		if (status != G_IO_STATUS_NORMAL) {
+			continue;
+		}
+
+		g_io_channel_write_chars((GIOChannel *)bustle_file,
+		                         line,
+		                         termloc,
+		                         NULL,
+		                         NULL);
+		g_io_channel_write_chars((GIOChannel *)bustle_file,
+		                         "\n",
+		                         1,
+		                         NULL,
+		                         NULL);
+
+		g_free(line);
+	}
+
+	g_io_channel_shutdown(bustle_stdout, TRUE, NULL);
+	g_io_channel_shutdown(bustle_stderr, TRUE, NULL);
+	g_io_channel_shutdown(bustle_file, TRUE, NULL);
+
+	return;
+}
+
 static gboolean
 force_kill_in_a_bit (gpointer data)
 {
@@ -185,7 +375,14 @@
 		g_setenv("DBUS_STARTER_ADDRESS", line, TRUE);
 		g_setenv("DBUS_STARTER_BUS_TYPE", "session", TRUE);
 
-		g_list_foreach(tasks, start_task, NULL);
+		if (tasks != NULL) {
+			start_bustling();
+
+			g_list_foreach(tasks, start_task, NULL);
+		} else {
+			g_print("No tasks!\n");
+			g_main_loop_quit(global_mainloop);
+		}
 	}
 
 	g_free(line);
@@ -274,14 +471,20 @@
 	return TRUE;
 }
 
+static gboolean
+bustle_watch (const gchar * arg, const gchar * value, gpointer data, GError ** error)
+{
+	bustle_watches = g_list_append(bustle_watches, g_strdup(value));
+	return TRUE;
+}
+
 static void
 length_finder (gpointer data, gpointer udata)
 {
 	task_t * task = (task_t *)data;
 	guint * longest = (guint *)udata;
 
-	/* 640 should be enough characters for anyone */
-	guint length = g_utf8_strlen(task->name, 640);
+	guint length = g_utf8_strlen(task->name, -1);
 	if (length > *longest) {
 		*longest = length;
 	}
@@ -307,8 +510,7 @@
 	task_t * task = (task_t *)data;
 	guint * target = (guint *)udata;
 
-	/* 640 should be enough characters for anyone */
-	guint length = g_utf8_strlen(task->name, 640);
+	guint length = g_utf8_strlen(task->name, -1);
 	if (length != *target) {
 		gchar * fillstr = g_strnfill(*target - length, ' ');
 		gchar * newname = g_strconcat(task->name, fillstr, NULL);
@@ -321,14 +523,37 @@
 }
 
 static void
+normalize_bustle (guint target)
+{
+	if (bustle_datafile == NULL) {
+		return;
+	}
+
+	guint length = g_utf8_strlen(BUSTLE_ERROR_DEFAULT, -1);
+	if (length != target) {
+		gchar * fillstr = g_strnfill(target - length, ' ');
+		bustle_error = g_strconcat(BUSTLE_ERROR_DEFAULT, fillstr, NULL);
+		g_free(fillstr);
+	}
+
+	return;
+}
+
+static void
 normalize_name_length (void)
 {
 	guint maxlen = 0;
+	
+	if (bustle_datafile != NULL) {
+		maxlen = g_utf8_strlen(BUSTLE_ERROR_DEFAULT, -1);
+	}
 
 	g_list_foreach(tasks, set_name, NULL);
 	g_list_foreach(tasks, length_finder, &maxlen);
 	g_list_foreach(tasks, normalize_name, &maxlen);
 
+	normalize_bustle(maxlen);
+
 	return;
 }
 
@@ -336,6 +561,8 @@
 
 static GOptionEntry general_options[] = {
 	{"dbus-config",  'd',   G_OPTION_FLAG_FILENAME,  G_OPTION_ARG_FILENAME,  &dbus_configfile, "Configuration file for newly created DBus server.  Defaults to '" DEFAULT_SESSION_CONF "'.", "config_file"},
+	{"bustle-data",  'b',   G_OPTION_FLAG_FILENAME,  G_OPTION_ARG_FILENAME,  &bustle_datafile, "A file to write out data from the bustle logger to.", "data_file"},
+	{"bustle-watch", 'w',   0,                       G_OPTION_ARG_CALLBACK,  bustle_watch,     "Defines a watch string for the bustle watcher task. (broken)", "filter"},
 	{NULL}
 };
 
@@ -399,6 +626,8 @@
 	global_mainloop = g_main_loop_new(NULL, FALSE);
 	g_main_loop_run(global_mainloop);
 
+	stop_bustling();
+
 	gchar * killline = g_strdup_printf("kill -9 %d", dbus);
 	g_spawn_command_line_sync(killline, NULL, NULL, NULL, NULL);
 	g_free(killline);

=== modified file 'tests/Makefile.am'
--- tests/Makefile.am	2009-12-03 17:39:04 +0000
+++ tests/Makefile.am	2009-12-08 05:35:21 +0000
@@ -64,5 +64,16 @@
 	@chmod +x $@
 DISTCLEANFILES += testcat.output.txt testcat.output.cat1.txt testcat.output.cat2.txt testcat.output.cat1.filtered.txt testcat.output.cat2.filtered.txt
 
+TESTS += test-bustle
+test-bustle: Makefile.am test-bustle.reference
+	@echo "#!/bin/sh -e" > $@
+	@echo $(DBUS_RUNNER) --bustle-data \"$(builddir)/test-bustle.bustle\" --task dbus-send -p "--session" -p "--print-reply" -p "--dest=org.freedesktop.DBus" -p "/org/freedesktop/DBus" -p "org.freedesktop.DBus.ListNames" --ignore-return >> $@
+	@echo "grep ^mc \"$(builddir)/test-bustle.bustle\" | grep ":1.1" | grep "ListNames" | cut -f 5-9 > test-bustle.filtered" >> $@
+	@echo "diff \"$(srcdir)/test-bustle.reference\" \"$(builddir)/test-bustle.filtered\"" >> $@
+	@chmod +x $@
+DISTCLEANFILES += test-bustle.bustle test-bustle.filtered
+
+
 EXTRA_DIST = \
-	delayrm.sh
+	delayrm.sh \
+	test-bustle.reference

=== added file 'tests/test-bustle.reference'
--- tests/test-bustle.reference	1970-01-01 00:00:00 +0000
+++ tests/test-bustle.reference	2009-12-08 05:35:21 +0000
@@ -0,0 +1,1 @@
+:1.1	org.freedesktop.DBus	/org/freedesktop/DBus	org.freedesktop.DBus	ListNames


Follow ups