5 #define DBG(...) EINA_LOG_DBG(__VA_ARGS__)
6 #define INF(...) EINA_LOG_INFO(__VA_ARGS__)
7 #define WRN(...) EINA_LOG_WARN(__VA_ARGS__)
8 #define ERR(...) EINA_LOG_ERR(__VA_ARGS__)
10 static int success = 0;
11 static int failure = 0;
12 static Ecore_Timer *exiter = NULL;
15 _test_string_get(E_Connman_Element *element, const char *name, bool (*func)(const E_Connman_Element *element, const char **value))
20 INF("BEGIN: testing string get %s of element %s...\n", name, element->path);
21 ret = func(element, &value);
23 INF("SUCCESS: testing string get %s of element %s: %s\n",
24 name, element->path, value);
26 WRN("FAILURE: testing string get %s of element %s\n",
33 _test_bool_get(E_Connman_Element *element, const char *name, bool (*func)(const E_Connman_Element *element, bool *value))
37 INF("BEGIN: testing bool get %s of element %s...\n", name, element->path);
38 ret = func(element, &value);
40 INF("SUCCESS: testing bool get %s of element %s: %hhu\n",
41 name, element->path, value);
43 WRN("FAILURE: testing bool get %s of element %s\n",
50 _test_uchar_get(E_Connman_Element *element, const char *name, bool (*func)(const E_Connman_Element *element, unsigned char *value))
55 INF("BEGIN: testing uchar get %s of element %s...\n", name, element->path);
56 ret = func(element, &value);
58 INF("SUCCESS: testing uchar get %s of element %s: %hhu\n",
59 name, element->path, value);
61 WRN("FAILURE: testing uchar get %s of element %s\n",
68 _test_ushort_get(E_Connman_Element *element, const char *name, bool (*func)(const E_Connman_Element *element, unsigned short *value))
73 INF("BEGIN: testing ushort get %s of element %s...\n", name, element->path);
74 ret = func(element, &value);
76 INF("SUCCESS: testing ushort get %s of element %s: %hu\n",
77 name, element->path, value);
79 WRN("FAILURE: testing ushort get %s of element %s\n",
86 _test_uchar_array_get(E_Connman_Element *element, const char *name, bool (*func)(const E_Connman_Element *element, unsigned int *count, unsigned char **value))
92 INF("BEGIN: testing ushort get %s of element %s...\n", name, element->path);
93 ret = func(element, &count, &value);
96 INF("SUCCESS: testing ushort get %s of element %s: %p\n",
97 name, element->path, value);
101 WRN("FAILURE: testing ushort get %s of element %s\n",
102 name, element->path);
108 _test_element_get(E_Connman_Element *element, const char *name, bool (*func)(const E_Connman_Element *element, E_Connman_Element **value))
110 E_Connman_Element *value;
113 INF("BEGIN: testing element get %s of element %s...\n", name, element->path);
114 ret = func(element, &value);
116 INF("SUCCESS: testing element get %s of element %s: %p\n",
117 name, element->path, value);
119 WRN("FAILURE: testing element get %s of element %s\n",
120 name, element->path);
126 _test_elements_get(E_Connman_Element *element, const char *name, bool (*func)(const E_Connman_Element *element, unsigned int *count, E_Connman_Element ***elements))
128 E_Connman_Element **value;
132 INF("BEGIN: testing elements get %s of element %s...\n",
133 name, element->path);
134 ret = func(element, &count, &value);
137 INF("SUCCESS: testing elements get %s of element %s: %p\n",
138 name, element->path, value);
142 WRN("FAILURE: testing elements get %s of element %s\n",
143 name, element->path);
149 _test_elements_get_global(const char *name, bool (*func)(unsigned int *count, E_Connman_Element ***elements))
151 E_Connman_Element **value;
155 INF("BEGIN: testing elements get %s\n", name);
156 ret = func(&count, &value);
159 INF("SUCCESS: testing elements get %s: %p\n", name, value);
163 WRN("FAILURE: testing elements get %s\n", name);
169 _test_string_get_global(const char *name, bool (*func)(const char **value))
174 INF("BEGIN: testing string get %s...\n", name);
177 INF("SUCCESS: testing string get %s: %s\n", name, value);
179 WRN("FAILURE: testing string get %s\n", name);
185 _test_bool_get_global(const char *name, bool (*func)(bool *value))
189 INF("BEGIN: testing bool get %s...\n", name);
192 INF("SUCCESS: testing bool get %s: %hhu\n", name, value);
194 WRN("FAILURE: testing bool get %s\n", name);
203 TEST_DESC_TYPE_STRING_GET,
204 TEST_DESC_TYPE_BOOL_GET,
205 TEST_DESC_TYPE_UCHAR_GET,
206 TEST_DESC_TYPE_USHORT_GET,
207 TEST_DESC_TYPE_UCHAR_ARRAY_GET,
208 TEST_DESC_TYPE_ELEMENT_GET,
209 TEST_DESC_TYPE_ELEMENTS_GET,
210 TEST_DESC_TYPE_ELEMENTS_GET_GLOBAL,
211 TEST_DESC_TYPE_STRING_GET_GLOBAL,
212 TEST_DESC_TYPE_BOOL_GET_GLOBAL,
216 bool (*string_get)(const E_Connman_Element *element, const char **value);
217 bool (*bool_get)(const E_Connman_Element *element, bool *value);
218 bool (*uchar_get)(const E_Connman_Element *element, unsigned char *value);
219 bool (*ushort_get)(const E_Connman_Element *element, unsigned short*value);
220 bool (*uchar_array_get)(const E_Connman_Element *element, unsigned int *count, unsigned char **value);
221 bool (*element_get)(const E_Connman_Element *element, E_Connman_Element **value);
222 bool (*elements_get)(const E_Connman_Element *element, unsigned int *count, E_Connman_Element ***elements);
223 bool (*elements_get_global)(unsigned int *count, E_Connman_Element ***elements);
224 bool (*string_get_global)(const char **value);
225 bool (*bool_get_global)(bool *value);
231 #define TEST_DESC_STRING_GET(_func, may_fail) \
232 {#_func, TEST_DESC_TYPE_STRING_GET, .func.string_get=_func, may_fail}
233 #define TEST_DESC_BOOL_GET(_func, may_fail) \
234 {#_func, TEST_DESC_TYPE_BOOL_GET, .func.bool_get=_func, may_fail}
235 #define TEST_DESC_UCHAR_GET(_func, may_fail) \
236 {#_func, TEST_DESC_TYPE_UCHAR_GET, .func.uchar_get=_func, may_fail}
237 #define TEST_DESC_USHORT_GET(_func, may_fail) \
238 {#_func, TEST_DESC_TYPE_USHORT_GET, .func.ushort_get=_func, may_fail}
239 #define TEST_DESC_UCHAR_ARRAY_GET(_func, may_fail) \
240 {#_func, TEST_DESC_TYPE_UCHAR_ARRAY_GET, .func.uchar_array_get=_func, may_fail}
241 #define TEST_DESC_ELEMENT_GET(_func, may_fail) \
242 {#_func, TEST_DESC_TYPE_ELEMENT_GET, .func.element_get=_func, may_fail}
243 #define TEST_DESC_ELEMENTS_GET(_func, may_fail) \
244 {#_func, TEST_DESC_TYPE_ELEMENTS_GET, .func.elements_get=_func, may_fail}
245 #define TEST_DESC_ELEMENTS_GET_GLOBAL(_func, may_fail) \
246 {#_func, TEST_DESC_TYPE_ELEMENTS_GET_GLOBAL, .func.elements_get_global=_func, may_fail}
247 #define TEST_DESC_STRING_GET_GLOBAL(_func, may_fail) \
248 {#_func, TEST_DESC_TYPE_STRING_GET_GLOBAL, .func.string_get_global=_func, may_fail}
249 #define TEST_DESC_BOOL_GET_GLOBAL(_func, may_fail) \
250 {#_func, TEST_DESC_TYPE_BOOL_GET_GLOBAL, .func.bool_get_global=_func, may_fail}
251 #define TEST_DESC_SENTINEL {NULL, TEST_DESC_TYPE_LAST, .func.dummy=NULL}
254 _test_element(E_Connman_Element *element, const struct test_desc *test_descs)
256 const struct test_desc *itr;
257 int total, ok = 0, fail = 0;
260 for (itr = test_descs; itr->type != TEST_DESC_TYPE_LAST; itr++)
266 case TEST_DESC_TYPE_STRING_GET:
267 r = _test_string_get(element, itr->name, itr->func.string_get);
269 case TEST_DESC_TYPE_BOOL_GET:
270 r = _test_bool_get(element, itr->name, itr->func.bool_get);
272 case TEST_DESC_TYPE_UCHAR_GET:
273 r = _test_uchar_get(element, itr->name, itr->func.uchar_get);
275 case TEST_DESC_TYPE_USHORT_GET:
276 r = _test_ushort_get(element, itr->name, itr->func.ushort_get);
278 case TEST_DESC_TYPE_UCHAR_ARRAY_GET:
279 r = _test_uchar_array_get
280 (element, itr->name, itr->func.uchar_array_get);
282 case TEST_DESC_TYPE_ELEMENT_GET:
283 r = _test_element_get
284 (element, itr->name, itr->func.element_get);
286 case TEST_DESC_TYPE_ELEMENTS_GET:
287 r = _test_elements_get
288 (element, itr->name, itr->func.elements_get);
290 case TEST_DESC_TYPE_ELEMENTS_GET_GLOBAL:
291 r = _test_elements_get_global
292 (itr->name, itr->func.elements_get_global);
294 case TEST_DESC_TYPE_STRING_GET_GLOBAL:
295 r = _test_string_get_global
296 (itr->name, itr->func.string_get_global);
298 case TEST_DESC_TYPE_BOOL_GET_GLOBAL:
299 r = _test_bool_get_global
300 (itr->name, itr->func.bool_get_global);
303 ERR("unknown test type %d (%s)\n", itr->type, itr->name);
308 if (r || itr->may_fail)
312 ERR("test failed %s, element %s [%s]\n",
313 itr->name, element->path, element->interface);
319 total = ok + failure;
324 INF("no tests for %s [%s]\n", element->path, element->interface);
328 INF("testing %s success: %d, failure: %d: %d%% [%s]\n",
329 element->path, ok, fail, (ok * 100) / total,
335 static const struct test_desc test_desc_manager[] = {
336 TEST_DESC_STRING_GET_GLOBAL(e_connman_manager_state_get, 0),
337 TEST_DESC_BOOL_GET_GLOBAL(e_connman_manager_offline_mode_get, 0),
338 //TEST_DESC_BOOL_SET_GLOBAL(e_connman_manager_offline_mode_set, 0),
339 TEST_DESC_ELEMENTS_GET_GLOBAL(e_connman_manager_profiles_get, 0),
340 TEST_DESC_ELEMENTS_GET_GLOBAL(e_connman_manager_devices_get, 0),
341 TEST_DESC_ELEMENTS_GET_GLOBAL(e_connman_manager_services_get, 1),
345 static const struct test_desc test_desc_device[] = {
346 TEST_DESC_STRING_GET(e_connman_device_address_get, 0),
347 TEST_DESC_STRING_GET(e_connman_device_name_get, 0),
348 TEST_DESC_STRING_GET(e_connman_device_type_get, 0),
349 TEST_DESC_STRING_GET(e_connman_device_interface_get, 0),
350 TEST_DESC_BOOL_GET(e_connman_device_powered_get, 0),
351 //TEST_DESC_BOOL_SET(e_connman_device_powered_set, 0),
352 TEST_DESC_USHORT_GET(e_connman_device_scan_interval_get, 1),
353 //TEST_DESC_USHORT_SET(e_connman_device_scan_interval_set, 1),
354 TEST_DESC_BOOL_GET(e_connman_device_scanning_get, 1),
355 TEST_DESC_ELEMENTS_GET(e_connman_device_networks_get, 1),
359 static const struct test_desc test_desc_profile[] = {
360 TEST_DESC_STRING_GET(e_connman_profile_name_get, 1),
361 TEST_DESC_BOOL_GET(e_connman_profile_offline_mode_get, 0),
362 //TEST_DESC_BOOL_SET(e_connman_profile_offline_mode_set, 0),
363 TEST_DESC_ELEMENTS_GET(e_connman_profile_services_get, 1),
367 static const struct test_desc test_desc_network[] = {
368 TEST_DESC_STRING_GET(e_connman_network_address_get, 0),
369 TEST_DESC_STRING_GET(e_connman_network_name_get, 0),
370 TEST_DESC_BOOL_GET(e_connman_network_connected_get, 0),
371 TEST_DESC_UCHAR_GET(e_connman_network_strength_get, 1),
372 TEST_DESC_USHORT_GET(e_connman_network_frequency_get, 1),
373 TEST_DESC_ELEMENT_GET(e_connman_network_device_get, 0),
374 TEST_DESC_UCHAR_ARRAY_GET(e_connman_network_wifi_ssid_get, 1),
375 TEST_DESC_STRING_GET(e_connman_network_wifi_mode_get, 1),
376 TEST_DESC_STRING_GET(e_connman_network_wifi_security_get, 1),
377 TEST_DESC_STRING_GET(e_connman_network_wifi_passphrase_get, 1),
378 TEST_DESC_USHORT_GET(e_connman_network_wifi_channel_get, 1),
379 TEST_DESC_STRING_GET(e_connman_network_wifi_eap_get, 1),
383 static const struct test_desc test_desc_service[] = {
384 /* TODO: need to check exactly what properties may fail */
385 TEST_DESC_STRING_GET(e_connman_service_state_get, 1),
386 TEST_DESC_STRING_GET(e_connman_service_error_get, 1),
387 TEST_DESC_STRING_GET(e_connman_service_name_get, 0),
388 TEST_DESC_STRING_GET(e_connman_service_type_get, 0),
389 TEST_DESC_STRING_GET(e_connman_service_mode_get, 1),
390 TEST_DESC_STRING_GET(e_connman_service_security_get, 1),
391 TEST_DESC_STRING_GET(e_connman_service_passphrase_get, 1),
392 //TEST_DESC_STRING_SET(e_connman_service_passphrase_set, 1),
393 TEST_DESC_BOOL_GET(e_connman_service_passphrase_required_get, 1),
394 TEST_DESC_UCHAR_GET(e_connman_service_strength_get, 1),
395 TEST_DESC_BOOL_GET(e_connman_service_favorite_get, 0),
396 TEST_DESC_BOOL_GET(e_connman_service_immutable_get, 0),
397 TEST_DESC_BOOL_GET(e_connman_service_auto_connect_get, 0),
398 //TEST_DESC_BOOL_SET(e_connman_service_auto_connect_set, 1),
399 TEST_DESC_BOOL_GET(e_connman_service_setup_required_get, 1),
400 TEST_DESC_STRING_GET(e_connman_service_apn_get, 1),
401 //TEST_DESC_STRING_SET(e_connman_service_apn_set, 1),
402 TEST_DESC_STRING_GET(e_connman_service_mcc_get, 1),
403 TEST_DESC_STRING_GET(e_connman_service_mnc_get, 1),
404 TEST_DESC_BOOL_GET(e_connman_service_roaming_get, 1),
405 TEST_DESC_STRING_GET(e_connman_service_ipv4_method_get, 1),
406 TEST_DESC_STRING_GET(e_connman_service_ipv4_address_get, 1),
413 ecore_main_loop_quit();
418 _on_exiter(void *data)
420 e_connman_system_shutdown();
421 ecore_idle_enterer_add(_quit, NULL);
427 _exiter_reschedule(void)
430 ecore_timer_del(exiter);
431 exiter = ecore_timer_add(10, _on_exiter, NULL);
434 struct test_element_timer_data
436 E_Connman_Element *element;
441 _test_element_timer(void *data)
443 struct test_element_timer_data *d = data;
444 E_Connman_Element *element = d->element;
446 if (e_connman_element_is_device(element))
447 _test_element(element, test_desc_device);
448 else if (e_connman_element_is_profile(element))
449 _test_element(element, test_desc_profile);
450 else if (e_connman_element_is_network(element))
451 _test_element(element, test_desc_network);
452 else if (e_connman_element_is_manager(element))
453 _test_element(element, test_desc_manager);
454 else if (e_connman_element_is_service(element))
455 _test_element(element, test_desc_service);
457 ERR("!!! don't know how to test %s [%s]\n",
458 element->path, element->interface);
460 _exiter_reschedule();
467 _element_listener(void *data, const E_Connman_Element *element)
469 struct test_element_timer_data *d = data;
471 ecore_timer_del(d->timer);
472 d->timer = ecore_timer_add(1.0, _test_element_timer, d);
473 _exiter_reschedule();
477 _element_listener_free(void *data)
479 struct test_element_timer_data *d = data;
481 ecore_timer_del(d->timer);
486 _on_element_add(void *data, int type, void *info)
488 E_Connman_Element *element = info;
489 struct test_element_timer_data *d;
491 d = malloc(sizeof(*d));
495 d->element = element;
496 d->timer = ecore_timer_add(1.0, _test_element_timer, d);
497 e_connman_element_listener_add
498 (element, _element_listener, d, _element_listener_free);
504 _on_element_del(void *data, int type, void *info)
510 _on_element_updated(void *data, int type, void *info)
516 main(int argc, char *argv[])
518 E_DBus_Connection *c;
525 c = e_dbus_bus_get(DBUS_BUS_SYSTEM);
527 printf("ERROR: can't connect to system session\n");
531 e_connman_system_init(c);
532 ecore_event_handler_add(E_CONNMAN_EVENT_ELEMENT_ADD, _on_element_add, NULL);
533 ecore_event_handler_add(E_CONNMAN_EVENT_ELEMENT_DEL, _on_element_del, NULL);
534 ecore_event_handler_add(E_CONNMAN_EVENT_ELEMENT_UPDATED,
535 _on_element_updated, NULL);
537 _exiter_reschedule();
539 ecore_main_loop_begin();
541 e_dbus_connection_close(c);
542 eina_stringshare_dump();
547 total = success + failure;
549 fputs("DBG: clean exit, no tests executed.\n", stderr);
551 fprintf(stderr, "DBG: clean exit, success: %d, failure: %d, %d%%\n",
552 success, failure, (success * 100) / total);