summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2011-05-13 12:24:08 +0200
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2011-05-16 11:03:55 +0200
commitd32d1334148c31f133968d1b1979fd29f8fec2a6 (patch)
tree2bc904edd58f9e02ca1aaff19d73f260f101a596
parent0d7638c507a58911a29e45d7830326bf60aa55d9 (diff)
test DelegateChannels() refusing to delegate
-rw-r--r--tests/dbus/base-client.c31
-rw-r--r--tests/lib/simple-channel-dispatcher.c36
-rw-r--r--tests/lib/simple-channel-dispatcher.h2
3 files changed, 67 insertions, 2 deletions
diff --git a/tests/dbus/base-client.c b/tests/dbus/base-client.c
index b26bfe39..0fe60cd9 100644
--- a/tests/dbus/base-client.c
+++ b/tests/dbus/base-client.c
@@ -1257,6 +1257,7 @@ test_delegate_channels (Test *test,
GPtrArray *requests_satisified;
GHashTable *info;
GList *chans;
+ GError *error = NULL;
tp_base_client_be_a_handler (test->base_client);
@@ -1321,6 +1322,36 @@ test_delegate_channels (Test *test,
g_assert (tp_base_client_is_handling_channel (test->base_client,
test->text_chan_2));
+ /* Try delegating the second channel, but MC refuses */
+ test->cd_service->refuse_delegate = TRUE;
+
+ chans = g_list_append (NULL, test->text_chan_2);
+
+ tp_base_client_delegate_channels_async (test->base_client,
+ chans, TP_USER_ACTION_TIME_CURRENT_TIME, NULL,
+ delegate_channels_cb, test);
+
+ g_list_free (chans);
+
+ test->wait++;
+ g_main_loop_run (test->mainloop);
+ g_assert_no_error (test->error);
+
+ g_assert_cmpuint (test->delegated->len, ==, 0);
+ g_assert_cmpuint (g_hash_table_size (test->not_delegated), ==, 1);
+ error = g_hash_table_lookup (test->not_delegated, test->text_chan_2);
+ g_assert_error (error, TP_ERRORS, TP_ERROR_BUSY);
+
+ /* Client is still handling the channel */
+ chans = tp_base_client_get_handled_channels (test->base_client);
+ g_assert_cmpuint (g_list_length (chans), ==, 1);
+ g_list_free (chans);
+
+ g_assert (!tp_base_client_is_handling_channel (test->base_client,
+ test->text_chan));
+ g_assert (tp_base_client_is_handling_channel (test->base_client,
+ test->text_chan_2));
+
g_ptr_array_foreach (channels, free_channel_details, NULL);
g_ptr_array_free (channels, TRUE);
g_ptr_array_free (requests_satisified, TRUE);
diff --git a/tests/lib/simple-channel-dispatcher.c b/tests/lib/simple-channel-dispatcher.c
index 8f3eb359..283ec64e 100644
--- a/tests/lib/simple-channel-dispatcher.c
+++ b/tests/lib/simple-channel-dispatcher.c
@@ -246,6 +246,12 @@ tp_tests_simple_channel_dispatcher_ensure_channel_with_hints (
g_free (path);
}
+static void
+free_not_delegated_error (gpointer data)
+{
+ g_boxed_free (TP_STRUCT_TYPE_NOT_DELEGATED_ERROR, data);
+}
+
static void
tp_tests_simple_channel_dispatcher_delegate_channels (
@@ -255,13 +261,39 @@ tp_tests_simple_channel_dispatcher_delegate_channels (
const gchar *preferred_handler,
DBusGMethodInvocation *context)
{
+ TpTestsSimpleChannelDispatcher *self = (TpTestsSimpleChannelDispatcher *)
+ dispatcher;
+ GPtrArray *delegated;
GHashTable *not_delegated;
+ guint i;
+
+ delegated = g_ptr_array_new ();
+ not_delegated = g_hash_table_new_full (g_str_hash, g_str_equal,
+ NULL, free_not_delegated_error);
- not_delegated = g_hash_table_new (g_str_hash, g_str_equal);
+ for (i = 0; i < channels->len; i++)
+ {
+ gpointer chan_path = g_ptr_array_index (channels, i);
+ GValueArray *v;
+
+ if (!self->refuse_delegate)
+ {
+ g_ptr_array_add (delegated, chan_path);
+ continue;
+ }
+
+ v = tp_value_array_build (2,
+ G_TYPE_STRING, TP_ERROR_STR_BUSY,
+ G_TYPE_STRING, "Nah!",
+ G_TYPE_INVALID);
+
+ g_hash_table_insert (not_delegated, chan_path, v);
+ }
- tp_svc_channel_dispatcher_return_from_delegate_channels (context, channels,
+ tp_svc_channel_dispatcher_return_from_delegate_channels (context, delegated,
not_delegated);
+ g_ptr_array_unref (delegated);
g_hash_table_unref (not_delegated);
}
diff --git a/tests/lib/simple-channel-dispatcher.h b/tests/lib/simple-channel-dispatcher.h
index bcc78f9e..42ba45f7 100644
--- a/tests/lib/simple-channel-dispatcher.h
+++ b/tests/lib/simple-channel-dispatcher.h
@@ -30,6 +30,8 @@ struct _TpTestsSimpleChannelDispatcher {
GObject parent;
TpTestsSimpleChannelDispatcherPrivate *priv;
+
+ gboolean refuse_delegate;
};
GType tp_tests_simple_channel_dispatcher_get_type (void);