88d0c6e971b6ada8556daa4d00212ded2b467080
[framework/uifw/edbus.git] / src / bin / e_dbus_connman_test_api.c
1 #ifdef HAVE_CONFIG_H
2 #include "config.h"
3 #endif
4
5 #include "E_Connman.h"
6 #include <stdio.h>
7 #include <string.h>
8
9 #define DBG(...) EINA_LOG_DBG(__VA_ARGS__)
10 #define INF(...) EINA_LOG_INFO(__VA_ARGS__)
11 #define WRN(...) EINA_LOG_WARN(__VA_ARGS__)
12 #define ERR(...) EINA_LOG_ERR(__VA_ARGS__)
13
14 static int success = 0;
15 static int failure = 0;
16 static Ecore_Timer *exiter = NULL;
17
18 static Eina_Bool
19 _test_string_get(E_Connman_Element *element, const char *name, Eina_Bool (*func)(const E_Connman_Element *element, const char **value))
20 {
21    const char *value;
22    Eina_Bool ret;
23
24    INF("BEGIN: testing string get %s of element %s...", name, element->path);
25    ret = func(element, &value);
26    if (ret)
27      INF("SUCCESS: testing string get %s of element %s: %s",
28          name, element->path, value);
29    else
30      WRN("FAILURE: testing string get %s of element %s",
31          name, element->path);
32
33    return ret;
34 }
35
36 static Eina_Bool
37 _test_bool_get(E_Connman_Element *element, const char *name, Eina_Bool (*func)(const E_Connman_Element *element, Eina_Bool *value))
38 {
39    Eina_Bool value, ret;
40
41    INF("BEGIN: testing Eina_Bool get %s of element %s...", name, element->path);
42    ret = func(element, &value);
43    if (ret)
44      INF("SUCCESS: testing Eina_Bool get %s of element %s: %hhu",
45          name, element->path, value);
46    else
47      WRN("FAILURE: testing Eina_Bool get %s of element %s",
48          name, element->path);
49
50    return ret;
51 }
52
53 static Eina_Bool
54 _test_uchar_get(E_Connman_Element *element, const char *name, Eina_Bool (*func)(const E_Connman_Element *element, unsigned char *value))
55 {
56    unsigned char value;
57    Eina_Bool ret;
58
59    INF("BEGIN: testing uchar get %s of element %s...", name, element->path);
60    ret = func(element, &value);
61    if (ret)
62      INF("SUCCESS: testing uchar get %s of element %s: %hhu",
63          name, element->path, value);
64    else
65      WRN("FAILURE: testing uchar get %s of element %s",
66          name, element->path);
67
68    return ret;
69 }
70
71 static Eina_Bool
72 _test_ushort_get(E_Connman_Element *element, const char *name, Eina_Bool (*func)(const E_Connman_Element *element, unsigned short *value))
73 {
74    unsigned short value;
75    Eina_Bool ret;
76
77    INF("BEGIN: testing ushort get %s of element %s...", name, element->path);
78    ret = func(element, &value);
79    if (ret)
80      INF("SUCCESS: testing ushort get %s of element %s: %hu",
81          name, element->path, value);
82    else
83      WRN("FAILURE: testing ushort get %s of element %s",
84          name, element->path);
85
86    return ret;
87 }
88
89 static Eina_Bool
90 _test_uchar_array_get(E_Connman_Element *element, const char *name, Eina_Bool (*func)(const E_Connman_Element *element, unsigned int *count, unsigned char **value))
91 {
92    unsigned char *value;
93    unsigned int count;
94    Eina_Bool ret;
95
96    INF("BEGIN: testing ushort get %s of element %s...", name, element->path);
97    ret = func(element, &count, &value);
98    if (ret)
99      {
100         INF("SUCCESS: testing ushort get %s of element %s: %p",
101             name, element->path, value);
102         free(value);
103      }
104    else
105      WRN("FAILURE: testing ushort get %s of element %s",
106          name, element->path);
107
108    return ret;
109 }
110
111 static Eina_Bool
112 _test_element_get(E_Connman_Element *element, const char *name, Eina_Bool (*func)(const E_Connman_Element *element, E_Connman_Element **value))
113 {
114    E_Connman_Element *value;
115    Eina_Bool ret;
116
117    INF("BEGIN: testing element get %s of element %s...", name, element->path);
118    ret = func(element, &value);
119    if (ret)
120      INF("SUCCESS: testing element get %s of element %s: %p",
121          name, element->path, value);
122    else
123      WRN("FAILURE: testing element get %s of element %s",
124          name, element->path);
125
126    return ret;
127 }
128
129 static Eina_Bool
130 _test_elements_get(E_Connman_Element *element, const char *name, Eina_Bool (*func)(const E_Connman_Element *element, unsigned int *count, E_Connman_Element ***elements))
131 {
132    E_Connman_Element **value;
133    unsigned int count;
134    Eina_Bool ret;
135
136    INF("BEGIN: testing elements get %s of element %s...",
137        name, element->path);
138    ret = func(element, &count, &value);
139    if (ret)
140      {
141         INF("SUCCESS: testing elements get %s of element %s: %p",
142             name, element->path, value);
143         free(value);
144      }
145    else
146      WRN("FAILURE: testing elements get %s of element %s",
147          name, element->path);
148
149    return ret;
150 }
151
152 static Eina_Bool
153 _test_element_get_global(const char *name, Eina_Bool (*func)(E_Connman_Element **value))
154 {
155    E_Connman_Element *value;
156    Eina_Bool ret;
157
158    INF("BEGIN: testing element get %s", name);
159    ret = func(&value);
160    if (ret)
161      INF("SUCCESS: testing element get %s: %p", name, value);
162    else
163      WRN("FAILURE: testing element get %s", name);
164
165    return ret;
166 }
167
168 static Eina_Bool
169 _test_elements_get_global(const char *name, Eina_Bool (*func)(unsigned int *count, E_Connman_Element ***elements))
170 {
171    E_Connman_Element **value;
172    unsigned int count;
173    Eina_Bool ret;
174
175    INF("BEGIN: testing elements get %s", name);
176    ret = func(&count, &value);
177    if (ret)
178      {
179         INF("SUCCESS: testing elements get %s: %p", name, value);
180         free(value);
181      }
182    else
183      WRN("FAILURE: testing elements get %s", name);
184
185    return ret;
186 }
187
188 static Eina_Bool
189 _test_string_get_global(const char *name, Eina_Bool (*func)(const char **value))
190 {
191    const char *value;
192    Eina_Bool ret;
193
194    INF("BEGIN: testing string get %s...", name);
195    ret = func(&value);
196    if (ret)
197      INF("SUCCESS: testing string get %s: %s", name, value);
198    else
199      WRN("FAILURE: testing string get %s", name);
200
201    return ret;
202 }
203
204 static Eina_Bool
205 _test_bool_get_global(const char *name, Eina_Bool (*func)(Eina_Bool *value))
206 {
207    Eina_Bool value, ret;
208
209    INF("BEGIN: testing Eina_Bool get %s...", name);
210    ret = func(&value);
211    if (ret)
212      INF("SUCCESS: testing Eina_Bool get %s: %hhu", name, value);
213    else
214      WRN("FAILURE: testing Eina_Bool get %s", name);
215
216    return ret;
217 }
218
219 static Eina_Bool
220 _test_strings_get_global(const char *name, Eina_Bool (*func)(unsigned int *count, const char ***elements))
221 {
222    const char **value;
223    unsigned int count;
224    Eina_Bool ret;
225
226    INF("BEGIN: testing strings get %s", name);
227    ret = func(&count, &value);
228    if (ret)
229      {
230         INF("SUCCESS: testing strings get %s: %p", name, value);
231         free(value);
232      }
233    else
234      WRN("FAILURE: testing strings get %s", name);
235
236    return ret;
237 }
238
239
240 struct test_desc
241 {
242    const char *name;
243    enum {
244      TEST_DESC_TYPE_STRING_GET,
245      TEST_DESC_TYPE_BOOL_GET,
246      TEST_DESC_TYPE_UCHAR_GET,
247      TEST_DESC_TYPE_USHORT_GET,
248      TEST_DESC_TYPE_UCHAR_ARRAY_GET,
249      TEST_DESC_TYPE_ELEMENT_GET,
250      TEST_DESC_TYPE_ELEMENTS_GET,
251      TEST_DESC_TYPE_ELEMENT_GET_GLOBAL,
252      TEST_DESC_TYPE_ELEMENTS_GET_GLOBAL,
253      TEST_DESC_TYPE_STRING_GET_GLOBAL,
254      TEST_DESC_TYPE_BOOL_GET_GLOBAL,
255      TEST_DESC_TYPE_STRINGS_GET_GLOBAL,
256      TEST_DESC_TYPE_LAST
257    } type;
258    union {
259       Eina_Bool (*string_get)(const E_Connman_Element *element, const char **value);
260       Eina_Bool (*bool_get)(const E_Connman_Element *element, Eina_Bool *value);
261       Eina_Bool (*uchar_get)(const E_Connman_Element *element, unsigned char *value);
262       Eina_Bool (*ushort_get)(const E_Connman_Element *element, unsigned short*value);
263       Eina_Bool (*uchar_array_get)(const E_Connman_Element *element, unsigned int *count, unsigned char **value);
264       Eina_Bool (*element_get)(const E_Connman_Element *element, E_Connman_Element **value);
265       Eina_Bool (*elements_get)(const E_Connman_Element *element, unsigned int *count, E_Connman_Element ***elements);
266       Eina_Bool (*element_get_global)(E_Connman_Element **element);
267       Eina_Bool (*elements_get_global)(unsigned int *count, E_Connman_Element ***elements);
268       Eina_Bool (*string_get_global)(const char **value);
269       Eina_Bool (*bool_get_global)(Eina_Bool *value);
270       Eina_Bool (*strings_get_global)(unsigned int *count, const char ***strings);
271       void *dummy;
272    } func;
273    Eina_Bool may_fail;
274 };
275
276 #define TEST_DESC_STRING_GET(_func, may_fail)                           \
277   {#_func, TEST_DESC_TYPE_STRING_GET, .func.string_get=_func, may_fail}
278 #define TEST_DESC_BOOL_GET(_func, may_fail)                             \
279   {#_func, TEST_DESC_TYPE_BOOL_GET, .func.bool_get=_func, may_fail}
280 #define TEST_DESC_UCHAR_GET(_func, may_fail)                            \
281   {#_func, TEST_DESC_TYPE_UCHAR_GET, .func.uchar_get=_func, may_fail}
282 #define TEST_DESC_USHORT_GET(_func, may_fail)                           \
283   {#_func, TEST_DESC_TYPE_USHORT_GET, .func.ushort_get=_func, may_fail}
284 #define TEST_DESC_UCHAR_ARRAY_GET(_func, may_fail)                      \
285   {#_func, TEST_DESC_TYPE_UCHAR_ARRAY_GET, .func.uchar_array_get=_func, may_fail}
286 #define TEST_DESC_ELEMENT_GET(_func, may_fail)                          \
287   {#_func, TEST_DESC_TYPE_ELEMENT_GET, .func.element_get=_func, may_fail}
288 #define TEST_DESC_ELEMENTS_GET(_func, may_fail)                         \
289   {#_func, TEST_DESC_TYPE_ELEMENTS_GET, .func.elements_get=_func, may_fail}
290 #define TEST_DESC_ELEMENT_GET_GLOBAL(_func, may_fail)                   \
291   {#_func, TEST_DESC_TYPE_ELEMENT_GET_GLOBAL, .func.element_get_global=_func, may_fail}
292 #define TEST_DESC_ELEMENTS_GET_GLOBAL(_func, may_fail)                  \
293   {#_func, TEST_DESC_TYPE_ELEMENTS_GET_GLOBAL, .func.elements_get_global=_func, may_fail}
294 #define TEST_DESC_STRING_GET_GLOBAL(_func, may_fail)                    \
295   {#_func, TEST_DESC_TYPE_STRING_GET_GLOBAL, .func.string_get_global=_func, may_fail}
296 #define TEST_DESC_BOOL_GET_GLOBAL(_func, may_fail)                      \
297   {#_func, TEST_DESC_TYPE_BOOL_GET_GLOBAL, .func.bool_get_global=_func, may_fail}
298 #define TEST_DESC_STRINGS_GET_GLOBAL(_func, may_fail)                   \
299   {#_func, TEST_DESC_TYPE_STRINGS_GET_GLOBAL, .func.strings_get_global=_func, may_fail}
300 #define TEST_DESC_SENTINEL {NULL, TEST_DESC_TYPE_LAST, .func.dummy=NULL}
301
302 static Eina_Bool
303 _test_element(E_Connman_Element *element, const struct test_desc *test_descs)
304 {
305    const struct test_desc *itr;
306    int total, ok = 0, fail = 0;
307    Eina_Bool ret = EINA_TRUE;
308
309    for (itr = test_descs; itr->type != TEST_DESC_TYPE_LAST; itr++)
310      {
311         Eina_Bool r;
312
313         switch (itr->type)
314           {
315            case TEST_DESC_TYPE_STRING_GET:
316               r = _test_string_get(element, itr->name, itr->func.string_get);
317               break;
318            case TEST_DESC_TYPE_BOOL_GET:
319               r = _test_bool_get(element, itr->name, itr->func.bool_get);
320               break;
321            case TEST_DESC_TYPE_UCHAR_GET:
322               r = _test_uchar_get(element, itr->name, itr->func.uchar_get);
323               break;
324            case TEST_DESC_TYPE_USHORT_GET:
325               r = _test_ushort_get(element, itr->name, itr->func.ushort_get);
326               break;
327            case TEST_DESC_TYPE_UCHAR_ARRAY_GET:
328               r = _test_uchar_array_get
329                 (element, itr->name, itr->func.uchar_array_get);
330               break;
331            case TEST_DESC_TYPE_ELEMENT_GET:
332               r = _test_element_get
333                 (element, itr->name, itr->func.element_get);
334               break;
335            case TEST_DESC_TYPE_ELEMENTS_GET:
336               r = _test_elements_get
337                 (element, itr->name, itr->func.elements_get);
338               break;
339            case TEST_DESC_TYPE_ELEMENT_GET_GLOBAL:
340               r = _test_element_get_global
341                 (itr->name, itr->func.element_get_global);
342               break;
343            case TEST_DESC_TYPE_ELEMENTS_GET_GLOBAL:
344               r = _test_elements_get_global
345                 (itr->name, itr->func.elements_get_global);
346               break;
347            case TEST_DESC_TYPE_STRING_GET_GLOBAL:
348               r = _test_string_get_global
349                 (itr->name, itr->func.string_get_global);
350               break;
351            case TEST_DESC_TYPE_BOOL_GET_GLOBAL:
352               r = _test_bool_get_global
353                 (itr->name, itr->func.bool_get_global);
354               break;
355            case TEST_DESC_TYPE_STRINGS_GET_GLOBAL:
356               r = _test_strings_get_global
357                 (itr->name, itr->func.strings_get_global);
358               break;
359            default:
360               ERR("unknown test type %d (%s)", itr->type, itr->name);
361               r = 0;
362               break;
363           }
364
365         if (r || itr->may_fail)
366           ok++;
367         else
368           {
369              ERR("test failed %s, element %s [%s]",
370                  itr->name, element->path, element->interface);
371              fail++;
372              ret = EINA_FALSE;
373           }
374      }
375
376    total = ok + failure;
377    success += ok;
378    failure += fail;
379    if (total == 0)
380      {
381         INF("no tests for %s [%s]", element->path, element->interface);
382         return EINA_TRUE;
383      }
384
385    INF("testing %s success: %d, failure: %d: %d%% [%s]",
386        element->path, ok, fail, (ok * 100) / total,
387        element->interface);
388
389    return ret;
390 }
391
392 static const struct test_desc test_desc_manager[] = {
393   TEST_DESC_STRING_GET_GLOBAL(e_connman_manager_state_get, 0),
394   TEST_DESC_BOOL_GET_GLOBAL(e_connman_manager_offline_mode_get, 0),
395   //TEST_DESC_STRING_SET_GLOBAL(e_connman_manager_request_scan, 0),
396   //TEST_DESC_BOOL_SET_GLOBAL(e_connman_manager_offline_mode_set, 0),
397   TEST_DESC_ELEMENTS_GET_GLOBAL(e_connman_manager_profiles_get, 0),
398   TEST_DESC_ELEMENTS_GET_GLOBAL(e_connman_manager_services_get, 1),
399   TEST_DESC_STRING_GET_GLOBAL(e_connman_manager_technology_default_get, 0),
400   TEST_DESC_STRINGS_GET_GLOBAL(e_connman_manager_technologies_available_get, 0),
401   TEST_DESC_STRINGS_GET_GLOBAL(e_connman_manager_technologies_enabled_get, 0),
402   TEST_DESC_STRINGS_GET_GLOBAL(e_connman_manager_technologies_connected_get, 0),
403   TEST_DESC_ELEMENT_GET_GLOBAL(e_connman_manager_profile_active_get, 0),
404   TEST_DESC_SENTINEL
405 };
406
407 static const struct test_desc test_desc_profile[] = {
408   TEST_DESC_STRING_GET(e_connman_profile_name_get, 1),
409   //TEST_DESC_STRING_SET(e_connman_profile_name_set, 1),
410   TEST_DESC_BOOL_GET(e_connman_profile_offline_mode_get, 0),
411   //TEST_DESC_BOOL_SET(e_connman_profile_offline_mode_set, 0),
412   TEST_DESC_ELEMENTS_GET(e_connman_profile_services_get, 1),
413   TEST_DESC_SENTINEL
414 };
415
416 static const struct test_desc test_desc_service[] = {
417   /* TODO: need to check exactly what properties may fail */
418   TEST_DESC_STRING_GET(e_connman_service_state_get, 1),
419   TEST_DESC_STRING_GET(e_connman_service_error_get, 1),
420   TEST_DESC_STRING_GET(e_connman_service_name_get, 0),
421   TEST_DESC_STRING_GET(e_connman_service_type_get, 0),
422   TEST_DESC_STRING_GET(e_connman_service_security_get, 1),
423   TEST_DESC_STRING_GET(e_connman_service_passphrase_get, 1),
424   //TEST_DESC_STRING_SET(e_connman_service_passphrase_set, 1),
425   TEST_DESC_BOOL_GET(e_connman_service_passphrase_required_get, 1),
426   TEST_DESC_UCHAR_GET(e_connman_service_strength_get, 1),
427   TEST_DESC_BOOL_GET(e_connman_service_favorite_get, 0),
428   TEST_DESC_BOOL_GET(e_connman_service_immutable_get, 0),
429   TEST_DESC_BOOL_GET(e_connman_service_auto_connect_get, 0),
430   //TEST_DESC_BOOL_SET(e_connman_service_auto_connect_set, 1),
431   TEST_DESC_BOOL_GET(e_connman_service_roaming_get, 1),
432   TEST_DESC_STRING_GET(e_connman_service_ipv4_method_get, 1),
433   TEST_DESC_STRING_GET(e_connman_service_ipv4_address_get, 1),
434   TEST_DESC_STRING_GET(e_connman_service_ipv4_gateway_get, 1),
435   TEST_DESC_STRING_GET(e_connman_service_ipv4_netmask_get, 1),
436   TEST_DESC_STRING_GET(e_connman_service_ipv4_configuration_method_get, 1),
437   TEST_DESC_STRING_GET(e_connman_service_ipv4_configuration_address_get, 1),
438   TEST_DESC_STRING_GET(e_connman_service_ipv4_configuration_gateway_get, 1),
439   TEST_DESC_STRING_GET(e_connman_service_ipv4_configuration_netmask_get, 1),
440   TEST_DESC_STRING_GET(e_connman_service_ethernet_method_get, 1),
441   TEST_DESC_STRING_GET(e_connman_service_ethernet_address_get, 1),
442   TEST_DESC_USHORT_GET(e_connman_service_ethernet_mtu_get, 1),
443   TEST_DESC_SENTINEL
444 };
445
446 static Eina_Bool
447 _quit(__UNUSED__ void *data)
448 {
449    ecore_main_loop_quit();
450    return ECORE_CALLBACK_CANCEL;
451 }
452
453 static Eina_Bool
454 _on_exiter(__UNUSED__ void *data)
455 {
456    e_connman_system_shutdown();
457    ecore_idle_enterer_add(_quit, NULL);
458    exiter = NULL;
459    return ECORE_CALLBACK_CANCEL;
460 }
461
462 static void
463 _exiter_reschedule(void)
464 {
465    if (exiter)
466      ecore_timer_del(exiter);
467    exiter = ecore_timer_add(10, _on_exiter, NULL);
468 }
469
470 struct test_element_timer_data
471 {
472    E_Connman_Element *element;
473    Ecore_Timer *timer;
474 };
475
476 static Eina_Bool
477 _test_element_timer(void *data)
478 {
479    struct test_element_timer_data *d = data;
480    E_Connman_Element *element = d->element;
481
482    if (e_connman_element_is_profile(element))
483      _test_element(element, test_desc_profile);
484    else if (e_connman_element_is_manager(element))
485      _test_element(element, test_desc_manager);
486    else if (e_connman_element_is_service(element))
487      _test_element(element, test_desc_service);
488    else
489      ERR("!!! don't know how to test %s [%s]",
490          element->path, element->interface);
491
492    _exiter_reschedule();
493
494    d->timer = NULL;
495    return ECORE_CALLBACK_CANCEL;
496 }
497
498 static void
499 _element_listener(void *data, __UNUSED__ const E_Connman_Element *element)
500 {
501    struct test_element_timer_data *d = data;
502    if (d->timer)
503      ecore_timer_del(d->timer);
504    d->timer = ecore_timer_add(1.0, _test_element_timer, d);
505    _exiter_reschedule();
506 }
507
508 static void
509 _element_listener_free(void *data)
510 {
511    struct test_element_timer_data *d = data;
512    if (d->timer)
513      ecore_timer_del(d->timer);
514    free(d);
515 }
516
517 static Eina_Bool
518 _on_element_add(__UNUSED__ void *data, __UNUSED__ int type, void *info)
519 {
520    E_Connman_Element *element = info;
521    struct test_element_timer_data *d;
522
523    d = malloc(sizeof(*d));
524    if (!d)
525      return ECORE_CALLBACK_PASS_ON;
526
527    d->element = element;
528    d->timer = ecore_timer_add(1.0, _test_element_timer, d);
529    e_connman_element_listener_add
530      (element, _element_listener, d, _element_listener_free);
531
532    return ECORE_CALLBACK_PASS_ON;
533 }
534
535 static Eina_Bool
536 _on_element_del(__UNUSED__ void *data, __UNUSED__ int type, __UNUSED__ void *info)
537 {
538    return ECORE_CALLBACK_PASS_ON;
539 }
540
541 static Eina_Bool
542 _on_element_updated(__UNUSED__ void *data, __UNUSED__ int type, __UNUSED__ void *info)
543 {
544    return ECORE_CALLBACK_PASS_ON;
545 }
546
547 int
548 main(__UNUSED__ int argc, __UNUSED__ char *argv[])
549 {
550    E_DBus_Connection *c;
551    int total;
552
553    ecore_init();
554    e_dbus_init();
555    eina_init();
556
557    c = e_dbus_bus_get(DBUS_BUS_SYSTEM);
558    if (!c) {
559       printf("ERROR: can't connect to system session\n");
560       return -1;
561    }
562
563    e_connman_system_init(c);
564    ecore_event_handler_add(E_CONNMAN_EVENT_ELEMENT_ADD, _on_element_add, NULL);
565    ecore_event_handler_add(E_CONNMAN_EVENT_ELEMENT_DEL, _on_element_del, NULL);
566    ecore_event_handler_add(E_CONNMAN_EVENT_ELEMENT_UPDATED,
567                            _on_element_updated, NULL);
568
569    _exiter_reschedule();
570
571    ecore_main_loop_begin();
572
573    e_dbus_connection_close(c);
574    eina_stringshare_dump();
575    eina_shutdown();
576    e_dbus_shutdown();
577    ecore_shutdown();
578
579    total = success + failure;
580    if (total == 0)
581      fputs("DBG: clean exit, no tests executed.\n", stderr);
582    else
583      fprintf(stderr, "DBG: clean exit, success: %d, failure: %d, %d%%\n",
584              success, failure, (success * 100) / total);
585
586    return 0;
587 }