Branch data Line data Source code
1 : : /* vi: set et sw=4 ts=4 cino=t0,(0: */
2 : : /* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 : : /*
4 : : * This file is part of libaccounts-glib
5 : : *
6 : : * Copyright (C) 2009-2010 Nokia Corporation.
7 : : * Copyright (C) 2012 Canonical Ltd.
8 : : *
9 : : * Contact: Alberto Mardegan <alberto.mardegan@canonical.com>
10 : : *
11 : : * This library is free software; you can redistribute it and/or
12 : : * modify it under the terms of the GNU Lesser General Public License
13 : : * version 2.1 as published by the Free Software Foundation.
14 : : *
15 : : * This library is distributed in the hope that it will be useful, but
16 : : * WITHOUT ANY WARRANTY; without even the implied warranty of
17 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 : : * Lesser General Public License for more details.
19 : : *
20 : : * You should have received a copy of the GNU Lesser General Public
21 : : * License along with this library; if not, write to the Free Software
22 : : * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
23 : : * 02110-1301 USA
24 : : */
25 : :
26 : : #define AG_DISABLE_DEPRECATION_WARNINGS
27 : :
28 : : #include <libaccounts-glib.h>
29 : : #include <glib.h>
30 : : #include <glib/gstdio.h>
31 : : #include <sqlite3.h>
32 : : #include <stdlib.h>
33 : : #include <string.h>
34 : : #include <sys/types.h>
35 : : #include <sys/stat.h>
36 : : #include <fcntl.h>
37 : : #include <unistd.h>
38 : :
39 : : static GMainLoop *main_loop = NULL;
40 : : static AgAccount *account = NULL;
41 : : static AgManager *manager = NULL;
42 : : static AgService *service = NULL;
43 : : static sqlite3 *sqldb = NULL;
44 : : int lock_file = 0;
45 : :
46 : : #define PROVIDER "dummyprovider"
47 : :
48 : : typedef struct {
49 : : gint argc;
50 : : gchar **argv;
51 : : } TestArgs;
52 : :
53 : : static void
54 : 2 : lock_db(gboolean lock)
55 : : {
56 : : static sqlite3_stmt *begin_stmt = NULL;
57 : : static sqlite3_stmt *commit_stmt = NULL;
58 : :
59 : : /* this lock is to synchronize with the main test application */
60 [ + + ]: 2 : if (!lock)
61 : : {
62 : 1 : int ret = lockf(lock_file, F_ULOCK, 0);
63 [ - + ]: 1 : g_assert(ret == 0);
64 : : }
65 : :
66 [ + + ]: 2 : if (!begin_stmt)
67 : : {
68 : 1 : sqlite3_prepare_v2 (sqldb, "BEGIN EXCLUSIVE;", -1, &begin_stmt, NULL);
69 : 1 : sqlite3_prepare_v2 (sqldb, "COMMIT;", -1, &commit_stmt, NULL);
70 : : }
71 : : else
72 : : {
73 : 1 : sqlite3_reset (begin_stmt);
74 : 1 : sqlite3_reset (commit_stmt);
75 : : }
76 : :
77 [ + + ]: 2 : if (lock)
78 : 1 : sqlite3_step (begin_stmt);
79 : : else
80 : 1 : sqlite3_step (commit_stmt);
81 : :
82 : : /* this lock is to synchronize with the main test application */
83 [ + + ]: 2 : if (lock)
84 : : {
85 : 1 : int ret = lockf(lock_file, F_LOCK, 0);
86 [ - + ]: 1 : g_assert(ret == 0);
87 : : }
88 : 2 : }
89 : :
90 : : static void
91 : 8 : end_test ()
92 : : {
93 [ + + ]: 8 : if (account)
94 : : {
95 : 7 : g_object_unref (account);
96 : 7 : account = NULL;
97 : : }
98 [ + + ]: 8 : if (manager)
99 : : {
100 : 7 : g_object_unref (manager);
101 : 7 : manager = NULL;
102 : : }
103 [ + + ]: 8 : if (service)
104 : : {
105 : 4 : ag_service_unref (service);
106 : 4 : service = NULL;
107 : : }
108 : :
109 [ + - ]: 8 : if (main_loop)
110 : : {
111 : 8 : g_main_loop_quit (main_loop);
112 : 8 : g_main_loop_unref (main_loop);
113 : 8 : main_loop = NULL;
114 : : }
115 : 8 : }
116 : :
117 : 7 : void account_store_cb (AgAccount *account, const GError *error,
118 : : gpointer user_data)
119 : : {
120 [ - + ]: 7 : if (error)
121 : 0 : g_warning ("Got error: %s", error->message);
122 : :
123 : 7 : end_test ();
124 : 7 : }
125 : :
126 : 1 : gboolean test_create (TestArgs *args)
127 : : {
128 : 1 : manager = ag_manager_new ();
129 : :
130 : 1 : account = ag_manager_create_account (manager, args->argv[0]);
131 : :
132 [ + - ]: 1 : if (args->argc > 1)
133 : : {
134 : 1 : ag_account_set_display_name (account, args->argv[1]);
135 : : }
136 : :
137 : 1 : ag_account_store (account, account_store_cb, NULL);
138 : :
139 : 1 : return FALSE;
140 : : }
141 : :
142 : 1 : gboolean test_delete (TestArgs *args)
143 : : {
144 : : AgAccountId id;
145 : :
146 : 1 : manager = ag_manager_new ();
147 : 1 : id = atoi(args->argv[0]);
148 : 1 : account = ag_manager_get_account (manager, id);
149 : 1 : ag_account_delete (account);
150 : :
151 : 1 : ag_account_store (account, account_store_cb, NULL);
152 : :
153 : 1 : return FALSE;
154 : : }
155 : :
156 : 1 : gboolean test_create2 (TestArgs *args)
157 : : {
158 : 1 : GValue value = { 0 };
159 : 1 : const gchar *numbers[] = {
160 : : "one",
161 : : "two",
162 : : "three",
163 : : NULL
164 : : };
165 : :
166 : 1 : manager = ag_manager_new ();
167 : :
168 : 1 : account = ag_manager_create_account (manager, args->argv[0]);
169 : :
170 [ + - ]: 1 : if (args->argc > 1)
171 : : {
172 : 1 : ag_account_set_display_name (account, args->argv[1]);
173 : : }
174 : :
175 : 1 : g_value_init (&value, G_TYPE_INT);
176 : 1 : g_value_set_int (&value, -12345);
177 : 1 : ag_account_set_value (account, "integer", &value);
178 : 1 : g_value_unset (&value);
179 : :
180 : 1 : g_value_init (&value, G_TYPE_STRING);
181 : 1 : g_value_set_static_string (&value, "a string");
182 : 1 : ag_account_set_value (account, "string", &value);
183 : 1 : g_value_unset (&value);
184 : :
185 : 1 : g_value_init (&value, G_TYPE_STRV);
186 : 1 : g_value_set_boxed (&value, numbers);
187 : 1 : ag_account_set_value (account, "numbers", &value);
188 : 1 : g_value_unset (&value);
189 : :
190 : 1 : ag_account_set_enabled (account, TRUE);
191 : :
192 : : /* also set some keys in one service */
193 : 1 : service = ag_manager_get_service (manager, "MyService");
194 : 1 : ag_account_select_service (account, service);
195 : :
196 : 1 : g_value_init (&value, G_TYPE_UINT);
197 : 1 : g_value_set_uint (&value, 54321);
198 : 1 : ag_account_set_value (account, "unsigned", &value);
199 : 1 : g_value_unset (&value);
200 : :
201 : 1 : g_value_init (&value, G_TYPE_CHAR);
202 : 1 : g_value_set_schar (&value, 'z');
203 : 1 : ag_account_set_value (account, "character", &value);
204 : 1 : g_value_unset (&value);
205 : :
206 : 1 : g_value_init (&value, G_TYPE_BOOLEAN);
207 : 1 : g_value_set_boolean (&value, TRUE);
208 : 1 : ag_account_set_value (account, "boolean", &value);
209 : 1 : g_value_unset (&value);
210 : :
211 : 1 : ag_account_set_enabled (account, FALSE);
212 : :
213 : 1 : ag_account_store (account, account_store_cb, NULL);
214 : :
215 : 1 : return FALSE;
216 : : }
217 : :
218 : 1 : gboolean test_create3 (TestArgs *args)
219 : : {
220 : 1 : GValue value = { 0 };
221 : :
222 : 1 : manager = ag_manager_new ();
223 : :
224 : 1 : account = ag_manager_create_account (manager, args->argv[0]);
225 : :
226 [ + - ]: 1 : if (args->argc > 1)
227 : : {
228 : 1 : ag_account_set_display_name (account, args->argv[1]);
229 : : }
230 : :
231 : 1 : g_value_init (&value, G_TYPE_INT);
232 : 1 : g_value_set_int (&value, -12345);
233 : 1 : ag_account_set_value (account, "integer", &value);
234 : 1 : g_value_unset (&value);
235 : :
236 : 1 : g_value_init (&value, G_TYPE_STRING);
237 : 1 : g_value_set_static_string (&value, "a string");
238 : 1 : ag_account_set_value (account, "string", &value);
239 : 1 : g_value_unset (&value);
240 : :
241 : 1 : ag_account_set_enabled (account, TRUE);
242 : :
243 : : /* also set some keys in one service */
244 : 1 : service = ag_manager_get_service (manager, "MyService");
245 : 1 : ag_account_select_service (account, service);
246 : :
247 : 1 : g_value_init (&value, G_TYPE_UINT);
248 : 1 : g_value_set_uint (&value, 54321);
249 : 1 : ag_account_set_value (account, "unsigned", &value);
250 : 1 : g_value_unset (&value);
251 : :
252 : 1 : g_value_init (&value, G_TYPE_CHAR);
253 : 1 : g_value_set_schar (&value, 'z');
254 : 1 : ag_account_set_value (account, "character", &value);
255 : 1 : g_value_unset (&value);
256 : :
257 : 1 : g_value_init (&value, G_TYPE_BOOLEAN);
258 : 1 : g_value_set_boolean (&value, TRUE);
259 : 1 : ag_account_set_value (account, "boolean", &value);
260 : 1 : g_value_unset (&value);
261 : :
262 : 1 : ag_account_set_enabled (account, TRUE);
263 : :
264 : 1 : ag_account_store (account, account_store_cb, NULL);
265 : :
266 : 1 : return FALSE;
267 : : }
268 : :
269 : 1 : gboolean test_change (TestArgs *args)
270 : : {
271 : 1 : GValue value = { 0 };
272 : :
273 : : AgAccountId id;
274 : :
275 : 1 : manager = ag_manager_new ();
276 : 1 : id = atoi(args->argv[0]);
277 : 1 : account = ag_manager_get_account (manager, id);
278 : :
279 : 1 : g_value_init (&value, G_TYPE_STRING);
280 : 1 : g_value_set_static_string (&value, "another string");
281 : 1 : ag_account_set_value (account, "string", &value);
282 : 1 : g_value_unset (&value);
283 : :
284 : 1 : service = ag_manager_get_service (manager, "MyService");
285 : 1 : ag_account_select_service (account, service);
286 : :
287 : 1 : ag_account_set_value (account, "character", NULL);
288 : :
289 : 1 : g_value_init (&value, G_TYPE_BOOLEAN);
290 : 1 : g_value_set_boolean (&value, FALSE);
291 : 1 : ag_account_set_value (account, "boolean", &value);
292 : 1 : g_value_unset (&value);
293 : :
294 : 1 : ag_account_set_enabled (account, TRUE);
295 : 1 : ag_account_store (account, account_store_cb, NULL);
296 : :
297 : 1 : return FALSE;
298 : : }
299 : :
300 : 1 : gboolean test_enabled_event (TestArgs *args)
301 : : {
302 : : AgAccountId id;
303 : :
304 : 1 : manager = ag_manager_new ();
305 : 1 : id = atoi(args->argv[0]);
306 : 1 : account = ag_manager_get_account (manager, id);
307 : 1 : service = ag_manager_get_service (manager, "MyService");
308 : 1 : ag_account_select_service (account, service);
309 : 1 : ag_account_set_enabled (account, TRUE);
310 : 1 : ag_account_store (account, account_store_cb, NULL);
311 : :
312 : 1 : return FALSE;
313 : : }
314 : :
315 : 1 : gboolean test_enabled_event2 (TestArgs *args)
316 : : {
317 : : AgAccountId id;
318 : :
319 : 1 : manager = ag_manager_new ();
320 : 1 : id = atoi (args->argv[0]);
321 : 1 : account = ag_manager_get_account (manager, id);
322 : 1 : ag_account_select_service (account, NULL);
323 : 1 : ag_account_set_enabled (account, FALSE);
324 : 1 : ag_account_store (account, account_store_cb, NULL);
325 : :
326 : 1 : return FALSE;
327 : : }
328 : :
329 : 1 : gboolean unlock_and_exit()
330 : : {
331 : 1 : lock_db(FALSE);
332 : 1 : end_test ();
333 : 1 : return FALSE;
334 : : }
335 : :
336 : 1 : gboolean test_lock_db (TestArgs *args)
337 : : {
338 : : const gchar *basedir;
339 : : gchar *filename;
340 : : gint ms;
341 : :
342 : 1 : ms = atoi(args->argv[0]);
343 : 1 : lock_file = open(args->argv[1], O_RDWR | O_APPEND);
344 : :
345 : 1 : basedir = g_getenv ("ACCOUNTS");
346 [ - + ]: 1 : if (G_LIKELY (!basedir))
347 : 0 : basedir = g_get_home_dir ();
348 : 1 : filename = g_build_filename (basedir, "accounts.db", NULL);
349 : 1 : sqlite3_open (filename, &sqldb);
350 : 1 : g_free (filename);
351 : :
352 : 1 : lock_db(TRUE);
353 : :
354 : 1 : g_timeout_add (ms, (GSourceFunc)unlock_and_exit, NULL);
355 : :
356 : 1 : return FALSE;
357 : : }
358 : :
359 : 8 : int main(int argc, char **argv)
360 : : {
361 : : TestArgs args;
362 : :
363 [ + - ]: 8 : if (argc >= 2)
364 : : {
365 : 8 : const gchar *test_name = argv[1];
366 : :
367 : 8 : argc -= 2;
368 : 8 : argv += 2;
369 : 8 : args.argc = argc;
370 : 8 : args.argv = argv;
371 : :
372 [ + + ]: 8 : if (strcmp (test_name, "create") == 0)
373 : : {
374 : 1 : g_idle_add ((GSourceFunc)test_create, &args);
375 : : }
376 [ + + ]: 7 : else if (strcmp (test_name, "delete") == 0)
377 : : {
378 : 1 : g_idle_add ((GSourceFunc)test_delete, &args);
379 : : }
380 [ + + ]: 6 : else if (strcmp (test_name, "create2") == 0)
381 : : {
382 : 1 : g_idle_add ((GSourceFunc)test_create2, &args);
383 : : }
384 [ + + ]: 5 : else if (strcmp (test_name, "create3") == 0)
385 : : {
386 : 1 : g_idle_add ((GSourceFunc)test_create3, &args);
387 : : }
388 [ + + ]: 4 : else if (strcmp (test_name, "change") == 0)
389 : : {
390 : 1 : g_idle_add ((GSourceFunc)test_change, &args);
391 : : }
392 [ + + ]: 3 : else if (strcmp (test_name, "lock_db") == 0)
393 : : {
394 : 1 : g_idle_add ((GSourceFunc)test_lock_db, &args);
395 : : }
396 [ + + ]: 2 : else if (strcmp (test_name, "enabled_event") == 0)
397 : : {
398 : 1 : g_idle_add ((GSourceFunc)test_enabled_event, &args);
399 : : }
400 [ + - ]: 1 : else if (strcmp (test_name, "enabled_event2") == 0)
401 : : {
402 : 1 : g_idle_add ((GSourceFunc)test_enabled_event2, &args);
403 : : }
404 : :
405 : 8 : main_loop = g_main_loop_new (NULL, FALSE);
406 : 8 : g_main_loop_run (main_loop);
407 : 8 : return EXIT_SUCCESS;
408 : : }
409 : :
410 : 8 : return EXIT_FAILURE;
411 : : }
412 : :
413 : : /* vim: set ai et tw=75 ts=4 sw=4: */
414 : :
|