diff options
Diffstat (limited to 'debian/opensync/opensync-0.22/tests/mock-plugin/mock_sync.c')
-rw-r--r-- | debian/opensync/opensync-0.22/tests/mock-plugin/mock_sync.c | 559 |
1 files changed, 0 insertions, 559 deletions
diff --git a/debian/opensync/opensync-0.22/tests/mock-plugin/mock_sync.c b/debian/opensync/opensync-0.22/tests/mock-plugin/mock_sync.c deleted file mode 100644 index 63ec969e..00000000 --- a/debian/opensync/opensync-0.22/tests/mock-plugin/mock_sync.c +++ /dev/null @@ -1,559 +0,0 @@ -/* - * mock-sync - A mock-plugin for the opensync framework - * Copyright (C) 2004-2005 Armin Bauer <armin.bauer@opensync.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ - -#include "mock_sync.h" - -#define fail(x) abort() - -#define fail_unless(condition, msg) do { \ - if (!condition) fail(msg); \ - } while (0) - -int mock_custom_function(mock_env *env, int input, OSyncError **error) -{ - osync_trace(TRACE_ENTRY, "%s(%p, %i, %p)", __func__, env, input, error); - - fail_unless(input == 1, NULL); - - osync_trace(TRACE_EXIT, "%s", __func__); - return 2; -} - -/*Load the state from a xml file and return it in the conn struct*/ -static osync_bool mock_parse_settings(mock_env *env, char *data, int size, OSyncError **error) -{ - osync_trace(TRACE_ENTRY, "%s(%p, %p, %i)", __func__, env, data, size); - xmlDocPtr doc; - xmlNodePtr cur; - - //set defaults - env->path = NULL; - - doc = xmlParseMemory(data, size); - - if (!doc) { - osync_error_set(error, OSYNC_ERROR_GENERIC, "Unable to parse settings"); - osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error)); - return FALSE; - } - - cur = xmlDocGetRootElement(doc); - - if (!cur) { - xmlFreeDoc(doc); - osync_error_set(error, OSYNC_ERROR_GENERIC, "Unable to get root element of the settings"); - osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error)); - return FALSE; - } - - if (xmlStrcmp(cur->name, (xmlChar*)"config")) { - xmlFreeDoc(doc); - osync_error_set(error, OSYNC_ERROR_GENERIC, "Config valid is not valid"); - osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error)); - return FALSE; - } - - cur = cur->xmlChildrenNode; - - while (cur != NULL) { - char *str = (char*)xmlNodeGetContent(cur); - if (str) { - if (!xmlStrcmp(cur->name, (const xmlChar *)"path")) { - env->path = g_strdup(str); - } - xmlFree(str); - } - cur = cur->next; - } - - xmlFreeDoc(doc); - osync_trace(TRACE_EXIT, "%s", __func__); - return TRUE; -} - -static osync_bool mock_get_error(OSyncMember *member, const char *domain) -{ - const char *env = g_getenv(domain); - if (!env) - return FALSE; - - int num = atoi(env); - int mask = 1 << (osync_member_get_id(member) - 1); - if (num & mask) { - char *chancestr = g_strdup_printf("%s_PROB", domain); - const char *chance = g_getenv(chancestr); - g_free(chancestr); - if (!chance) - return TRUE; - int prob = atoi(chance); - if (prob >= g_random_int_range(0, 100)) - return TRUE; - } - return FALSE; -} - -static void *mock_initialize(OSyncMember *member, OSyncError **error) -{ - osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, member, error); - - if (mock_get_error(member, "INIT_NULL")) { - osync_error_set(error, OSYNC_ERROR_EXPECTED, "Triggering INIT_NULL error"); - osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error)); - return NULL; - } - char *configdata; - int configsize; - mock_env *env = g_malloc0(sizeof(mock_env)); - - if (!osync_member_get_config(member, &configdata, &configsize, error)) { - osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error)); - return NULL; - } - - if (!mock_parse_settings(env, configdata, configsize, error)) { - g_free(env); - return NULL; - } - - //Rewrite the batch commit functions so we can disable them if necessary - if (!mock_get_error(member, "BATCH_COMMIT")) { - OSyncObjFormatSink *fmtsink = member->format_sinks->data; - osync_trace(TRACE_INTERNAL, "Disabling batch_commit on %p:%s: %i", fmtsink, fmtsink->format ? fmtsink->format->name : "None", g_list_length(member->format_sinks)); - OSyncFormatFunctions *functions = &(fmtsink->functions); - functions->batch_commit = NULL; - } - - env->member = member; - env->hashtable = osync_hashtable_new(); - - osync_trace(TRACE_EXIT, "%s: %p", __func__, env); - return (void *)env; -} - -static void mock_connect(OSyncContext *ctx) -{ - osync_trace(TRACE_ENTRY, "%s(%p)", __func__, ctx); - mock_env *env = (mock_env *)osync_context_get_plugin_data(ctx); - - env->committed_all = TRUE; - - if (mock_get_error(env->member, "CONNECT_ERROR")) { - osync_context_report_error(ctx, OSYNC_ERROR_EXPECTED, "Triggering CONNECT_ERROR error"); - osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, "Triggering CONNECT_ERROR error"); - return; - } - - if (mock_get_error(env->member, "CONNECT_TIMEOUT")) { - osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, "Triggering CONNECT_TIMEOUT error"); - return; - } - - OSyncError *error = NULL; - if (!osync_hashtable_load(env->hashtable, env->member, &error)) { - osync_context_report_osyncerror(ctx, &error); - osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(&error)); - osync_error_free(&error); - return; - } - - if (!osync_anchor_compare(env->member, "path", env->path)) - osync_member_set_slow_sync(env->member, "data", TRUE); - - GError *direrror = NULL; - - env->dir = g_dir_open(env->path, 0, &direrror); - if (direrror) { - //Unable to open directory - osync_context_report_error(ctx, OSYNC_ERROR_FILE_NOT_FOUND, "Unable to open directory %s", env->path); - g_error_free (direrror); - } else { - osync_context_report_success(ctx); - } - - osync_trace(TRACE_EXIT, "%s", __func__); -} - -static char *mock_generate_hash(struct stat *buf) -{ - char *hash = g_strdup_printf("%i-%i", (int)buf->st_mtime, (int)buf->st_ctime); - return hash; -} - -static void mock_get_changeinfo(OSyncContext *ctx) -{ - mock_env *env = (mock_env *)osync_context_get_plugin_data(ctx); - - if (mock_get_error(env->member, "GET_CHANGES_ERROR")) { - osync_context_report_error(ctx, OSYNC_ERROR_EXPECTED, "Triggering GET_CHANGES_ERROR error"); - return; - } - if (mock_get_error(env->member, "GET_CHANGES_TIMEOUT")) - return; - if (mock_get_error(env->member, "GET_CHANGES_TIMEOUT2")) - sleep(8); - - if (osync_member_get_slow_sync(env->member, "data")) { - osync_debug("FILE-SYNC", 3, "Slow sync requested"); - osync_hashtable_set_slow_sync(env->hashtable, "data"); - } - - GDir *dir; - GError *gerror = NULL; - const char *de = NULL; - - dir = g_dir_open(env->path, 0, &gerror); - if (!dir) { - osync_trace(TRACE_EXIT_ERROR, "mock_report_dir: Unable to open directory %s: %s", env->path, gerror ? gerror->message : "None"); - return; - } - while ((de = g_dir_read_name(dir))) { - char *filename = g_build_filename(env->path, de, NULL); - if (g_file_test(filename, G_FILE_TEST_IS_REGULAR)) { - /* Report normal files */ - OSyncChange *change = osync_change_new(); - osync_change_set_member(change, env->member); - osync_change_set_uid(change, de); - - osync_change_set_objformat_string(change, "mockformat"); - - struct stat buf; - stat(filename, &buf); - char *hash = mock_generate_hash(&buf); - osync_change_set_hash(change, hash); - - if (mock_get_error(env->member, "ONLY_INFO")) { - osync_change_set_data(change, NULL, 0, FALSE); - } else { - char *data = NULL; - int size = 0; - OSyncError *error = NULL; - if (!osync_file_read(filename, &data, &size, &error)) { - osync_context_report_osyncerror(ctx, &error); - g_free(filename); - return; - } - - osync_change_set_data(change, data, size, TRUE); - } - - if (mock_get_error(env->member, "SLOW_REPORT")) - sleep(1); - - if (osync_hashtable_detect_change(env->hashtable, change)) { - osync_context_report_change(ctx, change); - osync_hashtable_update_hash(env->hashtable, change); - } - g_free(hash); - - - } - } - g_dir_close(dir); - osync_hashtable_report_deleted(env->hashtable, ctx, "data"); - - fail_unless(env->committed_all == TRUE, NULL); - env->committed_all = FALSE; - - osync_context_report_success(ctx); -} - -static void mock_get_data(OSyncContext *ctx, OSyncChange *change) -{ - mock_env *env = (mock_env *)osync_context_get_plugin_data(ctx); - - if (mock_get_error(env->member, "GET_DATA_ERROR")) { - osync_context_report_error(ctx, OSYNC_ERROR_EXPECTED, "Triggering GET_DATA_ERROR error"); - return; - } - if (mock_get_error(env->member, "GET_DATA_TIMEOUT")) - return; - - char *filename = g_strdup_printf("%s/%s", env->path, osync_change_get_uid(change)); - char *data = NULL; - int size = 0; - OSyncError *error = NULL; - if (!osync_file_read(filename, &data, &size, &error)) { - osync_context_report_osyncerror(ctx, &error); - g_free(filename); - return; - } - - osync_change_set_data(change, data, size, TRUE); - g_free(filename); - - osync_context_report_success(ctx); -} - -static void mock_read(OSyncContext *ctx, OSyncChange *change) -{ - mock_env *env = (mock_env *)osync_context_get_plugin_data(ctx); - - char *filename = g_strdup_printf("%s/%s", env->path, osync_change_get_uid(change)); - - char *data = NULL; - int size = 0; - OSyncError *error = NULL; - if (!osync_file_read(filename, &data, &size, &error)) { - osync_context_report_osyncerror(ctx, &error); - g_free(filename); - return; - } - - osync_change_set_data(change, data, size, TRUE); - - g_free(filename); - - osync_context_report_success(ctx); -} - -static osync_bool mock_access(OSyncContext *ctx, OSyncChange *change) -{ - /*TODO: Create directory for file, if it doesn't exist */ - osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, ctx, change); - - mock_env *env = (mock_env *)osync_context_get_plugin_data(ctx); - - char *filename = NULL; - OSyncError *error = NULL; - filename = g_strdup_printf ("%s/%s", env->path, osync_change_get_uid(change)); - - switch (osync_change_get_changetype(change)) { - case CHANGE_DELETED: - if (!remove(filename) == 0) { - osync_debug("FILE-SYNC", 0, "Unable to remove file %s", filename); - osync_context_report_error(ctx, OSYNC_ERROR_FILE_NOT_FOUND, "Unable to write"); - g_free(filename); - osync_trace(TRACE_EXIT_ERROR, "%s: Unable to write", __func__); - return FALSE; - } - break; - case CHANGE_ADDED: - if (g_file_test(filename, G_FILE_TEST_EXISTS)) { - osync_debug("FILE-SYNC", 0, "File %s already exists", filename); - osync_context_report_error(ctx, OSYNC_ERROR_EXISTS, "Entry already exists"); - g_free(filename); - osync_trace(TRACE_EXIT_ERROR, "%s: Entry already exists", __func__); - return FALSE; - } - /* No break. Continue below */ - case CHANGE_MODIFIED: - //FIXME add permission and ownership for file-sync - if (!osync_file_write(filename, osync_change_get_data(change), osync_change_get_datasize(change), 0700, &error)) { - osync_debug("FILE-SYNC", 0, "Unable to write to file %s", filename); - osync_context_report_osyncerror(ctx, &error); - g_free(filename); - osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(&error)); - return FALSE; - } - - struct stat buf; - stat(filename, &buf); - char *hash = mock_generate_hash(&buf); - osync_change_set_hash(change, hash); - break; - default: - fail("no changetype given"); - } - g_free(filename); - - osync_trace(TRACE_EXIT, "%s", __func__); - return TRUE; -} - -static osync_bool mock_commit_change(OSyncContext *ctx, OSyncChange *change) -{ - osync_debug("FILE-SYNC", 4, "start: %s", __func__); - osync_debug("FILE-SYNC", 3, "Writing change %s with changetype %i", osync_change_get_uid(change), osync_change_get_changetype(change)); - mock_env *env = (mock_env *)osync_context_get_plugin_data(ctx); - - fail_unless(env->committed_all == FALSE, NULL); - - if (mock_get_error(env->member, "COMMIT_ERROR")) { - osync_context_report_error(ctx, OSYNC_ERROR_EXPECTED, "Triggering COMMIT_ERROR error"); - return FALSE; - } - if (mock_get_error(env->member, "COMMIT_TIMEOUT")) - return FALSE; - - if (!mock_access(ctx, change)) - return FALSE; - - osync_hashtable_update_hash(env->hashtable, change); - osync_context_report_success(ctx); - osync_debug("FILE-SYNC", 4, "end: %s", __func__); - return TRUE; -} - -static void mock_sync_done(OSyncContext *ctx) -{ - osync_debug("FILE-SYNC", 3, "start: %s", __func__); - mock_env *env = (mock_env *)osync_context_get_plugin_data(ctx); - - if (mock_get_error(env->member, "SYNC_DONE_ERROR")) { - osync_context_report_error(ctx, OSYNC_ERROR_EXPECTED, "Triggering SYNC_DONE_ERROR error"); - return; - } - if (mock_get_error(env->member, "SYNC_DONE_TIMEOUT")) - return; - - osync_anchor_update(env->member, "path", env->path); - osync_context_report_success(ctx); - osync_debug("FILE-SYNC", 3, "end: %s", __func__); -} - -static void mock_disconnect(OSyncContext *ctx) -{ - osync_debug("FILE-SYNC", 3, "start: %s", __func__); - mock_env *env = (mock_env *)osync_context_get_plugin_data(ctx); - - if (!g_getenv("NO_COMMITTED_ALL_CHECK")) - fail_unless(env->committed_all == TRUE, NULL); - env->committed_all = FALSE; - - if (mock_get_error(env->member, "DISCONNECT_ERROR")) { - osync_context_report_error(ctx, OSYNC_ERROR_EXPECTED, "Triggering DISCONNECT_ERROR error"); - return; - } - if (mock_get_error(env->member, "DISCONNECT_TIMEOUT")) - return; - - g_dir_close(env->dir); - osync_hashtable_close(env->hashtable); - osync_context_report_success(ctx); - osync_debug("FILE-SYNC", 3, "end: %s", __func__); -} - -static void mock_finalize(void *data) -{ - osync_debug("FILE-SYNC", 3, "start: %s", __func__); - mock_env *env = (mock_env *)data; - osync_hashtable_free(env->hashtable); - - g_free(env->path); - g_free(env); -} - -static osync_bool mock_is_available(OSyncError **error) -{ - if (g_getenv("IS_NOT_AVAILABLE")) { - osync_error_set(error, OSYNC_ERROR_GENERIC, "file-sync plugin is not available"); - return FALSE; - } - return TRUE; -} - -static void mock_batch_commit(OSyncContext *context, OSyncContext **contexts, OSyncChange **changes) -{ - osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, context, contexts, changes); - mock_env *env = (mock_env *)osync_context_get_plugin_data(context); - - fail_unless(env->committed_all == FALSE, NULL); - env->committed_all = TRUE; - - int i; - for (i = 0; contexts[i]; i++) { - if (mock_access(contexts[i], changes[i])) { - osync_hashtable_update_hash(env->hashtable, changes[i]); - osync_context_report_success(contexts[i]); - } - } - - if (g_getenv("NUM_BATCH_COMMITS")) { - int req = atoi(g_getenv("NUM_BATCH_COMMITS")); - fail_unless(req == i, NULL); - } - - if (mock_get_error(env->member, "COMMITTED_ALL_ERROR")) { - osync_context_report_error(context, OSYNC_ERROR_EXPECTED, "Triggering COMMITTED_ALL_ERROR error"); - return; - } - - osync_context_report_success(context); - - osync_trace(TRACE_EXIT, "%s", __func__); -} - -static void mock_committed_all(OSyncContext *context) -{ - osync_trace(TRACE_ENTRY, "%s(%p)", __func__, context); - mock_env *env = (mock_env *)osync_context_get_plugin_data(context); - - fail_unless(env->committed_all == FALSE, NULL); - env->committed_all = TRUE; - - if (mock_get_error(env->member, "COMMITTED_ALL_ERROR")) { - osync_context_report_error(context, OSYNC_ERROR_EXPECTED, "Triggering COMMITTED_ALL_ERROR error"); - osync_trace(TRACE_EXIT_ERROR, "%s: Reporting error", __func__); - return; - } - - osync_context_report_success(context); - - osync_trace(TRACE_EXIT, "%s", __func__); -} - -void get_info(OSyncEnv *env) -{ - OSyncPluginInfo *info = osync_plugin_new_info(env); - - info->name = "file-sync"; - info->longname = "Mock Plugin"; - info->description = "Mock Plugin"; - info->version = 1; - - info->functions.initialize = mock_initialize; - info->functions.connect = mock_connect; - info->functions.sync_done = mock_sync_done; - info->functions.disconnect = mock_disconnect; - info->functions.finalize = mock_finalize; - info->functions.get_changeinfo = mock_get_changeinfo; - info->functions.get_data = mock_get_data; - - osync_plugin_accept_objtype(info, "data"); - osync_plugin_accept_objformat(info, "data", "mockformat", NULL); - - osync_plugin_set_access_objformat(info, "data", "mockformat", mock_access); - osync_plugin_set_read_objformat(info, "data", "mockformat", mock_read); - - //Lets reduce the timeouts a bit so the checks work faster - info->timeouts.disconnect_timeout = 5; - info->timeouts.connect_timeout = 5; - info->timeouts.sync_done_timeout = 5; - info->timeouts.get_changeinfo_timeout = 5; - info->timeouts.get_data_timeout = 5; - info->timeouts.commit_timeout = 15; - - - if (g_getenv("NO_TIMEOUTS")) { - info->timeouts.disconnect_timeout = 0; - info->timeouts.connect_timeout = 0; - info->timeouts.sync_done_timeout = 0; - info->timeouts.get_changeinfo_timeout = 0; - info->timeouts.get_data_timeout = 0; - info->timeouts.commit_timeout = 0; - } - - if (g_getenv("IS_AVAILABLE")) - info->functions.is_available = mock_is_available; - - osync_plugin_set_batch_commit_objformat(info, "data", "mockformat", mock_batch_commit); - osync_plugin_set_commit_objformat(info, "data", "mockformat", mock_commit_change); - osync_plugin_set_committed_all_objformat(info, "data", "mockformat", mock_committed_all); -} |