Branch data Line data Source code
1 : : /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
2 : : *
3 : : * Copyright © 2018 Endless Mobile, Inc.
4 : : *
5 : : * This library is free software; you can redistribute it and/or
6 : : * modify it under the terms of the GNU Lesser General Public
7 : : * License as published by the Free Software Foundation; either
8 : : * version 2.1 of the License, or (at your option) any later version.
9 : : *
10 : : * This library is distributed in the hope that it will be useful,
11 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 : : * Lesser General Public License for more details.
14 : : *
15 : : * You should have received a copy of the GNU Lesser General Public
16 : : * License along with this library; if not, write to the Free Software
17 : : * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 : : *
19 : : * Authors:
20 : : * - Philip Withnall <withnall@endlessm.com>
21 : : */
22 : :
23 : : #include "config.h"
24 : :
25 : : #include <glib.h>
26 : : #include <glib-object.h>
27 : : #include <glib/gi18n-lib.h>
28 : : #include <gio/gio.h>
29 : : #include <libmogwai-schedule/peer-manager.h>
30 : : #include <libmogwai-schedule/scheduler.h>
31 : : #include <libmogwai-schedule/tests/peer-manager-dummy.h>
32 : : #include <stdlib.h>
33 : :
34 : :
35 : : static void mws_peer_manager_dummy_peer_manager_init (MwsPeerManagerInterface *iface);
36 : :
37 : : static void mws_peer_manager_dummy_get_property (GObject *object,
38 : : guint property_id,
39 : : GValue *value,
40 : : GParamSpec *pspec);
41 : : static void mws_peer_manager_dummy_set_property (GObject *object,
42 : : guint property_id,
43 : : const GValue *value,
44 : : GParamSpec *pspec);
45 : : static void mws_peer_manager_dummy_finalize (GObject *object);
46 : :
47 : : static void mws_peer_manager_dummy_ensure_peer_credentials_async (MwsPeerManager *manager,
48 : : const gchar *sender,
49 : : GCancellable *cancellable,
50 : : GAsyncReadyCallback callback,
51 : : gpointer user_data);
52 : : static gchar *mws_peer_manager_dummy_ensure_peer_credentials_finish (MwsPeerManager *manager,
53 : : GAsyncResult *result,
54 : : GError **error);
55 : : static const gchar *mws_peer_manager_dummy_get_peer_credentials (MwsPeerManager *manager,
56 : : const gchar *sender);
57 : :
58 : : /**
59 : : * MwsPeerManagerDummy:
60 : : *
61 : : * An implementation of the #MwsPeerManager interface which returns dummy
62 : : * results as provided using mws_peer_manager_dummy_set_peer_credentials() and
63 : : * mws_peer_manager_dummy_remove_peer(). It can be set to always return failure
64 : : * using mws_peer_manager_dummy_set_fail(). To be used for testing only.
65 : : *
66 : : * Since: 0.1.0
67 : : */
68 : : struct _MwsPeerManagerDummy
69 : : {
70 : : GObject parent;
71 : :
72 : : /* Whether to always fail, or always succeed. */
73 : : gboolean fail;
74 : :
75 : : /* Mapping of D-Bus unique names to credentials to return. */
76 : : GHashTable *peer_credentials; /* (owned) (element-type utf8 utf8) */
77 : : };
78 : :
79 : : typedef enum
80 : : {
81 : : PROP_FAIL = 1,
82 : : } MwsPeerManagerDummyProperty;
83 : :
84 [ + + + - : 348 : G_DEFINE_TYPE_WITH_CODE (MwsPeerManagerDummy, mws_peer_manager_dummy, G_TYPE_OBJECT,
+ + ]
85 : : G_IMPLEMENT_INTERFACE (MWS_TYPE_PEER_MANAGER,
86 : : mws_peer_manager_dummy_peer_manager_init))
87 : : static void
88 : 2 : mws_peer_manager_dummy_class_init (MwsPeerManagerDummyClass *klass)
89 : : {
90 : 2 : GObjectClass *object_class = (GObjectClass *) klass;
91 : 2 : GParamSpec *props[PROP_FAIL + 1] = { NULL, };
92 : :
93 : 2 : object_class->get_property = mws_peer_manager_dummy_get_property;
94 : 2 : object_class->set_property = mws_peer_manager_dummy_set_property;
95 : 2 : object_class->finalize = mws_peer_manager_dummy_finalize;
96 : :
97 : : /**
98 : : * MwsPeerManagerDummy:fail:
99 : : *
100 : : * %TRUE to return %MWS_SCHEDULER_ERROR_IDENTIFYING_PEER when credentials are
101 : : * next ensured; %FALSE to return valid details.
102 : : *
103 : : * Since: 0.1.0
104 : : */
105 : 2 : props[PROP_FAIL] =
106 : 2 : g_param_spec_boolean ("fail", "Fail",
107 : : "Whether to return failure on calls to ensure peers.",
108 : : FALSE,
109 : : G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
110 : :
111 : 2 : g_object_class_install_properties (object_class, G_N_ELEMENTS (props), props);
112 : 2 : }
113 : :
114 : : static void
115 : 2 : mws_peer_manager_dummy_peer_manager_init (MwsPeerManagerInterface *iface)
116 : : {
117 : 2 : iface->ensure_peer_credentials_async = mws_peer_manager_dummy_ensure_peer_credentials_async;
118 : 2 : iface->ensure_peer_credentials_finish = mws_peer_manager_dummy_ensure_peer_credentials_finish;
119 : 2 : iface->get_peer_credentials = mws_peer_manager_dummy_get_peer_credentials;
120 : 2 : }
121 : :
122 : : static void
123 : 48 : mws_peer_manager_dummy_init (MwsPeerManagerDummy *self)
124 : : {
125 : 48 : self->peer_credentials = g_hash_table_new_full (g_str_hash, g_str_equal,
126 : : g_free, g_free);
127 : 48 : }
128 : :
129 : : static void
130 : 0 : mws_peer_manager_dummy_get_property (GObject *object,
131 : : guint property_id,
132 : : GValue *value,
133 : : GParamSpec *pspec)
134 : : {
135 : 0 : MwsPeerManagerDummy *self = MWS_PEER_MANAGER_DUMMY (object);
136 : :
137 [ # # ]: 0 : switch ((MwsPeerManagerDummyProperty) property_id)
138 : : {
139 : 0 : case PROP_FAIL:
140 : 0 : g_value_set_boolean (value, self->fail);
141 : 0 : break;
142 : 0 : default:
143 : 0 : g_assert_not_reached ();
144 : : }
145 : 0 : }
146 : :
147 : : static void
148 : 48 : mws_peer_manager_dummy_set_property (GObject *object,
149 : : guint property_id,
150 : : const GValue *value,
151 : : GParamSpec *pspec)
152 : : {
153 : 48 : MwsPeerManagerDummy *self = MWS_PEER_MANAGER_DUMMY (object);
154 : :
155 [ + - ]: 48 : switch ((MwsPeerManagerDummyProperty) property_id)
156 : : {
157 : 48 : case PROP_FAIL:
158 : 48 : self->fail = g_value_get_boolean (value);
159 : 48 : g_object_notify (object, "fail");
160 : 48 : break;
161 : 0 : default:
162 : 0 : g_assert_not_reached ();
163 : : }
164 : 48 : }
165 : :
166 : : static void
167 : 47 : mws_peer_manager_dummy_finalize (GObject *object)
168 : : {
169 : 47 : MwsPeerManagerDummy *self = MWS_PEER_MANAGER_DUMMY (object);
170 : :
171 [ + - ]: 47 : g_clear_pointer (&self->peer_credentials, g_hash_table_unref);
172 : :
173 : 47 : G_OBJECT_CLASS (mws_peer_manager_dummy_parent_class)->finalize (object);
174 : 47 : }
175 : :
176 : : static void
177 : 9 : mws_peer_manager_dummy_ensure_peer_credentials_async (MwsPeerManager *manager,
178 : : const gchar *sender,
179 : : GCancellable *cancellable,
180 : : GAsyncReadyCallback callback,
181 : : gpointer user_data)
182 : : {
183 : 9 : MwsPeerManagerDummy *self = MWS_PEER_MANAGER_DUMMY (manager);
184 : :
185 : 18 : g_autoptr(GTask) task = g_task_new (self, cancellable, callback, user_data);
186 [ + - ]: 9 : g_task_set_source_tag (task, mws_peer_manager_dummy_ensure_peer_credentials_async);
187 : :
188 : 9 : const gchar *dummy_path = g_hash_table_lookup (self->peer_credentials, sender);
189 : :
190 [ + + - + ]: 9 : if (self->fail || dummy_path == NULL)
191 : 2 : g_task_return_new_error (task, MWS_SCHEDULER_ERROR,
192 : : MWS_SCHEDULER_ERROR_IDENTIFYING_PEER,
193 : : "Dummy peer manager always returns this error");
194 : : else
195 : 7 : g_task_return_pointer (task, g_strdup (dummy_path), g_free);
196 : 9 : }
197 : :
198 : : static gchar *
199 : 9 : mws_peer_manager_dummy_ensure_peer_credentials_finish (MwsPeerManager *manager,
200 : : GAsyncResult *result,
201 : : GError **error)
202 : : {
203 [ - + ]: 9 : g_return_val_if_fail (g_task_is_valid (result, manager), NULL);
204 [ - + ]: 9 : g_return_val_if_fail (g_async_result_is_tagged (result, mws_peer_manager_dummy_ensure_peer_credentials_async), NULL);
205 : :
206 : 9 : return g_task_propagate_pointer (G_TASK (result), error);
207 : : }
208 : :
209 : : static const gchar *
210 : 146 : mws_peer_manager_dummy_get_peer_credentials (MwsPeerManager *manager,
211 : : const gchar *sender)
212 : : {
213 : 146 : MwsPeerManagerDummy *self = MWS_PEER_MANAGER_DUMMY (manager);
214 : :
215 : 146 : return g_hash_table_lookup (self->peer_credentials, sender);
216 : : }
217 : :
218 : : /**
219 : : * mws_peer_manager_dummy_new:
220 : : * @fail: %TRUE to always return %MWS_SCHEDULER_ERROR_IDENTIFYING_PEER; %FALSE
221 : : * to always return valid peer data
222 : : *
223 : : * Create a #MwsPeerManagerDummy object.
224 : : *
225 : : * Returns: (transfer full): a new #MwsPeerManagerDummy
226 : : * Since: 0.1.0
227 : : */
228 : : MwsPeerManagerDummy *
229 : 48 : mws_peer_manager_dummy_new (gboolean fail)
230 : : {
231 : 48 : return g_object_new (MWS_TYPE_PEER_MANAGER_DUMMY,
232 : : "fail", fail,
233 : : NULL);
234 : : }
235 : :
236 : : /**
237 : : * mws_peer_manager_dummy_get_fail:
238 : : * @self: a #MwsPeerManagerDummy
239 : : *
240 : : * Get the value of #MwsPeerManagerDummy:fail.
241 : : *
242 : : * Returns: %TRUE if the peer manager will always fail to get peer information;
243 : : * %FALSE otherwise
244 : : * Since: 0.1.0
245 : : */
246 : : gboolean
247 : 0 : mws_peer_manager_dummy_get_fail (MwsPeerManagerDummy *self)
248 : : {
249 [ # # ]: 0 : g_return_val_if_fail (MWS_IS_PEER_MANAGER_DUMMY (self), FALSE);
250 : :
251 : 0 : return self->fail;
252 : : }
253 : :
254 : : /**
255 : : * mws_peer_manager_dummy_set_fail:
256 : : * @self: a #MwsPeerManagerDummy
257 : : * @fail: %TRUE to always fail to get peer information; %FALSE otherwise
258 : : *
259 : : * Set the value of #MwsPeerManagerDummy:fail to @fail.
260 : : *
261 : : * Since: 0.1.0
262 : : */
263 : : void
264 : 2 : mws_peer_manager_dummy_set_fail (MwsPeerManagerDummy *self,
265 : : gboolean fail)
266 : : {
267 [ - + ]: 2 : g_return_if_fail (MWS_IS_PEER_MANAGER_DUMMY (self));
268 : :
269 [ + - ]: 2 : if (fail != self->fail)
270 : : {
271 : 2 : self->fail = fail;
272 : 2 : g_object_notify (G_OBJECT (self), "fail");
273 : : }
274 : : }
275 : :
276 : : /**
277 : : * mws_peer_manager_dummy_set_peer_credentials:
278 : : * @self: a #MwsPeerManagerDummy
279 : : * @sender: D-Bus unique name for the peer
280 : : * @path: (nullable): absolute path to return as the credentials for @sender,
281 : : * or %NULL to remove the peer
282 : : *
283 : : * Set the mock credentials which will be returned for @sender when its
284 : : * credentials are queried. If @path is %NULL, any existing mock credentials
285 : : * will be removed and, if they were present, a #MwsPeerManager::peer-vanished
286 : : * signal will be emitted.
287 : : *
288 : : * Since: 0.1.0
289 : : */
290 : : void
291 : 20 : mws_peer_manager_dummy_set_peer_credentials (MwsPeerManagerDummy *self,
292 : : const gchar *sender,
293 : : const gchar *path)
294 : : {
295 [ - + ]: 20 : g_return_if_fail (MWS_IS_PEER_MANAGER_DUMMY (self));
296 [ - + ]: 20 : g_return_if_fail (g_dbus_is_unique_name (sender));
297 [ + + - + ]: 20 : g_return_if_fail (path == NULL || *path == '/');
298 : :
299 [ + + ]: 20 : if (path != NULL)
300 : : {
301 : 18 : g_hash_table_replace (self->peer_credentials, g_strdup (sender), g_strdup (path));
302 : : }
303 : : else
304 : : {
305 [ + - ]: 2 : if (g_hash_table_remove (self->peer_credentials, sender))
306 : 2 : g_signal_emit_by_name (self, "peer-vanished", sender);
307 : : }
308 : : }
309 : :
310 : : /**
311 : : * mws_peer_manager_dummy_remove_peer:
312 : : * @self: a #MwsPeerManagerDummy
313 : : * @name: D-Bus unique name for the peer to remove
314 : : *
315 : : * Remove any existing mock credentials for @name. If credentials were removed,
316 : : * this emits the #MwsPeerManager::peer-vanished signal.
317 : : *
318 : : * This function is equivalent to calling
319 : : * mws_peer_manager_dummy_set_peer_credentials() with %NULL credentials.
320 : : *
321 : : * Since: 0.1.0
322 : : */
323 : : void
324 : 2 : mws_peer_manager_dummy_remove_peer (MwsPeerManagerDummy *self,
325 : : const gchar *name)
326 : : {
327 [ - + ]: 2 : g_return_if_fail (MWS_IS_PEER_MANAGER_DUMMY (self));
328 [ - + ]: 2 : g_return_if_fail (g_dbus_is_unique_name (name));
329 : :
330 : 2 : mws_peer_manager_dummy_set_peer_credentials (self, name, NULL);
331 : : }
|