diff options
author | Michele Calgaro <[email protected]> | 2020-09-11 14:38:47 +0900 |
---|---|---|
committer | Michele Calgaro <[email protected]> | 2020-09-11 14:38:47 +0900 |
commit | 884c8093d63402a1ad0b502244b791e3c6782be3 (patch) | |
tree | a600d4ab0d431a2bdfe4c15b70df43c14fbd8dd0 /debian/opensync/opensync-0.22/tests/check_multisync.c | |
parent | 14e1aa2006796f147f3f4811fb908a6b01e79253 (diff) | |
download | extra-dependencies-884c8093d63402a1ad0b502244b791e3c6782be3.tar.gz extra-dependencies-884c8093d63402a1ad0b502244b791e3c6782be3.zip |
Added debian extra dependency packages.
Signed-off-by: Michele Calgaro <[email protected]>
Diffstat (limited to 'debian/opensync/opensync-0.22/tests/check_multisync.c')
-rw-r--r-- | debian/opensync/opensync-0.22/tests/check_multisync.c | 1829 |
1 files changed, 1829 insertions, 0 deletions
diff --git a/debian/opensync/opensync-0.22/tests/check_multisync.c b/debian/opensync/opensync-0.22/tests/check_multisync.c new file mode 100644 index 00000000..28f547d9 --- /dev/null +++ b/debian/opensync/opensync-0.22/tests/check_multisync.c @@ -0,0 +1,1829 @@ +#include "support.h" + +START_TEST (multisync_easy_new) +{ + char *testbed = setup_testbed("multisync_easy_new"); + OSyncEnv *osync = init_env(); + OSyncGroup *group = osync_group_load(osync, "configs/group", NULL); + fail_unless(group != NULL, NULL); + fail_unless(osync_env_num_groups(osync) == 1, NULL); + mark_point(); + + OSyncEngine *engine = init_engine(group); + + synchronize_once(engine, NULL); + osengine_finalize(engine); + osengine_free(engine); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + fail_unless(num_engine_connected == 1, NULL); + fail_unless(num_engine_read == 1, NULL); + fail_unless(num_engine_wrote == 1, NULL); + fail_unless(num_engine_disconnected == 1, NULL); + fail_unless(num_written == 2, NULL); + fail_unless(num_read == 1, NULL); + fail_unless(num_engine_end_conflicts == 1, NULL); + + OSyncMappingTable *maptable = mappingtable_load(group, 1, 0); + check_mapping(maptable, 1, 0, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 2, 0, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 3, 0, 3, "testdata", "mockformat", "data"); + mappingtable_close(maptable); + + OSyncHashTable *table = hashtable_load(group, 1, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + destroy_testbed(testbed); +} +END_TEST + +START_TEST (multisync_easy_mod) +{ + char *testbed = setup_testbed("multisync_easy_new"); + OSyncEnv *osync = init_env(); + OSyncGroup *group = osync_group_load(osync, "configs/group", NULL); + fail_unless(group != NULL, NULL); + fail_unless(osync_env_num_groups(osync) == 1, NULL); + mark_point(); + + OSyncEngine *engine = init_engine(group); + + synchronize_once(engine, NULL); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + fail_unless(num_written == 2, NULL); + fail_unless(num_read == 1, NULL); + fail_unless(num_engine_end_conflicts = 1, NULL); + + sleep(2); + system("cp newdata data3/testdata"); + + synchronize_once(engine, NULL); + osengine_finalize(engine); + osengine_free(engine); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + fail_unless(num_engine_connected == 1, NULL); + fail_unless(num_engine_read == 1, NULL); + fail_unless(num_engine_wrote == 1, NULL); + fail_unless(num_engine_disconnected == 1, NULL); + fail_unless(num_written == 2, NULL); + fail_unless(num_read == 1, NULL); + + OSyncMappingTable *maptable = mappingtable_load(group, 1, 0); + check_mapping(maptable, 1, 0, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 2, 0, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 3, 0, 3, "testdata", "mockformat", "data"); + mappingtable_close(maptable); + + OSyncHashTable *table = hashtable_load(group, 1, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + destroy_testbed(testbed); +} +END_TEST + +START_TEST (multisync_dual_mod) +{ + char *testbed = setup_testbed("multisync_easy_new"); + OSyncEnv *osync = init_env(); + OSyncGroup *group = osync_group_load(osync, "configs/group", NULL); + fail_unless(group != NULL, NULL); + fail_unless(osync_env_num_groups(osync) == 1, NULL); + mark_point(); + + OSyncEngine *engine = init_engine(group); + + synchronize_once(engine, NULL); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + fail_unless(num_engine_connected == 1, NULL); + fail_unless(num_engine_read == 1, NULL); + fail_unless(num_engine_wrote == 1, NULL); + fail_unless(num_engine_disconnected == 1, NULL); + fail_unless(num_written == 2, NULL); + fail_unless(num_read == 1, NULL); + fail_unless(num_engine_end_conflicts == 1, NULL); + + sleep(2); + system("cp newdata data1/testdata"); + system("cp newdata data3/testdata"); + + synchronize_once(engine, NULL); + osengine_finalize(engine); + osengine_free(engine); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + fail_unless(num_engine_connected == 1, NULL); + fail_unless(num_engine_read == 1, NULL); + fail_unless(num_engine_wrote == 1, NULL); + fail_unless(num_engine_disconnected == 1, NULL); + fail_unless(num_written == 1, NULL); + fail_unless(num_read == 2, NULL); + fail_unless(num_engine_end_conflicts == 1, NULL); + + OSyncMappingTable *maptable = mappingtable_load(group, 1, 0); + check_mapping(maptable, 1, 0, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 2, 0, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 3, 0, 3, "testdata", "mockformat", "data"); + mappingtable_close(maptable); + + OSyncHashTable *table = hashtable_load(group, 1, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + destroy_testbed(testbed); +} +END_TEST + +START_TEST (multisync_triple_mod) +{ + char *testbed = setup_testbed("multisync_easy_new"); + OSyncEnv *osync = init_env(); + OSyncGroup *group = osync_group_load(osync, "configs/group", NULL); + fail_unless(group != NULL, NULL); + fail_unless(osync_env_num_groups(osync) == 1, NULL); + mark_point(); + + OSyncEngine *engine = init_engine(group); + + synchronize_once(engine, NULL); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + + fail_unless(num_engine_connected == 1, NULL); + fail_unless(num_engine_read == 1, NULL); + fail_unless(num_engine_wrote == 1, NULL); + fail_unless(num_engine_disconnected == 1, NULL); + fail_unless(num_written == 2, NULL); + fail_unless(num_read == 1, NULL); + fail_unless(num_engine_end_conflicts == 1, NULL); + + sleep(2); + system("cp newdata data1/testdata"); + system("cp newdata data2/testdata"); + system("cp newdata data3/testdata"); + + synchronize_once(engine, NULL); + osengine_finalize(engine); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + fail_unless(num_written == 0, NULL); + fail_unless(num_read == 3, NULL); + fail_unless(num_engine_end_conflicts = 1, NULL); + + OSyncMappingTable *maptable = mappingtable_load(group, 1, 0); + check_mapping(maptable, 1, 0, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 2, 0, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 3, 0, 3, "testdata", "mockformat", "data"); + mappingtable_close(maptable); + + OSyncHashTable *table = hashtable_load(group, 1, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + destroy_testbed(testbed); +} +END_TEST + +START_TEST (multisync_dual_new) +{ + char *testbed = setup_testbed("multisync_easy_new_partial"); + OSyncEnv *osync = init_env(); + OSyncGroup *group = osync_group_load(osync, "configs/group", NULL); + fail_unless(group != NULL, NULL); + fail_unless(osync_env_num_groups(osync) == 1, NULL); + mark_point(); + + OSyncEngine *engine = init_engine(group); + + synchronize_once(engine, NULL); + + fail_unless(num_engine_connected == 1, NULL); + fail_unless(num_engine_read == 1, NULL); + fail_unless(num_engine_wrote == 1, NULL); + fail_unless(num_engine_disconnected == 1, NULL); + fail_unless(num_written == 1, NULL); + fail_unless(num_read == 2, NULL); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + OSyncMappingTable *maptable = mappingtable_load(group, 1, 0); + check_mapping(maptable, 1, 0, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 2, 0, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 3, 0, 3, "testdata", "mockformat", "data"); + mappingtable_close(maptable); + + OSyncHashTable *table = hashtable_load(group, 1, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + system("rm -f data2/testdata"); + + synchronize_once(engine, NULL); + osengine_finalize(engine); + + maptable = mappingtable_load(group, 0, 0); + mappingtable_close(maptable); + + table = hashtable_load(group, 1, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 0); + osync_hashtable_close(table); + + fail_unless(!system("test \"x$(ls data1)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data3)\" = \"x\""), NULL); + + destroy_testbed(testbed); +} +END_TEST + + +START_TEST (multisync_triple_new) +{ + char *testbed = setup_testbed("multisync_easy_new_partial2"); + OSyncEnv *osync = init_env(); + OSyncGroup *group = osync_group_load(osync, "configs/group", NULL); + fail_unless(group != NULL, NULL); + fail_unless(osync_env_num_groups(osync) == 1, NULL); + mark_point(); + + OSyncEngine *engine = init_engine(group); + + synchronize_once(engine, NULL); + + fail_unless(num_engine_connected == 1, NULL); + fail_unless(num_engine_read == 1, NULL); + fail_unless(num_engine_wrote == 1, NULL); + fail_unless(num_engine_disconnected == 1, NULL); + fail_unless(num_written == 0, NULL); + fail_unless(num_read == 3, NULL); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + OSyncMappingTable *maptable = mappingtable_load(group, 1, 0); + check_mapping(maptable, 1, 0, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 2, 0, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 3, 0, 3, "testdata", "mockformat", "data"); + mappingtable_close(maptable); + + OSyncHashTable *table = hashtable_load(group, 1, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + system("rm -f data1/testdata"); + + synchronize_once(engine, NULL); + osengine_finalize(engine); + + maptable = mappingtable_load(group, 0, 0); + mappingtable_close(maptable); + + table = hashtable_load(group, 1, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 0); + osync_hashtable_close(table); + + fail_unless(!system("test \"x$(ls data1)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data3)\" = \"x\""), NULL); + + destroy_testbed(testbed); +} +END_TEST + +START_TEST (multisync_easy_del) +{ + char *testbed = setup_testbed("multisync_conflict_changetype_choose"); + OSyncEnv *osync = init_env(); + OSyncGroup *group = osync_group_load(osync, "configs/group", NULL); + + OSyncEngine *engine = init_engine(group); + osengine_set_conflict_callback(engine, conflict_handler_duplication, NULL); + + synchronize_once(engine, NULL); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + system("rm -f data2/testdata"); + + synchronize_once(engine, NULL); + osengine_finalize(engine); + + fail_unless(num_engine_connected == 1, NULL); + fail_unless(num_engine_read == 1, NULL); + fail_unless(num_engine_wrote == 1, NULL); + fail_unless(num_engine_disconnected == 1, NULL); + fail_unless(num_read == 1, NULL); + fail_unless(num_conflicts == 0, NULL); + fail_unless(num_written == 2, NULL); + + OSyncMappingTable *maptable = mappingtable_load(group, 0, 0); + mappingtable_close(maptable); + + OSyncHashTable *table = hashtable_load(group, 1, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 0); + osync_hashtable_close(table); + + fail_unless(!system("test \"x$(ls data1)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data3)\" = \"x\""), NULL); + + destroy_testbed(testbed); +} +END_TEST + +START_TEST (multisync_dual_del) +{ + char *testbed = setup_testbed("multisync_conflict_changetype_choose"); + OSyncEnv *osync = init_env(); + OSyncGroup *group = osync_group_load(osync, "configs/group", NULL); + + OSyncEngine *engine = init_engine(group); + osengine_set_conflict_callback(engine, conflict_handler_duplication, NULL); + + synchronize_once(engine, NULL); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + system("rm -f data1/testdata"); + system("rm -f data3/testdata"); + + synchronize_once(engine, NULL); + osengine_finalize(engine); + + fail_unless(num_engine_connected == 1, NULL); + fail_unless(num_engine_read == 1, NULL); + fail_unless(num_engine_wrote == 1, NULL); + fail_unless(num_engine_disconnected == 1, NULL); + fail_unless(num_read == 2, NULL); + fail_unless(num_conflicts == 0, NULL); + fail_unless(num_written == 1, NULL); + + OSyncMappingTable *maptable = mappingtable_load(group, 0, 0); + mappingtable_close(maptable); + + OSyncHashTable *table = hashtable_load(group, 1, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 0); + osync_hashtable_close(table); + + fail_unless(!system("test \"x$(ls data1)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data3)\" = \"x\""), NULL); + + destroy_testbed(testbed); +} +END_TEST + +START_TEST (multisync_triple_del) +{ + char *testbed = setup_testbed("multisync_conflict_changetype_choose"); + OSyncEnv *osync = init_env(); + OSyncGroup *group = osync_group_load(osync, "configs/group", NULL); + + OSyncEngine *engine = init_engine(group); + osengine_set_conflict_callback(engine, conflict_handler_duplication, NULL); + + synchronize_once(engine, NULL); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + system("rm -f data1/testdata"); + system("rm -f data2/testdata"); + system("rm -f data3/testdata"); + + synchronize_once(engine, NULL); + osengine_finalize(engine); + + fail_unless(num_engine_connected == 1, NULL); + fail_unless(num_engine_read == 1, NULL); + fail_unless(num_engine_wrote == 1, NULL); + fail_unless(num_engine_disconnected == 1, NULL); + fail_unless(num_read == 3, NULL); + fail_unless(num_conflicts == 0, NULL); + fail_unless(num_written == 0, NULL); + + OSyncMappingTable *maptable = mappingtable_load(group, 0, 0); + mappingtable_close(maptable); + + OSyncHashTable *table = hashtable_load(group, 1, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 0); + osync_hashtable_close(table); + + fail_unless(!system("test \"x$(ls data1)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data3)\" = \"x\""), NULL); + + destroy_testbed(testbed); +} +END_TEST + +START_TEST (multisync_conflict_data_choose) +{ + char *testbed = setup_testbed("multisync_conflict_data_choose"); + OSyncEnv *osync = init_env(); + OSyncGroup *group = osync_group_load(osync, "configs/group", NULL); + fail_unless(group != NULL, NULL); + fail_unless(osync_env_num_groups(osync) == 1, NULL); + mark_point(); + + OSyncEngine *engine = init_engine(group); + osengine_set_conflict_callback(engine, conflict_handler_choose_first, GINT_TO_POINTER(2)); + + synchronize_once(engine, NULL); + + fail_unless(num_engine_connected == 1, NULL); + fail_unless(num_engine_read == 1, NULL); + fail_unless(num_engine_wrote == 1, NULL); + fail_unless(num_engine_disconnected == 1, NULL); + fail_unless(num_written == 2, NULL); + fail_unless(num_read == 2, NULL); + fail_unless(num_conflicts == 1, NULL); + fail_unless(num_engine_end_conflicts == 1, NULL); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + OSyncMappingTable *maptable = mappingtable_load(group, 1, 0); + check_mapping(maptable, 1, 0, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 2, 0, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 3, 0, 3, "testdata", "mockformat", "data"); + mappingtable_close(maptable); + + OSyncHashTable *table = hashtable_load(group, 1, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + system("rm -f data3/testdata"); + + mark_point(); + num_conflicts = 0; + synchronize_once(engine, NULL); + osengine_finalize(engine); + + mappingtable_load(group, 0, 0); + mappingtable_close(maptable); + + hashtable_load(group, 1, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 0); + osync_hashtable_close(table); + + fail_unless(!system("test \"x$(ls data1)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data3)\" = \"x\""), NULL); + + destroy_testbed(testbed); +} +END_TEST + +START_TEST (multisync_conflict_data_choose2) +{ + char *testbed = setup_testbed("multisync_conflict_data_choose2"); + OSyncEnv *osync = init_env(); + OSyncGroup *group = osync_group_load(osync, "configs/group", NULL); + fail_unless(group != NULL, NULL); + fail_unless(osync_env_num_groups(osync) == 1, NULL); + mark_point(); + + OSyncEngine *engine = init_engine(group); + osengine_set_conflict_callback(engine, conflict_handler_choose_first, GINT_TO_POINTER(3)); + + synchronize_once(engine, NULL); + + fail_unless(num_engine_connected == 1, NULL); + fail_unless(num_engine_read == 1, NULL); + fail_unless(num_engine_wrote == 1, NULL); + fail_unless(num_engine_disconnected == 1, NULL); + fail_unless(num_read == 3, NULL); + fail_unless(num_conflicts == 1, NULL); + fail_unless(num_engine_end_conflicts == 1, NULL); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + OSyncMappingTable *maptable = mappingtable_load(group, 1, 0); + check_mapping(maptable, 1, 0, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 2, 0, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 3, 0, 3, "testdata", "mockformat", "data"); + mappingtable_close(maptable); + + OSyncHashTable *table = hashtable_load(group, 1, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + system("rm -f data3/testdata"); + + mark_point(); + num_conflicts = 0; + synchronize_once(engine, NULL);; + osengine_finalize(engine); + + mappingtable_load(group, 0, 0); + mappingtable_close(maptable); + + hashtable_load(group, 1, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 0); + osync_hashtable_close(table); + + fail_unless(!system("test \"x$(ls data1)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data3)\" = \"x\""), NULL); + + destroy_testbed(testbed); +} +END_TEST + +START_TEST (multisync_conflict_changetype_choose) +{ + char *testbed = setup_testbed("multisync_conflict_changetype_choose"); + OSyncEnv *osync = init_env(); + OSyncGroup *group = osync_group_load(osync, "configs/group", NULL); + + OSyncEngine *engine = init_engine(group); + osengine_set_conflict_callback(engine, conflict_handler_choose_modified, GINT_TO_POINTER(3)); + + synchronize_once(engine, NULL); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + sleep(2); + + system("rm -f data1/testdata"); + system("cp newdata data3/testdata"); + + num_written = 0; + num_read = 0; + num_conflicts = 0; + synchronize_once(engine, NULL); + + fail_unless(num_engine_connected == 1, NULL); + fail_unless(num_engine_read == 1, NULL); + fail_unless(num_engine_wrote == 1, NULL); + fail_unless(num_engine_disconnected == 1, NULL); + fail_unless(num_read == 2, NULL); + fail_unless(num_conflicts == 1, NULL); + fail_unless(num_written == 2, NULL); + fail_unless(num_engine_end_conflicts == 1, NULL); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + OSyncMappingTable *maptable = mappingtable_load(group, 1, 0); + check_mapping(maptable, 1, 0, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 2, 0, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 3, 0, 3, "testdata", "mockformat", "data"); + mappingtable_close(maptable); + + OSyncHashTable *table = hashtable_load(group, 1, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + system("rm -f data1/testdata"); + + mark_point(); + num_conflicts = 0; + synchronize_once(engine, NULL); + osengine_finalize(engine); + + mappingtable_load(group, 0, 0); + mappingtable_close(maptable); + + hashtable_load(group, 1, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 0); + osync_hashtable_close(table); + + fail_unless(!system("test \"x$(ls data1)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data3)\" = \"x\""), NULL); + + destroy_testbed(testbed); +} +END_TEST + +START_TEST (multisync_conflict_changetype_choose2) +{ + char *testbed = setup_testbed("multisync_conflict_changetype_choose"); + OSyncEnv *osync = init_env(); + OSyncGroup *group = osync_group_load(osync, "configs/group", NULL); + + OSyncEngine *engine = init_engine(group); + osengine_set_conflict_callback(engine, conflict_handler_choose_deleted, GINT_TO_POINTER(3)); + + synchronize_once(engine, NULL); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + sleep(2); + + system("rm -f data1/testdata"); + system("cp newdata data3/testdata"); + + synchronize_once(engine, NULL); + osengine_finalize(engine); + + fail_unless(num_engine_connected == 1, NULL); + fail_unless(num_engine_read == 1, NULL); + fail_unless(num_engine_wrote == 1, NULL); + fail_unless(num_engine_disconnected == 1, NULL); + fail_unless(num_read == 2, NULL); + fail_unless(num_conflicts == 1, NULL); + fail_unless(num_written == 2, NULL); + + OSyncMappingTable *maptable = mappingtable_load(group, 0, 0); + mappingtable_close(maptable); + + OSyncHashTable *table = hashtable_load(group, 1, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 0); + osync_hashtable_close(table); + + fail_unless(!system("test \"x$(ls data1)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data3)\" = \"x\""), NULL); + + destroy_testbed(testbed); +} +END_TEST + +START_TEST (multisync_conflict_hybrid_choose) +{ + char *testbed = setup_testbed("multisync_conflict_changetype_choose"); + OSyncEnv *osync = init_env(); + OSyncGroup *group = osync_group_load(osync, "configs/group", NULL); + + OSyncEngine *engine = init_engine(group); + osengine_set_conflict_callback(engine, conflict_handler_choose_modified, GINT_TO_POINTER(3)); + + synchronize_once(engine, NULL); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + sleep(2); + + system("rm -f data1/testdata"); + system("cp newdata data3/testdata"); + system("cp newdata2 data2/testdata"); + + synchronize_once(engine, NULL); + + fail_unless(num_engine_connected == 1, NULL); + fail_unless(num_engine_read == 1, NULL); + fail_unless(num_engine_wrote == 1, NULL); + fail_unless(num_engine_disconnected == 1, NULL); + fail_unless(num_read == 3, NULL); + fail_unless(num_conflicts == 1, NULL); + fail_unless(num_written == 2, NULL); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + OSyncMappingTable *maptable = mappingtable_load(group, 1, 0); + check_mapping(maptable, 1, 0, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 2, 0, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 3, 0, 3, "testdata", "mockformat", "data"); + mappingtable_close(maptable); + + OSyncHashTable *table = hashtable_load(group, 1, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + system("rm -f data1/testdata"); + + mark_point(); + num_conflicts = 0; + synchronize_once(engine, NULL); + osengine_finalize(engine); + + mappingtable_load(group, 0, 0); + mappingtable_close(maptable); + + hashtable_load(group, 1, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 0); + osync_hashtable_close(table); + + fail_unless(!system("test \"x$(ls data1)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data3)\" = \"x\""), NULL); + + destroy_testbed(testbed); +} +END_TEST + +START_TEST (multisync_conflict_hybrid_choose2) +{ + char *testbed = setup_testbed("multisync_conflict_changetype_choose"); + OSyncEnv *osync = init_env(); + OSyncGroup *group = osync_group_load(osync, "configs/group", NULL); + + OSyncEngine *engine = init_engine(group); + osengine_set_conflict_callback(engine, conflict_handler_choose_deleted, GINT_TO_POINTER(3)); + + synchronize_once(engine, NULL); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + sleep(2); + + system("rm -f data1/testdata"); + system("cp newdata data3/testdata"); + system("cp newdata2 data2/testdata"); + + synchronize_once(engine, NULL); + + fail_unless(num_engine_connected == 1, NULL); + fail_unless(num_engine_read == 1, NULL); + fail_unless(num_engine_wrote == 1, NULL); + fail_unless(num_engine_disconnected == 1, NULL); + fail_unless(num_read == 3, NULL); + fail_unless(num_conflicts == 1, NULL); + fail_unless(num_written == 2, NULL); + + OSyncMappingTable *maptable = mappingtable_load(group, 0, 0); + mappingtable_close(maptable); + + OSyncHashTable *table = hashtable_load(group, 1, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 0); + osync_hashtable_close(table); + + fail_unless(!system("test \"x$(ls data1)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data3)\" = \"x\""), NULL); + + destroy_testbed(testbed); +} +END_TEST + +START_TEST (multisync_conflict_data_duplicate) +{ + char *testbed = setup_testbed("multisync_conflict_data_choose"); + OSyncEnv *osync = init_env(); + OSyncGroup *group = osync_group_load(osync, "configs/group", NULL); + fail_unless(group != NULL, NULL); + fail_unless(osync_env_num_groups(osync) == 1, NULL); + mark_point(); + + OSyncEngine *engine = init_engine(group); + osengine_set_conflict_callback(engine, conflict_handler_duplication, GINT_TO_POINTER(2)); + + synchronize_once(engine, NULL); + + fail_unless(num_engine_connected == 1, NULL); + fail_unless(num_engine_read == 1, NULL); + fail_unless(num_engine_wrote == 1, NULL); + fail_unless(num_engine_disconnected == 1, NULL); + fail_unless(num_read == 2, NULL); + fail_unless(num_conflicts == 1, NULL); + fail_unless(num_written == 5, NULL); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + OSyncMappingTable *maptable = mappingtable_load(group, 2, 0); + check_mapping(maptable, 1, -1, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 2, -1, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 3, -1, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 1, -1, 3, "testdata-dupe", "mockformat", "data"); + check_mapping(maptable, 2, -1, 3, "testdata-dupe", "mockformat", "data"); + check_mapping(maptable, 3, -1, 3, "testdata-dupe", "mockformat", "data"); + mappingtable_close(maptable); + + OSyncHashTable *table = hashtable_load(group, 1, 2); + check_hash(table, "testdata"); + check_hash(table, "testdata-dupe"); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 2); + check_hash(table, "testdata"); + check_hash(table, "testdata-dupe"); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 2); + check_hash(table, "testdata"); + check_hash(table, "testdata-dupe"); + osync_hashtable_close(table); + + system("rm -f data3/testdata"); + + synchronize_once(engine, NULL); + + maptable = mappingtable_load(group, 1, 0); + check_mapping(maptable, 1, 0, 3, "testdata-dupe", "mockformat", "data"); + check_mapping(maptable, 2, 0, 3, "testdata-dupe", "mockformat", "data"); + check_mapping(maptable, 3, 0, 3, "testdata-dupe", "mockformat", "data"); + mappingtable_close(maptable); + + table = hashtable_load(group, 1, 1); + check_hash(table, "testdata-dupe"); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 1); + check_hash(table, "testdata-dupe"); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 1); + check_hash(table, "testdata-dupe"); + osync_hashtable_close(table); + + system("rm -f data2/testdata-dupe"); + + mark_point(); + num_conflicts = 0; + synchronize_once(engine, NULL); + osengine_finalize(engine); + + mappingtable_load(group, 0, 0); + mappingtable_close(maptable); + + hashtable_load(group, 1, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 0); + osync_hashtable_close(table); + + fail_unless(!system("test \"x$(ls data1)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data3)\" = \"x\""), NULL); + + destroy_testbed(testbed); +} +END_TEST + +START_TEST (multisync_conflict_data_duplicate2) +{ + char *testbed = setup_testbed("multisync_conflict_data_duplicate2"); + OSyncEnv *osync = init_env(); + OSyncGroup *group = osync_group_load(osync, "configs/group", NULL); + fail_unless(group != NULL, NULL); + fail_unless(osync_env_num_groups(osync) == 1, NULL); + mark_point(); + + OSyncEngine *engine = init_engine(group); + osengine_set_conflict_callback(engine, conflict_handler_duplication, GINT_TO_POINTER(3)); + + synchronize_once(engine, NULL); + + fail_unless(num_engine_connected == 1, NULL); + fail_unless(num_engine_read == 1, NULL); + fail_unless(num_engine_wrote == 1, NULL); + fail_unless(num_engine_disconnected == 1, NULL); + fail_unless(num_read == 3, NULL); + fail_unless(num_conflicts == 1, NULL); + fail_unless(num_written == 8, NULL); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + OSyncMappingTable *maptable = mappingtable_load(group, 3, 0); + check_mapping(maptable, 1, -1, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 2, -1, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 3, -1, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 1, -1, 3, "testdata-dupe", "mockformat", "data"); + check_mapping(maptable, 2, -1, 3, "testdata-dupe", "mockformat", "data"); + check_mapping(maptable, 3, -1, 3, "testdata-dupe", "mockformat", "data"); + check_mapping(maptable, 1, -1, 3, "testdata-dupe-dupe", "mockformat", "data"); + check_mapping(maptable, 2, -1, 3, "testdata-dupe-dupe", "mockformat", "data"); + check_mapping(maptable, 3, -1, 3, "testdata-dupe-dupe", "mockformat", "data"); + mappingtable_close(maptable); + + OSyncHashTable *table = hashtable_load(group, 1, 3); + check_hash(table, "testdata"); + check_hash(table, "testdata-dupe"); + check_hash(table, "testdata-dupe-dupe"); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 3); + check_hash(table, "testdata"); + check_hash(table, "testdata-dupe"); + check_hash(table, "testdata-dupe-dupe"); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 3); + check_hash(table, "testdata"); + check_hash(table, "testdata-dupe"); + check_hash(table, "testdata-dupe-dupe"); + osync_hashtable_close(table); + + system("rm -f data3/testdata data3/testdata-dupe-dupe"); + + synchronize_once(engine, NULL); + + maptable = mappingtable_load(group, 1, 0); + check_mapping(maptable, 1, 0, 3, "testdata-dupe", "mockformat", "data"); + check_mapping(maptable, 2, 0, 3, "testdata-dupe", "mockformat", "data"); + check_mapping(maptable, 3, 0, 3, "testdata-dupe", "mockformat", "data"); + mappingtable_close(maptable); + + table = hashtable_load(group, 1, 1); + check_hash(table, "testdata-dupe"); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 1); + check_hash(table, "testdata-dupe"); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 1); + check_hash(table, "testdata-dupe"); + osync_hashtable_close(table); + + system("rm -f data2/testdata-dupe"); + + mark_point(); + num_conflicts = 0; + synchronize_once(engine, NULL); + osengine_finalize(engine); + + mappingtable_load(group, 0, 0); + mappingtable_close(maptable); + + hashtable_load(group, 1, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 0); + osync_hashtable_close(table); + + fail_unless(!system("test \"x$(ls data1)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data3)\" = \"x\""), NULL); + + destroy_testbed(testbed); +} +END_TEST + +START_TEST (multisync_conflict_changetype_duplicate) +{ + char *testbed = setup_testbed("multisync_conflict_changetype_choose"); + OSyncEnv *osync = init_env(); + OSyncGroup *group = osync_group_load(osync, "configs/group", NULL); + + OSyncEngine *engine = init_engine(group); + osengine_set_conflict_callback(engine, conflict_handler_duplication, GINT_TO_POINTER(3)); + + synchronize_once(engine, NULL); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + sleep(2); + + system("rm -f data1/testdata"); + system("cp newdata data3/testdata"); + + synchronize_once(engine, NULL); + + fail_unless(num_engine_connected == 1, NULL); + fail_unless(num_engine_read == 1, NULL); + fail_unless(num_engine_wrote == 1, NULL); + fail_unless(num_engine_disconnected == 1, NULL); + fail_unless(num_read == 2, NULL); + fail_unless(num_conflicts == 1, NULL); + fail_unless(num_written == 2, NULL); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + OSyncMappingTable *maptable = mappingtable_load(group, 1, 0); + check_mapping(maptable, 1, 0, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 2, 0, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 3, 0, 3, "testdata", "mockformat", "data"); + mappingtable_close(maptable); + + OSyncHashTable *table = hashtable_load(group, 1, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + system("rm -f data1/testdata"); + + mark_point(); + num_conflicts = 0; + synchronize_once(engine, NULL); + osengine_finalize(engine); + + mappingtable_load(group, 0, 0); + mappingtable_close(maptable); + + hashtable_load(group, 1, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 0); + osync_hashtable_close(table); + + fail_unless(!system("test \"x$(ls data1)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data3)\" = \"x\""), NULL); + + destroy_testbed(testbed); +} +END_TEST + +START_TEST (multisync_conflict_changetype_duplicate2) +{ + char *testbed = setup_testbed("multisync_conflict_changetype_choose"); + OSyncEnv *osync = init_env(); + OSyncGroup *group = osync_group_load(osync, "configs/group", NULL); + + OSyncEngine *engine = init_engine(group); + osengine_set_conflict_callback(engine, conflict_handler_duplication, GINT_TO_POINTER(3)); + + synchronize_once(engine, NULL); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + sleep(2); + + system("rm -f data2/testdata"); + system("rm -f data3/testdata"); + system("cp newdata2 data1/testdata"); + + synchronize_once(engine, NULL); + + fail_unless(num_engine_connected == 1, NULL); + fail_unless(num_engine_read == 1, NULL); + fail_unless(num_engine_wrote == 1, NULL); + fail_unless(num_engine_disconnected == 1, NULL); + fail_unless(num_read == 3, NULL); + fail_unless(num_conflicts == 1, NULL); + fail_unless(num_written == 2, NULL); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + OSyncMappingTable *maptable = mappingtable_load(group, 1, 0); + check_mapping(maptable, 1, 0, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 2, 0, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 3, 0, 3, "testdata", "mockformat", "data"); + mappingtable_close(maptable); + + OSyncHashTable *table = hashtable_load(group, 1, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 1); + check_hash(table, "testdata"); + osync_hashtable_close(table); + + system("rm -f data1/testdata"); + + mark_point(); + num_conflicts = 0; + synchronize_once(engine, NULL); + osengine_finalize(engine); + + mappingtable_load(group, 0, 0); + mappingtable_close(maptable); + + hashtable_load(group, 1, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 0); + osync_hashtable_close(table); + + fail_unless(!system("test \"x$(ls data1)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data3)\" = \"x\""), NULL); + + destroy_testbed(testbed); +} +END_TEST + +START_TEST (multisync_conflict_hybrid_duplicate) +{ + char *testbed = setup_testbed("multisync_conflict_changetype_choose"); + OSyncEnv *osync = init_env(); + OSyncGroup *group = osync_group_load(osync, "configs/group", NULL); + + OSyncEngine *engine = init_engine(group); + osengine_set_conflict_callback(engine, conflict_handler_duplication, GINT_TO_POINTER(3)); + + synchronize_once(engine, NULL); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + sleep(2); + + system("rm -f data2/testdata"); + system("cp newdata data3/testdata"); + system("cp newdata2 data1/testdata"); + + synchronize_once(engine, NULL); + + fail_unless(num_engine_connected == 1, NULL); + fail_unless(num_engine_read == 1, NULL); + fail_unless(num_engine_wrote == 1, NULL); + fail_unless(num_engine_disconnected == 1, NULL); + fail_unless(num_read == 3, NULL); + fail_unless(num_conflicts == 1, NULL); + fail_unless(num_written == 5, NULL); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + OSyncMappingTable *maptable = mappingtable_load(group, 2, 0); + check_mapping(maptable, 1, -1, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 2, -1, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 3, -1, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 1, -1, 3, "testdata-dupe", "mockformat", "data"); + check_mapping(maptable, 2, -1, 3, "testdata-dupe", "mockformat", "data"); + check_mapping(maptable, 3, -1, 3, "testdata-dupe", "mockformat", "data"); + mappingtable_close(maptable); + + OSyncHashTable *table = hashtable_load(group, 1, 2); + check_hash(table, "testdata"); + check_hash(table, "testdata-dupe"); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 2); + check_hash(table, "testdata"); + check_hash(table, "testdata-dupe"); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 2); + check_hash(table, "testdata"); + check_hash(table, "testdata-dupe"); + osync_hashtable_close(table); + + system("rm -f data1/testdata data2/testdata-dupe"); + + mark_point(); + num_conflicts = 0; + synchronize_once(engine, NULL); + osengine_finalize(engine); + + mappingtable_load(group, 0, 0); + mappingtable_close(maptable); + + hashtable_load(group, 1, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 0); + osync_hashtable_close(table); + + fail_unless(!system("test \"x$(ls data1)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data3)\" = \"x\""), NULL); + + destroy_testbed(testbed); +} +END_TEST + +START_TEST (multisync_multi_conflict) +{ + char *testbed = setup_testbed("multisync_easy_new"); + + OSyncEnv *osync = init_env(); + OSyncGroup *group = osync_group_load(osync, "configs/group", NULL); + + OSyncEngine *engine = init_engine(group); + osengine_set_conflict_callback(engine, conflict_handler_duplication, GINT_TO_POINTER(3)); + + system("cp newdata data3/testdata1"); + system("cp newdata1 data2/testdata2"); + + synchronize_once(engine, NULL); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + OSyncMappingTable *maptable = mappingtable_load(group, 3, 0); + check_mapping(maptable, 1, -1, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 2, -1, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 3, -1, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 1, -1, 3, "testdata1", "mockformat", "data"); + check_mapping(maptable, 2, -1, 3, "testdata1", "mockformat", "data"); + check_mapping(maptable, 3, -1, 3, "testdata1", "mockformat", "data"); + check_mapping(maptable, 1, -1, 3, "testdata2", "mockformat", "data"); + check_mapping(maptable, 2, -1, 3, "testdata2", "mockformat", "data"); + check_mapping(maptable, 3, -1, 3, "testdata2", "mockformat", "data"); + mappingtable_close(maptable); + + OSyncHashTable *table = hashtable_load(group, 1, 3); + check_hash(table, "testdata"); + check_hash(table, "testdata1"); + check_hash(table, "testdata2"); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 3); + check_hash(table, "testdata"); + check_hash(table, "testdata1"); + check_hash(table, "testdata2"); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 3); + check_hash(table, "testdata"); + check_hash(table, "testdata1"); + check_hash(table, "testdata2"); + osync_hashtable_close(table); + + //Change statuses + fail_unless(num_read == 3, NULL); + fail_unless(num_read_info == 0, NULL); + fail_unless(num_conflicts == 0, NULL); + fail_unless(num_written == 6, NULL); + fail_unless(num_written_errors == 0, NULL); + fail_unless(num_recv_errors == 0, NULL); + + //Member statuses + fail_unless(num_connected == 3, NULL); + fail_unless(num_disconnected == 3, NULL); + fail_unless(num_member_comitted_all == 3, NULL); + fail_unless(num_member_sent_changes == 3, NULL); + fail_unless(num_member_connect_errors == 0, NULL); + fail_unless(num_member_get_changes_errors == 0, NULL); + fail_unless(num_member_sync_done_errors == 0, NULL); + fail_unless(num_member_disconnect_errors == 0, NULL); + fail_unless(num_member_comitted_all_errors == 0, NULL); + + //Engine statuses + fail_unless(num_engine_connected == 1, NULL); + fail_unless(num_engine_read == 1, NULL); + fail_unless(num_engine_wrote == 1, NULL); + fail_unless(num_engine_disconnected == 1, NULL); + fail_unless(num_engine_errors == 0, NULL); + fail_unless(num_engine_successfull == 1, NULL); + fail_unless(num_engine_prev_unclean == 0, NULL); + fail_unless(num_engine_end_conflicts == 1, NULL); + + + + sleep(2); + + system("rm -f data2/testdata"); + system("cp newdata data3/testdata"); + + system("cp newdata3 data1/testdata1"); + system("cp newdata4 data3/testdata1"); + + system("cp newdata data1/testdata2"); + system("cp newdata5 data3/testdata2"); + system("rm -f data2/testdata2"); + + synchronize_once(engine, NULL); + + fail_unless(num_read == 7, NULL); + fail_unless(num_conflicts == 3, NULL); + fail_unless(num_written == 12, NULL); + fail_unless(num_engine_end_conflicts == 1, NULL); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + maptable = mappingtable_load(group, 5, 0); + check_mapping(maptable, 1, -1, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 2, -1, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 3, -1, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 1, -1, 3, "testdata1", "mockformat", "data"); + check_mapping(maptable, 2, -1, 3, "testdata1", "mockformat", "data"); + check_mapping(maptable, 3, -1, 3, "testdata1", "mockformat", "data"); + check_mapping(maptable, 1, -1, 3, "testdata1-dupe", "mockformat", "data"); + check_mapping(maptable, 2, -1, 3, "testdata1-dupe", "mockformat", "data"); + check_mapping(maptable, 3, -1, 3, "testdata1-dupe", "mockformat", "data"); + check_mapping(maptable, 1, -1, 3, "testdata2", "mockformat", "data"); + check_mapping(maptable, 2, -1, 3, "testdata2", "mockformat", "data"); + check_mapping(maptable, 3, -1, 3, "testdata2", "mockformat", "data"); + check_mapping(maptable, 1, -1, 3, "testdata2-dupe", "mockformat", "data"); + check_mapping(maptable, 2, -1, 3, "testdata2-dupe", "mockformat", "data"); + check_mapping(maptable, 3, -1, 3, "testdata2-dupe", "mockformat", "data"); + mappingtable_close(maptable); + + table = hashtable_load(group, 1, 5); + check_hash(table, "testdata"); + check_hash(table, "testdata1"); + check_hash(table, "testdata2"); + check_hash(table, "testdata1-dupe"); + check_hash(table, "testdata2-dupe"); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 5); + check_hash(table, "testdata"); + check_hash(table, "testdata1"); + check_hash(table, "testdata2"); + check_hash(table, "testdata1-dupe"); + check_hash(table, "testdata2-dupe"); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 5); + check_hash(table, "testdata"); + check_hash(table, "testdata1"); + check_hash(table, "testdata2"); + check_hash(table, "testdata1-dupe"); + check_hash(table, "testdata2-dupe"); + osync_hashtable_close(table); + + system("rm -f data1/*"); + + mark_point(); + num_conflicts = 0; + synchronize_once(engine, NULL); + osengine_finalize(engine); + + maptable = mappingtable_load(group, 0, 0); + mappingtable_close(maptable); + + table = hashtable_load(group, 1, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 0); + osync_hashtable_close(table); + + fail_unless(!system("test \"x$(ls data1)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data3)\" = \"x\""), NULL); + + destroy_testbed(testbed); +} +END_TEST + +START_TEST (multisync_delayed_conflict_handler) +{ + char *testbed = setup_testbed("multisync_easy_new"); + + OSyncEnv *osync = init_env(); + OSyncGroup *group = osync_group_load(osync, "configs/group", NULL); + + OSyncEngine *engine = init_engine(group); + osengine_set_conflict_callback(engine, conflict_handler_delay, GINT_TO_POINTER(3)); + + system("cp newdata data3/testdata1"); + system("cp newdata1 data2/testdata2"); + + synchronize_once(engine, NULL); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + OSyncMappingTable *maptable = mappingtable_load(group, 3, 0); + check_mapping(maptable, 1, -1, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 2, -1, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 3, -1, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 1, -1, 3, "testdata1", "mockformat", "data"); + check_mapping(maptable, 2, -1, 3, "testdata1", "mockformat", "data"); + check_mapping(maptable, 3, -1, 3, "testdata1", "mockformat", "data"); + check_mapping(maptable, 1, -1, 3, "testdata2", "mockformat", "data"); + check_mapping(maptable, 2, -1, 3, "testdata2", "mockformat", "data"); + check_mapping(maptable, 3, -1, 3, "testdata2", "mockformat", "data"); + mappingtable_close(maptable); + + OSyncHashTable *table = hashtable_load(group, 1, 3); + check_hash(table, "testdata"); + check_hash(table, "testdata1"); + check_hash(table, "testdata2"); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 3); + check_hash(table, "testdata"); + check_hash(table, "testdata1"); + check_hash(table, "testdata2"); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 3); + check_hash(table, "testdata"); + check_hash(table, "testdata1"); + check_hash(table, "testdata2"); + osync_hashtable_close(table); + + fail_unless(num_engine_connected == 1, NULL); + fail_unless(num_engine_read == 1, NULL); + fail_unless(num_engine_wrote == 1, NULL); + fail_unless(num_engine_disconnected == 1, NULL); + fail_unless(num_read == 3, NULL); + fail_unless(num_conflicts == 0, NULL); + fail_unless(num_written == 6, NULL); + fail_unless(num_engine_end_conflicts == 1, NULL); + + sleep(2); + + system("rm -f data2/testdata"); + system("cp newdata data3/testdata"); + + system("cp newdata3 data1/testdata1"); + system("rm -f data2/testdata1"); + + system("cp newdata data1/testdata2"); + system("rm -f data3/testdata2"); + system("rm -f data2/testdata2"); + + synchronize_once(engine, NULL); + + fail_unless(num_read == 7, NULL); + fail_unless(num_conflicts == 3, NULL); + fail_unless(num_written == 6, NULL); + fail_unless(num_engine_end_conflicts == 1, NULL); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + maptable = mappingtable_load(group, 3, 0); + check_mapping(maptable, 1, -1, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 2, -1, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 3, -1, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 1, -1, 3, "testdata1", "mockformat", "data"); + check_mapping(maptable, 2, -1, 3, "testdata1", "mockformat", "data"); + check_mapping(maptable, 3, -1, 3, "testdata1", "mockformat", "data"); + check_mapping(maptable, 1, -1, 3, "testdata2", "mockformat", "data"); + check_mapping(maptable, 2, -1, 3, "testdata2", "mockformat", "data"); + check_mapping(maptable, 3, -1, 3, "testdata2", "mockformat", "data"); + mappingtable_close(maptable); + + table = hashtable_load(group, 1, 3); + check_hash(table, "testdata"); + check_hash(table, "testdata1"); + check_hash(table, "testdata2"); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 3); + check_hash(table, "testdata"); + check_hash(table, "testdata1"); + check_hash(table, "testdata2"); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 3); + check_hash(table, "testdata"); + check_hash(table, "testdata1"); + check_hash(table, "testdata2"); + osync_hashtable_close(table); + + system("rm -f data1/*"); + + mark_point(); + num_conflicts = 0; + synchronize_once(engine, NULL); + osengine_finalize(engine); + + maptable = mappingtable_load(group, 0, 0); + mappingtable_close(maptable); + + table = hashtable_load(group, 1, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 0); + osync_hashtable_close(table); + + fail_unless(!system("test \"x$(ls data1)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data3)\" = \"x\""), NULL); + + destroy_testbed(testbed); +} +END_TEST + +START_TEST (multisync_delayed_slow) +{ + char *testbed = setup_testbed("multisync_easy_new"); + + OSyncEnv *osync = init_env(); + OSyncGroup *group = osync_group_load(osync, "configs/group", NULL); + + OSyncEngine *engine = init_engine(group); + osengine_set_conflict_callback(engine, conflict_handler_delay, GINT_TO_POINTER(3)); + + system("cp newdata data3/testdata1"); + setenv("SLOW_REPORT", "2", TRUE); + + synchronize_once(engine, NULL); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + OSyncMappingTable *maptable = mappingtable_load(group, 2, 0); + check_mapping(maptable, 1, -1, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 2, -1, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 3, -1, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 1, -1, 3, "testdata1", "mockformat", "data"); + check_mapping(maptable, 2, -1, 3, "testdata1", "mockformat", "data"); + check_mapping(maptable, 3, -1, 3, "testdata1", "mockformat", "data"); + mappingtable_close(maptable); + + OSyncHashTable *table = hashtable_load(group, 1, 2); + check_hash(table, "testdata"); + check_hash(table, "testdata1"); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 2); + check_hash(table, "testdata"); + check_hash(table, "testdata1"); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 2); + check_hash(table, "testdata"); + check_hash(table, "testdata1"); + osync_hashtable_close(table); + + fail_unless(num_read == 2, NULL); + fail_unless(num_conflicts == 0, NULL); + fail_unless(num_written == 4, NULL); + fail_unless(num_engine_end_conflicts == 1, NULL); + + sleep(2); + + system("cp newdata data3/testdata"); + + system("cp newdata3 data1/testdata1"); + system("rm -f data2/testdata1"); + + synchronize_once(engine, NULL); + + fail_unless(num_engine_connected == 1, NULL); + fail_unless(num_engine_read == 1, NULL); + fail_unless(num_engine_wrote == 1, NULL); + fail_unless(num_engine_disconnected == 1, NULL); + fail_unless(num_read == 3, NULL); + fail_unless(num_conflicts == 1, NULL); + fail_unless(num_written == 4, NULL); + fail_unless(num_engine_end_conflicts == 1, NULL); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + maptable = mappingtable_load(group, 2, 0); + check_mapping(maptable, 1, -1, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 2, -1, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 3, -1, 3, "testdata", "mockformat", "data"); + check_mapping(maptable, 1, -1, 3, "testdata1", "mockformat", "data"); + check_mapping(maptable, 2, -1, 3, "testdata1", "mockformat", "data"); + check_mapping(maptable, 3, -1, 3, "testdata1", "mockformat", "data"); + mappingtable_close(maptable); + + table = hashtable_load(group, 1, 2); + check_hash(table, "testdata"); + check_hash(table, "testdata1"); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 2); + check_hash(table, "testdata"); + check_hash(table, "testdata1"); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 2); + check_hash(table, "testdata"); + check_hash(table, "testdata1"); + osync_hashtable_close(table); + + system("rm -f data1/*"); + + mark_point(); + num_conflicts = 0; + synchronize_once(engine, NULL); + osengine_finalize(engine); + + maptable = mappingtable_load(group, 0, 0); + mappingtable_close(maptable); + + table = hashtable_load(group, 1, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 0); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 0); + osync_hashtable_close(table); + + fail_unless(!system("test \"x$(ls data1)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(ls data3)\" = \"x\""), NULL); + + unsetenv("SLOW_REPORT"); + + destroy_testbed(testbed); +} +END_TEST + +Suite *multisync_suite(void) +{ + Suite *s = suite_create("Multisync"); + //Suite *s2 = suite_create("Multisync"); + create_case(s, "multisync_easy_new", multisync_easy_new); + create_case(s, "multisync_dual_new", multisync_dual_new); + create_case(s, "multisync_triple_new", multisync_triple_new); + create_case(s, "multisync_easy_mod", multisync_easy_mod); + create_case(s, "multisync_dual_mod", multisync_dual_mod); + create_case(s, "multisync_triple_mod", multisync_triple_mod); + create_case(s, "multisync_easy_del", multisync_easy_del); + create_case(s, "multisync_dual_del", multisync_dual_del); + create_case(s, "multisync_triple_del", multisync_triple_del); + + create_case(s, "multisync_conflict_data_choose", multisync_conflict_data_choose); + create_case(s, "multisync_conflict_data_choose2", multisync_conflict_data_choose2); + create_case(s, "multisync_conflict_changetype_choose", multisync_conflict_changetype_choose); + create_case(s, "multisync_conflict_changetype_choose2", multisync_conflict_changetype_choose2); + create_case(s, "multisync_conflict_hybrid_choose", multisync_conflict_hybrid_choose); + create_case(s, "multisync_conflict_hybrid_choose2", multisync_conflict_hybrid_choose2); + create_case(s, "multisync_conflict_data_duplicate", multisync_conflict_data_duplicate); + create_case(s, "multisync_conflict_data_duplicate2", multisync_conflict_data_duplicate2); + create_case(s, "multisync_conflict_changetype_duplicate", multisync_conflict_changetype_duplicate); + create_case(s, "multisync_conflict_changetype_duplicate2", multisync_conflict_changetype_duplicate2); + create_case(s, "multisync_conflict_hybrid_duplicate", multisync_conflict_hybrid_duplicate); + create_case(s, "multisync_multi_conflict", multisync_multi_conflict); + + create_case(s, "multisync_delayed_conflict_handler", multisync_delayed_conflict_handler); + create_case(s, "multisync_delayed_slow", multisync_delayed_slow); + + return s; +} + +int main(void) +{ + int nf; + + Suite *s = multisync_suite(); + + SRunner *sr; + sr = srunner_create(s); + +// srunner_set_fork_status (sr, CK_NOFORK); + srunner_run_all(sr, CK_NORMAL); + nf = srunner_ntests_failed(sr); + srunner_free(sr); + return (nf == 0) ? EXIT_SUCCESS : EXIT_FAILURE; +} |