From: <svn...@op...> - 2009-09-24 17:10:18
|
Author: bellmich Date: Thu Sep 24 19:10:09 2009 New Revision: 1283 URL: http://libsyncml.opensync.org/changeset/1283 Log: - added code to test the sending of changes from server to client - added code to test map handling Modified: trunk/tests/check_data_sync_api.c Modified: trunk/tests/check_data_sync_api.c ============================================================================== --- trunk/tests/check_data_sync_api.c Thu Sep 24 19:08:41 2009 (r1282) +++ trunk/tests/check_data_sync_api.c Thu Sep 24 19:10:09 2009 (r1283) @@ -48,41 +48,81 @@ /* *********** CALLBACKS ************** */ /* ************************************ */ +SmlDataSyncTestClient* +getTestClientFromDataSyncSession(SmlDataSyncSession *session) +{ + /* This is a hack because of the behaviour of the OBEX server. */ + smlTrace(TRACE_INTERNAL, "%s: session(server->remote) ::= %p", __func__, sml_data_sync_session_get_remote(session)); + smlTrace(TRACE_INTERNAL, "%s: session(server->remote) ::= %s", __func__, sml_location_get_full_uri(sml_data_sync_session_get_remote(session))); + smlTrace(TRACE_INTERNAL, "%s: session(server->local) ::= %p", __func__, sml_data_sync_session_get_local(session)); + smlTrace(TRACE_INTERNAL, "%s: session(server->local) ::= %s", __func__, sml_location_get_full_uri(sml_data_sync_session_get_local(session))); + GList *list = clients; + SmlDataSyncTestClient *client = NULL; + for (;list; list = list->next) { + client = list->data; + smlTrace(TRACE_INTERNAL, "%s: client(local) ::= %p", __func__, sml_data_sync_get_local(client->client)); + smlTrace(TRACE_INTERNAL, "%s: client(local) ::= %s", __func__, sml_location_get_full_uri(sml_data_sync_get_local(client->client))); + smlTrace(TRACE_INTERNAL, "%s: client(remote) ::= %p", __func__, sml_data_sync_get_remote(client->client)); + smlTrace(TRACE_INTERNAL, "%s: client(remote) ::= %s", __func__, sml_location_get_full_uri(sml_data_sync_get_remote(client->client))); + if (sml_location_is_equal(sml_data_sync_get_local(client->client), sml_data_sync_session_get_remote(session))) + { + /* correct client */ + smlTrace(TRACE_INTERNAL, "%s - correct client", __func__); + break; + } else { + /* wrong client */ + client = NULL; + } + } + sml_fail_unless(client != NULL, "Cannot find correct client."); + return client; +} + gboolean sendAllChanges (SmlDataSyncSession *session, SmlDataSyncTestClient *client, GError **error) { - smlTrace(TRACE_ENTRY, "%s", __func__); + smlTrace(TRACE_ENTRY, "%s (%p, %p, %p)", __func__, session, client, error); + gboolean is_server = client ? FALSE : TRUE; SmlDataSyncDataStoreSession *dss = NULL; - if (client) + if (!is_server) dss = sml_data_sync_session_get_data_store_session(session, client->data_store, error); else dss = sml_data_sync_session_get_data_store_session(session, server_data_store, error); sml_fail_unless(dss != NULL, "%s", GET_ERROR_MESSAGE((*error))); - if (client) + if (is_server) { - GList *list = client->items; - size_t count = 0; - for (;list;list = list->next) - { - count++; - char *name = g_strdup_printf("%d", count); - SmlLocation *loc = sml_location_new(); - sml_location_set_uri(loc, name); - smlSafeCFree(&name); + /* determine the remote client */ + client = getTestClientFromDataSyncSession(session); + } - SmlDataSyncChangeItem *item = sml_data_sync_change_item_new(); - sml_data_sync_change_item_set_action(item, SML_CHANGE_ADD); - sml_fail_unless(sml_data_sync_change_item_set_data(item, list->data, 0, error), "%s", GET_ERROR_MESSAGE((*error))); - sml_fail_unless(sml_data_sync_change_item_set_location(item, loc, error), "%s", GET_ERROR_MESSAGE((*error))); - g_object_unref(loc); - loc = NULL; + GList *list = client->items; + size_t count = 0; + for (;list;list = list->next) + { + count++; + char *name = NULL; - sml_fail_unless(sml_data_sync_data_store_session_add_change(dss, item, NULL, error), "%s", GET_ERROR_MESSAGE((*error))); - } + if (is_server) + name = g_strdup_printf("%d from server", count); + else + name = g_strdup_printf("%d", count); + + SmlLocation *loc = sml_location_new(); + sml_location_set_uri(loc, name); + smlSafeCFree(&name); + + SmlDataSyncChangeItem *item = sml_data_sync_change_item_new(); + sml_data_sync_change_item_set_action(item, SML_CHANGE_ADD); + sml_fail_unless(sml_data_sync_change_item_set_data(item, list->data, 0, error), "%s", GET_ERROR_MESSAGE((*error))); + sml_fail_unless(sml_data_sync_change_item_set_location(item, loc, error), "%s", GET_ERROR_MESSAGE((*error))); + g_object_unref(loc); + loc = NULL; + + sml_fail_unless(sml_data_sync_data_store_session_add_change(dss, item, NULL, error), "%s", GET_ERROR_MESSAGE((*error))); } smlTrace(TRACE_EXIT, "%s", __func__); @@ -163,64 +203,39 @@ } static gboolean -recvChangeCallback (SmlDataSyncDataStoreSession *session, +serverRecvChangeCallback (SmlDataSyncDataStoreSession *session, SmlDataSyncChangeItem *item, void *userdata, GError **error) { smlTrace(TRACE_ENTRY, "%s: (%p, %p, %p, %p)", __func__, session, item, userdata, error); - /* clients should never receive a change in this test */ + /* determine the relevant data sync objects */ SmlDataSyncDataStore *datastore = sml_data_sync_data_store_session_get_data_store(session); SmlDataSyncSession *dss = sml_data_sync_data_store_session_get_data_sync_session(session); SmlDataSync *dsObject = sml_data_sync_session_get_data_sync(dss); - if (dsObject != server) { - sml_fail_unless(FALSE, "A change was received by the server."); - } - /* check the source */ - if (datastore != server_data_store) { - sml_fail_unless(FALSE, "The data store is wrong (from client)."); + if (dsObject != server || datastore != server_data_store) { + sml_fail_unless(FALSE, "This is the server callback."); } /* determine client */ - /* This is a hack because of the behaviour of the OBEX server. */ - smlTrace(TRACE_INTERNAL, "%s: session(server->remote) ::= %p", __func__, sml_data_sync_session_get_remote(dss)); - smlTrace(TRACE_INTERNAL, "%s: session(server->remote) ::= %s", __func__, sml_location_get_full_uri(sml_data_sync_session_get_remote(dss))); - smlTrace(TRACE_INTERNAL, "%s: session(server->local) ::= %p", __func__, sml_data_sync_session_get_local(dss)); - smlTrace(TRACE_INTERNAL, "%s: session(server->local) ::= %s", __func__, sml_location_get_full_uri(sml_data_sync_session_get_local(dss))); - GList *list = clients; - SmlDataSyncTestClient *client = NULL; - for (;list; list = list->next) { - client = list->data; - smlTrace(TRACE_INTERNAL, "%s: client(local) ::= %p", __func__, sml_data_sync_get_local(client->client)); - smlTrace(TRACE_INTERNAL, "%s: client(local) ::= %s", __func__, sml_location_get_full_uri(sml_data_sync_get_local(client->client))); - smlTrace(TRACE_INTERNAL, "%s: client(remote) ::= %p", __func__, sml_data_sync_get_remote(client->client)); - smlTrace(TRACE_INTERNAL, "%s: client(remote) ::= %s", __func__, sml_location_get_full_uri(sml_data_sync_get_remote(client->client))); - if (sml_location_is_equal(sml_data_sync_get_local(client->client), sml_data_sync_session_get_remote(dss))) - { - /* correct client */ - smlTrace(TRACE_INTERNAL, "%s - correct client", __func__); - break; - } else { - /* wrong client */ - client = NULL; - } - } - sml_fail_unless(client != NULL, "Cannot find correct client."); + SmlDataSyncTestClient *client = getTestClientFromDataSyncSession(dss); /* handle the item */ - list = client->items; + GList *list = client->items; size_t count = 0; for (; list; list = list->next) { count++; /* test the uid */ + smlTrace(TRACE_INTERNAL, "%s - case 1 %p %p", __func__, item, sml_data_sync_change_item_get_location(item)); const gchar *uid = sml_location_get_full_uri(sml_data_sync_change_item_get_location(item)); + smlTrace(TRACE_INTERNAL, "%s - case 1", __func__); char *name = g_strdup_printf("%d", count); if (strcmp(name, uid)) { smlSafeCFree(&name); @@ -239,6 +254,110 @@ return TRUE; } +static gboolean +clientRecvChangeCallback (SmlDataSyncDataStoreSession *session, + SmlDataSyncChangeItem *item, + void *userdata, + GError **error) +{ + smlTrace(TRACE_ENTRY, "%s: (%p, %p, %p, %p)", __func__, session, item, userdata, error); + + /* determine the relevant data sync objects */ + + SmlDataSyncDataStore *datastore = sml_data_sync_data_store_session_get_data_store(session); + SmlDataSyncSession *dss = sml_data_sync_data_store_session_get_data_sync_session(session); + SmlDataSync *dsObject = sml_data_sync_session_get_data_sync(dss); + + /* check the source */ + + if (dsObject == server || datastore == server_data_store) { + sml_fail_unless(FALSE, "This is the client callback."); + } + + /* document remote and local locations */ + + smlTrace(TRACE_INTERNAL, "%s: server->remote ::= %p", __func__, sml_data_sync_get_remote(server)); + if (sml_data_sync_get_remote(server)) + smlTrace(TRACE_INTERNAL, "%s: server->remote ::= %s", __func__, sml_location_get_full_uri(sml_data_sync_get_remote(server))); + smlTrace(TRACE_INTERNAL, "%s: server->local ::= %p", __func__, sml_data_sync_get_local(server)); + smlTrace(TRACE_INTERNAL, "%s: server->local ::= %s", __func__, sml_location_get_full_uri(sml_data_sync_get_local(server))); + smlTrace(TRACE_INTERNAL, "%s: client session(local) ::= %p", __func__, sml_data_sync_session_get_local(dss)); + smlTrace(TRACE_INTERNAL, "%s: client session(local) ::= %s", __func__, sml_location_get_full_uri(sml_data_sync_session_get_local(dss))); + smlTrace(TRACE_INTERNAL, "%s: client session(remote) ::= %p", __func__, sml_data_sync_session_get_remote(dss)); + smlTrace(TRACE_INTERNAL, "%s: client session(remote) ::= %s", __func__, sml_location_get_full_uri(sml_data_sync_session_get_remote(dss))); + + /* create a mapping per add item */ + + SmlLocation* remote = sml_data_sync_change_item_get_location(item); + SmlLocation* local = sml_location_clone(remote); + gchar *local_uri = g_strdup_printf("%s => mapped ID", sml_location_get_uri(remote)); + sml_location_set_uri(local, local_uri); + smlSafeCFree(&local_uri); + SmlMapItem *map = sml_map_item_new(); + sml_fail_unless(sml_map_item_set_remote(map, remote, error), "%s", GET_ERROR_MESSAGE((*error))); + sml_fail_unless(sml_map_item_set_local(map, local, error), "%s", GET_ERROR_MESSAGE((*error))); + sml_fail_unless(sml_map_item_is_compliant(map, error), "%s", GET_ERROR_MESSAGE((*error))); + + /* add the mapping to the session */ + + sml_fail_unless(sml_data_sync_data_store_session_add_mapping(session, map, NULL, error), "%s", GET_ERROR_MESSAGE((*error))); + + smlTrace(TRACE_EXIT, "%s - TRUE", __func__); + return TRUE; +} + +static gboolean +serverRecvMappingCallback (SmlDataSyncDataStoreSession *session, + SmlMapItem *item, + void *userdata, + GError **error) +{ + smlTrace(TRACE_ENTRY, "%s: (%p, %p, %p, %p)", __func__, session, item, userdata, error); + + /* determine the relevant data sync objects */ + + SmlDataSyncDataStore *datastore = sml_data_sync_data_store_session_get_data_store(session); + SmlDataSyncSession *dss = sml_data_sync_data_store_session_get_data_sync_session(session); + SmlDataSync *dsObject = sml_data_sync_session_get_data_sync(dss); + + /* check the source */ + + if (dsObject != server || datastore != server_data_store) { + sml_fail_unless(FALSE, "This is the server callback."); + } + + /* determine client */ + + SmlDataSyncTestClient *client = getTestClientFromDataSyncSession(dss); + + /* handle the item */ + GList *list = client->items; + size_t count = 0; + for (; list; list = list->next) { + count++; + + /* test the uid */ + const gchar *uid = sml_map_item_get_remote_uri(item); + char *name = g_strdup_printf("%d from server", count); + if (strcmp(name, uid)) { + smlSafeCFree(&name); + continue; + } + smlSafeCFree(&name); + + /* item with correct uid */ + const gchar *mapped = sml_map_item_get_local_uri(item); + name = g_strdup_printf("%d from server => mapped ID", count); + if (strcmp(name, mapped)) { + sml_fail_unless(FALSE, "The mapped ID of the item %s was wrong(%s != %s).", uid, name, mapped); + } + smlSafeCFree(&name); + } + + smlTrace(TRACE_EXIT, "%s - TRUE", __func__); + return TRUE; +} + //static SmlAlertType recvAlertTypeCallback( // SmlDataSyncObject *dsObject, // const char *source, @@ -286,9 +405,11 @@ /* general init */ setup_testbed(NULL); GError *error = NULL; + clients = NULL; + server = NULL; + server_data_store = NULL; /* initialize clients */ - clients = NULL; unsigned int i = 0; for (;i < peers; i++) { @@ -494,11 +615,13 @@ runMutex = NULL; /* close the object */ + smlTrace(TRACE_INTERNAL, "%s: shutting down all SmlDataSync objects", __func__); GList *list = clients; for (; list; list = list->next) { SmlDataSyncTestClient *client = list->data; g_object_unref(client->client); + g_object_unref(client->data_store); while(client->items) { gchar* item = client->items->data; @@ -532,14 +655,15 @@ client->data_store = sml_data_sync_data_store_new(); sml_data_sync_data_store_set_content_type (client->data_store, "text/x-vcard"); sml_data_sync_data_store_set_local_uri (client->data_store, "contacts"); - sml_data_sync_data_store_register_change_callback(client->data_store, recvChangeCallback, client); + sml_data_sync_data_store_register_change_callback(client->data_store, clientRecvChangeCallback, client); if (!sml_data_sync_add_data_store(client->client, client->data_store, &error)) goto error; server_data_store = sml_data_sync_data_store_new(); sml_data_sync_data_store_set_content_type (server_data_store, "text/x-vcard"); sml_data_sync_data_store_set_local_uri (server_data_store, "contacts"); - sml_data_sync_data_store_register_change_callback(server_data_store, recvChangeCallback, NULL); + sml_data_sync_data_store_register_change_callback(server_data_store, serverRecvChangeCallback, NULL); + sml_data_sync_data_store_register_mapping_callback(server_data_store, serverRecvMappingCallback, NULL); if (!sml_data_sync_add_data_store(server, server_data_store, &error)) goto error; @@ -567,7 +691,7 @@ client->data_store = sml_data_sync_data_store_new(); sml_data_sync_data_store_set_content_type (client->data_store, "image/jpeg"); sml_data_sync_data_store_set_local_uri (client->data_store, "dcim"); - sml_data_sync_data_store_register_change_callback(client->data_store, recvChangeCallback, NULL); + sml_data_sync_data_store_register_change_callback(client->data_store, clientRecvChangeCallback, NULL); if (!sml_data_sync_add_data_store(client->client, client->data_store, &error)) goto error; @@ -577,7 +701,8 @@ sml_data_sync_data_store_set_local_uri (server_data_store, "photos"); else sml_data_sync_data_store_set_local_uri (server_data_store, "dcim"); - sml_data_sync_data_store_register_change_callback(server_data_store, recvChangeCallback, NULL); + sml_data_sync_data_store_register_change_callback(server_data_store, serverRecvChangeCallback, NULL); + sml_data_sync_data_store_register_mapping_callback(server_data_store, serverRecvMappingCallback, NULL); if (!sml_data_sync_add_data_store(server, server_data_store, &error)) goto error; @@ -605,14 +730,15 @@ client->data_store = sml_data_sync_data_store_new(); sml_data_sync_data_store_set_content_type (client->data_store, "unknown/content-type"); sml_data_sync_data_store_set_local_uri (client->data_store, "data"); - sml_data_sync_data_store_register_change_callback(client->data_store, recvChangeCallback, NULL); + sml_data_sync_data_store_register_change_callback(client->data_store, clientRecvChangeCallback, NULL); if (!sml_data_sync_add_data_store(client->client, client->data_store, &error)) goto error; server_data_store = sml_data_sync_data_store_new(); sml_data_sync_data_store_set_content_type (server_data_store, "unknown/content-type"); sml_data_sync_data_store_set_local_uri (server_data_store, "data"); - sml_data_sync_data_store_register_change_callback(server_data_store, recvChangeCallback, NULL); + sml_data_sync_data_store_register_change_callback(server_data_store, serverRecvChangeCallback, NULL); + sml_data_sync_data_store_register_mapping_callback(server_data_store, serverRecvMappingCallback, NULL); if (!sml_data_sync_add_data_store(server, server_data_store, &error)) goto error; @@ -640,14 +766,15 @@ client->data_store = sml_data_sync_data_store_new(); sml_data_sync_data_store_set_content_type (client->data_store, "text/x-vcard"); sml_data_sync_data_store_set_local_uri (client->data_store, "contacts"); - sml_data_sync_data_store_register_change_callback(client->data_store, recvChangeCallback, NULL); + sml_data_sync_data_store_register_change_callback(client->data_store, clientRecvChangeCallback, NULL); if (!sml_data_sync_add_data_store(client->client, client->data_store, &error)) goto error; server_data_store = sml_data_sync_data_store_new(); sml_data_sync_data_store_set_content_type (server_data_store, "text/x-vcard"); sml_data_sync_data_store_set_local_uri (server_data_store, "contacts"); - sml_data_sync_data_store_register_change_callback(server_data_store, recvChangeCallback, NULL); + sml_data_sync_data_store_register_change_callback(server_data_store, serverRecvChangeCallback, NULL); + sml_data_sync_data_store_register_mapping_callback(server_data_store, serverRecvMappingCallback, NULL); if (!sml_data_sync_add_data_store(server, server_data_store, &error)) goto error; @@ -685,7 +812,7 @@ client->data_store = sml_data_sync_data_store_new(); sml_data_sync_data_store_set_content_type (client->data_store, "text/x-vcard"); sml_data_sync_data_store_set_local_uri (client->data_store, "contacts"); - sml_data_sync_data_store_register_change_callback(client->data_store, recvChangeCallback, client); + sml_data_sync_data_store_register_change_callback(client->data_store, clientRecvChangeCallback, client); if (!sml_data_sync_add_data_store(client->client, client->data_store, &error)) goto error; @@ -696,7 +823,8 @@ server_data_store = sml_data_sync_data_store_new(); sml_data_sync_data_store_set_content_type (server_data_store, "text/x-vcard"); sml_data_sync_data_store_set_local_uri (server_data_store, "contacts"); - sml_data_sync_data_store_register_change_callback(server_data_store, recvChangeCallback, NULL); + sml_data_sync_data_store_register_change_callback(server_data_store, serverRecvChangeCallback, NULL); + sml_data_sync_data_store_register_mapping_callback(server_data_store, serverRecvMappingCallback, NULL); if (!sml_data_sync_add_data_store(server, server_data_store, &error)) goto error; @@ -727,7 +855,7 @@ client->data_store = sml_data_sync_data_store_new(); sml_data_sync_data_store_set_content_type (client->data_store, "text/x-vcard"); sml_data_sync_data_store_set_local_uri (client->data_store, "contacts"); - sml_data_sync_data_store_register_change_callback(client->data_store, recvChangeCallback, client); + sml_data_sync_data_store_register_change_callback(client->data_store, clientRecvChangeCallback, client); if (!sml_data_sync_add_data_store(client->client, client->data_store, &error)) goto error; @@ -742,7 +870,8 @@ server_data_store = sml_data_sync_data_store_new(); sml_data_sync_data_store_set_content_type (server_data_store, "text/x-vcard"); sml_data_sync_data_store_set_local_uri (server_data_store, "contacts"); - sml_data_sync_data_store_register_change_callback(server_data_store, recvChangeCallback, NULL); + sml_data_sync_data_store_register_change_callback(server_data_store, serverRecvChangeCallback, NULL); + sml_data_sync_data_store_register_mapping_callback(server_data_store, serverRecvMappingCallback, NULL); if (!sml_data_sync_add_data_store(server, server_data_store, &error)) goto error; |