|
From: <svn...@op...> - 2010-01-10 17:34:42
|
Author: dgollub Date: Sun Jan 10 18:34:33 2010 New Revision: 5992 URL: http://www.opensync.org/changeset/5992 Log: Introduce testcase to verify correct slow-sync once the hashtable gets deleted. fixes #960 Modified: trunk/tests/CMakeLists.txt trunk/tests/sync-tests/check_sync.c Modified: trunk/tests/CMakeLists.txt ============================================================================== --- trunk/tests/CMakeLists.txt Sun Jan 10 18:34:06 2010 (r5991) +++ trunk/tests/CMakeLists.txt Sun Jan 10 18:34:33 2010 (r5992) @@ -332,6 +332,7 @@ OSYNC_TESTCASE( sync sync_slowsync_connect) OSYNC_TESTCASE( sync sync_slowsync_mainsink_connect) OSYNC_TESTCASE( sync sync_initial_slow_sync) +OSYNC_TESTCASE( sync sync_hashtable_deleted_slowsync) BUILD_CHECK_TEST( sync-error sync-tests/check_sync_error.c ${TEST_TARGET_LIBRARIES} ) OSYNC_TESTCASE(sync-error sync_error_single_init_error_noerror) Modified: trunk/tests/sync-tests/check_sync.c ============================================================================== --- trunk/tests/sync-tests/check_sync.c Sun Jan 10 18:34:06 2010 (r5991) +++ trunk/tests/sync-tests/check_sync.c Sun Jan 10 18:34:33 2010 (r5992) @@ -3367,6 +3367,152 @@ END_TEST +/* Test if slow-sync get triggerd if a new hashtable got created + * this can be due that the hashtable got deleted. + * Or hashtable got malformed? (TODO: validate that ..) + * + * See #960 + */ +START_TEST (sync_hashtable_deleted_slowsync) +{ + char *testbed = setup_testbed("sync"); + char *formatdir = g_strdup_printf("%s/formats", testbed); + char *plugindir = g_strdup_printf("%s/plugins", testbed); + + osync_testing_system_abort("cp testdata data1/testdata"); + + OSyncError *error = NULL; + OSyncGroup *group = osync_group_new(&error); + fail_unless(group != NULL, NULL); + fail_unless(error == NULL, NULL); + + osync_group_set_schemadir(group, testbed); + fail_unless(osync_group_load(group, "configs/group", &error), NULL); + fail_unless(error == NULL, NULL); + + OSyncEngine *engine = osync_engine_new(group, &error); + fail_unless(engine != NULL, NULL); + fail_unless(error == NULL, NULL); + + osync_engine_set_schemadir(engine, testbed); + osync_engine_set_plugindir(engine, plugindir); + osync_engine_set_formatdir(engine, formatdir); + + osync_engine_set_conflict_callback(engine, conflict_handler_choose_first, GINT_TO_POINTER(1)); + osync_engine_set_changestatus_callback(engine, entry_status, GINT_TO_POINTER(1)); + osync_engine_set_mappingstatus_callback(engine, mapping_status, GINT_TO_POINTER(1)); + osync_engine_set_enginestatus_callback(engine, engine_status, GINT_TO_POINTER(1)); + osync_engine_set_memberstatus_callback(engine, member_status, GINT_TO_POINTER(1)); + + + fail_unless(osync_engine_initialize(engine, &error), NULL); + fail_unless(error == NULL, NULL); + + fail_unless(osync_engine_synchronize_and_block(engine, &error), NULL); + fail_unless(error == NULL, NULL); + + fail_unless(osync_engine_finalize(engine, &error), NULL); + fail_unless(error == NULL, NULL); + + osync_engine_unref(engine); + + /* NOW we manipulate the group and delete the hashtable of one member. */ + + osync_testing_system_abort("rm configs/group/1/hashtable.db"); + + /*** end of hashtable manipulation ***/ + + engine = osync_engine_new(group, &error); + fail_unless(engine != NULL, NULL); + fail_unless(error == NULL, NULL); + osync_group_unref(group); + + osync_engine_set_schemadir(engine, testbed); + osync_engine_set_plugindir(engine, plugindir); + osync_engine_set_formatdir(engine, formatdir); + + osync_engine_set_conflict_callback(engine, conflict_handler_choose_first, GINT_TO_POINTER(1)); + osync_engine_set_changestatus_callback(engine, entry_status, GINT_TO_POINTER(1)); + osync_engine_set_mappingstatus_callback(engine, mapping_status, GINT_TO_POINTER(1)); + osync_engine_set_enginestatus_callback(engine, engine_status, GINT_TO_POINTER(1)); + osync_engine_set_memberstatus_callback(engine, member_status, GINT_TO_POINTER(1)); + + + fail_unless(osync_engine_initialize(engine, &error), NULL); + fail_unless(error == NULL, NULL); + + fail_unless(synchronize_once(engine, &error), NULL); + fail_unless(error == NULL, NULL); + + fail_unless(osync_engine_finalize(engine, &error), NULL); + fail_unless(error == NULL, NULL); + + /* Change checks */ + fail_unless(num_change_written == 0, NULL); + fail_unless(num_change_error == 0, NULL); + + /* BOOoom! If hashtable-deleted slow-sync implementation is missing */ + fail_unless(num_change_read == 2, NULL); + + /* Client checks */ + fail_unless(num_client_connected == 2, NULL); + fail_unless(num_client_main_connected == 2, NULL); + fail_unless(num_client_read == 2, NULL); + fail_unless(num_client_main_read == 2, NULL); + fail_unless(num_client_written == 2, NULL); + fail_unless(num_client_main_written == 2, NULL); + fail_unless(num_client_disconnected == 2, NULL); + fail_unless(num_client_main_disconnected == 2, NULL); + fail_unless(num_client_errors == 0, NULL); + fail_unless(num_client_sync_done == 2, NULL); + fail_unless(num_client_main_sync_done == 2, NULL); + + /* Client checks */ + fail_unless(num_engine_connected == 1, NULL); + fail_unless(num_engine_errors == 0, NULL); + fail_unless(num_engine_read == 1, NULL); + fail_unless(num_engine_written == 1, NULL); + fail_unless(num_engine_sync_done == 1, NULL); + fail_unless(num_engine_disconnected == 1, NULL); + fail_unless(num_engine_successful == 1, NULL); + fail_unless(num_engine_end_conflicts == 1, NULL); + fail_unless(num_engine_prev_unclean == 0, NULL); + + /* Mapping checks */ + fail_unless(num_mapping_solved == 1, NULL); + //fail_unless(num_mapping_written == 1, NULL); + fail_unless(num_mapping_errors == 0, NULL); + fail_unless(num_mapping_conflicts == 0, NULL); + + fail_unless(osync_testing_diff("data1", "data2")); + + char *path = g_strdup_printf("%s/configs/group/archive.db", testbed); + OSyncMappingTable *maptable = mappingtable_load(path, "mockobjtype1", 1); + g_free(path); + check_mapping(maptable, 1, 1, 2, "testdata"); + check_mapping(maptable, 2, 1, 2, "testdata"); + osync_mapping_table_close(maptable); + osync_mapping_table_unref(maptable); + + path = g_strdup_printf("%s/configs/group/1/hashtable.db", testbed); + OSyncHashTable *table = hashtable_load(path, "mockobjtype1", 1); + g_free(path); + check_hash(table, "testdata"); + osync_hashtable_unref(table); + + path = g_strdup_printf("%s/configs/group/2/hashtable.db", testbed); + table = hashtable_load(path, "mockobjtype1", 1); + g_free(path); + check_hash(table, "testdata"); + osync_hashtable_unref(table); + + g_free(formatdir); + g_free(plugindir); + + destroy_testbed(testbed); +} +END_TEST + /* Testing mixed-objtype syncing (#992) * */ @@ -3498,6 +3644,7 @@ OSYNC_TESTCASE_ADD(sync_slowsync_connect) OSYNC_TESTCASE_ADD(sync_slowsync_mainsink_connect) OSYNC_TESTCASE_ADD(sync_initial_slow_sync) +OSYNC_TESTCASE_ADD(sync_hashtable_deleted_slowsync) OSYNC_TESTCASE_ADD(sync_mixed_objtype) /* TODO: stateless sync */ OSYNC_TESTCASE_END |