Merge lp:~gordallott/unity/fix-hud-not-emitting-signal into lp:unity

Proposed by Gord Allott
Status: Merged
Approved by: Marco Trevisan (Treviño)
Approved revision: no longer in the source branch.
Merged at revision: 2139
Proposed branch: lp:~gordallott/unity/fix-hud-not-emitting-signal
Merge into: lp:unity
Diff against target: 230 lines (+136/-5)
3 files modified
UnityCore/Hud.cpp (+1/-0)
tests/test_hud.cpp (+41/-3)
tests/test_service_hud.c (+94/-2)
To merge this branch: bzr merge lp:~gordallott/unity/fix-hud-not-emitting-signal
Reviewer Review Type Date Requested Status
Marco Trevisan (Treviño) Approve
Review via email: mp+97873@code.launchpad.net

Commit message

Fixes issue with hud not emitting a signal when results change

Description of the change

Fixes issue with hud not emitting when results change

== The Problem ==
Hud was listening the to the QueryUpdated signal but wasn't emitting a signal

== The Solution ==
Emit the signal

== Testing ==
About a billion lines in comparison, adds the signal check to our hud test suite

To post a comment you must log in.
Revision history for this message
Marco Trevisan (Treviño) (3v1n0) wrote :

Looks good. ;)

review: Approve
Revision history for this message
Unity Merger (unity-merger) wrote :

