325a98d95a5c541c862075797837a0fee6076386
[platform/core/telephony/libtcore.git] / unit-test / test-co.c
1
2 #include <stdio.h>
3 #include <string.h>
4 #include <stdlib.h>
5
6 #include <glib.h>
7
8 #include <tcore.h>
9 #include <core_object.h>
10
11 static int _count = 0;
12
13 static gboolean on_event1(CoreObject *o, const void *event_info, void *user_data)
14 {
15         _count++;
16
17         g_assert(o);
18         g_assert(event_info);
19         g_assert_cmpstr(event_info, ==, "ok");
20
21         return TRUE;
22 }
23
24 static gboolean on_event2(CoreObject *o, const void *event_info, void *user_data)
25 {
26         _count++;
27
28         g_assert(o);
29         g_assert(event_info);
30         g_assert_cmpstr(event_info, ==, "ok");
31
32         return FALSE;
33 }
34
35
36 static void test_co_new(void)
37 {
38         CoreObject *co;
39
40         co = tcore_object_new(NULL, "test", NULL);
41         g_assert(co);
42
43         tcore_object_free (co);
44 }
45
46 static void test_callback_renew(void)
47 {
48         CoreObject *co;
49         TReturn ret;
50
51         co = tcore_object_new(NULL, "test", NULL);
52         g_assert(co);
53
54         // lifetime: unlimit
55         _count = 0;
56         ret = tcore_object_add_callback(co, "event1", on_event1, NULL);
57         g_assert(ret == TCORE_RETURN_SUCCESS);
58
59         ret = tcore_object_emit_callback(co, "event1", "ok");
60         g_assert(ret == TCORE_RETURN_SUCCESS);
61
62         ret = tcore_object_emit_callback(co, "event1", "ok");
63         g_assert(ret == TCORE_RETURN_SUCCESS);
64
65         g_assert(_count == 2);
66 }
67
68 static void test_callback_once(void)
69 {
70         CoreObject *co;
71         TReturn ret;
72
73         co = tcore_object_new(NULL, "test", NULL);
74         g_assert(co);
75
76         // lifetime: one time callback + unlimit callback
77         _count = 0;
78         ret = tcore_object_add_callback(co, "event2", on_event2, NULL);
79         g_assert(ret == TCORE_RETURN_SUCCESS);
80         ret = tcore_object_add_callback(co, "event1", on_event1, NULL);
81         g_assert(ret == TCORE_RETURN_SUCCESS);
82
83         ret = tcore_object_emit_callback(co, "event2", "ok");
84         g_assert(ret == TCORE_RETURN_SUCCESS);
85
86         ret = tcore_object_emit_callback(co, "event2", "ok");
87         g_assert(ret == TCORE_RETURN_SUCCESS);
88
89         g_assert(_count == 1);
90
91         ret = tcore_object_emit_callback(co, "event1", "ok");
92         g_assert(ret == TCORE_RETURN_SUCCESS);
93
94         g_assert(_count == 2);
95
96         tcore_object_free (co);
97 }
98
99 static gboolean on_prop_changed (CoreObject *co, const void *event_info,
100                 void *user_data)
101 {
102         int *mode = user_data;
103         GSList *key = (GSList *)event_info;
104         const char *data;
105
106         switch (*mode) {
107                 case 1:
108                         g_assert (g_slist_length(key) == 1);
109                         g_assert_cmpstr (key->data, ==, "qqq");
110                         data = tcore_object_ref_property (co, "qqq");
111                         g_assert_cmpstr (data, ==, "1234");
112                         break;
113
114                 case 2:
115                         g_assert (g_slist_length (key) == 1);
116                         g_assert_cmpstr (key->data, ==, "qqq");
117                         data = tcore_object_ref_property (co, "qqq");
118                         g_assert (data == NULL);
119                         break;
120
121                 case 3:
122                         g_assert (g_slist_length (key) == 1);
123                         g_assert_cmpstr (key->data, ==, "www");
124                         data = tcore_object_ref_property (co, "www");
125                         g_assert_cmpstr (data, ==, "heap");
126                         break;
127
128                 case 4:
129                         g_assert (g_slist_length (key) == 1);
130                         g_assert_cmpstr (key->data, ==, "www");
131                         data = tcore_object_ref_property (co, "www");
132                         g_assert (data == NULL);
133                         break;
134
135                 case 5:
136                         g_assert (g_slist_length (key) == 1);
137                         g_assert_cmpstr (key->data, ==, "key");
138                         data = tcore_object_ref_property (co, "key");
139                         g_assert_cmpstr (data, ==, "1");
140                         break;
141
142                 case 6:
143                         g_assert (g_slist_length (key) == 1);
144                         g_assert_cmpstr (key->data, ==, "key");
145                         data = tcore_object_ref_property (co, "key");
146                         g_assert_cmpstr (data, ==, "2");
147                         break;
148
149                 case 7:
150                         g_assert (FALSE);
151                         break;
152
153                 case 8:
154                         g_assert (g_slist_length (key) == 1);
155                         g_assert_cmpstr (key->data, ==, "key");
156                         data = tcore_object_ref_property (co, "key");
157                         g_assert_cmpstr (data, ==, "2");
158                         break;
159
160                 case 9:
161                         g_assert (g_slist_length (key) == 2);
162                         g_assert_cmpstr (key->data, ==, "foo");
163                         g_assert_cmpstr (key->next->data, ==, "bar");
164                         data = tcore_object_ref_property (co, "foo");
165                         g_assert_cmpstr (data, ==, "1");
166                         data = tcore_object_ref_property (co, "bar");
167                         g_assert_cmpstr (data, ==, "2");
168                         break;
169
170                 case 10:
171                         g_assert (g_slist_length (key) == 1);
172                         g_assert_cmpstr (key->data, ==, "foo");
173                         data = tcore_object_ref_property (co, "foo");
174                         g_assert (data == NULL);
175                         break;
176
177                 case 11:
178                         g_assert (g_slist_length (key) == 2);
179                         g_assert (g_slist_find_custom (key, "foo",
180                                                 (GCompareFunc)g_strcmp0) != NULL);
181                         g_assert (CORE_OBJECT_KEY_FIND(key, "bar") != NULL);
182                         data = tcore_object_ref_property (co, "foo");
183                         g_assert_cmpstr (data, ==, "1");
184                         data = tcore_object_ref_property (co, "bar");
185                         g_assert (data == NULL);
186                         break;
187
188                 default:
189                         g_assert (FALSE);
190                         break;
191         }
192
193         /* Set flag to callback invocation success */
194         *mode = 0;
195
196         return TRUE;
197 }
198
199 static void test_property (void)
200 {
201         CoreObject *co;
202         const char *data;
203         char *test;
204         GHashTable *raw;
205         int mode = 0;
206         GSList *tmp_list;
207
208         co = tcore_object_new (NULL, "test", NULL);
209         g_assert (co);
210
211         tcore_object_add_callback (co, CORE_OBJECT_EVENT_PROPERTY_CHANGED,
212                         on_prop_changed, &mode);
213
214         raw = tcore_object_ref_property_hash (co);
215         g_assert (raw);
216
217         /* Case: Basic property set */
218         mode = 1;
219         tcore_object_set_property (co, "qqq", "1234");
220         g_assert (g_hash_table_size (raw) == 1);
221         g_assert (mode == 0);
222
223         data = tcore_object_ref_property (co, "qqq");
224         g_assert_cmpstr(data, ==, "1234");
225
226         /* Case: Basic property remove */
227         mode = 2;
228         tcore_object_set_property (co, "qqq", NULL);
229         g_assert (g_hash_table_size (raw) == 0);
230         g_assert (mode == 0);
231
232         data = tcore_object_ref_property (co, "qqq");
233         g_assert (data == NULL);
234
235         /* Case: Malloc property set */
236         mode = 3;
237         test = strdup("heap");
238         tcore_object_set_property (co, "www", test);
239         g_assert (g_hash_table_size (raw) == 1);
240         g_assert (mode == 0);
241         free(test);
242
243         data = tcore_object_ref_property (co, "www");
244         g_assert_cmpstr(data, ==, "heap");
245
246         /* Case: Malloc property remove */
247         mode = 4;
248         tcore_object_set_property (co, "www", NULL);
249         g_assert (g_hash_table_size (raw) == 0);
250         g_assert (mode == 0);
251
252         data = tcore_object_ref_property (co, "www");
253         g_assert (data == NULL);
254
255         /* Case: Same key & Different value set */
256         mode = 5;
257         tcore_object_set_property (co, "key", "1");
258         g_assert (g_hash_table_size (raw) == 1);
259         g_assert (mode == 0);
260
261         mode = 6;
262         tcore_object_set_property (co, "key", "2");
263         g_assert (g_hash_table_size (raw) == 1);
264         g_assert (mode == 0);
265
266         /* Case: Same key & Same value set => No callback invocation */
267         mode = 7;
268         tcore_object_set_property (co, "key", "2");
269         g_assert (g_hash_table_size (raw) == 1);
270         g_assert (mode == 7);
271
272         /* Case: Same key & Same value set & force event invocation */
273         mode = 8;
274         tcore_object_set_property (co, "key", "2");
275         g_assert (g_hash_table_size (raw) == 1);
276
277         tmp_list = g_slist_append (NULL, (char*)"key");
278         tcore_object_emit_callback(co, CORE_OBJECT_EVENT_PROPERTY_CHANGED, tmp_list);
279         g_assert (mode == 0);
280         g_slist_free(tmp_list);
281
282         /* Case: Multiple property set */
283         mode = 9;
284         tcore_object_set_property (co, "foo", "1", "bar", "2");
285         g_assert (g_hash_table_size (raw) == 3);
286         g_assert (mode == 0);
287
288         /* Case: Set key without value => same as key with NULL: remove key */
289         mode = 10;
290         tcore_object_set_property (co, "foo");
291         g_assert (g_hash_table_size (raw) == 2);
292         g_assert (mode == 0);
293
294         /* Case: Multiple property set with unset (foo set, bar unset) */
295         mode = 11;
296         tcore_object_set_property (co, "foo", "1", "bar");
297         g_assert (g_hash_table_size (raw) == 2);
298         g_assert (mode == 0);
299
300         tcore_object_free (co);
301 }
302
303 int main(int argc, char **argv)
304 {
305         g_test_init(&argc, &argv, NULL);
306
307         g_test_add_func("/co/new", test_co_new);
308         g_test_add_func("/co/callback_renew", test_callback_renew);
309         g_test_add_func("/co/callback_once", test_callback_once);
310         g_test_add_func("/co/property", test_property);
311
312         return g_test_run();
313 }