From: <svn...@op...> - 2010-01-11 15:28:23
|
Author: dgollub Date: Mon Jan 11 16:28:13 2010 New Revision: 6002 URL: http://www.opensync.org/changeset/6002 Log: Make multisync_conflict_hybrid_choose more reliable by switching to a new conflict handler. Instead of taking the "first" modified entry we choose the modified entry of member 2. For this a new conflict resolution function got introduced in the testsuite. The memberid get passed via userdata pointer. The order of the mapping_engine list seems to be not sorted by memberid. TODO: How is this list of changes sorted? fixes #1124 Modified: trunk/tests/support.c trunk/tests/support.h trunk/tests/sync-tests/check_multisync.c Modified: trunk/tests/support.c ============================================================================== --- trunk/tests/support.c Sun Jan 10 20:11:36 2010 (r6001) +++ trunk/tests/support.c Mon Jan 11 16:28:13 2010 (r6002) @@ -524,6 +524,24 @@ } } + +void conflict_handler_choose_member(OSyncEngine *engine, OSyncMappingEngine *mapping, void *user_data) +{ + OSyncChange *change = NULL; + OSyncError *error = NULL; + + osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, engine, mapping, user_data); + + num_mapping_conflicts++; + fail_unless(num_engine_end_conflicts == 0, NULL); + + change = osync_mapping_engine_member_change(mapping, GPOINTER_TO_UINT(user_data)); + osync_assert(osync_engine_mapping_solve(engine, mapping, change, &error)); + osync_assert(error == NULL); + + osync_trace(TRACE_EXIT, "%s", __func__); +} + void conflict_handler_choose_first(OSyncEngine *engine, OSyncMappingEngine *mapping, void *user_data) { OSyncChange *change = NULL; Modified: trunk/tests/support.h ============================================================================== --- trunk/tests/support.h Sun Jan 10 20:11:36 2010 (r6001) +++ trunk/tests/support.h Mon Jan 11 16:28:13 2010 (r6002) @@ -123,6 +123,7 @@ void mapping_status(OSyncEngineMappingUpdate *status, void *user_data); /* Conflict handlers */ +void conflict_handler_choose_member(OSyncEngine *engine, OSyncMappingEngine *mapping, void *user_data); void conflict_handler_choose_first(OSyncEngine *engine, OSyncMappingEngine *mapping, void *user_data); void conflict_handler_choose_deleted(OSyncEngine *engine, OSyncMappingEngine *mapping, void *user_data); void conflict_handler_choose_modified(OSyncEngine *engine, OSyncMappingEngine *mapping, void *user_data); Modified: trunk/tests/sync-tests/check_multisync.c ============================================================================== --- trunk/tests/sync-tests/check_multisync.c Sun Jan 10 20:11:36 2010 (r6001) +++ trunk/tests/sync-tests/check_multisync.c Mon Jan 11 16:28:13 2010 (r6002) @@ -1037,15 +1037,15 @@ /* Sync from data1/testdata to all * remove data1 and change data2 to newdata2 and data3 to newdata - * conflict_handler_choose_modified picks the first modified so should get newdata2 - * everywhere. + * conflict_handler_choose_member chooses the change of member2 (which owns data2/ directory). + * So newdata2 should get synced everywhere. */ START_TEST (multisync_conflict_hybrid_choose) { char *testbed = setup_testbed("multisync_conflict_changetype_choose"); OSyncError *error = NULL; OSyncEngine *engine = setup_engine(testbed); - osync_engine_set_conflict_callback(engine, conflict_handler_choose_modified, GINT_TO_POINTER(3)); + osync_engine_set_conflict_callback(engine, conflict_handler_choose_member, GINT_TO_POINTER(2)); fail_unless(osync_engine_initialize(engine, &error), NULL); fail_unless(error == NULL, NULL); |