No commit message specified.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'UnityCore/Hud.cpp'
2--- UnityCore/Hud.cpp 2012-02-02 14:47:15 +0000
3+++ UnityCore/Hud.cpp 2012-03-16 13:18:21 +0000
4@@ -150,6 +150,7 @@
5 GVariant* queries = g_variant_get_child_value(query, 1);
6 BuildQueries(queries);
7 g_variant_unref(queries);
8+ parent_->queries_updated.emit(queries_);
9 }
10 }
11
12
13=== modified file 'tests/test_hud.cpp'
14--- tests/test_hud.cpp 2012-03-05 16:56:48 +0000
15+++ tests/test_hud.cpp 2012-03-16 13:18:21 +0000
16@@ -2,6 +2,7 @@
17 #include <glib-object.h>
18 #include <UnityCore/GLibWrapper.h>
19 #include <UnityCore/Hud.h>
20+#include <sigc++/connection.h>
21
22 using namespace std;
23
24@@ -22,6 +23,7 @@
25 unity::hud::Hud::Queries queries;
26 bool query_return_result;
27 bool connected_result;
28+ int number_signals_found;
29 };
30
31 TEST_F(TestHud, TestConstruction)
32@@ -85,7 +87,7 @@
33 return FALSE;
34 };
35
36- hud->queries_updated.connect(query_connection);
37+ sigc::connection connection = hud->queries_updated.connect(query_connection);
38
39 guint source_id = g_timeout_add(10000, timeout_bailout, this);
40
41@@ -98,7 +100,43 @@
42
43 // finally close the connection - Nothing to check for here
44 hud->CloseQuery();
45-}
46-
47+ connection.disconnect();
48+}
49+
50+TEST_F(TestHud, TestSigEmission)
51+{
52+ // checks that the signal emission from Hud is working correctly
53+ // the service is setup to emit the same signal every 1000ms
54+ // using the same query key as its StarQuery method
55+ // so calling StartQuery and listening we expect > 1
56+ // signal emission
57+ number_signals_found = 0;
58+
59+ // make sure we receive the queries
60+ auto query_connection = [this](unity::hud::Hud::Queries queries_)
61+ {
62+ number_signals_found += 1;
63+ };
64+
65+ auto timeout_bailout = [] (gpointer data) -> gboolean
66+ {
67+ g_main_loop_quit(loop_);
68+ return FALSE;
69+ };
70+
71+ sigc::connection connection = hud->queries_updated.connect(query_connection);
72+
73+ hud->RequestQuery("Request30Queries");
74+ guint source_id = g_timeout_add(10000, timeout_bailout, this);
75+
76+ g_main_loop_run(loop_);
77+ EXPECT_GT(number_signals_found, 1);
78+ g_source_remove(source_id);
79+
80+ // finally close the connection - Nothing to check for here
81+ hud->CloseQuery();
82+ connection.disconnect();
83+
84+}
85
86 }
87
88=== modified file 'tests/test_service_hud.c'
89--- tests/test_service_hud.c 2012-01-12 11:45:05 +0000
90+++ tests/test_service_hud.c 2012-03-16 13:18:21 +0000
91@@ -51,6 +51,10 @@
92 GDBusMethodInvocation *invocation,
93 gpointer user_data);
94
95+static gboolean do_emit_signal(gpointer data);
96+static void emit_signal(GDBusConnection *connection);
97+
98+
99 G_DEFINE_TYPE(ServiceHud, service_hud, G_TYPE_OBJECT);
100 static GDBusNodeInfo * node_info = NULL;
101 static GDBusInterfaceInfo * iface_info = NULL;
102@@ -60,12 +64,12 @@
103 set_property: NULL,
104 };
105
106-
107 struct _ServiceHudPrivate
108 {
109 GDBusConnection * bus;
110 GCancellable * bus_lookup;
111 guint bus_registration;
112+ guint sig_emission_handle;
113 };
114
115 static void
116@@ -88,6 +92,11 @@
117 self->priv->bus = NULL;
118 }
119
120+ if (self->priv->sig_emission_handle) {
121+ g_source_remove(self->priv->sig_emission_handle);
122+ self->priv->sig_emission_handle = 0;
123+ }
124+
125 }
126
127 static void
128@@ -129,7 +138,6 @@
129
130 self->priv->bus_lookup = g_cancellable_new();
131 g_bus_get(G_BUS_TYPE_SESSION, self->priv->bus_lookup, bus_got_cb, self);
132-
133 }
134
135 ServiceHud*
136@@ -168,10 +176,94 @@
137 g_error_free(error);
138 return;
139 }
140+ else
141+ {
142+ self->priv->sig_emission_handle = g_timeout_add(1000, do_emit_signal, bus);
143+ }
144
145 return;
146 }
147
148+static gboolean
149+do_emit_signal(gpointer data)
150+{
151+ emit_signal(G_DBUS_CONNECTION(data));
152+ return TRUE;
153+}
154+
155+static void
156+emit_signal(GDBusConnection *connection)
157+{
158+ GVariant *query;
159+ int num_entries = 5;
160+
161+ /* Build into into a variant */
162+ GVariantBuilder ret_builder;
163+ g_variant_builder_init(&ret_builder, G_VARIANT_TYPE_TUPLE);
164+ g_variant_builder_add_value(&ret_builder, g_variant_new_string("target"));
165+ GVariantBuilder builder;
166+
167+ g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY);
168+
169+ int i = 0;
170+ for (i = 0; i < num_entries; i++)
171+ {
172+ gchar* target = g_strdup_printf("test-%i", i);
173+ gchar* icon = g_strdup_printf("icon-%i", i);
174+ gchar* future_icon = g_strdup(icon);
175+ gchar* completion_text = g_strdup_printf("completion-%i", i);
176+ gchar* accelerator = g_strdup_printf("<alt>+whatever");
177+
178+ GVariantBuilder tuple;
179+ g_variant_builder_init(&tuple, G_VARIANT_TYPE_TUPLE);
180+ g_variant_builder_add_value(&tuple, g_variant_new_string(target));
181+ g_variant_builder_add_value(&tuple, g_variant_new_string(icon));
182+ g_variant_builder_add_value(&tuple, g_variant_new_string(future_icon));
183+ g_variant_builder_add_value(&tuple, g_variant_new_string(completion_text));
184+ g_variant_builder_add_value(&tuple, g_variant_new_string(accelerator));
185+ // build a fake key
186+ GVariant* key;
187+ {
188+ GVariantBuilder keybuilder;
189+ g_variant_builder_init(&keybuilder, G_VARIANT_TYPE_TUPLE);
190+ g_variant_builder_add_value(&keybuilder, g_variant_new_string("dummy string"));
191+ g_variant_builder_add_value(&keybuilder, g_variant_new_string("dummy string"));
192+ g_variant_builder_add_value(&keybuilder, g_variant_new_string("dummy string"));
193+ g_variant_builder_add_value(&keybuilder, g_variant_new_int32(1986));
194+
195+ key = g_variant_new_variant(g_variant_builder_end(&keybuilder));
196+ }
197+ g_variant_ref_sink(key);
198+ g_variant_builder_add_value(&tuple, key);
199+ g_variant_builder_add_value(&builder, g_variant_builder_end(&tuple));
200+ g_free(target);
201+ g_free(icon);
202+ g_free(future_icon);
203+ g_free(completion_text);
204+ }
205+ g_variant_builder_add_value(&ret_builder, g_variant_builder_end(&builder));
206+
207+ GVariant* query_key;
208+ {
209+ GVariantBuilder keybuilder;
210+ g_variant_builder_init(&keybuilder, G_VARIANT_TYPE_TUPLE);
211+ g_variant_builder_add_value(&keybuilder, g_variant_new_string("dummy string"));
212+ g_variant_builder_add_value(&keybuilder, g_variant_new_string("dummy string"));
213+ g_variant_builder_add_value(&keybuilder, g_variant_new_string("dummy string"));
214+ g_variant_builder_add_value(&keybuilder, g_variant_new_int32(1986));
215+
216+ query_key = g_variant_new_variant(g_variant_builder_end(&keybuilder));
217+ }
218+ g_variant_ref_sink(query_key);
219+ g_variant_builder_add_value(&ret_builder, query_key);
220+
221+ query = g_variant_builder_end(&ret_builder);
222+
223+ g_dbus_connection_emit_signal (connection, NULL, "/com/canonical/hud",
224+ "com.canonical.hud", "UpdatedQuery",
225+ query, NULL);
226+}
227+
228 static void
229 bus_method (GDBusConnection *connection, const gchar *sender, const gchar *object_path, const gchar *interface_name, const gchar *method_name, GVariant *parameters, GDBusMethodInvocation *invocation, gpointer user_data)
230 {