3 #include <sys/wait.h> /* For WEXITSTATUS */
6 #include "opensync/engine/opensync_engine_internals.h"
11 void osync_testsuite_all(Suite
*s
, struct osync_testcase_s
*tc
)
14 for (i
=0; tc
[i
].name
; i
++)
15 create_case(s
, tc
[i
].name
, tc
[i
].func
);
18 unsigned int osync_testsuite_selected(Suite
*s
, int argc
, char **argv
,
19 struct osync_testcase_s
*tc
)
21 unsigned int i
, j
, n
=0;
22 /* Also argv[0]! for symlink-ed calls */
23 for (i
=0; argc
> i
; i
++) {
24 for (j
=0; tc
[j
].name
; j
++) {
25 if (strcmp(g_basename(argv
[i
]), tc
[j
].name
))
28 create_case(s
, tc
[j
].name
, tc
[j
].func
);
36 int osync_testsuite(int argc
, char **argv
, const char *unittest
,
37 struct osync_testcase_s
*tc
)
40 Suite
*s
= suite_create(unittest
);
45 if (!osync_testsuite_selected(s
, argc
, argv
, tc
))
46 osync_testsuite_all(s
, tc
);
48 sr
= srunner_create(s
);
49 srunner_run_all(sr
, CK_VERBOSE
);
50 nf
= srunner_ntests_failed(sr
);
52 return (nf
== 0) ? EXIT_SUCCESS
: EXIT_FAILURE
;
55 static void reset_env(void)
57 g_unsetenv("CONNECT_ERROR");
58 g_unsetenv("CONNECT_TIMEOUT");
59 g_unsetenv("CONNECT_SLOWSYNC");
60 g_unsetenv("INIT_NULL");
61 g_unsetenv("INIT_NULL_NOERROR");
62 g_unsetenv("GET_CHANGES_ERROR");
63 g_unsetenv("GET_CHANGES_TIMEOUT");
64 g_unsetenv("GET_CHANGES_TIMEOUT2");
65 g_unsetenv("COMMIT_ERROR");
66 g_unsetenv("COMMIT_TIMEOUT");
67 g_unsetenv("SYNC_DONE_ERROR");
68 g_unsetenv("SYNC_DONE_TIMEOUT");
69 g_unsetenv("DISCONNECT_ERROR");
70 g_unsetenv("DISCONNECT_TIMEOUT");
71 g_unsetenv("BATCH_COMMIT");
72 g_unsetenv("COMMITTED_ALL_ERROR");
73 g_unsetenv("NO_COMMITTED_ALL_CHECK");
74 g_unsetenv("MAINSINK_CONNECT");
76 g_unsetenv("OSYNC_NOMEMORY");
77 g_unsetenv("MOCK_SYNC_EXPECT_COMMIT_ALWAYS_ADDED");
78 g_unsetenv("MOCK_SYNC_ALWAYS_CHANGETYPE_MODIFIED");
80 g_unsetenv("MOCK_FORMAT_PATH_COMPARE_NO");
84 void check_env(void) {
86 if (g_getenv("OSYNC_TRACE"))
87 fprintf(stderr
, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
88 "WARNING! Environment variable OSYNC_TRACE is set.\n"
89 "This unit contains stress & performance tests which\n"
90 "will fail/timeout because of bad performance impact of\n"
91 "the i/o which will be produced by OSYNC_TRACE!\n"
92 "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n\n");
95 char *setup_testbed(const char *fkt_name
)
100 char *testbed
= g_strdup_printf("%s/testbed.XXXXXX", g_get_tmp_dir());
101 char *command
= NULL
, *dirname
= NULL
;
103 if(g_file_test(testbed
, G_FILE_TEST_IS_DIR
))
104 destroy_testbed(g_strdup(testbed
));
106 if(g_mkdir(testbed
,0777) < 0){
107 osync_trace(TRACE_INTERNAL
, "%s: Cannot create testbed directory %s", __func__
, testbed
);
111 if (!mkdtemp(testbed
))
116 dirname
= g_strdup_printf(OPENSYNC_TESTDATA
"/%s", fkt_name
);
117 if (!g_file_test(dirname
, G_FILE_TEST_IS_DIR
)) {
118 osync_trace(TRACE_INTERNAL
, "%s: Path %s not exist.", __func__
, dirname
);
121 command
= g_strdup_printf("cp -R %s/* %s", dirname
, testbed
);
128 dirname
= g_strdup_printf("%s/formats", testbed
);
129 if (!g_file_test(dirname
, G_FILE_TEST_IS_DIR
)) {
130 if (g_mkdir(dirname
,0777) < 0) {
131 osync_trace(TRACE_ERROR
, "Could not create format direcotry %s", dirname
);
137 dirname
= g_strdup_printf("%s/plugins", testbed
);
138 if (!g_file_test(dirname
, G_FILE_TEST_IS_DIR
)) {
139 if (g_mkdir(dirname
,0777) < 0) {
140 osync_trace(TRACE_ERROR
, "Could not create plugin direcotry %s", dirname
);
146 command
= g_strdup_printf("cp ./mock-plugin/mock-sync.%s %s/plugins", G_MODULE_SUFFIX
, testbed
);
151 command
= g_strdup_printf("cp ./mock-plugin/mock-format.%s %s/formats", G_MODULE_SUFFIX
, testbed
);
156 command
= g_strdup_printf("cp -R %s/../../misc/schemas/*.xsd %s", OPENSYNC_TESTDATA
, testbed
);
161 #ifndef _WIN32 /* chmod is useless on windows system */
162 command
= g_strdup_printf("chmod -R 700 %s", testbed
);
168 olddir
= g_get_current_dir();
169 if (g_chdir(testbed
) < 0){
170 osync_trace(TRACE_ERROR
, "Could not chdir to testbed");
176 osync_trace(TRACE_INTERNAL
, "Seting up %s at %s", fkt_name
, testbed
);
183 void destroy_testbed(char *path
)
185 char *command
= g_strdup_printf("rm -rf %s", path
);
187 if (g_chdir(olddir
) < 0)
195 osync_trace(TRACE_INTERNAL
, "Tearing down %s", path
);
199 void create_case(Suite
*s
, const char *name
, TFun function
)
201 TCase
*tc_new
= tcase_create(name
);
202 tcase_set_timeout(tc_new
, 30);
203 suite_add_tcase (s
, tc_new
);
204 tcase_add_test(tc_new
, function
);
208 // create_case_timeout() allow to specific a specific timeout - intended for breaking testcases which needs longer then 30seconds (default)
209 void create_case_timeout(Suite
*s
, const char *name
, TFun function
, int timeout
)
211 TCase
*tc_new
= tcase_create(name
);
212 tcase_set_timeout(tc_new
, timeout
);
213 suite_add_tcase (s
, tc_new
);
214 tcase_add_test(tc_new
, function
);
217 OSyncMappingTable
*mappingtable_load(const char *path
, const char *objtype
, int num_mappings
)
219 OSyncError
*error
= NULL
;
220 OSyncMappingTable
*table
= NULL
;
221 OSyncArchive
*archive
= NULL
;
223 osync_trace(TRACE_ENTRY
, "%s(%s, %s, %i)", __func__
, path
, objtype
, num_mappings
);
225 table
= osync_mapping_table_new(&error
);
226 fail_unless(table
!= NULL
, NULL
);
227 fail_unless(error
== NULL
, NULL
);
229 archive
= osync_archive_new(path
, &error
);
230 fail_unless(archive
!= NULL
, NULL
);
231 fail_unless(error
== NULL
, NULL
);
233 fail_unless(osync_mapping_table_load(table
, archive
, objtype
, &error
), NULL
);
234 fail_unless(error
== NULL
, NULL
);
236 osync_archive_unref(archive
);
238 fail_unless(osync_mapping_table_num_mappings(table
) == num_mappings
, NULL
);
240 osync_trace(TRACE_EXIT
, "%s: %p", __func__
, table
);
244 void check_mapping(OSyncMappingTable
*maptable
, int memberid
, int mappingid
, int numentries
, const char *uid
)
247 osync_trace(TRACE_ENTRY
, "%s(%p, %i, %i, %i, %s)", __func__
, maptable
, memberid
, mappingid
, numentries
, uid
);
249 for (i
= 0; i
< osync_mapping_table_num_mappings(maptable
); i
++) {
250 OSyncMapping
*mapping
= osync_mapping_table_nth_mapping(maptable
, i
);
251 OSyncMappingEntry
*testentry
= osync_mapping_find_entry_by_member_id(mapping
, memberid
);
252 if ((mappingid
!= -1 && osync_mapping_get_id(mapping
) == mappingid
) || (mappingid
== -1 && !strcmp(osync_mapping_entry_get_uid(testentry
), uid
))) {
254 fail_unless(osync_mapping_num_entries(mapping
) == numentries
);
255 for (n
= 0; n
< osync_mapping_num_entries(mapping
); n
++) {
256 OSyncMappingEntry
*entry
= osync_mapping_nth_entry(mapping
, n
);
257 if (osync_mapping_entry_get_member_id(entry
) == memberid
) {
258 fail_unless(!strcmp(osync_mapping_entry_get_uid(entry
), uid
), NULL
);
268 osync_trace(TRACE_EXIT
, "%s", __func__
);
271 OSyncHashTable
*hashtable_load(const char *path
, const char *objtype
, int entries
)
273 OSyncError
*error
= NULL
;
274 OSyncHashTable
*table
= osync_hashtable_new(path
, objtype
, &error
);
275 fail_unless(table
!= NULL
, NULL
);
276 fail_unless(error
== NULL
, NULL
);
278 fail_unless(osync_hashtable_load(table
, &error
), NULL
);
280 fail_unless(osync_hashtable_num_entries(table
) == entries
, NULL
);
285 void check_hash(OSyncHashTable
*table
, const char *cmpuid
)
287 fail_unless(!!osync_hashtable_get_hash(table
, cmpuid
), "Couldn't find hash!");
291 void create_random_file(const char *path
)
293 char *content
= osync_rand_str(g_random_int_range(100, 200));
294 osync_assert(osync_file_write(path
, content
, strlen(content
), 0700, NULL
) == TRUE
);
298 void member_status(OSyncMemberUpdate
*status
, void *user_data
)
300 osync_trace(TRACE_ENTRY
, "%s(%p (%i), %p)", __func__
, status
, status
->type
, user_data
);
301 fail_unless(GINT_TO_POINTER(1) == user_data
, NULL
);
303 switch (status
->type
) {
304 case OSYNC_CLIENT_EVENT_CONNECTED
:
305 fail_unless(!osync_error_is_set(&(status
->error
)), NULL
);
307 if (status
->objtype
== NULL
) {
308 num_client_main_connected
++;
310 fail_unless(!strncmp(status
->objtype
, "mockobjtype", 11), NULL
);
311 num_client_connected
++;
315 case OSYNC_CLIENT_EVENT_CONNECT_DONE
:
316 fail_unless(!osync_error_is_set(&(status
->error
)), NULL
);
318 if (status
->objtype
== NULL
) {
319 num_client_main_connect_done
++;
321 fail_unless(!strncmp(status
->objtype
, "mockobjtype", 11), NULL
);
322 num_client_connect_done
++;
325 case OSYNC_CLIENT_EVENT_DISCONNECTED
:
326 fail_unless(!osync_error_is_set(&(status
->error
)), NULL
);
328 if (status
->objtype
== NULL
) {
329 num_client_main_disconnected
++;
331 fail_unless(!strncmp(status
->objtype
, "mockobjtype", 11), NULL
);
332 num_client_disconnected
++;
336 case OSYNC_CLIENT_EVENT_READ
:
337 fail_unless(!osync_error_is_set(&(status
->error
)), NULL
);
339 if (status
->objtype
== NULL
) {
340 num_client_main_read
++;
342 fail_unless(!strncmp(status
->objtype
, "mockobjtype", 11), NULL
);
347 case OSYNC_CLIENT_EVENT_WRITTEN
:
348 fail_unless(!osync_error_is_set(&(status
->error
)), NULL
);
350 if (status
->objtype
== NULL
) {
351 num_client_main_written
++;
353 fail_unless(!strncmp(status
->objtype
, "mockobjtype", 11), NULL
);
354 num_client_written
++;
358 case OSYNC_CLIENT_EVENT_ERROR
:
359 fail_unless(osync_error_is_set(&(status
->error
)), NULL
);
362 case OSYNC_CLIENT_EVENT_SYNC_DONE
:
363 fail_unless(!osync_error_is_set(&(status
->error
)), NULL
);
365 if (status
->objtype
== NULL
) {
366 num_client_main_sync_done
++;
368 fail_unless(!strncmp(status
->objtype
, "mockobjtype", 11), NULL
);
369 num_client_sync_done
++;
373 case OSYNC_CLIENT_EVENT_DISCOVERED
:
374 fail_unless(!osync_error_is_set(&(status
->error
)), NULL
);
375 num_client_discovered
++;
379 osync_trace(TRACE_EXIT
, "%s", __func__
);
382 void entry_status(OSyncChangeUpdate
*status
, void *user_data
)
384 osync_trace(TRACE_ENTRY
, "%s(%p (%i), %p)", __func__
, status
, status
->type
, user_data
);
386 switch (status
->type
) {
387 case OSYNC_CHANGE_EVENT_READ
:
388 fail_unless(!osync_error_is_set(&(status
->error
)), NULL
);
391 case OSYNC_CHANGE_EVENT_WRITTEN
:
392 fail_unless(!osync_error_is_set(&(status
->error
)), NULL
);
393 num_change_written
++;
395 case OSYNC_CHANGE_EVENT_ERROR
:
396 fail_unless(osync_error_is_set(&(status
->error
)), NULL
);
401 osync_trace(TRACE_EXIT
, "%s", __func__
);
404 void engine_status(OSyncEngineUpdate
*status
, void *user_data
)
406 osync_trace(TRACE_ENTRY
, "%s(%p(%i), %p)", __func__
, status
, status
->type
, user_data
);
407 switch (status
->type
) {
408 case OSYNC_ENGINE_EVENT_CONNECTED
:
409 fail_unless(!osync_error_is_set(&(status
->error
)), NULL
);
410 num_engine_connected
++;
412 case OSYNC_ENGINE_EVENT_CONNECT_DONE
:
413 fail_unless(!osync_error_is_set(&(status
->error
)), NULL
);
414 num_engine_connect_done
++;
416 case OSYNC_ENGINE_EVENT_READ
:
417 fail_unless(!osync_error_is_set(&(status
->error
)), NULL
);
420 case OSYNC_ENGINE_EVENT_PREPARED_MAP
:
421 fail_unless(!osync_error_is_set(&(status
->error
)), NULL
);
422 num_engine_prepared_map
++;
424 case OSYNC_ENGINE_EVENT_MAPPED
:
425 fail_unless(!osync_error_is_set(&(status
->error
)), NULL
);
428 case OSYNC_ENGINE_EVENT_MULTIPLIED
:
429 fail_unless(!osync_error_is_set(&(status
->error
)), NULL
);
430 num_engine_multiplied
++;
432 case OSYNC_ENGINE_EVENT_PREPARED_WRITE
:
433 fail_unless(!osync_error_is_set(&(status
->error
)), NULL
);
434 num_engine_prepared_write
++;
436 case OSYNC_ENGINE_EVENT_WRITTEN
:
437 fail_unless(!osync_error_is_set(&(status
->error
)), NULL
);
438 num_engine_written
++;
440 case OSYNC_ENGINE_EVENT_DISCONNECTED
:
441 fail_unless(!osync_error_is_set(&(status
->error
)), NULL
);
442 num_engine_disconnected
++;
444 case OSYNC_ENGINE_EVENT_ERROR
:
445 fail_unless(osync_error_is_set(&(status
->error
)), NULL
);
448 case OSYNC_ENGINE_EVENT_SUCCESSFUL
:
449 fail_unless(!osync_error_is_set(&(status
->error
)), NULL
);
450 num_engine_successful
++;
452 case OSYNC_ENGINE_EVENT_PREV_UNCLEAN
:
453 fail_unless(!osync_error_is_set(&(status
->error
)), NULL
);
454 num_engine_prev_unclean
++;
456 case OSYNC_ENGINE_EVENT_END_CONFLICTS
:
457 fail_unless(!osync_error_is_set(&(status
->error
)), NULL
);
458 num_engine_end_conflicts
++;
460 case OSYNC_ENGINE_EVENT_SYNC_DONE
:
461 fail_unless(!osync_error_is_set(&(status
->error
)), NULL
);
462 num_engine_sync_done
++;
466 osync_trace(TRACE_EXIT
, "%s", __func__
);
469 void mapping_status(OSyncMappingUpdate
*status
, void *user_data
)
471 switch (status
->type
) {
472 case OSYNC_MAPPING_EVENT_SOLVED
:
473 fail_unless(!osync_error_is_set(&(status
->error
)), NULL
);
474 num_mapping_solved
++;
476 /*case OSYNC_MAPPING_EVENT_WRITTEN:
477 fail_unless(!osync_error_is_set(&(status->error)), NULL);
478 num_mapping_written++;
480 case OSYNC_MAPPING_EVENT_ERROR
:
481 fail_unless(osync_error_is_set(&(status
->error
)), NULL
);
482 num_mapping_errors
++;
487 void conflict_handler_choose_first(OSyncEngine
*engine
, OSyncMappingEngine
*mapping
, void *user_data
)
489 OSyncChange
*change
= NULL
;
490 OSyncError
*error
= NULL
;
492 osync_trace(TRACE_ENTRY
, "%s(%p, %p, %p)", __func__
, engine
, mapping
, user_data
);
494 num_mapping_conflicts
++;
495 fail_unless(osync_mapping_engine_num_changes(mapping
) == GPOINTER_TO_INT(user_data
), NULL
);
496 fail_unless(num_engine_end_conflicts
== 0, NULL
);
498 change
= osync_mapping_engine_member_change(mapping
, 1);
499 osync_assert(osync_engine_mapping_solve(engine
, mapping
, change
, &error
));
500 osync_assert(error
== NULL
);
502 osync_trace(TRACE_EXIT
, "%s", __func__
);
505 void conflict_handler_choose_deleted(OSyncEngine
*engine
, OSyncMappingEngine
*mapping
, void *user_data
)
507 OSyncError
*error
= NULL
;
509 osync_trace(TRACE_ENTRY
, "%s(%p, %p, %p)", __func__
, engine
, mapping
, user_data
);
511 num_mapping_conflicts
++;
512 fail_unless(osync_mapping_engine_num_changes(mapping
) == GPOINTER_TO_INT(user_data
), NULL
);
513 fail_unless(num_engine_end_conflicts
== 0, NULL
);
515 for (i
= 0; i
< osync_mapping_engine_num_changes(mapping
); i
++) {
516 OSyncChange
*change
= osync_mapping_engine_nth_change(mapping
, i
);
517 if (osync_change_get_changetype(change
) == OSYNC_CHANGE_TYPE_DELETED
) {
518 osync_assert(osync_engine_mapping_solve(engine
, mapping
, change
, &error
));
519 osync_assert(error
== NULL
);
521 osync_trace(TRACE_EXIT
, "%s", __func__
);
528 void conflict_handler_choose_modified(OSyncEngine
*engine
, OSyncMappingEngine
*mapping
, void *user_data
)
530 OSyncError
*error
= NULL
;
532 osync_trace(TRACE_ENTRY
, "%s(%p, %p, %p)", __func__
, engine
, mapping
, user_data
);
534 num_mapping_conflicts
++;
535 fail_unless(osync_mapping_engine_num_changes(mapping
) == GPOINTER_TO_INT(user_data
), NULL
);
536 fail_unless(num_engine_end_conflicts
== 0, NULL
);
538 for (i
= 0; i
< osync_mapping_engine_num_changes(mapping
); i
++) {
539 OSyncChange
*change
= osync_mapping_engine_nth_change(mapping
, i
);
540 if (osync_change_get_changetype(change
) == OSYNC_CHANGE_TYPE_MODIFIED
) {
541 osync_assert(osync_mapping_engine_solve(mapping
, change
, &error
));
542 osync_assert(error
== NULL
);
543 osync_trace(TRACE_EXIT
, "%s", __func__
);
550 void conflict_handler_ignore(OSyncEngine
*engine
, OSyncMappingEngine
*mapping
, void *user_data
)
552 OSyncError
*error
= NULL
;
553 num_mapping_conflicts
++;
555 fail_unless(osync_mapping_engine_num_changes(mapping
) == GPOINTER_TO_INT(user_data
), NULL
);
556 fail_unless(num_engine_end_conflicts
== 0, NULL
);
558 osync_engine_mapping_ignore_conflict(engine
, mapping
, &error
);
559 fail_unless(error
== NULL
, NULL
);
562 void conflict_handler_duplicate(OSyncEngine
*engine
, OSyncMappingEngine
*mapping
, void *user_data
)
564 OSyncError
*error
= NULL
;
565 osync_trace(TRACE_ENTRY
, "%s(%p, %p, %p)", __func__
, engine
, mapping
, user_data
);
567 num_mapping_conflicts
++;
568 fail_unless(osync_mapping_engine_num_changes(mapping
) == GPOINTER_TO_INT(user_data
), NULL
);
569 fail_unless(num_engine_end_conflicts
== 0, NULL
);
571 fail_unless(osync_engine_mapping_duplicate(engine
, mapping
, &error
), NULL
);
573 osync_trace(TRACE_EXIT
, "%s", __func__
);
576 void conflict_handler_abort(OSyncEngine
*engine
, OSyncMappingEngine
*mapping
, void *user_data
)
578 OSyncError
*error
= NULL
;
579 osync_trace(TRACE_ENTRY
, "%s(%p, %p, %p)", __func__
, engine
, mapping
, user_data
);
581 fail_unless(osync_mapping_engine_num_changes(mapping
) == GPOINTER_TO_INT(user_data
), NULL
);
582 fail_unless(num_engine_end_conflicts
== 0, NULL
);
584 fail_unless(osync_engine_abort(engine
, &error
), NULL
);
586 osync_trace(TRACE_EXIT
, "%s", __func__
);
589 OSyncEngine
*gengine
= NULL
;
591 void solve_conflict(OSyncMappingEngine
*mapping
)
593 OSyncChange
*change
= NULL
;
594 OSyncError
*error
= NULL
;
596 g_usleep(5*G_USEC_PER_SEC
);
598 change
= osync_mapping_engine_nth_change(mapping
, 0);
599 osync_assert(osync_engine_mapping_solve(gengine
, mapping
, change
, &error
));
600 osync_assert(error
== NULL
);
603 void conflict_handler_delay(OSyncEngine
*engine
, OSyncMappingEngine
*mapping
, void *user_data
)
605 osync_trace(TRACE_ENTRY
, "%s(%p, %p, %p)", __func__
, engine
, mapping
, user_data
);
607 num_mapping_conflicts
++;
608 fail_unless(osync_mapping_engine_num_changes(mapping
) == GPOINTER_TO_INT(user_data
), NULL
);
609 fail_unless(num_engine_end_conflicts
== 0, NULL
);
611 g_thread_create ((GThreadFunc
)solve_conflict
, mapping
, TRUE
, NULL
);
613 osync_trace(TRACE_EXIT
, "%s", __func__
);
616 void reset_counters()
618 num_client_connected
= 0;
619 num_client_main_connected
= 0;
620 num_client_disconnected
= 0;
621 num_client_main_disconnected
= 0;
623 num_client_main_read
= 0;
624 num_client_written
= 0;
625 num_client_main_written
= 0;
626 num_client_errors
= 0;
627 num_client_sync_done
= 0;
628 num_client_main_sync_done
= 0;
629 num_client_discovered
= 0;
632 num_change_written
= 0;
633 num_change_error
= 0;
635 num_engine_connected
= 0;
637 num_engine_prepared_map
= 0;
638 num_engine_mapped
= 0;
639 num_engine_multiplied
= 0;
640 num_engine_written
= 0;
641 num_engine_disconnected
= 0;
642 num_engine_errors
= 0;
643 num_engine_successful
= 0;
644 num_engine_end_conflicts
= 0;
645 num_engine_prev_unclean
= 0;
646 num_engine_sync_done
= 0;
648 num_mapping_solved
= 0;
649 num_mapping_written
= 0;
650 num_mapping_errors
= 0;
652 num_mapping_conflicts
= 0;
655 osync_bool
synchronize_once(OSyncEngine
*engine
, OSyncError
**error
)
658 fail_unless(osync_engine_repair(engine
, error
), "Repair of engine failed: %s", osync_error_print(error
));
659 return osync_engine_synchronize_and_block(engine
, error
);
662 void discover_all_once(OSyncEngine
*engine
, OSyncError
**error
)
664 OSyncGroup
*group
= osync_engine_get_group(engine
);
665 int i
, max
= osync_group_num_members(group
);
666 for (i
=0; i
< max
; i
++) {
667 OSyncMember
*member
= osync_group_nth_member(group
, i
);
668 osync_engine_discover_and_block(engine
, member
, error
);
669 osync_member_save(member
, error
);
673 OSyncFormatEnv
*osync_testing_load_formatenv(const char *formatdir
)
675 OSyncError
*error
= NULL
;
676 OSyncFormatEnv
*formatenv
= osync_format_env_new(&error
);
677 fail_unless(formatenv
!= NULL
, NULL
);
678 fail_unless(error
== NULL
, NULL
);
679 fail_unless(osync_format_env_load_plugins(formatenv
, formatdir
, &error
));
683 /** @brief Check if file or directory exists. No check for regular file!
685 * @param file filename or fullpath of file/directory
686 * @returns TRUE if exists, FALSE otherwise
689 osync_bool
osync_testing_file_exists(const char *file
)
691 return g_file_test(file
, G_FILE_TEST_EXISTS
);
694 /** @brief Removes files and directories
696 * @param file filename or fullpath of file/directory
697 * @returns TRUE on success, FALSE otherwise
700 osync_bool
osync_testing_file_remove(const char *file
)
702 return g_remove(file
);
705 /** @brief Modifies permission of file - like chmod()
707 * @param file filename or fullpath of file
708 * @param mode the permission mode like chmod()
709 * @returns TRUE on success, FALSE otherwise
712 osync_bool
osync_testing_file_chmod(const char *file
, int mode
)
715 "[...] Software that needs to manage file
716 permissions on Windows exactly should use the Win32 API."
717 TODO: Do we have to care about this on Windows?! */
718 return g_chmod(file
, mode
);
721 /** @brief Copy files
723 * @param source source filename
724 * @param dest destination filename
725 * @returns TRUE on success, FALSE otherwise
728 osync_bool
osync_testing_file_copy(const char *source
, const char *dest
)
731 const char *argv
[] = { "cp", source
, dest
, NULL
};
734 ret
= g_spawn_sync(NULL
, /* working directory */
735 (char **)argv
, /* arguments */
736 NULL
, /* environment */
737 G_SPAWN_STDOUT_TO_DEV_NULL
| G_SPAWN_STDERR_TO_DEV_NULL
,
738 NULL
, /* child setup function */
739 NULL
, /* user data for child setup func */
742 &exitstatus
, /* exit status */
743 NULL
/* error function */
746 return ret
&& WEXITSTATUS(exitstatus
) == 0;
752 /** @brief Find differences between two files
754 * @param source source filename
755 * @param dest destination filename
756 * @returns TRUE on when equal/success, FALSE otherwise
759 osync_bool
osync_testing_diff(const char *file1
, const char *file2
)
767 cmd
= g_strdup_printf(DIFF
" -x \".*\" %s %s", file1
, file2
);
774 /** @brief Creates a simple OSyncPluginConfig with a single resource.
775 * If config is not null the resource information gets added.
777 * @param config OSyncPluginConfig pointer to add resource info
778 * @param path relative path of resource
779 * @param objformat the objformat of the resource
780 * @param format_config the format converter config paramter
781 * @returns OSyncPluginConfig pointer or asserts on error
784 OSyncPluginConfig
*simple_plugin_config(OSyncPluginConfig
*config
, const char *path
, const char *objtype
, const char *objformat
, const char *format_config
) {
785 OSyncError
*error
= NULL
;
786 OSyncObjFormatSink
*format_sink
= NULL
;
787 OSyncPluginResource
*res
= NULL
;
788 osync_assert(objtype
);
789 osync_assert(objformat
);
792 config
= osync_plugin_config_new(&error
);
794 fail_unless(config
!= NULL
, NULL
);
795 fail_unless(error
== NULL
, NULL
);
797 format_sink
= osync_objformat_sink_new(objformat
, &error
);
799 osync_objformat_sink_set_config(format_sink
, format_config
);
801 res
= osync_plugin_resource_new(&error
);
802 osync_plugin_resource_set_objtype(res
, objtype
);
803 osync_plugin_resource_set_path(res
, path
);
804 osync_plugin_resource_enable(res
, TRUE
);
805 osync_plugin_resource_add_objformat_sink(res
, format_sink
);
808 osync_plugin_config_add_resource(config
, res
);
813 /** @brief Creates a simple OSyncEngine with nth Members with mock-sync
816 * @param member_size The number of member the Group for this Engine should have
817 * @returns OSyncEngine pointer or asserts on error
820 OSyncEngine
*osync_testing_create_engine_dummy(unsigned int member_size
)
823 OSyncError
*error
= NULL
;
824 OSyncEngine
*engine
= NULL
;
825 OSyncGroup
*group
= osync_group_new(&error
);
827 fail_unless(group
!= NULL
, NULL
);
828 fail_unless(error
== NULL
, NULL
);
830 for (u
=0; u
< member_size
; u
++) {
831 OSyncMember
*member
= osync_member_new(&error
);
832 fail_unless(member
!= NULL
, NULL
);
833 fail_unless(error
== NULL
, NULL
);
835 osync_group_add_member(group
, member
);
838 engine
= osync_engine_new(group
, &error
);
839 fail_unless(engine
!= NULL
, NULL
);
840 fail_unless(error
== NULL
, NULL
);
845 void osync_testing_system_abort(const char *command
)