END_TEST START_TEST (archive_save_data) { char *testbed = setup_testbed("merger"); OSyncError *error = NULL; OSyncArchive *archive = osync_archive_new("archive.db", &error); fail_unless(archive != NULL, NULL); fail_unless(error == NULL, NULL); OSyncList *ids; OSyncList *uids; OSyncList *mappingids; OSyncList *memberids; osync_archive_load_changes(archive, "contact", &ids, &uids, &mappingids, &memberids, &error); long long int id = osync_archive_save_change(archive, 0, "uid", "contact", 1, 1, &error); fail_unless(id != 0, NULL); fail_unless(error == NULL, NULL); const char *testdata = "testdata"; unsigned int testsize = strlen(testdata); fail_unless(osync_archive_save_data(archive, 1, "contact", testdata, testsize, &error) == TRUE, NULL); fail_unless(error == NULL, NULL); osync_archive_unref(archive); destroy_testbed(testbed); }
END_TEST START_TEST (archive_save_change) { char *testbed = setup_testbed("merger"); OSyncError *error = NULL; OSyncArchive *archive = osync_archive_new("archive.db", &error); fail_unless(archive != NULL, NULL); fail_unless(error == NULL, NULL); OSyncList *ids; OSyncList *uids; OSyncList *mappingids; OSyncList *memberids; osync_archive_load_changes(archive, "contact", &ids, &uids, &mappingids, &memberids, &error); long long int id = osync_archive_save_change(archive, 0, "uid", "contact", 1, 1, &error); fail_unless(id != 0, NULL); fail_unless(error == NULL, NULL); osync_archive_unref(archive); destroy_testbed(testbed); }
END_TEST START_TEST (module_function_false) { char *testbed = setup_testbed(NULL); OSyncError *error = NULL; OSyncModule *module = osync_module_new(&error); fail_unless(module != NULL, NULL); fail_unless(error == NULL, NULL); char *curdir = g_get_current_dir(); char *path = g_strdup_printf("%s/formats/mock-format.%s", curdir, G_MODULE_SUFFIX); fail_unless(osync_module_load(module, path, &error), NULL); fail_unless(error == NULL, NULL); g_free(path); g_free(curdir); void *func = osync_module_get_function(module, "get_version1", &error); fail_unless(func == NULL, NULL); fail_unless(error != NULL, NULL); osync_error_unref(&error); osync_module_unload(module); osync_module_unref(module); destroy_testbed(testbed); }
END_TEST START_TEST (filter_sync_custom) { char *testbed = setup_testbed("filter_sync_custom"); char *formatdir = g_strdup_printf("%s/formats", testbed); char *plugindir = g_strdup_printf("%s/plugins", testbed); 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); osync_group_load(group, "configs/group", &error); fail_unless(error == NULL, osync_error_print(&error)); fail_unless(group != NULL, NULL); mark_point(); OSyncCustomFilter *custom_filter = osync_custom_filter_new("mockobjtype1", "mockformat1", "mockformat1_custom_filter", dummy_filter_hook, &error); fail_unless(custom_filter != NULL, NULL); OSyncFilter *filter = osync_filter_new_custom(custom_filter, NULL, OSYNC_FILTER_DENY, &error); fail_unless(filter != NULL, NULL); osync_group_add_filter(group, filter); osync_filter_set_config(filter, "test"); mark_point(); OSyncEngine *engine = osync_engine_new(group, &error); mark_point(); fail_unless(engine != NULL, NULL); osync_engine_set_plugindir(engine, plugindir); osync_engine_set_formatdir(engine, formatdir); osync_engine_set_schemadir(engine, testbed); fail_unless(osync_engine_initialize(engine, &error), NULL); synchronize_once(engine, NULL); osync_engine_finalize(engine, &error); fail_unless(osync_testing_diff("data1", "data2"), NULL); g_free(formatdir); g_free(plugindir); destroy_testbed(testbed); }
END_TEST #endif /* FIXME */ START_TEST(filter_destobjtype_delete) { /* Check if the destobjtype of the changes is being * set when the change type os DELETE */ char *testbed = setup_testbed("destobjtype_delete"); char *formatdir = g_strdup_printf("%s/formats", testbed); char *plugindir = g_strdup_printf("%s/plugins", testbed); 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); osync_group_load(group, "configs/group", &error); fail_unless(error == NULL, osync_error_print(&error)); fail_unless(group != NULL, NULL); mark_point(); mark_point(); OSyncEngine *engine = osync_engine_new(group, &error); mark_point(); fail_unless(engine != NULL, NULL); osync_engine_set_plugindir(engine, plugindir); osync_engine_set_formatdir(engine, formatdir); osync_engine_set_schemadir(engine, testbed); fail_unless(osync_engine_initialize(engine, &error), NULL); synchronize_once(engine, NULL); mark_point(); /* Synchronize once, delete a file, and synchronize again */ fail_unless(!osync_testing_file_remove("data1/file"), NULL); synchronize_once(engine, NULL); mark_point(); osync_engine_finalize(engine, &error); g_free(formatdir); g_free(plugindir); destroy_testbed(testbed); }
END_TEST START_TEST (mapping_compare) { char *testbed = setup_testbed(NULL); char *formatdir = g_strdup_printf("%s/formats", testbed); OSyncError *error = NULL; OSyncFormatEnv *formatenv = osync_format_env_new(&error); fail_unless(formatenv != NULL, NULL); fail_unless(error == NULL, NULL); fail_unless(osync_format_env_load_plugins(formatenv, formatdir, &error), NULL); fail_unless(error == NULL, NULL); OSyncObjFormat *format = osync_format_env_find_objformat(formatenv, "mockformat1"); fail_unless(format != NULL, NULL); /*OSyncChange *change = osync_change_new(&error); fail_unless(change != NULL, NULL); fail_unless(error == NULL, NULL); osync_change_set_uid(change, "uid");*/ OSyncData *data1 = osync_data_new("test", 5, format, &error); fail_unless(data1 != NULL, NULL); fail_unless(error == NULL, NULL); OSyncMapping *mapping = osync_mapping_new(&error); fail_unless(mapping != NULL, NULL); fail_unless(error == NULL, NULL); OSyncMappingEntry *entry = osync_mapping_entry_new(&error); fail_unless(entry != NULL, NULL); fail_unless(error == NULL, NULL); //osync_mapping_entry_update(entry, change); osync_format_env_free(formatenv); g_free(formatdir); destroy_testbed(testbed); }
END_TEST START_TEST (version_load_from_descriptions) { char *testbed = setup_testbed(NULL); OSyncError *error = NULL; OSyncList *versions = osync_version_load_from_descriptions(&error, testbed, testbed); //fail_unless(versions != NULL, NULL); fail_unless(error == NULL, NULL); OSyncList *cur = osync_list_first(versions); while(cur) { osync_version_unref(cur->data); cur = cur->next; } osync_list_free(versions); destroy_testbed(testbed); }
END_TEST START_TEST (version_matches) { char *testbed = setup_testbed(NULL); OSyncError *error = NULL; OSyncVersion *version = osync_version_new(&error); fail_unless(version != NULL, NULL); fail_unless(error == NULL, NULL); osync_version_set_plugin(version, "SyncML"); osync_version_set_vendor(version, "Nokia"); osync_version_set_modelversion(version, "7650"); osync_version_set_firmwareversion(version, "*"); osync_version_set_softwareversion(version, "*"); osync_version_set_hardwareversion(version, "*"); OSyncVersion *pattern = osync_version_new(&error); fail_unless(pattern != NULL, NULL); fail_unless(error == NULL, NULL); osync_version_set_plugin(pattern, "Sync[A-Z]"); osync_version_set_priority(pattern, "100"); osync_version_set_vendor(pattern, "Nokia"); osync_version_set_modelversion(pattern, "[0-9]"); osync_version_set_firmwareversion(pattern, ""); osync_version_set_softwareversion(pattern, ""); osync_version_set_hardwareversion(pattern, ""); fail_unless(osync_version_matches(pattern, version, &error) > 0, NULL); fail_unless(error == NULL, NULL); osync_version_set_firmwareversion(pattern, "[0-9]"); fail_unless(osync_version_matches(pattern, version, &error) == 0, NULL); fail_unless(error == NULL, NULL); destroy_testbed(testbed); }
END_TEST START_TEST (module_load_false) { char *testbed = setup_testbed(NULL); OSyncError *error = NULL; OSyncModule *module = osync_module_new(&error); fail_unless(module != NULL, NULL); fail_unless(error == NULL, NULL); char *curdir = g_get_current_dir(); char *path = g_strdup_printf("%s/does-not-exist.%s", curdir, G_MODULE_SUFFIX); fail_unless(!osync_module_load(module, path, &error), NULL); fail_unless(error != NULL, NULL); g_free(path); g_free(curdir); osync_error_unref(&error); osync_module_unref(module); destroy_testbed(testbed); }
END_TEST /* filter flushing got dropped with OpenSync 0.30 API START_TEST (filter_flush) { char *testbed = setup_testbed("filter_setup"); OSyncError *error = NULL; OSyncGroup *group = osync_group_new(&error); fail_unless(group != NULL, NULL); fail_unless(error == NULL, NULL); osync_group_load(group, "configs/group", &error); fail_unless(error == NULL, osync_error_print(&error)); fail_unless(group != NULL, NULL); mark_point(); OSyncMember *leftmember = osync_group_nth_member(group, 0); OSyncMember *rightmember = osync_group_nth_member(group, 1); OSyncFilter *filter1 = osync_filter_new("mockobjtype1", OSYNC_FILTER_DENY, &error); OSyncFilter *filter2 = osync_filter_new("mockobjtype1", OSYNC_FILTER_DENY, &error); fail_unless(filter1 != NULL, NULL); fail_unless(filter2 != NULL, NULL); osync_group_add_filter(group, filter1); osync_group_add_filter(group, filter2); mark_point(); fail_unless(osync_group_num_filters(group) == 2, NULL); fail_unless(osync_group_nth_filter(group, 0) == filter1, NULL); fail_unless(osync_group_nth_filter(group, 1) == filter2, NULL); mark_point(); osync_group_flush_filters(group); fail_unless(osync_group_num_filters(group) == 0, NULL); destroy_testbed(testbed); } END_TEST */ START_TEST (filter_sync_deny_all) { char *testbed = setup_testbed("filter_sync_deny_all"); char *formatdir = g_strdup_printf("%s/formats", testbed); char *plugindir = g_strdup_printf("%s/plugins", testbed); 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); osync_group_load(group, "configs/group", &error); fail_unless(error == NULL, osync_error_print(&error)); fail_unless(group != NULL, NULL); mark_point(); OSyncFilter *filter1 = osync_filter_new("mockobjtype1", OSYNC_FILTER_DENY, &error); OSyncFilter *filter2 = osync_filter_new("mockobjtype1", OSYNC_FILTER_DENY, &error); fail_unless(filter1 != NULL, NULL); fail_unless(filter2 != NULL, NULL); osync_group_add_filter(group, filter1); osync_group_add_filter(group, filter2); mark_point(); OSyncEngine *engine = osync_engine_new(group, &error); mark_point(); fail_unless(engine != NULL, NULL); osync_engine_set_plugindir(engine, plugindir); osync_engine_set_formatdir(engine, formatdir); osync_engine_set_schemadir(engine, testbed); fail_unless(osync_engine_initialize(engine, &error), osync_error_print(&error)); synchronize_once(engine, &error); osync_engine_finalize(engine, &error); fail_unless(osync_testing_file_exists("data1/testdata"), NULL); fail_unless(osync_testing_file_exists("data2/testdata2"), NULL); g_free(formatdir); g_free(plugindir); destroy_testbed(testbed); }
END_TEST /* TODO: Test filtering of different objtypes within one resource/database/path. Mixed objtypes in mock-sync (based on file-sync) currenlty not supported. Reimplement this when: data(wildcard objtype) <-> certain-objtype syncing is working again. Make this implementation independet of vformat plugin (feel free to rename vcard to mockobjtypeX). This filtering isn't about obfjromat filtering - it's about objtype filtering. */ /* FIXME */ #if 0 START_TEST (filter_sync_vcard_only) { char *testbed = setup_testbed("filter_sync_vcard_only"); char *formatdir = g_strdup_printf("%s/formats", testbed); char *plugindir = g_strdup_printf("%s/plugins", testbed); OSyncError *error = NULL; OSyncGroup *group = osync_group_new(&error); fail_unless(group != NULL, NULL); fail_unless(error == NULL, NULL); osync_group_load(group, "configs/group", &error); fail_unless(error == NULL, osync_error_print(&error)); fail_unless(group != NULL, NULL); mark_point(); /* TODO filtering isn't member sepcific anymore OSyncMember *rightmember = osync_group_nth_member(group, 1); osync_filter_add(group, NULL, rightmember, NULL, NULL, NULL, OSYNC_FILTER_DENY); osync_filter_add(group, NULL, rightmember, NULL, NULL, "contact", OSYNC_FILTER_ALLOW); */ OSyncFilter *filter1 = osync_filter_new("mockobjtype1", OSYNC_FILTER_DENY, &error); OSyncFilter *filter2 = osync_filter_new("mockobjtype1", OSYNC_FILTER_ALLOW, &error); fail_unless(filter1 != NULL, NULL); fail_unless(filter2 != NULL, NULL); osync_group_add_filter(group, filter1); osync_group_add_filter(group, filter2); mark_point(); OSyncEngine *engine = osync_engine_new(group, &error); mark_point(); fail_unless(engine != NULL, NULL); osync_engine_set_plugindir(engine, plugindir); osync_engine_set_formatdir(engine, formatdir); osync_engine_set_schemadir(engine, testbed); fail_unless(osync_engine_initialize(engine, &error), NULL); synchronize_once(engine, NULL); osync_engine_finalize(engine, &error); osync_engine_unref(engine); fail_unless(osync_testing_file_exists("data1/testdata"), NULL); fail_unless(osync_testing_file_exists("data1/testdata2"), NULL); fail_unless(osync_testing_file_exists("data1/testdata3"), NULL); fail_unless(osync_testing_file_exists("data1/vcard.vcf"), NULL); fail_unless(osync_testing_file_exists("data2/testdata3"), NULL); fail_unless(osync_testing_file_exists("data2/vcard.vcf"), NULL); g_free(formatdir); g_free(plugindir); destroy_testbed(testbed); }
END_TEST START_TEST (filter_save_and_load) { char *testbed = setup_testbed("filter_save_and_load"); 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); osync_group_load(group, "configs/group", &error); fail_unless(error == NULL, osync_error_print(&error)); fail_unless(group != NULL, NULL); mark_point(); /* TODO filter member handling OSyncMember *leftmember = osync_group_nth_member(group, 0); OSyncMember *rightmember = osync_group_nth_member(group, 1); */ OSyncCustomFilter *custom_filter = osync_custom_filter_new("mockobjtype3", "mockformat3", "mockformat1_custom_filter", dummy_filter_hook, &error); fail_unless(custom_filter != NULL, NULL); OSyncFilter *filter1 = osync_filter_new("mockobjtype1", OSYNC_FILTER_DENY, &error); OSyncFilter *filter2 = osync_filter_new("mockobjtype2", OSYNC_FILTER_ALLOW, &error); OSyncFilter *filter3 = osync_filter_new_custom(custom_filter, "test", OSYNC_FILTER_IGNORE, &error); fail_unless(filter1 != NULL, NULL); fail_unless(filter2 != NULL, NULL); fail_unless(filter3 != NULL, NULL); osync_group_add_filter(group, filter1); osync_group_add_filter(group, filter2); osync_group_add_filter(group, filter3); fail_unless(osync_group_num_filters(group) == 3, NULL); fail_unless(osync_group_nth_filter(group, 0) == filter1, NULL); fail_unless(osync_group_nth_filter(group, 1) == filter2, NULL); fail_unless(osync_group_nth_filter(group, 2) == filter3, NULL); mark_point(); osync_group_save(group, NULL); mark_point(); osync_group_load(group, "configs/group", NULL); fail_unless(group != NULL, NULL); mark_point(); fail_unless(osync_group_num_filters(group) == 3, NULL); filter1 = osync_group_nth_filter(group, 0); fail_unless(filter1 != NULL, NULL); /* filter aren't member specific anymore. */ //fail_unless(filter1->sourcememberid == 1, NULL); //fail_unless(filter1->destmemberid == 2, NULL); fail_unless(!strcmp(osync_filter_get_objtype(filter1), "mockobjtype1"), NULL); /* cross objtype syncing isn't supported anymore with 0.30 API */ //fail_unless(!strcmp(filter1->destobjtype, "2"), NULL); //fail_unless(!strcmp(filter1->detectobjtype, "3"), NULL); fail_unless(filter1->action == OSYNC_FILTER_DENY, NULL); filter1 = osync_group_nth_filter(group, 1); fail_unless(filter1 != NULL, NULL); /* filter aren't member specific anymore. */ //fail_unless(filter1->sourcememberid == 2, NULL); //fail_unless(filter1->destmemberid == 1, NULL); /* cross objtype syncing isn't supported anymore with 0.30 API */ fail_unless(!strcmp(osync_filter_get_objtype(filter1), "mockobjtype2"), NULL); /* cross objtype syncing isn't supported anymore with 0.30 API */ //fail_unless(!strcmp(filter1->destobjtype, "5"), NULL); //fail_unless(!strcmp(filter1->detectobjtype, "6"), NULL); fail_unless(filter1->action == OSYNC_FILTER_ALLOW, NULL); filter1 = osync_group_nth_filter(group, 2); fail_unless(filter1 != NULL, NULL); /* filter aren't member specific anymore. */ //fail_unless(filter1->sourcememberid == 1, NULL); //fail_unless(filter1->destmemberid == 2, NULL); /* cross objtype syncing isn't supported anymore with 0.30 API */ // FIXME - custom filter handling for objtype ///fail_unless(!strcmp(osync_filter_get_objtype(filter1), "mockobjtype3"), NULL); /* cross objtype syncing isn't supported anymore with 0.30 API */ //fail_unless(!strcmp(filter1->destobjtype, "8"), NULL); //fail_unless(!strcmp(filter1->detectobjtype, "9"), NULL); fail_unless(filter1->custom_filter != NULL, NULL); fail_unless(filter1->custom_filter->hook != NULL, NULL); fail_unless(!strcmp(osync_filter_get_config(filter1), "test"), NULL); osync_group_unref(group); destroy_testbed(testbed); }
END_TEST START_TEST (hashtable_reload) { OSyncError *error = NULL; char *testbed = setup_testbed(NULL); osync_bool new_hashtable = FALSE; reset_hashtable_counters(); char *hashpath = g_strdup_printf("%s%chashtable.db", testbed, G_DIR_SEPARATOR); OSyncHashTable *table = osync_hashtable_new(hashpath, "contact", &new_hashtable, &error); fail_unless(!error, NULL); fail_unless(table != NULL, NULL); fail_unless(new_hashtable != FALSE, NULL); /* Expecting a new/fresh hastable */ /***** load */ fail_unless(osync_hashtable_load(table, &error), NULL); OSyncChange *fakechange = osync_change_new(&error); osync_change_set_uid(fakechange, "test1"); char *rndhash = osync_rand_str(g_random_int_range(100, 200), &error); osync_assert(error == NULL); osync_change_set_hash(fakechange, rndhash); osync_change_set_changetype(fakechange, OSYNC_CHANGE_TYPE_ADDED); osync_hashtable_update_change(table, fakechange); osync_change_unref(fakechange); /*** store - commit hashtable */ fail_unless(osync_hashtable_save(table, &error), NULL); fail_unless(!error, NULL); osync_hashtable_unref(table); table = NULL; /** reload the hashtable */ OSyncHashTable *newtable = osync_hashtable_new(hashpath, "contact", &new_hashtable, &error); fail_unless(!error, NULL); fail_unless(newtable != NULL, NULL); fail_unless(new_hashtable != TRUE, NULL); /* We expect here no new hashtable */ /* 0 entries - since not loaded! */ fail_unless(osync_hashtable_num_entries(newtable) == 0, NULL); /* load and count and compare hashs */ fail_unless(osync_hashtable_load(newtable, &error), NULL); fail_unless(osync_hashtable_num_entries(newtable) == 1, NULL); const char *newhash = osync_hashtable_get_hash(newtable, "test1"); fail_unless(newhash != NULL, NULL); fail_unless(!strcmp(newhash, rndhash), NULL); g_free(rndhash); g_free(hashpath); destroy_testbed(testbed); }
char *setup_testbed(const char *fkt_name) { #ifndef _WIN32 setuid(65534); #endif char *testbed = g_strdup_printf("%s/testbed.XXXXXX", g_get_tmp_dir()); char *command = NULL, *dirname = NULL; #ifdef _WIN32 if(g_file_test(testbed, G_FILE_TEST_IS_DIR)) destroy_testbed(g_strdup(testbed)); if(g_mkdir(testbed,0777) < 0){ osync_trace(TRACE_INTERNAL, "%s: Cannot create testbed directory %s", __func__, testbed); abort(); } #else /* WIN32 */ if (!mkdtemp(testbed)) abort(); #endif /* WIN32 */ if (fkt_name) { dirname = g_strdup_printf(OPENSYNC_TESTDATA"/%s", fkt_name); if (!g_file_test(dirname, G_FILE_TEST_IS_DIR)) { osync_trace(TRACE_INTERNAL, "%s: Path %s not exist.", __func__, dirname); abort(); } command = g_strdup_printf("cp -R %s/* %s", dirname, testbed); if (osync_system(command)) abort(); g_free(command); /* special handling for the git repo, since git does not * support empty directories, check for a file named * "empty_dirs" and create every subdirectory listed * there that does not begin with a slash (relative dirs only) */ { char *empty_name = NULL; FILE *fh = NULL; empty_name = g_strdup_printf("%s/empty_dirs", dirname); if ((fh = fopen(empty_name, "r"))) { char line[100], *s; while ((s = fgets(line, sizeof(line), fh))) { int len = strlen(s); /* trim newline */ if (len && s[len-1] == '\n') s[len-1] = 0; /* only create relative paths */ if (len && s[0] != '/' && s[0] != '\\' && s[0] != '#') { char *newdir = g_strdup_printf("%s/%s", testbed, s); if (newdir) { g_mkdir_with_parents(newdir, 0755); g_free(newdir); } } } fclose(fh); } g_free(empty_name); } g_free(dirname); } dirname = g_strdup_printf("%s/formats", testbed); if (!g_file_test(dirname, G_FILE_TEST_IS_DIR)) { if (g_mkdir(dirname,0777) < 0) { osync_trace(TRACE_ERROR, "Could not create format direcotry %s", dirname); abort(); } } g_free(dirname); dirname = g_strdup_printf("%s/plugins", testbed); if (!g_file_test(dirname, G_FILE_TEST_IS_DIR)) { if (g_mkdir(dirname,0777) < 0) { osync_trace(TRACE_ERROR, "Could not create plugin direcotry %s", dirname); abort(); } } g_free(dirname); command = g_strdup_printf("cp ./mock-plugin/mock-sync.%s %s/plugins", G_MODULE_SUFFIX, testbed); if (osync_system(command)) abort(); g_free(command); command = g_strdup_printf("cp ./mock-plugin/mock-format.%s %s/formats", G_MODULE_SUFFIX, testbed); if (osync_system(command)) abort(); g_free(command); command = g_strdup_printf("cp -R %s/../../misc/schemas/*.xsd %s", OPENSYNC_TESTDATA, testbed); if (osync_system(command)) abort(); g_free(command); #ifndef _WIN32 /* chmod is useless on windows system */ command = g_strdup_printf("chmod -R 700 %s", testbed); if (osync_system(command)) abort(); g_free(command); #endif olddir = g_get_current_dir(); if (g_chdir(testbed) < 0){ osync_trace(TRACE_ERROR, "Could not chdir to testbed"); abort(); } reset_counters(); osync_trace(TRACE_INTERNAL, "Seting up %s at %s", fkt_name, testbed); /* printf("."); fflush(NULL);*/ reset_env(); return testbed; }