diff options
Diffstat (limited to 'gdata/tests/contacts.c')
-rw-r--r-- | gdata/tests/contacts.c | 2705 |
1 files changed, 0 insertions, 2705 deletions
diff --git a/gdata/tests/contacts.c b/gdata/tests/contacts.c deleted file mode 100644 index 59698898..00000000 --- a/gdata/tests/contacts.c +++ /dev/null @@ -1,2705 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* - * GData Client - * Copyright (C) Philip Withnall 2009, 2010, 2011, 2014 <philip@tecnocode.co.uk> - * - * GData Client 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. - * - * GData Client 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 GData Client. If not, see <http://www.gnu.org/licenses/>. - */ - -#include <glib.h> -#include <unistd.h> -#include <string.h> - -#include "gdata.h" -#include "common.h" -#include "gdata-dummy-authorizer.h" - -G_GNUC_BEGIN_IGNORE_DEPRECATIONS - -static UhmServer *mock_server = NULL; - -#undef CLIENT_ID /* from common.h */ - -#define CLIENT_ID "352818697630-nqu2cmt5quqd6lr17ouoqmb684u84l1f.apps.googleusercontent.com" -#define CLIENT_SECRET "-fA4pHQJxR3zJ-FyAMPQsikg" -#define REDIRECT_URI "urn:ietf:wg:oauth:2.0:oob" - -typedef struct { - GDataContactsContact *contact; -} TempContactData; - -static void -set_up_temp_contact (TempContactData *data, gconstpointer service) -{ - GDataContactsContact *contact; - - gdata_test_mock_server_start_trace (mock_server, "setup-temp-contact"); - - /* Create a new temporary contact to use for a single test */ - contact = gdata_contacts_contact_new (NULL); - gdata_contacts_contact_set_nickname (contact, "Test Contact Esq."); - - /* Insert the contact */ - data->contact = gdata_contacts_service_insert_contact (GDATA_CONTACTS_SERVICE (service), contact, NULL, NULL); - g_assert (GDATA_IS_CONTACTS_CONTACT (data->contact)); - gdata_test_compare_kind (GDATA_ENTRY (data->contact), "http://schemas.google.com/contact/2008#contact", NULL); - - g_object_unref (contact); - - uhm_server_end_trace (mock_server); - - /* HACK. Wait for the server to propagate distributed changes. */ - if (uhm_server_get_enable_online (mock_server) == TRUE) { - sleep (10); - } -} - -static void -tear_down_temp_contact (TempContactData *data, gconstpointer service) -{ - GDataEntry *updated_contact; - - gdata_test_mock_server_start_trace (mock_server, "teardown-temp-contact"); - - /* Re-query for the contact to get any updated ETags */ - updated_contact = gdata_service_query_single_entry (GDATA_SERVICE (service), gdata_contacts_service_get_primary_authorization_domain (), - gdata_entry_get_id (GDATA_ENTRY (data->contact)), NULL, GDATA_TYPE_CONTACTS_CONTACT, - NULL, NULL); - g_assert (GDATA_IS_CONTACTS_CONTACT (updated_contact)); - - g_object_unref (data->contact); - - /* Delete the new/updated contact */ - g_assert (gdata_service_delete_entry (GDATA_SERVICE (service), gdata_contacts_service_get_primary_authorization_domain (), - updated_contact, NULL, NULL) == TRUE); - - g_object_unref (updated_contact); - - uhm_server_end_trace (mock_server); -} - -GDATA_ASYNC_CLOSURE_FUNCTIONS (temp_contact, TempContactData); - -static void -test_authentication (void) -{ - GDataOAuth2Authorizer *authorizer = NULL; /* owned */ - gchar *authentication_uri, *authorisation_code; - - gdata_test_mock_server_start_trace (mock_server, "authentication"); - - authorizer = gdata_oauth2_authorizer_new (CLIENT_ID, CLIENT_SECRET, - REDIRECT_URI, - GDATA_TYPE_CONTACTS_SERVICE); - - /* Get an authentication URI. */ - authentication_uri = gdata_oauth2_authorizer_build_authentication_uri (authorizer, NULL, FALSE); - g_assert (authentication_uri != NULL); - - /* Get the authorisation code off the user. */ - if (uhm_server_get_enable_online (mock_server)) { - authorisation_code = gdata_test_query_user_for_verifier (authentication_uri); - } else { - /* Hard coded, extracted from the trace file. */ - authorisation_code = g_strdup ("4/OEX-S1iMbOA_dOnNgUlSYmGWh3TK.QrR73axcNMkWoiIBeO6P2m_su7cwkQI"); - } - - g_free (authentication_uri); - - if (authorisation_code == NULL) { - /* Skip tests. */ - goto skip_test; - } - - /* Authorise the token */ - g_assert (gdata_oauth2_authorizer_request_authorization (authorizer, authorisation_code, NULL, NULL) == TRUE); - - /* Check all is as it should be */ - g_assert (gdata_authorizer_is_authorized_for_domain (GDATA_AUTHORIZER (authorizer), - gdata_contacts_service_get_primary_authorization_domain ()) == TRUE); - -skip_test: - g_free (authorisation_code); - g_object_unref (authorizer); - - uhm_server_end_trace (mock_server); -} - -typedef struct { - GDataContactsContact *contact1; - GDataContactsContact *contact2; - GDataContactsContact *contact3; -} QueryAllContactsData; - -static void -set_up_query_all_contacts (QueryAllContactsData *data, gconstpointer service) -{ - GDataContactsContact *contact; - - gdata_test_mock_server_start_trace (mock_server, "setup-query-all-contacts"); - - /* Create new temporary contacts to use for the query all contacts tests */ - contact = gdata_contacts_contact_new (NULL); - gdata_contacts_contact_set_nickname (contact, "Test Contact 1"); - data->contact1 = gdata_contacts_service_insert_contact (GDATA_CONTACTS_SERVICE (service), contact, NULL, NULL); - g_object_unref (contact); - - contact = gdata_contacts_contact_new (NULL); - gdata_contacts_contact_set_nickname (contact, "Test Contact 2"); - data->contact2 = gdata_contacts_service_insert_contact (GDATA_CONTACTS_SERVICE (service), contact, NULL, NULL); - g_object_unref (contact); - - contact = gdata_contacts_contact_new (NULL); - gdata_contacts_contact_set_nickname (contact, "Test Contact 3"); - data->contact3 = gdata_contacts_service_insert_contact (GDATA_CONTACTS_SERVICE (service), contact, NULL, NULL); - g_object_unref (contact); - - uhm_server_end_trace (mock_server); - - /* It takes a few seconds for the contacts to reliably propagate around Google's servers. Distributed systems are so fun. Not. - * Thankfully, we don't have to wait when running against the mock server. */ - if (uhm_server_get_enable_online (mock_server) == TRUE) { - g_usleep (G_USEC_PER_SEC * 5); - } -} - -static void -tear_down_query_all_contacts (QueryAllContactsData *data, gconstpointer service) -{ - gdata_test_mock_server_start_trace (mock_server, "teardown-query-all-contacts"); - - /* Delete the new contacts */ - g_assert (gdata_service_delete_entry (GDATA_SERVICE (service), gdata_contacts_service_get_primary_authorization_domain (), - GDATA_ENTRY (data->contact1), NULL, NULL) == TRUE); - g_object_unref (data->contact1); - - g_assert (gdata_service_delete_entry (GDATA_SERVICE (service), gdata_contacts_service_get_primary_authorization_domain (), - GDATA_ENTRY (data->contact2), NULL, NULL) == TRUE); - g_object_unref (data->contact2); - - g_assert (gdata_service_delete_entry (GDATA_SERVICE (service), gdata_contacts_service_get_primary_authorization_domain (), - GDATA_ENTRY (data->contact3), NULL, NULL) == TRUE); - g_object_unref (data->contact3); - - uhm_server_end_trace (mock_server); -} - -static void -test_query_all_contacts (QueryAllContactsData *data, gconstpointer service) -{ - GDataFeed *feed; - GError *error = NULL; - - gdata_test_mock_server_start_trace (mock_server, "query-all-contacts"); - - feed = gdata_contacts_service_query_contacts (GDATA_CONTACTS_SERVICE (service), NULL, NULL, NULL, NULL, &error); - g_assert_no_error (error); - g_assert (GDATA_IS_FEED (feed)); - g_clear_error (&error); - - /* TODO: check entries, kinds and feed properties */ - - g_object_unref (feed); - - uhm_server_end_trace (mock_server); -} - -GDATA_ASYNC_CLOSURE_FUNCTIONS (query_all_contacts, QueryAllContactsData); - -GDATA_ASYNC_TEST_FUNCTIONS (query_all_contacts, QueryAllContactsData, -G_STMT_START { - gdata_contacts_service_query_contacts_async (GDATA_CONTACTS_SERVICE (service), NULL, cancellable, NULL, - NULL, NULL, async_ready_callback, async_data); -} G_STMT_END, -G_STMT_START { - GDataFeed *feed; - - feed = gdata_service_query_finish (GDATA_SERVICE (obj), async_result, &error); - - if (error == NULL) { - g_assert (GDATA_IS_FEED (feed)); - /* TODO: Tests? */ - - g_object_unref (feed); - } else { - g_assert (feed == NULL); - } -} G_STMT_END); - -static void -test_query_all_contacts_async_progress_closure (QueryAllContactsData *query_data, gconstpointer service) -{ - GDataAsyncProgressClosure *data = g_slice_new0 (GDataAsyncProgressClosure); - - gdata_test_mock_server_start_trace (mock_server, "query-all-contacts-async-progress-closure"); - - data->main_loop = g_main_loop_new (NULL, TRUE); - - gdata_contacts_service_query_contacts_async (GDATA_CONTACTS_SERVICE (service), NULL, NULL, - (GDataQueryProgressCallback) gdata_test_async_progress_callback, - data, (GDestroyNotify) gdata_test_async_progress_closure_free, - (GAsyncReadyCallback) gdata_test_async_progress_finish_callback, data); - g_main_loop_run (data->main_loop); - g_main_loop_unref (data->main_loop); - - /* Check that both callbacks were called exactly once */ - g_assert_cmpuint (data->progress_destroy_notify_count, ==, 1); - g_assert_cmpuint (data->async_ready_notify_count, ==, 1); - - g_slice_free (GDataAsyncProgressClosure, data); - - uhm_server_end_trace (mock_server); -} - -typedef struct { - GDataContactsContact *new_contact; -} InsertData; - -static void -set_up_insert (InsertData *data, gconstpointer service) -{ - data->new_contact = NULL; -} - -static void -tear_down_insert (InsertData *data, gconstpointer service) -{ - gdata_test_mock_server_start_trace (mock_server, "teardown-insert"); - - /* Delete the new contact */ - g_assert (gdata_service_delete_entry (GDATA_SERVICE (service), gdata_contacts_service_get_primary_authorization_domain (), - GDATA_ENTRY (data->new_contact), NULL, NULL) == TRUE); - - g_object_unref (data->new_contact); - - uhm_server_end_trace (mock_server); -} - -static void -test_contact_insert (InsertData *data, gconstpointer service) -{ - GDataContactsContact *contact, *new_contact; - GDataGDName *name, *name2; - GDataGDEmailAddress *email_address1, *email_address2; - GDataGDPhoneNumber *phone_number1, *phone_number2; - GDataGDIMAddress *im_address; - GDataGDOrganization *org; - GDataGDPostalAddress *postal_address; - GDataGContactJot *jot; - GDataGContactRelation *relation; - GDataGContactWebsite *website; - GDataGContactEvent *event; - GDataGContactCalendar *calendar; - GDataGContactExternalID *external_id; - GDataGContactLanguage *language; - GList *list; - GDate date; - GHashTable *properties; - gint64 edited, creation_time; - GError *error = NULL; - - gdata_test_mock_server_start_trace (mock_server, "contact-insert"); - - contact = gdata_contacts_contact_new (NULL); - - /* Check the kind is present and correct */ - g_assert (GDATA_IS_CONTACTS_CONTACT (contact)); - gdata_test_compare_kind (GDATA_ENTRY (contact), "http://schemas.google.com/contact/2008#contact", NULL); - - /* Set and check the name (to check if the title of the entry is updated) */ - gdata_entry_set_title (GDATA_ENTRY (contact), "Elizabeth Bennet"); - name = gdata_contacts_contact_get_name (contact); - gdata_gd_name_set_full_name (name, "Lizzie Bennet"); - - name2 = gdata_gd_name_new ("John", "Smith"); - gdata_gd_name_set_full_name (name2, "John Smith"); - gdata_contacts_contact_set_name (contact, name2); - g_object_unref (name2); - - gdata_contacts_contact_set_nickname (contact, "Big J"); - gdata_contacts_contact_set_file_as (contact, "J, Big"); - g_date_set_dmy (&date, 1, 1, 1900); - gdata_contacts_contact_set_birthday (contact, &date, FALSE); - gdata_entry_set_content (GDATA_ENTRY (contact), "Notes"); - gdata_contacts_contact_set_billing_information (contact, "Big J Enterprises, Ltd."); - gdata_contacts_contact_set_directory_server (contact, "This is a server"); - gdata_contacts_contact_set_gender (contact, GDATA_CONTACTS_GENDER_MALE); - gdata_contacts_contact_set_initials (contact, "A. B. C."); - gdata_contacts_contact_set_maiden_name (contact, "Smith"); - gdata_contacts_contact_set_mileage (contact, "12km"); - gdata_contacts_contact_set_occupation (contact, "Professional bum"); - gdata_contacts_contact_set_priority (contact, GDATA_CONTACTS_PRIORITY_HIGH); - gdata_contacts_contact_set_sensitivity (contact, GDATA_CONTACTS_SENSITIVITY_PERSONAL); - gdata_contacts_contact_set_short_name (contact, "Jon"); - gdata_contacts_contact_set_subject (contact, "Charity work"); - - email_address1 = gdata_gd_email_address_new ("liz@gmail.com", GDATA_GD_EMAIL_ADDRESS_WORK, NULL, FALSE); - gdata_contacts_contact_add_email_address (contact, email_address1); - g_object_unref (email_address1); - - email_address2 = gdata_gd_email_address_new ("liz@example.org", GDATA_GD_EMAIL_ADDRESS_HOME, NULL, FALSE); - gdata_contacts_contact_add_email_address (contact, email_address2); - g_object_unref (email_address2); - - phone_number1 = gdata_gd_phone_number_new ("(206)555-1212", GDATA_GD_PHONE_NUMBER_WORK, NULL, NULL, TRUE); - gdata_contacts_contact_add_phone_number (contact, phone_number1); - g_object_unref (phone_number1); - - phone_number2 = gdata_gd_phone_number_new ("(206)555-1213", GDATA_GD_PHONE_NUMBER_HOME, NULL, NULL, FALSE); - gdata_contacts_contact_add_phone_number (contact, phone_number2); - g_object_unref (phone_number2); - - im_address = gdata_gd_im_address_new ("liz@gmail.com", GDATA_GD_IM_PROTOCOL_GOOGLE_TALK, GDATA_GD_IM_ADDRESS_HOME, NULL, FALSE); - gdata_contacts_contact_add_im_address (contact, im_address); - g_object_unref (im_address); - - postal_address = gdata_gd_postal_address_new (GDATA_GD_POSTAL_ADDRESS_WORK, NULL, TRUE); - gdata_gd_postal_address_set_street (postal_address, "1600 Amphitheatre Pkwy Mountain View"); - gdata_contacts_contact_add_postal_address (contact, postal_address); - g_object_unref (postal_address); - - org = gdata_gd_organization_new ("OrgCorp", "President", GDATA_GD_ORGANIZATION_WORK, NULL, FALSE); - gdata_contacts_contact_add_organization (contact, org); - g_object_unref (org); - - jot = gdata_gcontact_jot_new ("This is a jot.", GDATA_GCONTACT_JOT_OTHER); - gdata_contacts_contact_add_jot (contact, jot); - g_object_unref (jot); - - relation = gdata_gcontact_relation_new ("Brian Haddock", GDATA_GCONTACT_RELATION_FRIEND, NULL); - gdata_contacts_contact_add_relation (contact, relation); - g_object_unref (relation); - - website = gdata_gcontact_website_new ("http://example.com/", GDATA_GCONTACT_WEBSITE_PROFILE, NULL, TRUE); - gdata_contacts_contact_add_website (contact, website); - g_object_unref (website); - - event = gdata_gcontact_event_new (&date, GDATA_GCONTACT_EVENT_ANNIVERSARY, NULL); - gdata_contacts_contact_add_event (contact, event); - g_object_unref (event); - - calendar = gdata_gcontact_calendar_new ("http://calendar.example.com/", GDATA_GCONTACT_CALENDAR_HOME, NULL, TRUE); - gdata_contacts_contact_add_calendar (contact, calendar); - g_object_unref (calendar); - - external_id = gdata_gcontact_external_id_new ("Number Six", GDATA_GCONTACT_EXTERNAL_ID_ORGANIZATION, NULL); - gdata_contacts_contact_add_external_id (contact, external_id); - g_object_unref (external_id); - - gdata_contacts_contact_add_hobby (contact, "Rowing"); - - language = gdata_gcontact_language_new ("en-GB", NULL); - gdata_contacts_contact_add_language (contact, language); - g_object_unref (language); - - /* Add some extended properties */ - g_assert (gdata_contacts_contact_set_extended_property (contact, "TITLE", NULL) == TRUE); - g_assert (gdata_contacts_contact_set_extended_property (contact, "ROLE", "") == TRUE); - g_assert (gdata_contacts_contact_set_extended_property (contact, "CALURI", "http://example.com/") == TRUE); - - /* Add some user-defined fields */ - gdata_contacts_contact_set_user_defined_field (contact, "Favourite colour", "Blue"); - gdata_contacts_contact_set_user_defined_field (contact, "Owes me", "£10"); - gdata_contacts_contact_set_user_defined_field (contact, "My notes", ""); - gdata_contacts_contact_set_user_defined_field (contact, "", "Foo"); /* bgo#648058 */ - - /* Insert the contact */ - new_contact = data->new_contact = gdata_contacts_service_insert_contact (GDATA_CONTACTS_SERVICE (service), contact, NULL, &error); - g_assert_no_error (error); - g_assert (GDATA_IS_CONTACTS_CONTACT (new_contact)); - gdata_test_compare_kind (GDATA_ENTRY (new_contact), "http://schemas.google.com/contact/2008#contact", NULL); - g_clear_error (&error); - - /* Check its edited date. Yes, we have to allow the edited time to possibly precede the creation time because Google's - * servers can allow this to happen. Somehow. - * This check isn't run when testing against a mock server because the dates in the trace file may be waaaay out of date. */ - edited = gdata_contacts_contact_get_edited (contact); - if (uhm_server_get_enable_online (mock_server) == TRUE) { - creation_time = gdata_contacts_contact_get_edited (new_contact); - g_assert_cmpint (creation_time + TIME_FUZZINESS, >=, edited); - g_assert_cmpint (creation_time - TIME_FUZZINESS, <=, edited); - } - - /* Various properties */ - g_assert_cmpstr (gdata_contacts_contact_get_nickname (new_contact), ==, "Big J"); - g_assert_cmpstr (gdata_contacts_contact_get_file_as (new_contact), ==, "J, Big"); - g_assert (gdata_contacts_contact_get_birthday (new_contact, &date) == FALSE); - g_assert (g_date_valid (&date) == TRUE); - g_assert_cmpuint (g_date_get_month (&date), ==, 1); - g_assert_cmpuint (g_date_get_day (&date), ==, 1); - g_assert_cmpstr (gdata_contacts_contact_get_billing_information (new_contact), ==, "Big J Enterprises, Ltd."); - g_assert_cmpstr (gdata_contacts_contact_get_directory_server (new_contact), ==, "This is a server"); - g_assert_cmpstr (gdata_contacts_contact_get_gender (new_contact), ==, GDATA_CONTACTS_GENDER_MALE); - g_assert_cmpstr (gdata_contacts_contact_get_initials (new_contact), ==, "A. B. C."); - g_assert_cmpstr (gdata_contacts_contact_get_maiden_name (new_contact), ==, "Smith"); - g_assert_cmpstr (gdata_contacts_contact_get_mileage (new_contact), ==, "12km"); - g_assert_cmpstr (gdata_contacts_contact_get_occupation (new_contact), ==, "Professional bum"); - /* FIXME: https://code.google.com/a/google.com/p/apps-api-issues/issues/detail?id=3662 - * g_assert_cmpstr (gdata_contacts_contact_get_priority (new_contact), ==, GDATA_CONTACTS_PRIORITY_HIGH); - * g_assert_cmpstr (gdata_contacts_contact_get_sensitivity (new_contact), ==, GDATA_CONTACTS_SENSITIVITY_PERSONAL); */ - g_assert_cmpstr (gdata_contacts_contact_get_short_name (new_contact), ==, "Jon"); - g_assert_cmpstr (gdata_contacts_contact_get_subject (new_contact), ==, "Charity work"); - - /* E-mail addresses */ - list = gdata_contacts_contact_get_email_addresses (new_contact); - g_assert_cmpuint (g_list_length (list), ==, 2); - g_assert (GDATA_IS_GD_EMAIL_ADDRESS (list->data)); - - g_assert (gdata_contacts_contact_get_primary_email_address (new_contact) == NULL); - - /* IM addresses */ - list = gdata_contacts_contact_get_im_addresses (new_contact); - g_assert_cmpuint (g_list_length (list), ==, 1); - g_assert (GDATA_IS_GD_IM_ADDRESS (list->data)); - - g_assert (gdata_contacts_contact_get_primary_im_address (new_contact) == NULL); - - /* Phone numbers */ - list = gdata_contacts_contact_get_phone_numbers (new_contact); - g_assert_cmpuint (g_list_length (list), ==, 2); - g_assert (GDATA_IS_GD_PHONE_NUMBER (list->data)); - - g_assert (GDATA_IS_GD_PHONE_NUMBER (gdata_contacts_contact_get_primary_phone_number (new_contact))); - - /* Postal addresses */ - list = gdata_contacts_contact_get_postal_addresses (new_contact); - g_assert_cmpuint (g_list_length (list), ==, 1); - g_assert (GDATA_IS_GD_POSTAL_ADDRESS (list->data)); - - g_assert (GDATA_IS_GD_POSTAL_ADDRESS (gdata_contacts_contact_get_primary_postal_address (new_contact))); - - /* Organizations */ - list = gdata_contacts_contact_get_organizations (new_contact); - g_assert_cmpuint (g_list_length (list), ==, 1); - g_assert (GDATA_IS_GD_ORGANIZATION (list->data)); - - g_assert (gdata_contacts_contact_get_primary_organization (new_contact) == NULL); - - /* Jots */ - list = gdata_contacts_contact_get_jots (new_contact); - g_assert_cmpuint (g_list_length (list), ==, 1); - g_assert (GDATA_IS_GCONTACT_JOT (list->data)); - - /* Relations */ - list = gdata_contacts_contact_get_relations (new_contact); - g_assert_cmpuint (g_list_length (list), ==, 1); - g_assert (GDATA_IS_GCONTACT_RELATION (list->data)); - - /* Websites */ - list = gdata_contacts_contact_get_websites (new_contact); - g_assert_cmpuint (g_list_length (list), ==, 1); - g_assert (GDATA_IS_GCONTACT_WEBSITE (list->data)); - - g_assert (GDATA_IS_GCONTACT_WEBSITE (gdata_contacts_contact_get_primary_website (new_contact))); - - /* Events */ - list = gdata_contacts_contact_get_events (new_contact); - g_assert_cmpuint (g_list_length (list), ==, 1); - g_assert (GDATA_IS_GCONTACT_EVENT (list->data)); - - /* Calendars */ - list = gdata_contacts_contact_get_calendars (new_contact); - g_assert_cmpuint (g_list_length (list), ==, 1); - g_assert (GDATA_IS_GCONTACT_CALENDAR (list->data)); - - g_assert (GDATA_IS_GCONTACT_CALENDAR (gdata_contacts_contact_get_primary_calendar (new_contact))); - - /* External IDs */ - list = gdata_contacts_contact_get_external_ids (new_contact); - g_assert_cmpuint (g_list_length (list), ==, 1); - g_assert (GDATA_IS_GCONTACT_EXTERNAL_ID (list->data)); - - /* Languages */ - list = gdata_contacts_contact_get_languages (new_contact); - g_assert_cmpuint (g_list_length (list), ==, 1); - g_assert (GDATA_IS_GCONTACT_LANGUAGE (list->data)); - - /* Hobbies */ - list = gdata_contacts_contact_get_hobbies (new_contact); - g_assert_cmpuint (g_list_length (list), ==, 1); - g_assert_cmpstr (list->data, ==, "Rowing"); - - /* Extended properties */ - g_assert_cmpstr (gdata_contacts_contact_get_extended_property (new_contact, "CALURI"), ==, "http://example.com/"); - g_assert (gdata_contacts_contact_get_extended_property (new_contact, "non-existent") == NULL); - - properties = gdata_contacts_contact_get_extended_properties (new_contact); - g_assert (properties != NULL); - g_assert_cmpuint (g_hash_table_size (properties), ==, 1); - - /* User-defined fields */ - g_assert_cmpstr (gdata_contacts_contact_get_user_defined_field (new_contact, "Favourite colour"), ==, "Blue"); - g_assert_cmpstr (gdata_contacts_contact_get_user_defined_field (new_contact, "Owes me"), ==, "£10"); - g_assert_cmpstr (gdata_contacts_contact_get_user_defined_field (new_contact, "My notes"), ==, ""); - g_assert_cmpstr (gdata_contacts_contact_get_user_defined_field (new_contact, ""), ==, "Foo"); - - properties = gdata_contacts_contact_get_user_defined_fields (new_contact); - g_assert (properties != NULL); - g_assert_cmpuint (g_hash_table_size (properties), ==, 4); - - /* Groups */ - list = gdata_contacts_contact_get_groups (new_contact); - g_assert (list == NULL); - - /* Deleted? */ - g_assert (gdata_contacts_contact_is_deleted (new_contact) == FALSE); - - /* TODO: check entries and feed properties */ - - g_object_unref (contact); - - uhm_server_end_trace (mock_server); -} - -static void -test_contact_update (TempContactData *data, gconstpointer service) -{ - GDataContactsContact *new_contact; - GError *error = NULL; - - gdata_test_mock_server_start_trace (mock_server, "contact-update"); - - /* Update the contact's name and add an extended property */ - gdata_entry_set_title (GDATA_ENTRY (data->contact), "John Wilson"); - g_assert (gdata_contacts_contact_set_extended_property (data->contact, "contact-test", "value")); - - /* Update the contact */ - new_contact = GDATA_CONTACTS_CONTACT (gdata_service_update_entry (GDATA_SERVICE (service), - gdata_contacts_service_get_primary_authorization_domain (), - GDATA_ENTRY (data->contact), NULL, &error)); - g_assert_no_error (error); - g_assert (GDATA_IS_CONTACTS_CONTACT (new_contact)); - gdata_test_compare_kind (GDATA_ENTRY (new_contact), "http://schemas.google.com/contact/2008#contact", NULL); - g_clear_error (&error); - - /* Check a few properties */ - g_assert_cmpstr (gdata_entry_get_title (GDATA_ENTRY (new_contact)), ==, "John Wilson"); - g_assert_cmpstr (gdata_contacts_contact_get_extended_property (new_contact, "contact-test"), ==, "value"); - g_assert (gdata_contacts_contact_is_deleted (new_contact) == FALSE); - - g_object_unref (new_contact); - - uhm_server_end_trace (mock_server); -} - -typedef struct { - GDataContactsGroup *group1; - GDataContactsGroup *group2; - GDataContactsGroup *group3; -} QueryAllGroupsData; - -static void -set_up_query_all_groups (QueryAllGroupsData *data, gconstpointer service) -{ - GDataContactsGroup *group; - - gdata_test_mock_server_start_trace (mock_server, "setup-query-all-groups"); - - group = gdata_contacts_group_new (NULL); - gdata_entry_set_title (GDATA_ENTRY (group), "Test Group 1"); - data->group1 = gdata_contacts_service_insert_group (GDATA_CONTACTS_SERVICE (service), group, NULL, NULL); - g_assert (GDATA_IS_CONTACTS_GROUP (data->group1)); - g_object_unref (group); - - group = gdata_contacts_group_new (NULL); - gdata_entry_set_title (GDATA_ENTRY (group), "Test Group 2"); - data->group2 = gdata_contacts_service_insert_group (GDATA_CONTACTS_SERVICE (service), group, NULL, NULL); - g_assert (GDATA_IS_CONTACTS_GROUP (data->group2)); - g_object_unref (group); - - group = gdata_contacts_group_new (NULL); - gdata_entry_set_title (GDATA_ENTRY (group), "Test Group 3"); - data->group3 = gdata_contacts_service_insert_group (GDATA_CONTACTS_SERVICE (service), group, NULL, NULL); - g_assert (GDATA_IS_CONTACTS_GROUP (data->group3)); - g_object_unref (group); - - uhm_server_end_trace (mock_server); - - /* HACK! Guess what? Distributed system inconsistency strikes again! */ - if (uhm_server_get_enable_online (mock_server) == TRUE) { - sleep (10); - } -} - -static void -tear_down_query_all_groups (QueryAllGroupsData *data, gconstpointer service) -{ - gdata_test_mock_server_start_trace (mock_server, "teardown-query-all-groups"); - - g_assert (gdata_service_delete_entry (GDATA_SERVICE (service), gdata_contacts_service_get_primary_authorization_domain (), - GDATA_ENTRY (data->group1), NULL, NULL) == TRUE); - g_object_unref (data->group1); - - g_assert (gdata_service_delete_entry (GDATA_SERVICE (service), gdata_contacts_service_get_primary_authorization_domain (), - GDATA_ENTRY (data->group2), NULL, NULL) == TRUE); - g_object_unref (data->group2); - - g_assert (gdata_service_delete_entry (GDATA_SERVICE (service), gdata_contacts_service_get_primary_authorization_domain (), - GDATA_ENTRY (data->group3), NULL, NULL) == TRUE); - g_object_unref (data->group3); - - uhm_server_end_trace (mock_server); -} - -static void -test_query_all_groups (QueryAllGroupsData *data, gconstpointer service) -{ - GDataFeed *feed; - GError *error = NULL; - - gdata_test_mock_server_start_trace (mock_server, "query-all-groups"); - - feed = gdata_contacts_service_query_groups (GDATA_CONTACTS_SERVICE (service), NULL, NULL, NULL, NULL, &error); - g_assert_no_error (error); - g_assert (GDATA_IS_FEED (feed)); - g_clear_error (&error); - - /* TODO: check entries, kinds and feed properties */ - - g_object_unref (feed); - - uhm_server_end_trace (mock_server); -} - -GDATA_ASYNC_CLOSURE_FUNCTIONS (query_all_groups, QueryAllGroupsData); - -GDATA_ASYNC_TEST_FUNCTIONS (query_all_groups, QueryAllGroupsData, -G_STMT_START { - gdata_contacts_service_query_groups_async (GDATA_CONTACTS_SERVICE (service), NULL, cancellable, NULL, NULL, NULL, - async_ready_callback, async_data); -} G_STMT_END, -G_STMT_START { - GDataFeed *feed; - - feed = gdata_service_query_finish (GDATA_SERVICE (obj), async_result, &error); - - if (error == NULL) { - g_assert (GDATA_IS_FEED (feed)); - /* TODO: Tests? */ - - g_object_unref (feed); - } else { - g_assert (feed == NULL); - } -} G_STMT_END); - -static void -test_query_all_groups_async_progress_closure (QueryAllGroupsData *query_data, gconstpointer service) -{ - GDataAsyncProgressClosure *data = g_slice_new0 (GDataAsyncProgressClosure); - - gdata_test_mock_server_start_trace (mock_server, "query-all-groups-async-progress-closure"); - - data->main_loop = g_main_loop_new (NULL, TRUE); - - gdata_contacts_service_query_groups_async (GDATA_CONTACTS_SERVICE (service), NULL, NULL, - (GDataQueryProgressCallback) gdata_test_async_progress_callback, - data, (GDestroyNotify) gdata_test_async_progress_closure_free, - (GAsyncReadyCallback) gdata_test_async_progress_finish_callback, data); - - g_main_loop_run (data->main_loop); - g_main_loop_unref (data->main_loop); - - /* Check that both callbacks were called exactly once */ - g_assert_cmpuint (data->progress_destroy_notify_count, ==, 1); - g_assert_cmpuint (data->async_ready_notify_count, ==, 1); - - g_slice_free (GDataAsyncProgressClosure, data); - - uhm_server_end_trace (mock_server); -} - -typedef struct { - GDataContactsGroup *new_group; -} InsertGroupData; - -static void -set_up_insert_group (InsertGroupData *data, gconstpointer service) -{ - data->new_group = NULL; -} - -static void -tear_down_insert_group (InsertGroupData *data, gconstpointer service) -{ - /* HACK! Distributed systems suck. */ - if (uhm_server_get_enable_online (mock_server) == TRUE) { - sleep (10); - } - - gdata_test_mock_server_start_trace (mock_server, "teardown-insert-group"); - - /* Delete the group, just to be tidy */ - g_assert (gdata_service_delete_entry (GDATA_SERVICE (service), gdata_contacts_service_get_primary_authorization_domain (), - GDATA_ENTRY (data->new_group), NULL, NULL) == TRUE); - g_object_unref (data->new_group); - - uhm_server_end_trace (mock_server); -} - -static void -test_group_insert (InsertGroupData *data, gconstpointer service) -{ - GDataContactsGroup *group, *new_group; - gint64 time_val; - GHashTable *properties; - GError *error = NULL; - - gdata_test_mock_server_start_trace (mock_server, "group-insert"); - - time_val = g_get_real_time () / G_USEC_PER_SEC; - - group = gdata_contacts_group_new (NULL); - - /* Check the kind is present and correct */ - g_assert (GDATA_IS_CONTACTS_GROUP (group)); - gdata_test_compare_kind (GDATA_ENTRY (group), "http://schemas.google.com/contact/2008#group", NULL); - - /* Set various properties */ - gdata_entry_set_title (GDATA_ENTRY (group), "New Group!"); - g_assert (gdata_contacts_group_set_extended_property (group, "foobar", "barfoo") == TRUE); - - /* Insert the group */ - new_group = data->new_group = gdata_contacts_service_insert_group (GDATA_CONTACTS_SERVICE (service), group, NULL, &error); - g_assert_no_error (error); - g_assert (GDATA_IS_CONTACTS_GROUP (new_group)); - gdata_test_compare_kind (GDATA_ENTRY (new_group), "http://schemas.google.com/contact/2008#group", NULL); - g_clear_error (&error); - - /* Check the properties. Time-based properties can't be checked when running against a mock server, since - * the trace files may be quite old. */ - if (uhm_server_get_enable_online (mock_server) == TRUE) { - g_assert_cmpint (gdata_contacts_group_get_edited (new_group), >=, time_val); - } - g_assert (gdata_contacts_group_is_deleted (new_group) == FALSE); - g_assert (gdata_contacts_group_get_system_group_id (new_group) == NULL); - - properties = gdata_contacts_group_get_extended_properties (new_group); - g_assert (properties != NULL); - g_assert_cmpint (g_hash_table_size (properties), ==, 1); - g_assert_cmpstr (gdata_contacts_group_get_extended_property (new_group, "foobar"), ==, "barfoo"); - - g_object_unref (group); - - uhm_server_end_trace (mock_server); -} - -GDATA_ASYNC_CLOSURE_FUNCTIONS (insert_group, InsertGroupData); - -GDATA_ASYNC_TEST_FUNCTIONS (group_insert, InsertGroupData, -G_STMT_START { - GDataContactsGroup *group; - - group = gdata_contacts_group_new (NULL); - - /* Check the kind is present and correct */ - g_assert (GDATA_IS_CONTACTS_GROUP (group)); - gdata_test_compare_kind (GDATA_ENTRY (group), "http://schemas.google.com/contact/2008#group", NULL); - - /* Set various properties */ - gdata_entry_set_title (GDATA_ENTRY (group), "New Group!"); - g_assert (gdata_contacts_group_set_extended_property (group, "foobar", "barfoo") == TRUE); - - gdata_contacts_service_insert_group_async (GDATA_CONTACTS_SERVICE (service), group, cancellable, async_ready_callback, async_data); - - g_object_unref (group); -} G_STMT_END, -G_STMT_START { - GDataEntry *entry; - - entry = gdata_service_insert_entry_finish (GDATA_SERVICE (obj), async_result, &error); - - if (error == NULL) { - g_assert (GDATA_IS_CONTACTS_GROUP (entry)); - /* TODO: Tests? */ - - data->new_group = GDATA_CONTACTS_GROUP (entry); - } else { - g_assert (entry == NULL); - } -} G_STMT_END); - -static void -test_contact_properties (void) -{ - GDataContactsContact *contact; - GDataGDName *name, *name2; - GDataGDEmailAddress *email_address1, *email_address2; - GDataGDPhoneNumber *phone_number1, *phone_number2; - GDataGDIMAddress *im_address; - GDataGDOrganization *org; - GDataGDPostalAddress *postal_address; - GDataGContactJot *jot; - GDataGContactRelation *relation; - GDataGContactWebsite *website; - GDataGContactEvent *event; - GDataGContactCalendar *calendar; - GDataGContactExternalID *external_id; - GDataGContactLanguage *language; - gchar *nickname, *file_as, *billing_information, *directory_server, *gender, *initials, *maiden_name, *mileage, *occupation; - gchar *priority, *sensitivity, *short_name, *subject, *photo_etag; - GDate date, *date2; - gint64 current_time; - gint64 edited; - gboolean deleted, birthday_has_year; - - contact = gdata_contacts_contact_new (NULL); - current_time = g_get_real_time () / G_USEC_PER_SEC; - - /* Check the kind is present and correct */ - g_assert (GDATA_IS_CONTACTS_CONTACT (contact)); - gdata_test_compare_kind (GDATA_ENTRY (contact), "http://schemas.google.com/contact/2008#contact", NULL); - - /* Set and check the name (to check if the title of the entry is updated) */ - gdata_entry_set_title (GDATA_ENTRY (contact), "Elizabeth Bennet"); - name = gdata_contacts_contact_get_name (contact); - g_assert_cmpstr (gdata_gd_name_get_full_name (name), ==, "Elizabeth Bennet"); - gdata_gd_name_set_full_name (name, "Lizzie Bennet"); - g_assert_cmpstr (gdata_entry_get_title (GDATA_ENTRY (contact)), ==, "Lizzie Bennet"); - - name2 = gdata_gd_name_new ("John", "Smith"); - gdata_gd_name_set_full_name (name2, "John Smith"); - gdata_contacts_contact_set_name (contact, name2); - g_object_unref (name2); - g_assert_cmpstr (gdata_entry_get_title (GDATA_ENTRY (contact)), ==, "John Smith"); - - gdata_contacts_contact_set_nickname (contact, "Big J"); - gdata_contacts_contact_set_file_as (contact, "J, Big"); - g_date_set_dmy (&date, 1, 1, 1900); - gdata_contacts_contact_set_birthday (contact, &date, FALSE); - gdata_entry_set_content (GDATA_ENTRY (contact), "Notes"); - gdata_contacts_contact_set_billing_information (contact, "Big J Enterprises, Ltd."); - gdata_contacts_contact_set_directory_server (contact, "This is a server"); - gdata_contacts_contact_set_gender (contact, GDATA_CONTACTS_GENDER_MALE); - gdata_contacts_contact_set_initials (contact, "A. B. C."); - gdata_contacts_contact_set_maiden_name (contact, "Smith"); - gdata_contacts_contact_set_mileage (contact, "12km"); - gdata_contacts_contact_set_occupation (contact, "Professional bum"); - gdata_contacts_contact_set_priority (contact, GDATA_CONTACTS_PRIORITY_HIGH); - gdata_contacts_contact_set_sensitivity (contact, GDATA_CONTACTS_SENSITIVITY_PERSONAL); - gdata_contacts_contact_set_short_name (contact, "Jon"); - gdata_contacts_contact_set_subject (contact, "Charity work"); - - email_address1 = gdata_gd_email_address_new ("liz@gmail.com", GDATA_GD_EMAIL_ADDRESS_WORK, NULL, FALSE); - gdata_contacts_contact_add_email_address (contact, email_address1); - g_object_unref (email_address1); - - email_address2 = gdata_gd_email_address_new ("liz@example.org", GDATA_GD_EMAIL_ADDRESS_HOME, NULL, FALSE); - gdata_contacts_contact_add_email_address (contact, email_address2); - g_object_unref (email_address2); - - phone_number1 = gdata_gd_phone_number_new ("(206)555-1212", GDATA_GD_PHONE_NUMBER_WORK, NULL, NULL, TRUE); - gdata_contacts_contact_add_phone_number (contact, phone_number1); - g_object_unref (phone_number1); - - phone_number2 = gdata_gd_phone_number_new ("(206)555-1213", GDATA_GD_PHONE_NUMBER_HOME, NULL, NULL, FALSE); - gdata_contacts_contact_add_phone_number (contact, phone_number2); - g_object_unref (phone_number2); - - im_address = gdata_gd_im_address_new ("liz@gmail.com", GDATA_GD_IM_PROTOCOL_GOOGLE_TALK, GDATA_GD_IM_ADDRESS_HOME, NULL, FALSE); - gdata_contacts_contact_add_im_address (contact, im_address); - g_object_unref (im_address); - - postal_address = gdata_gd_postal_address_new (GDATA_GD_POSTAL_ADDRESS_WORK, NULL, TRUE); - gdata_gd_postal_address_set_street (postal_address, "1600 Amphitheatre Pkwy Mountain View"); - gdata_contacts_contact_add_postal_address (contact, postal_address); - g_object_unref (postal_address); - - org = gdata_gd_organization_new ("OrgCorp", "President", GDATA_GD_ORGANIZATION_WORK, NULL, FALSE); - gdata_contacts_contact_add_organization (contact, org); - g_object_unref (org); - - jot = gdata_gcontact_jot_new ("This is a jot.", GDATA_GCONTACT_JOT_OTHER); - gdata_contacts_contact_add_jot (contact, jot); - g_object_unref (jot); - - relation = gdata_gcontact_relation_new ("Brian Haddock", GDATA_GCONTACT_RELATION_FRIEND, NULL); - gdata_contacts_contact_add_relation (contact, relation); - g_object_unref (relation); - - website = gdata_gcontact_website_new ("http://example.com/", GDATA_GCONTACT_WEBSITE_PROFILE, NULL, TRUE); - gdata_contacts_contact_add_website (contact, website); - g_object_unref (website); - - event = gdata_gcontact_event_new (&date, GDATA_GCONTACT_EVENT_ANNIVERSARY, NULL); - gdata_contacts_contact_add_event (contact, event); - g_object_unref (event); - - calendar = gdata_gcontact_calendar_new ("http://calendar.example.com/", GDATA_GCONTACT_CALENDAR_HOME, NULL, TRUE); - gdata_contacts_contact_add_calendar (contact, calendar); - g_object_unref (calendar); - - external_id = gdata_gcontact_external_id_new ("Number Six", GDATA_GCONTACT_EXTERNAL_ID_ORGANIZATION, NULL); - gdata_contacts_contact_add_external_id (contact, external_id); - g_object_unref (external_id); - - gdata_contacts_contact_add_hobby (contact, "Rowing"); - - language = gdata_gcontact_language_new ("en-GB", NULL); - gdata_contacts_contact_add_language (contact, language); - g_object_unref (language); - - /* Add some extended properties */ - g_assert (gdata_contacts_contact_set_extended_property (contact, "TITLE", NULL) == TRUE); - g_assert (gdata_contacts_contact_set_extended_property (contact, "ROLE", "") == TRUE); - g_assert (gdata_contacts_contact_set_extended_property (contact, "CALURI", "http://example.com/") == TRUE); - - /* Add some user-defined fields */ - gdata_contacts_contact_set_user_defined_field (contact, "Favourite colour", "Blue"); - gdata_contacts_contact_set_user_defined_field (contact, "Owes me", "£10"); - gdata_contacts_contact_set_user_defined_field (contact, "My notes", ""); - gdata_contacts_contact_set_user_defined_field (contact, "", "Foo"); /* bgo#648058 */ - - /* Check the properties of the object */ - g_object_get (G_OBJECT (contact), - "edited", &edited, - "deleted", &deleted, - "photo-etag", &photo_etag, - "name", &name, - "nickname", &nickname, - "file-as", &file_as, - "birthday", &date2, - "birthday-has-year", &birthday_has_year, - "billing-information", &billing_information, - "directory-server", &directory_server, - "gender", &gender, - "initials", &initials, - "maiden-name", &maiden_name, - "mileage", &mileage, - "occupation", &occupation, - "priority", &priority, - "sensitivity", &sensitivity, - "short-name", &short_name, - "subject", &subject, - NULL); - - g_assert_cmpint (edited, ==, current_time); - g_assert (deleted == FALSE); - g_assert (photo_etag == NULL); - g_assert (name2 == name); - g_assert_cmpstr (nickname, ==, "Big J"); - g_assert_cmpstr (file_as, ==, "J, Big"); - g_assert (g_date_valid (date2) == TRUE); - g_assert_cmpuint (g_date_get_month (date2), ==, 1); - g_assert_cmpuint (g_date_get_day (date2), ==, 1); - g_assert (birthday_has_year == FALSE); - g_assert_cmpstr (billing_information, ==, "Big J Enterprises, Ltd."); - g_assert_cmpstr (directory_server, ==, "This is a server"); - g_assert_cmpstr (gender, ==, GDATA_CONTACTS_GENDER_MALE); - g_assert_cmpstr (initials, ==, "A. B. C."); - g_assert_cmpstr (maiden_name, ==, "Smith"); - g_assert_cmpstr (mileage, ==, "12km"); - g_assert_cmpstr (occupation, ==, "Professional bum"); - g_assert_cmpstr (priority, ==, GDATA_CONTACTS_PRIORITY_HIGH); - g_assert_cmpstr (sensitivity, ==, GDATA_CONTACTS_SENSITIVITY_PERSONAL); - g_assert_cmpstr (short_name, ==, "Jon"); - g_assert_cmpstr (subject, ==, "Charity work"); - - g_object_unref (name2); - g_free (date2); - g_free (nickname); - g_free (file_as); - g_free (billing_information); - g_free (directory_server); - g_free (gender); - g_free (initials); - g_free (maiden_name); - g_free (mileage); - g_free (occupation); - g_free (priority); - g_free (sensitivity); - g_free (short_name); - g_free (subject); - g_free (photo_etag); - - /* Check the XML */ - gdata_test_assert_xml (contact, - "<?xml version='1.0' encoding='UTF-8'?>" - "<entry xmlns='http://www.w3.org/2005/Atom' " - "xmlns:gd='http://schemas.google.com/g/2005' " - "xmlns:app='http://www.w3.org/2007/app' " - "xmlns:gContact='http://schemas.google.com/contact/2008'>" - "<title type='text'>John Smith</title>" - "<content type='text'>Notes</content>" - "<category term='http://schemas.google.com/contact/2008#contact' scheme='http://schemas.google.com/g/2005#kind'/>" - "<gd:name>" - "<gd:givenName>John</gd:givenName>" - "<gd:familyName>Smith</gd:familyName>" - "<gd:fullName>John Smith</gd:fullName>" - "</gd:name>" - "<gd:email address='liz@gmail.com' rel='http://schemas.google.com/g/2005#work' primary='false'/>" - "<gd:email address='liz@example.org' rel='http://schemas.google.com/g/2005#home' primary='false'/>" - "<gd:im address='liz@gmail.com' protocol='http://schemas.google.com/g/2005#GOOGLE_TALK' " - "rel='http://schemas.google.com/g/2005#home' primary='false'/>" - "<gd:phoneNumber rel='http://schemas.google.com/g/2005#work' primary='true'>(206)555-1212</gd:phoneNumber>" - "<gd:phoneNumber rel='http://schemas.google.com/g/2005#home' primary='false'>(206)555-1213</gd:phoneNumber>" - "<gd:structuredPostalAddress rel='http://schemas.google.com/g/2005#work' primary='true'>" - "<gd:street>1600 Amphitheatre Pkwy Mountain View</gd:street>" - "</gd:structuredPostalAddress>" - "<gd:organization rel='http://schemas.google.com/g/2005#work' primary='false'>" - "<gd:orgName>OrgCorp</gd:orgName>" - "<gd:orgTitle>President</gd:orgTitle>" - "</gd:organization>" - "<gContact:jot rel='other'>This is a jot.</gContact:jot>" - "<gContact:relation rel='friend'>Brian Haddock</gContact:relation>" - "<gContact:website href='http://example.com/' rel='profile' primary='true'/>" - "<gContact:event rel='anniversary'><gd:when startTime='1900-01-01'/></gContact:event>" - "<gContact:calendarLink href='http://calendar.example.com/' rel='home' primary='true'/>" - "<gContact:externalId value='Number Six' rel='organization'/>" - "<gContact:language code='en-GB'/>" - "<gd:extendedProperty name='CALURI'>http://example.com/</gd:extendedProperty>" - "<gContact:userDefinedField key='Favourite colour' value='Blue'/>" - "<gContact:userDefinedField key='Owes me' value='£10'/>" - "<gContact:userDefinedField key='My notes' value=''/>" - "<gContact:userDefinedField key='' value='Foo'/>" /* bgo#648058 */ - "<gContact:hobby>Rowing</gContact:hobby>" - "<gContact:nickname>Big J</gContact:nickname>" - "<gContact:fileAs>J, Big</gContact:fileAs>" - "<gContact:birthday when='--01-01'/>" - "<gContact:billingInformation>Big J Enterprises, Ltd.</gContact:billingInformation>" - "<gContact:directoryServer>This is a server</gContact:directoryServer>" - "<gContact:gender value='male'/>" - "<gContact:initials>A. B. C.</gContact:initials>" - "<gContact:maidenName>Smith</gContact:maidenName>" - "<gContact:mileage>12km</gContact:mileage>" - "<gContact:occupation>Professional bum</gContact:occupation>" - "<gContact:priority rel='high'/>" - "<gContact:sensitivity rel='personal'/>" - "<gContact:shortName>Jon</gContact:shortName>" - "<gContact:subject>Charity work</gContact:subject>" - "</entry>"); - - /* Try removing some things from the contact and ensure it works */ - gdata_contacts_contact_remove_all_email_addresses (contact); - g_assert (gdata_contacts_contact_get_email_addresses (contact) == NULL); - g_assert (gdata_contacts_contact_get_primary_email_address (contact) == NULL); - - gdata_contacts_contact_remove_all_im_addresses (contact); - g_assert (gdata_contacts_contact_get_im_addresses (contact) == NULL); - g_assert (gdata_contacts_contact_get_primary_im_address (contact) == NULL); - - gdata_contacts_contact_remove_all_phone_numbers (contact); - g_assert (gdata_contacts_contact_get_phone_numbers (contact) == NULL); - g_assert (gdata_contacts_contact_get_primary_phone_number (contact) == NULL); - - gdata_contacts_contact_remove_all_postal_addresses (contact); - g_assert (gdata_contacts_contact_get_postal_addresses (contact) == NULL); - g_assert (gdata_contacts_contact_get_primary_postal_address (contact) == NULL); - - gdata_contacts_contact_remove_all_organizations (contact); - g_assert (gdata_contacts_contact_get_organizations (contact) == NULL); - g_assert (gdata_contacts_contact_get_primary_organization (contact) == NULL); - - gdata_contacts_contact_remove_all_jots (contact); - g_assert (gdata_contacts_contact_get_jots (contact) == NULL); - - gdata_contacts_contact_remove_all_relations (contact); - g_assert (gdata_contacts_contact_get_relations (contact) == NULL); - - gdata_contacts_contact_remove_all_websites (contact); - g_assert (gdata_contacts_contact_get_websites (contact) == NULL); - g_assert (gdata_contacts_contact_get_primary_website (contact) == NULL); - - gdata_contacts_contact_remove_all_events (contact); - g_assert (gdata_contacts_contact_get_events (contact) == NULL); - - gdata_contacts_contact_remove_all_calendars (contact); - g_assert (gdata_contacts_contact_get_calendars (contact) == NULL); - g_assert (gdata_contacts_contact_get_primary_calendar (contact) == NULL); - - gdata_contacts_contact_remove_all_external_ids (contact); - g_assert (gdata_contacts_contact_get_external_ids (contact) == NULL); - - gdata_contacts_contact_remove_all_languages (contact); - g_assert (gdata_contacts_contact_get_languages (contact) == NULL); - - gdata_contacts_contact_remove_all_hobbies (contact); - g_assert (gdata_contacts_contact_get_hobbies (contact) == NULL); -} - -static void -test_contact_escaping (void) -{ - GDataContactsContact *contact; - - contact = gdata_contacts_contact_new (NULL); - gdata_contacts_contact_set_nickname (contact, "Nickname & stuff"); - gdata_contacts_contact_set_file_as (contact, "Stuff, & Nickname"); - gdata_contacts_contact_set_billing_information (contact, "Billing information & stuff"); - gdata_contacts_contact_set_directory_server (contact, "http://foo.com?foo&bar"); - gdata_contacts_contact_set_gender (contact, "Misc. & other"); - gdata_contacts_contact_set_initials (contact, "<AB>"); - gdata_contacts_contact_set_maiden_name (contact, "Maiden & name"); - gdata_contacts_contact_set_mileage (contact, "Over the hills & far away"); - gdata_contacts_contact_set_occupation (contact, "Occupation & stuff"); - gdata_contacts_contact_set_priority (contact, "http://foo.com?foo&priority=bar"); - gdata_contacts_contact_set_sensitivity (contact, "http://foo.com?foo&sensitivity=bar"); - gdata_contacts_contact_set_short_name (contact, "Short name & stuff"); - gdata_contacts_contact_set_subject (contact, "Subject & stuff"); - gdata_contacts_contact_add_hobby (contact, "Escaping &s"); - gdata_contacts_contact_set_extended_property (contact, "extended & prop", "<unescaped>Value should be a pre-escaped XML blob.</unescaped>"); - gdata_contacts_contact_set_user_defined_field (contact, "User defined field & stuff", "Value & stuff"); - gdata_contacts_contact_add_group (contact, "http://foo.com?foo&bar"); - - /* Check the outputted XML is escaped properly */ - gdata_test_assert_xml (contact, - "<?xml version='1.0' encoding='UTF-8'?>" - "<entry xmlns='http://www.w3.org/2005/Atom' xmlns:gd='http://schemas.google.com/g/2005' " - "xmlns:app='http://www.w3.org/2007/app' xmlns:gContact='http://schemas.google.com/contact/2008'>" - "<title type='text'></title>" - "<category term='http://schemas.google.com/contact/2008#contact' scheme='http://schemas.google.com/g/2005#kind'/>" - "<gd:name/>" - "<gd:extendedProperty name='extended & prop'>" - "<unescaped>Value should be a pre-escaped XML blob.</unescaped>" - "</gd:extendedProperty>" - "<gContact:userDefinedField key='User defined field & stuff' value='Value & stuff'/>" - "<gContact:groupMembershipInfo href='http://foo.com?foo&bar'/>" - "<gContact:hobby>Escaping &s</gContact:hobby>" - "<gContact:nickname>Nickname & stuff</gContact:nickname>" - "<gContact:fileAs>Stuff, & Nickname</gContact:fileAs>" - "<gContact:billingInformation>Billing information & stuff</gContact:billingInformation>" - "<gContact:directoryServer>http://foo.com?foo&bar</gContact:directoryServer>" - "<gContact:gender value='Misc. & other'/>" - "<gContact:initials><AB></gContact:initials>" - "<gContact:maidenName>Maiden & name</gContact:maidenName>" - "<gContact:mileage>Over the hills & far away</gContact:mileage>" - "<gContact:occupation>Occupation & stuff</gContact:occupation>" - "<gContact:priority rel='http://foo.com?foo&priority=bar'/>" - "<gContact:sensitivity rel='http://foo.com?foo&sensitivity=bar'/>" - "<gContact:shortName>Short name & stuff</gContact:shortName>" - "<gContact:subject>Subject & stuff</gContact:subject>" - "</entry>"); - g_object_unref (contact); -} - -static void -test_group_escaping (void) -{ - GDataContactsGroup *group; - - group = gdata_contacts_group_new (NULL); - gdata_contacts_group_set_extended_property (group, "extended & prop", "<unescaped>Value should be a pre-escaped XML blob.</unescaped>"); - - /* Check the outputted XML is escaped properly */ - gdata_test_assert_xml (group, - "<?xml version='1.0' encoding='UTF-8'?>" - "<entry xmlns='http://www.w3.org/2005/Atom' xmlns:gd='http://schemas.google.com/g/2005' " - "xmlns:app='http://www.w3.org/2007/app' xmlns:gContact='http://schemas.google.com/contact/2008'>" - "<title type='text'></title>" - "<category term='http://schemas.google.com/contact/2008#group' scheme='http://schemas.google.com/g/2005#kind'/>" - "<gd:extendedProperty name='extended & prop'>" - "<unescaped>Value should be a pre-escaped XML blob.</unescaped>" - "</gd:extendedProperty>" - "</entry>"); - g_object_unref (group); -} - -static void -test_query_uri (void) -{ - gchar *query_uri; - GDataContactsQuery *query = gdata_contacts_query_new ("q"); - - gdata_contacts_query_set_order_by (query, "lastmodified"); - g_assert_cmpstr (gdata_contacts_query_get_order_by (query), ==, "lastmodified"); - - gdata_contacts_query_set_show_deleted (query, FALSE); - g_assert (gdata_contacts_query_show_deleted (query) == FALSE); - - /* Test it with both values of show-deleted */ - query_uri = gdata_query_get_query_uri (GDATA_QUERY (query), "http://example.com"); - g_assert_cmpstr (query_uri, ==, "http://example.com?q=q&orderby=lastmodified&showdeleted=false"); - g_free (query_uri); - - gdata_contacts_query_set_show_deleted (query, TRUE); - g_assert (gdata_contacts_query_show_deleted (query) == TRUE); - - gdata_contacts_query_set_sort_order (query, "descending"); - g_assert_cmpstr (gdata_contacts_query_get_sort_order (query), ==, "descending"); - - gdata_contacts_query_set_group (query, "http://www.google.com/feeds/contacts/groups/jo@gmail.com/base/1234a"); - g_assert_cmpstr (gdata_contacts_query_get_group (query), ==, "http://www.google.com/feeds/contacts/groups/jo@gmail.com/base/1234a"); - - /* Check the built query URI with a normal feed URI */ - query_uri = gdata_query_get_query_uri (GDATA_QUERY (query), "http://example.com"); - g_assert_cmpstr (query_uri, ==, "http://example.com?q=q&orderby=lastmodified&showdeleted=true&sortorder=descending" - "&group=http%3A%2F%2Fwww.google.com%2Ffeeds%2Fcontacts%2Fgroups%2Fjo%40gmail.com%2Fbase%2F1234a"); - g_free (query_uri); - - /* …with a feed URI with a trailing slash */ - query_uri = gdata_query_get_query_uri (GDATA_QUERY (query), "http://example.com/"); - g_assert_cmpstr (query_uri, ==, "http://example.com/?q=q&orderby=lastmodified&showdeleted=true&sortorder=descending" - "&group=http%3A%2F%2Fwww.google.com%2Ffeeds%2Fcontacts%2Fgroups%2Fjo%40gmail.com%2Fbase%2F1234a"); - g_free (query_uri); - - /* …with a feed URI with pre-existing arguments */ - query_uri = gdata_query_get_query_uri (GDATA_QUERY (query), "http://example.com/bar/?test=test&this=that"); - g_assert_cmpstr (query_uri, ==, "http://example.com/bar/?test=test&this=that&q=q&orderby=lastmodified&showdeleted=true&sortorder=descending" - "&group=http%3A%2F%2Fwww.google.com%2Ffeeds%2Fcontacts%2Fgroups%2Fjo%40gmail.com%2Fbase%2F1234a"); - g_free (query_uri); - - g_object_unref (query); -} - -static void -test_query_etag (void) -{ - GDataContactsQuery *query = gdata_contacts_query_new (NULL); - - /* Test that setting any property will unset the ETag */ - g_test_bug ("613529"); - -#define CHECK_ETAG(C) \ - gdata_query_set_etag (GDATA_QUERY (query), "foobar"); \ - (C); \ - g_assert (gdata_query_get_etag (GDATA_QUERY (query)) == NULL); - - CHECK_ETAG (gdata_contacts_query_set_order_by (query, "foobar")) - CHECK_ETAG (gdata_contacts_query_set_show_deleted (query, FALSE)) - CHECK_ETAG (gdata_contacts_query_set_sort_order (query, "shizzle")) - CHECK_ETAG (gdata_contacts_query_set_group (query, "support group")) - -#undef CHECK_ETAG - - g_object_unref (query); -} - -static void -test_query_properties (void) -{ - gchar *order_by, *sort_order, *group; - gboolean show_deleted; - guint start_index, max_results; - GDataContactsQuery *query = gdata_contacts_query_new_with_limits ("q", 1, 10); - - /* Set the properties */ - g_object_set (G_OBJECT (query), - "order-by", "lastmodified", - "show-deleted", TRUE, - "sort-order", "descending", - "group", "http://www.google.com/feeds/contacts/groups/jo@gmail.com/base/1234a", - NULL); - - /* Check the query's properties */ - g_object_get (G_OBJECT (query), - "order-by", &order_by, - "show-deleted", &show_deleted, - "sort-order", &sort_order, - "group", &group, - "start-index", &start_index, - "max-results", &max_results, - NULL); - - g_assert_cmpstr (order_by, ==, "lastmodified"); - g_assert (show_deleted == TRUE); - g_assert_cmpstr (sort_order, ==, "descending"); - g_assert_cmpstr (group, ==, "http://www.google.com/feeds/contacts/groups/jo@gmail.com/base/1234a"); - g_assert_cmpuint (start_index, ==, 1); - g_assert_cmpuint (max_results, ==, 10); - - g_free (order_by); - g_free (sort_order); - g_free (group); - - g_object_unref (query); -} - -static void -test_contact_parser_minimal (void) -{ - GDataContactsContact *contact; - GDate birthday; - GError *error = NULL; - - g_test_bug ("580330"); - - contact = GDATA_CONTACTS_CONTACT (gdata_parsable_new_from_xml (GDATA_TYPE_CONTACTS_CONTACT, - "<entry xmlns='http://www.w3.org/2005/Atom' " - "xmlns:gd='http://schemas.google.com/g/2005' " - "gd:etag='"QngzcDVSLyp7ImA9WxJTFkoITgU."'>" - "<id>http://www.google.com/m8/feeds/contacts/libgdata.test@googlemail.com/base/1b46cdd20bfbee3b</id>" - "<updated>2009-04-25T15:21:53.688Z</updated>" - "<app:edited xmlns:app='http://www.w3.org/2007/app'>2009-04-25T15:21:53.688Z</app:edited>" - "<category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/contact/2008#contact'/>" - "<title></title>" /* Here's where it all went wrong */ - "<link rel='http://schemas.google.com/contacts/2008/rel#photo' type='image/*' " - "href='http://www.google.com/m8/feeds/photos/media/libgdata.test@googlemail.com/1b46cdd20bfbee3b'/>" - "<link rel='http://www.iana.org/assignments/relation/self' type='application/atom+xml' " - "href='http://www.google.com/m8/feeds/contacts/libgdata.test@googlemail.com/full/1b46cdd20bfbee3b'/>" - "<link rel='http://www.iana.org/assignments/relation/edit' type='application/atom+xml' " - "href='http://www.google.com/m8/feeds/contacts/libgdata.test@googlemail.com/full/1b46cdd20bfbee3b'/>" - "<gd:email rel='http://schemas.google.com/g/2005#other' address='bob@example.com'/>" - "</entry>", -1, &error)); - g_assert_no_error (error); - g_assert (GDATA_IS_CONTACTS_CONTACT (contact)); - gdata_test_compare_kind (GDATA_ENTRY (contact), "http://schemas.google.com/contact/2008#contact", NULL); - g_clear_error (&error); - - /* Check the contact's properties */ - g_assert (gdata_entry_get_title (GDATA_ENTRY (contact)) != NULL); - g_assert (*gdata_entry_get_title (GDATA_ENTRY (contact)) == '\0'); - - /* TODO: Check the other properties */ - - g_assert (gdata_contacts_contact_get_nickname (contact) == NULL); - g_assert (gdata_contacts_contact_get_file_as (contact) == NULL); - g_assert (gdata_contacts_contact_get_birthday (contact, &birthday) == FALSE); - g_assert (g_date_valid (&birthday) == FALSE); - g_assert (gdata_contacts_contact_get_billing_information (contact) == NULL); - g_assert (gdata_contacts_contact_get_directory_server (contact) == NULL); - g_assert (gdata_contacts_contact_get_gender (contact) == NULL); - g_assert (gdata_contacts_contact_get_initials (contact) == NULL); - g_assert (gdata_contacts_contact_get_maiden_name (contact) == NULL); - g_assert (gdata_contacts_contact_get_mileage (contact) == NULL); - g_assert (gdata_contacts_contact_get_occupation (contact) == NULL); - g_assert (gdata_contacts_contact_get_priority (contact) == NULL); - g_assert (gdata_contacts_contact_get_sensitivity (contact) == NULL); - g_assert (gdata_contacts_contact_get_short_name (contact) == NULL); - g_assert (gdata_contacts_contact_get_subject (contact) == NULL); - g_assert (gdata_contacts_contact_get_jots (contact) == NULL); - g_assert (gdata_contacts_contact_get_relations (contact) == NULL); - g_assert (gdata_contacts_contact_get_websites (contact) == NULL); - g_assert (gdata_contacts_contact_get_primary_website (contact) == NULL); - g_assert (gdata_contacts_contact_get_events (contact) == NULL); - g_assert (gdata_contacts_contact_get_calendars (contact) == NULL); - g_assert (gdata_contacts_contact_get_primary_calendar (contact) == NULL); - g_assert (gdata_contacts_contact_get_external_ids (contact) == NULL); - g_assert (gdata_contacts_contact_get_languages (contact) == NULL); - g_assert (gdata_contacts_contact_get_hobbies (contact) == NULL); - - g_object_unref (contact); -} - -static void -test_contact_parser_normal (void) -{ - GDataContactsContact *contact; - GDate date; - GList *list; - GError *error = NULL; - - contact = GDATA_CONTACTS_CONTACT (gdata_parsable_new_from_xml (GDATA_TYPE_CONTACTS_CONTACT, - "<entry xmlns='http://www.w3.org/2005/Atom' " - "xmlns:gd='http://schemas.google.com/g/2005' " - "xmlns:gContact='http://schemas.google.com/contact/2008' " - "gd:etag='"QngzcDVSLyp7ImA9WxJTFkoITgU."'>" - "<id>http://www.google.com/m8/feeds/contacts/libgdata.test@googlemail.com/base/1b46cdd20bfbee3b</id>" - "<updated>2009-04-25T15:21:53.688Z</updated>" - "<app:edited xmlns:app='http://www.w3.org/2007/app'>2009-04-25T15:21:53.688Z</app:edited>" - "<category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/contact/2008#contact'/>" - "<title></title>" /* Here's where it all went wrong */ - "<link rel='http://schemas.google.com/contacts/2008/rel#photo' type='image/*' " - "href='http://www.google.com/m8/feeds/photos/media/libgdata.test@googlemail.com/1b46cdd20bfbee3b'/>" - "<link rel='http://www.iana.org/assignments/relation/self' type='application/atom+xml' " - "href='http://www.google.com/m8/feeds/contacts/libgdata.test@googlemail.com/full/1b46cdd20bfbee3b'/>" - "<link rel='http://www.iana.org/assignments/relation/edit' type='application/atom+xml' " - "href='http://www.google.com/m8/feeds/contacts/libgdata.test@googlemail.com/full/1b46cdd20bfbee3b'/>" - "<gd:email rel='http://schemas.google.com/g/2005#other' address='bob@example.com'/>" - "<gd:email rel='http://schemas.google.com/g/2005#other' address=''/>" /* https://bugzilla.gnome.org/show_bug.cgi?id=734863 */ - "<gd:extendedProperty name='test' value='test value'/>" - "<gd:organization rel='http://schemas.google.com/g/2005#work' label='Work' primary='true'/>" - "<gContact:groupMembershipInfo href='http://www.google.com/feeds/contacts/groups/jo%40gmail.com/base/1234a' " - "deleted='true'/>" - "<gContact:groupMembershipInfo href='http://www.google.com/feeds/contacts/groups/jo%40gmail.com/base/1234b'/>" - "<gd:deleted/>" - "<gContact:nickname>Agent Smith</gContact:nickname>" - "<gContact:fileAs>Smith, Agent</gContact:fileAs>" - "<gContact:birthday when='2010-12-03'/>" - "<gContact:billingInformation>Foo & Bar Inc.</gContact:billingInformation>" - "<gContact:directoryServer>Directory & server</gContact:directoryServer>" - "<gContact:gender value='female'/>" - "<gContact:initials>X. Y. Z.</gContact:initials>" - "<gContact:maidenName>Foo</gContact:maidenName>" - "<gContact:mileage>15km</gContact:mileage>" - "<gContact:occupation>Occupied</gContact:occupation>" - "<gContact:priority rel='low'/>" - "<gContact:sensitivity rel='confidential'/>" - "<gContact:shortName>Smith</gContact:shortName>" - "<gContact:subject>Film buddy</gContact:subject>" - "<gContact:jot rel='home'>Moved house on 2010-02-14 to the North Pole.</gContact:jot>" - "<gContact:jot rel='user'>Owes me ten pounds.</gContact:jot>" - "<gContact:jot rel='other'></gContact:jot>" /* Empty on purpose */ - "<gContact:relation rel='father'>Darth Vader</gContact:relation>" - "<gContact:relation label='Favourite singer'>Rob Halford</gContact:relation>" - "<gContact:website href='http://example.com' rel='home-page' label='Home tab #1' primary='true'/>" - "<gContact:website href='http://example.com' rel='work'/>" - "<gContact:website href='http://bar.com' rel='profile' primary='false'/>" - "<gContact:website href='' rel='other'/>" /* empty on purpose; see bgo#790671 */ - "<gContact:event rel='anniversary'><gd:when startTime='2010-03-04'/></gContact:event>" - "<gContact:event label='Foobar'><gd:when startTime='1900-01-01'/></gContact:event>" - "<gContact:calendarLink href='http://example.com/' rel='free-busy' primary='true'/>" - "<gContact:calendarLink href='http://example.com/' label='Gig list' primary='false'/>" - "<gContact:calendarLink href='http://foo.com/calendar' rel='home'/>" - "<gContact:externalId value='Number Six' label='The Prisoner'/>" - "<gContact:externalId value='1545' rel='account'/>" - "<gContact:language label='Fresian'/>" - "<gContact:language code='en-US'/>" - "<gContact:hobby>Programming</gContact:hobby>" - "<gContact:hobby>Heavy metal</gContact:hobby>" - "<gContact:hobby>Heavy metal</gContact:hobby>" /* Test that duplicates get merged */ - "</entry>", -1, &error)); - g_assert_no_error (error); - g_assert (GDATA_IS_CONTACTS_CONTACT (contact)); - gdata_test_compare_kind (GDATA_ENTRY (contact), "http://schemas.google.com/contact/2008#contact", NULL); - g_clear_error (&error); - - /* TODO: Check the other properties */ - - g_assert_cmpstr (gdata_contacts_contact_get_nickname (contact), ==, "Agent Smith"); - g_assert_cmpstr (gdata_contacts_contact_get_file_as (contact), ==, "Smith, Agent"); - g_assert_cmpstr (gdata_contacts_contact_get_billing_information (contact), ==, "Foo & Bar Inc."); - g_assert_cmpstr (gdata_contacts_contact_get_directory_server (contact), ==, "Directory & server"); - g_assert_cmpstr (gdata_contacts_contact_get_gender (contact), ==, GDATA_CONTACTS_GENDER_FEMALE); - g_assert_cmpstr (gdata_contacts_contact_get_initials (contact), ==, "X. Y. Z."); - g_assert_cmpstr (gdata_contacts_contact_get_maiden_name (contact), ==, "Foo"); - g_assert_cmpstr (gdata_contacts_contact_get_mileage (contact), ==, "15km"); - g_assert_cmpstr (gdata_contacts_contact_get_occupation (contact), ==, "Occupied"); - g_assert_cmpstr (gdata_contacts_contact_get_priority (contact), ==, GDATA_CONTACTS_PRIORITY_LOW); - g_assert_cmpstr (gdata_contacts_contact_get_sensitivity (contact), ==, GDATA_CONTACTS_SENSITIVITY_CONFIDENTIAL); - g_assert_cmpstr (gdata_contacts_contact_get_short_name (contact), ==, "Smith"); - g_assert_cmpstr (gdata_contacts_contact_get_subject (contact), ==, "Film buddy"); - - /* Birthday */ - g_assert (gdata_contacts_contact_get_birthday (contact, &date) == TRUE); - g_assert (g_date_valid (&date) == TRUE); - g_assert_cmpuint (g_date_get_year (&date), ==, 2010); - g_assert_cmpuint (g_date_get_month (&date), ==, 12); - g_assert_cmpuint (g_date_get_day (&date), ==, 3); - - /* Jots */ - list = gdata_contacts_contact_get_jots (contact); - g_assert_cmpuint (g_list_length (list), ==, 3); - - g_assert (GDATA_IS_GCONTACT_JOT (list->data)); - g_assert_cmpstr (gdata_gcontact_jot_get_content (GDATA_GCONTACT_JOT (list->data)), ==, "Moved house on 2010-02-14 to the North Pole."); - g_assert_cmpstr (gdata_gcontact_jot_get_relation_type (GDATA_GCONTACT_JOT (list->data)), ==, GDATA_GCONTACT_JOT_HOME); - - list = list->next; - g_assert (GDATA_IS_GCONTACT_JOT (list->data)); - g_assert_cmpstr (gdata_gcontact_jot_get_content (GDATA_GCONTACT_JOT (list->data)), ==, "Owes me ten pounds."); - g_assert_cmpstr (gdata_gcontact_jot_get_relation_type (GDATA_GCONTACT_JOT (list->data)), ==, GDATA_GCONTACT_JOT_USER); - - list = list->next; - g_assert (GDATA_IS_GCONTACT_JOT (list->data)); - g_assert (gdata_gcontact_jot_get_content (GDATA_GCONTACT_JOT (list->data)) == NULL); - g_assert_cmpstr (gdata_gcontact_jot_get_relation_type (GDATA_GCONTACT_JOT (list->data)), ==, GDATA_GCONTACT_JOT_OTHER); - - /* Relations */ - list = gdata_contacts_contact_get_relations (contact); - g_assert_cmpuint (g_list_length (list), ==, 2); - - g_assert (GDATA_IS_GCONTACT_RELATION (list->data)); - g_assert_cmpstr (gdata_gcontact_relation_get_name (GDATA_GCONTACT_RELATION (list->data)), ==, "Darth Vader"); - g_assert_cmpstr (gdata_gcontact_relation_get_relation_type (GDATA_GCONTACT_RELATION (list->data)), ==, GDATA_GCONTACT_RELATION_FATHER); - g_assert (gdata_gcontact_relation_get_label (GDATA_GCONTACT_RELATION (list->data)) == NULL); - - list = list->next; - g_assert (GDATA_IS_GCONTACT_RELATION (list->data)); - g_assert_cmpstr (gdata_gcontact_relation_get_name (GDATA_GCONTACT_RELATION (list->data)), ==, "Rob Halford"); - g_assert (gdata_gcontact_relation_get_relation_type (GDATA_GCONTACT_RELATION (list->data)) == NULL); - g_assert_cmpstr (gdata_gcontact_relation_get_label (GDATA_GCONTACT_RELATION (list->data)), ==, "Favourite singer"); - - /* Websites */ - list = gdata_contacts_contact_get_websites (contact); - g_assert_cmpuint (g_list_length (list), ==, 3); - /* Note the empty website should *not* be present. See bgo#790671. */ - - g_assert (GDATA_IS_GCONTACT_WEBSITE (list->data)); - g_assert_cmpstr (gdata_gcontact_website_get_uri (GDATA_GCONTACT_WEBSITE (list->data)), ==, "http://example.com"); - g_assert_cmpstr (gdata_gcontact_website_get_relation_type (GDATA_GCONTACT_WEBSITE (list->data)), ==, GDATA_GCONTACT_WEBSITE_HOME_PAGE); - g_assert_cmpstr (gdata_gcontact_website_get_label (GDATA_GCONTACT_WEBSITE (list->data)), ==, "Home tab #1"); - g_assert (gdata_gcontact_website_is_primary (GDATA_GCONTACT_WEBSITE (list->data)) == TRUE); - - g_assert (gdata_contacts_contact_get_primary_website (contact) == list->data); - - list = list->next; - g_assert (GDATA_IS_GCONTACT_WEBSITE (list->data)); - g_assert_cmpstr (gdata_gcontact_website_get_uri (GDATA_GCONTACT_WEBSITE (list->data)), ==, "http://example.com"); - g_assert_cmpstr (gdata_gcontact_website_get_relation_type (GDATA_GCONTACT_WEBSITE (list->data)), ==, GDATA_GCONTACT_WEBSITE_WORK); - g_assert (gdata_gcontact_website_get_label (GDATA_GCONTACT_WEBSITE (list->data)) == NULL); - g_assert (gdata_gcontact_website_is_primary (GDATA_GCONTACT_WEBSITE (list->data)) == FALSE); - - list = list->next; - g_assert (GDATA_IS_GCONTACT_WEBSITE (list->data)); - g_assert_cmpstr (gdata_gcontact_website_get_uri (GDATA_GCONTACT_WEBSITE (list->data)), ==, "http://bar.com"); - g_assert_cmpstr (gdata_gcontact_website_get_relation_type (GDATA_GCONTACT_WEBSITE (list->data)), ==, GDATA_GCONTACT_WEBSITE_PROFILE); - g_assert (gdata_gcontact_website_get_label (GDATA_GCONTACT_WEBSITE (list->data)) == NULL); - g_assert (gdata_gcontact_website_is_primary (GDATA_GCONTACT_WEBSITE (list->data)) == FALSE); - - /* Events */ - list = gdata_contacts_contact_get_events (contact); - g_assert_cmpuint (g_list_length (list), ==, 2); - - g_assert (GDATA_IS_GCONTACT_EVENT (list->data)); - gdata_gcontact_event_get_date (GDATA_GCONTACT_EVENT (list->data), &date); - g_assert (g_date_valid (&date) == TRUE); - g_assert_cmpuint (g_date_get_year (&date), ==, 2010); - g_assert_cmpuint (g_date_get_month (&date), ==, 3); - g_assert_cmpuint (g_date_get_day (&date), ==, 4); - g_assert_cmpstr (gdata_gcontact_event_get_relation_type (GDATA_GCONTACT_EVENT (list->data)), ==, GDATA_GCONTACT_EVENT_ANNIVERSARY); - g_assert (gdata_gcontact_event_get_label (GDATA_GCONTACT_EVENT (list->data)) == NULL); - - list = list->next; - g_assert (GDATA_IS_GCONTACT_EVENT (list->data)); - gdata_gcontact_event_get_date (GDATA_GCONTACT_EVENT (list->data), &date); - g_assert (g_date_valid (&date) == TRUE); - g_assert_cmpuint (g_date_get_year (&date), ==, 1900); - g_assert_cmpuint (g_date_get_month (&date), ==, 1); - g_assert_cmpuint (g_date_get_day (&date), ==, 1); - g_assert (gdata_gcontact_event_get_relation_type (GDATA_GCONTACT_EVENT (list->data)) == NULL); - g_assert_cmpstr (gdata_gcontact_event_get_label (GDATA_GCONTACT_EVENT (list->data)), ==, "Foobar"); - - /* Calendars */ - list = gdata_contacts_contact_get_calendars (contact); - g_assert_cmpuint (g_list_length (list), ==, 3); - - g_assert (GDATA_IS_GCONTACT_CALENDAR (list->data)); - g_assert_cmpstr (gdata_gcontact_calendar_get_uri (GDATA_GCONTACT_CALENDAR (list->data)), ==, "http://example.com/"); - g_assert_cmpstr (gdata_gcontact_calendar_get_relation_type (GDATA_GCONTACT_CALENDAR (list->data)), ==, GDATA_GCONTACT_CALENDAR_FREE_BUSY); - g_assert (gdata_gcontact_calendar_get_label (GDATA_GCONTACT_CALENDAR (list->data)) == NULL); - g_assert (gdata_gcontact_calendar_is_primary (GDATA_GCONTACT_CALENDAR (list->data)) == TRUE); - - g_assert (gdata_contacts_contact_get_primary_calendar (contact) == list->data); - - list = list->next; - g_assert (GDATA_IS_GCONTACT_CALENDAR (list->data)); - g_assert_cmpstr (gdata_gcontact_calendar_get_uri (GDATA_GCONTACT_CALENDAR (list->data)), ==, "http://example.com/"); - g_assert (gdata_gcontact_calendar_get_relation_type (GDATA_GCONTACT_CALENDAR (list->data)) == NULL); - g_assert_cmpstr (gdata_gcontact_calendar_get_label (GDATA_GCONTACT_CALENDAR (list->data)), ==, "Gig list"); - g_assert (gdata_gcontact_calendar_is_primary (GDATA_GCONTACT_CALENDAR (list->data)) == FALSE); - - list = list->next; - g_assert (GDATA_IS_GCONTACT_CALENDAR (list->data)); - g_assert_cmpstr (gdata_gcontact_calendar_get_uri (GDATA_GCONTACT_CALENDAR (list->data)), ==, "http://foo.com/calendar"); - g_assert_cmpstr (gdata_gcontact_calendar_get_relation_type (GDATA_GCONTACT_CALENDAR (list->data)), ==, GDATA_GCONTACT_CALENDAR_HOME); - g_assert (gdata_gcontact_calendar_get_label (GDATA_GCONTACT_CALENDAR (list->data)) == NULL); - g_assert (gdata_gcontact_calendar_is_primary (GDATA_GCONTACT_CALENDAR (list->data)) == FALSE); - - /* External IDs */ - list = gdata_contacts_contact_get_external_ids (contact); - g_assert_cmpuint (g_list_length (list), ==, 2); - - g_assert (GDATA_IS_GCONTACT_EXTERNAL_ID (list->data)); - g_assert (GDATA_IS_GCONTACT_EXTERNAL_ID (list->next->data)); - - /* Languages */ - list = gdata_contacts_contact_get_languages (contact); - g_assert_cmpuint (g_list_length (list), ==, 2); - - g_assert (GDATA_IS_GCONTACT_LANGUAGE (list->data)); - g_assert (GDATA_IS_GCONTACT_LANGUAGE (list->next->data)); - - /* Hobbies */ - list = gdata_contacts_contact_get_hobbies (contact); - g_assert_cmpuint (g_list_length (list), ==, 2); - - g_assert_cmpstr (list->data, ==, "Programming"); - g_assert_cmpstr (list->next->data, ==, "Heavy metal"); - - g_object_unref (contact); -} - -static void -test_contact_parser_error_handling (void) -{ - GDataContactsContact *contact; - GError *error = NULL; - -#define TEST_XML_ERROR_HANDLING(x) \ - contact = GDATA_CONTACTS_CONTACT (gdata_parsable_new_from_xml (GDATA_TYPE_CONTACTS_CONTACT,\ - "<entry xmlns='http://www.w3.org/2005/Atom' "\ - "xmlns:gd='http://schemas.google.com/g/2005' "\ - "xmlns:gContact='http://schemas.google.com/contact/2008'>"\ - x\ - "</entry>", -1, &error));\ - g_assert_error (error, GDATA_SERVICE_ERROR, GDATA_SERVICE_ERROR_PROTOCOL_ERROR);\ - g_assert (contact == NULL);\ - g_clear_error (&error) - - /* app:edited */ - TEST_XML_ERROR_HANDLING ("<app:edited xmlns:app='http://www.w3.org/2007/app'>this shouldn't parse</app:edited>"); - - /* gd:name */ - TEST_XML_ERROR_HANDLING ("<gd:name><gd:givenName>Spartacus</gd:givenName><gd:givenName>Spartacus</gd:givenName></gd:name>"); - - /* gd:email */ - TEST_XML_ERROR_HANDLING ("<gd:email>neither should this</gd:email>"); - - /* gd:im */ - TEST_XML_ERROR_HANDLING ("<gd:im>nor this</gd:im>"); - - /* gd:phoneNumber */ - TEST_XML_ERROR_HANDLING ("<gd:phoneNumber/>"); - - /* gd:structuredPostalAddress */ - TEST_XML_ERROR_HANDLING ("<gd:structuredPostalAddress rel=''/>"); - - /* gd:organization */ - TEST_XML_ERROR_HANDLING ("<gd:organization rel=''/>"); - - /* gd:extendedProperty */ - TEST_XML_ERROR_HANDLING ("<gd:extendedProperty/>"); - - /* gContact:userDefinedField */ - TEST_XML_ERROR_HANDLING ("<gContact:userDefinedField/>"); /* no key or value */ - TEST_XML_ERROR_HANDLING ("<gContact:userDefinedField key='foo'/>"); /* no value */ - TEST_XML_ERROR_HANDLING ("<gContact:userDefinedField value='bar'/>"); /* no key */ - - /* gContact:groupMembershipInfo */ - TEST_XML_ERROR_HANDLING ("<gContact:groupMembershipInfo/>"); - TEST_XML_ERROR_HANDLING ("<gContact:groupMembershipInfo href='http://foobar.com/base/1234b' deleted='maybe'/>"); - - /* gContact:nickname */ - TEST_XML_ERROR_HANDLING ("<gContact:nickname/>"); /* missing content */ - TEST_XML_ERROR_HANDLING ("<gContact:nickname>Nickname 1</gContact:nickname><gContact:nickname>Duplicate!</gContact:nickname>"); /* duplicate */ - - /* gContact:fileAs */ - TEST_XML_ERROR_HANDLING ("<gContact:fileAs/>"); /* missing content */ - TEST_XML_ERROR_HANDLING ("<gContact:fileAs>File As 1</gContact:fileAs><gContact:fileAs>Duplicate!</gContact:fileAs>"); /* duplicate */ - - /* gContact:birthday */ - TEST_XML_ERROR_HANDLING ("<gContact:birthday/>"); /* missing "when" attribute */ - TEST_XML_ERROR_HANDLING ("<gContact:birthday when='foobar'/>"); /* invalid date */ - TEST_XML_ERROR_HANDLING ("<gContact:birthday when='2000-01-01'/><gContact:birthday when='--01-01'/>"); /* duplicate */ - - /* gContact:billingInformation */ - TEST_XML_ERROR_HANDLING ("<gContact:billingInformation/>"); /* missing content */ - TEST_XML_ERROR_HANDLING ("<gContact:billingInformation>foo</gContact:billingInformation>" - "<gContact:billingInformation>Dupe!</gContact:billingInformation>"); /* duplicate */ - - /* gContact:directoryServer */ - TEST_XML_ERROR_HANDLING ("<gContact:directoryServer/>"); /* missing content */ - TEST_XML_ERROR_HANDLING ("<gContact:directoryServer>foo</gContact:directoryServer>" - "<gContact:directoryServer>Dupe!</gContact:directoryServer>"); /* duplicate */ - - /* gContact:gender */ - TEST_XML_ERROR_HANDLING ("<gContact:gender/>"); /* missing content */ - TEST_XML_ERROR_HANDLING ("<gContact:gender value='male'/><gContact:gender value='female'/>"); /* duplicate */ - - /* gContact:initials */ - TEST_XML_ERROR_HANDLING ("<gContact:initials/>"); /* missing content */ - TEST_XML_ERROR_HANDLING ("<gContact:initials>A</gContact:initials><gContact:initials>B</gContact:initials>"); /* duplicate */ - - /* gContact:maidenName */ - TEST_XML_ERROR_HANDLING ("<gContact:maidenName/>"); /* missing content */ - TEST_XML_ERROR_HANDLING ("<gContact:maidenName>A</gContact:maidenName><gContact:maidenName>B</gContact:maidenName>"); /* duplicate */ - - /* gContact:mileage */ - TEST_XML_ERROR_HANDLING ("<gContact:mileage/>"); /* missing content */ - TEST_XML_ERROR_HANDLING ("<gContact:mileage>12 mi</gContact:mileage><gContact:mileage>12 mi</gContact:mileage>"); /* duplicate */ - - /* gContact:occupation */ - TEST_XML_ERROR_HANDLING ("<gContact:occupation/>"); /* missing content */ - TEST_XML_ERROR_HANDLING ("<gContact:occupation>Foo</gContact:occupation><gContact:occupation>Bar</gContact:occupation>"); /* duplicate */ - - /* gContact:priority */ - TEST_XML_ERROR_HANDLING ("<gContact:priority/>"); /* missing rel param */ - TEST_XML_ERROR_HANDLING ("<gContact:priority rel=''/>"); /* empty rel param */ - TEST_XML_ERROR_HANDLING ("<gContact:priority rel='high'/><gContact:priority rel='low'/>"); /* duplicate */ - - /* gContact:sensitivity */ - TEST_XML_ERROR_HANDLING ("<gContact:sensitivity/>"); /* missing rel param */ - TEST_XML_ERROR_HANDLING ("<gContact:sensitivity rel=''/>"); /* empty rel param */ - TEST_XML_ERROR_HANDLING ("<gContact:sensitivity rel='private'/><gContact:sensitivity rel='normal'/>"); /* duplicate */ - - /* gContact:shortName */ - TEST_XML_ERROR_HANDLING ("<gContact:shortName/>"); /* missing content */ - TEST_XML_ERROR_HANDLING ("<gContact:shortName>Foo</gContact:shortName><gContact:shortName>Bar</gContact:shortName>"); /* duplicate */ - - /* gContact:subject */ - TEST_XML_ERROR_HANDLING ("<gContact:subject/>"); /* missing content */ - TEST_XML_ERROR_HANDLING ("<gContact:subject>Foo</gContact:subject><gContact:subject>Bar</gContact:subject>"); /* duplicate */ - - /* gContact:jot */ - TEST_XML_ERROR_HANDLING ("<gContact:jot/>"); - - /* gContact:relation */ - TEST_XML_ERROR_HANDLING ("<gContact:relation/>"); - - /* gContact:website errors are ignored (see bgo#790671) */ - - /* gContact:event */ - TEST_XML_ERROR_HANDLING ("<gContact:event/>"); - - /* gContact:calendar */ - TEST_XML_ERROR_HANDLING ("<gContact:calendarLink/>"); - - /* gContact:externalId */ - TEST_XML_ERROR_HANDLING ("<gContact:externalId/>"); - - /* gContact:language */ - TEST_XML_ERROR_HANDLING ("<gContact:language/>"); - - /* gContact:hobby */ - TEST_XML_ERROR_HANDLING ("<gContact:hobby/>"); - -#undef TEST_XML_ERROR_HANDLING -} - -static void -test_group_properties (void) -{ - GDataContactsGroup *group; - gint64 time_val; - GHashTable *properties; - gint64 edited; - gboolean deleted; - gchar *system_group_id; - - group = gdata_contacts_group_new (NULL); - - /* Check the kind is present and correct */ - g_assert (GDATA_IS_CONTACTS_GROUP (group)); - gdata_test_compare_kind (GDATA_ENTRY (group), "http://schemas.google.com/contact/2008#group", NULL); - - /* Set various properties */ - gdata_entry_set_title (GDATA_ENTRY (group), "New Group!"); - g_assert (gdata_contacts_group_set_extended_property (group, "foobar", "barfoo") == TRUE); - - /* Check various properties */ - time_val = g_get_real_time () / G_USEC_PER_SEC; - g_assert_cmpint (gdata_contacts_group_get_edited (group), ==, time_val); - g_assert (gdata_contacts_group_is_deleted (group) == FALSE); - g_assert (gdata_contacts_group_get_system_group_id (group) == NULL); - - properties = gdata_contacts_group_get_extended_properties (group); - g_assert (properties != NULL); - g_assert_cmpint (g_hash_table_size (properties), ==, 1); - g_assert_cmpstr (gdata_contacts_group_get_extended_property (group, "foobar"), ==, "barfoo"); - - /* Check the properties a different way */ - g_object_get (G_OBJECT (group), - "edited", &edited, - "deleted", &deleted, - "system-group-id", &system_group_id, - NULL); - - g_assert_cmpint (edited, ==, time_val); - g_assert (deleted == FALSE); - g_assert (system_group_id == NULL); - - g_free (system_group_id); - - /* Check the XML */ - gdata_test_assert_xml (group, - "<?xml version='1.0' encoding='UTF-8'?>" - "<entry xmlns='http://www.w3.org/2005/Atom' " - "xmlns:gd='http://schemas.google.com/g/2005' " - "xmlns:app='http://www.w3.org/2007/app' " - "xmlns:gContact='http://schemas.google.com/contact/2008'>" - "<title type='text'>New Group!</title>" - "<content type='text'>New Group!</content>" - "<category term='http://schemas.google.com/contact/2008#group' scheme='http://schemas.google.com/g/2005#kind'/>" - "<gd:extendedProperty name='foobar'>barfoo</gd:extendedProperty>" - "</entry>"); - - g_object_unref (group); -} - -static void -test_group_parser_normal (void) -{ - GDataContactsGroup *group; - GHashTable *properties; - GError *error = NULL; - - group = GDATA_CONTACTS_GROUP (gdata_parsable_new_from_xml (GDATA_TYPE_CONTACTS_GROUP, - "<entry xmlns='http://www.w3.org/2005/Atom' " - "xmlns:gd='http://schemas.google.com/g/2005' " - "xmlns:gContact='http://schemas.google.com/contact/2008' " - "gd:etag='"Rno4ezVSLyp7ImA9WxdTEUgNRQU."'>" - "<category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/contact/2008#group'/>" - "<id>http://www.google.com/feeds/groups/jo%40gmail.com/base/1234</id>" - "<published>2005-01-18T21:00:00Z</published>" - "<updated>2006-01-01T00:00:00Z</updated>" - "<app:edited xmlns:app='http://www.w3.org/2007/app'>2006-01-01T00:00:00Z</app:edited>" - "<title>Salsa class members</title>" - "<content/>" - "<link rel='self' type='application/atom+xml' href='http://www.google.com/m8/feeds/groups/jo%40gmail.com/full/1234'/>" - "<link rel='edit' type='application/atom+xml' href='http://www.google.com/m8/feeds/groups/jo%40gmail.com/full/1234'/>" - "<gd:extendedProperty name='more info'>Some text.</gd:extendedProperty>" - "<gd:extendedProperty name='extra info'>" - "<xml>Foobar.</xml>" - "</gd:extendedProperty>" - "<gd:deleted/>" - "</entry>", -1, &error)); - g_assert_no_error (error); - g_assert (GDATA_IS_CONTACTS_GROUP (group)); - gdata_test_compare_kind (GDATA_ENTRY (group), "http://schemas.google.com/contact/2008#group", NULL); - g_clear_error (&error); - - g_assert_cmpint (gdata_contacts_group_get_edited (group), ==, 1136073600); - g_assert (gdata_contacts_group_is_deleted (group) == TRUE); - g_assert (gdata_contacts_group_get_system_group_id (group) == NULL); - - g_assert_cmpstr (gdata_contacts_group_get_extended_property (group, "more info"), ==, "Some text."); - g_assert_cmpstr (gdata_contacts_group_get_extended_property (group, "extra info"), ==, "<xml>Foobar.</xml>"); - - properties = gdata_contacts_group_get_extended_properties (group); - g_assert_cmpint (g_hash_table_size (properties), ==, 2); - - g_object_unref (group); -} - -static void -test_group_parser_system (void) -{ - GDataContactsGroup *group; - GError *error = NULL; - - group = GDATA_CONTACTS_GROUP (gdata_parsable_new_from_xml (GDATA_TYPE_CONTACTS_GROUP, - "<entry xmlns='http://www.w3.org/2005/Atom' " - "xmlns:gd='http://schemas.google.com/g/2005' " - "xmlns:gContact='http://schemas.google.com/contact/2008' " - "gd:etag='"Rno4ezVSLyp7ImA9WxdTEUgNRQU."'>" - "<category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/contact/2008#group'/>" - "<id>http://www.google.com/feeds/groups/jo%40gmail.com/base/1234</id>" - "<published>2005-01-18T21:00:00Z</published>" - "<updated>2006-01-01T00:00:00Z</updated>" - "<app:edited xmlns:app='http://www.w3.org/2007/app'>2006-01-01T00:00:00Z</app:edited>" - "<title>Salsa class members</title>" - "<content/>" - "<link rel='self' type='application/atom+xml' href='http://www.google.com/m8/feeds/groups/jo%40gmail.com/full/1234'/>" - "<link rel='edit' type='application/atom+xml' href='http://www.google.com/m8/feeds/groups/jo%40gmail.com/full/1234'/>" - "<gContact:systemGroup id='Contacts'/>" - "</entry>", -1, &error)); - g_assert_no_error (error); - g_assert (GDATA_IS_CONTACTS_GROUP (group)); - gdata_test_compare_kind (GDATA_ENTRY (group), "http://schemas.google.com/contact/2008#group", NULL); - g_clear_error (&error); - - g_assert_cmpint (gdata_contacts_group_get_edited (group), ==, 1136073600); - g_assert (gdata_contacts_group_is_deleted (group) == FALSE); - g_assert_cmpstr (gdata_contacts_group_get_system_group_id (group), ==, GDATA_CONTACTS_GROUP_CONTACTS); - - g_object_unref (group); -} - -static void -test_group_parser_error_handling (void) -{ - GDataContactsGroup *group; - GError *error = NULL; - -#define TEST_XML_ERROR_HANDLING(x) \ - group = GDATA_CONTACTS_GROUP (gdata_parsable_new_from_xml (GDATA_TYPE_CONTACTS_GROUP,\ - "<entry xmlns='http://www.w3.org/2005/Atom' "\ - "xmlns:gd='http://schemas.google.com/g/2005' "\ - "xmlns:gContact='http://schemas.google.com/contact/2008'>"\ - x\ - "</entry>", -1, &error));\ - g_assert_error (error, GDATA_SERVICE_ERROR, GDATA_SERVICE_ERROR_PROTOCOL_ERROR);\ - g_assert (group == NULL);\ - g_clear_error (&error) - - /* app:edited */ - TEST_XML_ERROR_HANDLING ("<app:edited xmlns:app='http://www.w3.org/2007/app'>this shouldn't parse</app:edited>"); - - /* gd:deleted */ - TEST_XML_ERROR_HANDLING ("<gd:deleted/><gd:deleted/>"); - - /* gd:extendedProperty */ - TEST_XML_ERROR_HANDLING ("<gd:extendedProperty/>"); - - /* gContact:systemGroup */ - TEST_XML_ERROR_HANDLING ("<gContact:systemGroup/>"); - TEST_XML_ERROR_HANDLING ("<gContact:systemGroup id='foo'/><gContact:systemGroup id='duplicated'/>"); - -#undef TEST_XML_ERROR_HANDLING -} - -static void -test_photo_has_photo (gconstpointer service) -{ - GDataContactsContact *contact; - gsize length = 0; - gchar *content_type = NULL; - GError *error = NULL; - - contact = GDATA_CONTACTS_CONTACT (gdata_parsable_new_from_xml (GDATA_TYPE_CONTACTS_CONTACT, - "<entry xmlns='http://www.w3.org/2005/Atom' " - "xmlns:gd='http://schemas.google.com/g/2005'>" - "<id>http://www.google.com/m8/feeds/contacts/libgdata.test@googlemail.com/base/1b46cdd20bfbee3b</id>" - "<updated>2009-04-25T15:21:53.688Z</updated>" - "<category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/contact/2008#contact'/>" - "<title></title>" /* Here's where it all went wrong */ - "<link rel='http://schemas.google.com/contacts/2008/rel#photo' type='image/*' " - "href='http://www.google.com/m8/feeds/photos/media/libgdata.test@googlemail.com/1b46cdd20bfbee3b'/>" - "</entry>", -1, &error)); - g_assert_no_error (error); - g_assert (GDATA_IS_CONTACTS_CONTACT (contact)); - gdata_test_compare_kind (GDATA_ENTRY (contact), "http://schemas.google.com/contact/2008#contact", NULL); - g_clear_error (&error); - - /* Check for no photo */ - g_assert (gdata_contacts_contact_get_photo_etag (contact) == NULL); - g_assert (gdata_contacts_contact_get_photo (contact, GDATA_CONTACTS_SERVICE (service), &length, &content_type, NULL, &error) == NULL); - g_assert_cmpint (length, ==, 0); - g_assert (content_type == NULL); - g_assert_no_error (error); - - g_clear_error (&error); - g_free (content_type); - g_object_unref (contact); - - /* Try again with a photo */ - contact = GDATA_CONTACTS_CONTACT (gdata_parsable_new_from_xml (GDATA_TYPE_CONTACTS_CONTACT, - "<entry xmlns='http://www.w3.org/2005/Atom' " - "xmlns:gd='http://schemas.google.com/g/2005'>" - "<id>http://www.google.com/m8/feeds/contacts/libgdata.test@googlemail.com/base/1b46cdd20bfbee3b</id>" - "<updated>2009-04-25T15:21:53.688Z</updated>" - "<category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/contact/2008#contact'/>" - "<title></title>" /* Here's where it all went wrong */ - "<link rel='http://schemas.google.com/contacts/2008/rel#photo' type='image/*' " - "href='http://www.google.com/m8/feeds/photos/media/libgdata.test@googlemail.com/1b46cdd20bfbee3b' " - "gd:etag='"QngzcDVSLyp7ImA9WxJTFkoITgU."'/>" - "</entry>", -1, &error)); - g_assert_no_error (error); - g_assert (GDATA_IS_CONTACTS_CONTACT (contact)); - gdata_test_compare_kind (GDATA_ENTRY (contact), "http://schemas.google.com/contact/2008#contact", NULL); - g_clear_error (&error); - - g_assert (gdata_contacts_contact_get_photo_etag (contact) != NULL); - g_object_unref (contact); -} - -static void -test_photo_add (TempContactData *data, gconstpointer service) -{ - guint8 *photo_data; - gsize length; - gboolean retval; - gchar *path = NULL; - GError *error = NULL; - - gdata_test_mock_server_start_trace (mock_server, "photo-add"); - - /* Get the photo */ - path = g_test_build_filename (G_TEST_DIST, "photo.jpg", NULL); - g_assert (g_file_get_contents (path, (gchar**) &photo_data, &length, NULL) == TRUE); - g_free (path); - - /* Add it to the contact */ - retval = gdata_contacts_contact_set_photo (data->contact, GDATA_CONTACTS_SERVICE (service), photo_data, length, "image/jpeg", NULL, &error); - g_assert_no_error (error); - g_assert (retval == TRUE); - - g_clear_error (&error); - g_free (photo_data); - - uhm_server_end_trace (mock_server); -} - -GDATA_ASYNC_TEST_FUNCTIONS (photo_add, TempContactData, -G_STMT_START { - guint8 *photo_data; - gsize length; - gchar *path = NULL; - - /* Get the photo */ - path = g_test_build_filename (G_TEST_DIST, "photo.jpg", NULL); - g_assert (g_file_get_contents (path, (gchar**) &photo_data, &length, NULL) == TRUE); - g_free (path); - - /* Add it to the contact asynchronously */ - gdata_contacts_contact_set_photo_async (data->contact, GDATA_CONTACTS_SERVICE (service), photo_data, length, "image/jpeg", cancellable, - async_ready_callback, async_data); - - g_free (photo_data); -} G_STMT_END, -G_STMT_START { - GDataContactsContact *contact = GDATA_CONTACTS_CONTACT (obj); - gboolean success; - - success = gdata_contacts_contact_set_photo_finish (contact, async_result, &error); - - if (error == NULL) { - g_assert (success == TRUE); - g_assert (gdata_contacts_contact_get_photo_etag (contact) != NULL); - } else { - g_assert (success == FALSE); - /*g_assert (gdata_contacts_contact_get_photo_etag (contact) == NULL);*/ - - /* Bail out on a conflict error, since it means the addition went through - * (but not fast enough for libgdata to return success rather than cancellation). */ - if (g_error_matches (error, GDATA_SERVICE_ERROR, GDATA_SERVICE_ERROR_CONFLICT) == TRUE) { - g_clear_error (&error); - async_data->cancellation_successful = FALSE; - } - } -} G_STMT_END); - -static void -add_photo_to_contact (GDataContactsService *service, GDataContactsContact **contact) -{ - guint8 *photo_data; - gsize length; - GDataEntry *updated_contact; - gchar *path = NULL; - - /* Get the photo and add it to the contact */ - path = g_test_build_filename (G_TEST_DIST, "photo.jpg", NULL); - g_assert (g_file_get_contents (path, (gchar**) &photo_data, &length, NULL) == TRUE); - g_assert (gdata_contacts_contact_set_photo (*contact, service, photo_data, length, "image/jpeg", NULL, NULL) == TRUE); - - g_free (path); - g_free (photo_data); - - /* HACK: It fairly consistently seems to take the Google servers about 4 seconds to process uploaded photos. Before this - * time, a query for the photo will return an error. So let's wait for 10. - * Helps: bgo#679072 */ - if (uhm_server_get_enable_online (mock_server) == TRUE) { - sleep (10); - } - - /* Re-query for the contact to get any updated ETags. */ - updated_contact = gdata_service_query_single_entry (GDATA_SERVICE (service), gdata_contacts_service_get_primary_authorization_domain (), - gdata_entry_get_id (GDATA_ENTRY (*contact)), NULL, GDATA_TYPE_CONTACTS_CONTACT, - NULL, NULL); - g_assert (GDATA_IS_CONTACTS_CONTACT (updated_contact)); - - g_object_unref (*contact); - *contact = GDATA_CONTACTS_CONTACT (updated_contact); -} - -typedef TempContactData TempContactWithPhotoData; - -static void -set_up_temp_contact_with_photo (TempContactWithPhotoData *data, gconstpointer service) -{ - set_up_temp_contact ((TempContactData*) data, service); - - gdata_test_mock_server_start_trace (mock_server, "setup-temp-contact-with-photo"); - add_photo_to_contact (GDATA_CONTACTS_SERVICE (service), &data->contact); - uhm_server_end_trace (mock_server); -} - -static void -tear_down_temp_contact_with_photo (TempContactWithPhotoData *data, gconstpointer service) -{ - tear_down_temp_contact ((TempContactData*) data, service); -} - -GDATA_ASYNC_CLOSURE_FUNCTIONS (temp_contact_with_photo, TempContactWithPhotoData); - -static void -test_photo_get (TempContactData *data, gconstpointer service) -{ - guint8 *photo_data; - gchar *content_type = NULL; - gsize length = 0; - GError *error = NULL; - - gdata_test_mock_server_start_trace (mock_server, "photo-get"); - - g_assert (gdata_contacts_contact_get_photo_etag (data->contact) != NULL); - - /* Get the photo from the network */ - photo_data = gdata_contacts_contact_get_photo (data->contact, GDATA_CONTACTS_SERVICE (service), &length, &content_type, NULL, &error); - g_assert_no_error (error); - g_assert (photo_data != NULL); - g_assert (length != 0); - g_assert_cmpstr (content_type, ==, "image/jpeg"); - - g_assert (gdata_contacts_contact_get_photo_etag (data->contact) != NULL); - - g_free (content_type); - g_free (photo_data); - g_clear_error (&error); - - uhm_server_end_trace (mock_server); -} - -GDATA_ASYNC_TEST_FUNCTIONS (photo_get, TempContactData, -G_STMT_START { - g_assert (gdata_contacts_contact_get_photo_etag (data->contact) != NULL); - - /* Get the photo from the network asynchronously */ - gdata_contacts_contact_get_photo_async (data->contact, GDATA_CONTACTS_SERVICE (service), cancellable, async_ready_callback, async_data); -} G_STMT_END, -G_STMT_START { - GDataContactsContact *contact = GDATA_CONTACTS_CONTACT (obj); - guint8 *photo_data; - gsize length; - gchar *content_type; - - /* Finish getting the photo */ - photo_data = gdata_contacts_contact_get_photo_finish (contact, async_result, &length, &content_type, &error); - - if (error == NULL) { - g_assert (photo_data != NULL); - g_assert (length != 0); - g_assert_cmpstr (content_type, ==, "image/jpeg"); - - g_assert (gdata_contacts_contact_get_photo_etag (contact) != NULL); - } else { - g_assert (photo_data == NULL); - g_assert (length == 0); - g_assert (content_type == NULL); - } - - g_free (content_type); - g_free (photo_data); -} G_STMT_END); - -static void -test_photo_delete (TempContactData *data, gconstpointer service) -{ - GError *error = NULL; - - gdata_test_mock_server_start_trace (mock_server, "photo-delete"); - - g_assert (gdata_contacts_contact_get_photo_etag (data->contact) != NULL); - - /* Remove the contact's photo */ - g_assert (gdata_contacts_contact_set_photo (data->contact, GDATA_CONTACTS_SERVICE (service), NULL, 0, NULL, NULL, &error) == TRUE); - g_assert_no_error (error); - - g_assert (gdata_contacts_contact_get_photo_etag (data->contact) == NULL); - - g_clear_error (&error); - - uhm_server_end_trace (mock_server); -} - -static void -test_photo_delete_async_cancellation (GDataAsyncTestData *data, - gconstpointer service) __attribute__((unused)); - -GDATA_ASYNC_TEST_FUNCTIONS (photo_delete, TempContactData, -G_STMT_START { - g_assert (gdata_contacts_contact_get_photo_etag (data->contact) != NULL); - - /* Delete it from the contact asynchronously */ - gdata_contacts_contact_set_photo_async (data->contact, GDATA_CONTACTS_SERVICE (service), NULL, 0, NULL, cancellable, - async_ready_callback, async_data); -} G_STMT_END, -G_STMT_START { - GDataContactsContact *contact = GDATA_CONTACTS_CONTACT (obj); - gboolean success; - - success = gdata_contacts_contact_set_photo_finish (contact, async_result, &error); - - if (error == NULL) { - g_assert (success == TRUE); - g_assert (gdata_contacts_contact_get_photo_etag (contact) == NULL); - } else { - g_assert (success == FALSE); - g_assert (gdata_contacts_contact_get_photo_etag (contact) != NULL); - } -} G_STMT_END); - -static void -test_batch (gconstpointer service) -{ - GDataBatchOperation *operation; - GDataService *service2; - GDataContactsContact *contact, *contact2, *contact3; - GDataEntry *inserted_entry, *inserted_entry2, *inserted_entry3; - gchar *feed_uri; - guint op_id, op_id2, op_id3; - GError *error = NULL, *entry_error = NULL; - - gdata_test_mock_server_start_trace (mock_server, "batch"); - - /* Here we hardcode the feed URI, but it should really be extracted from a contacts feed, as the GDATA_LINK_BATCH link */ - operation = gdata_batchable_create_operation (GDATA_BATCHABLE (service), gdata_contacts_service_get_primary_authorization_domain (), - "https://www.google.com/m8/feeds/contacts/default/full/batch"); - - /* Check the properties of the operation */ - g_assert (gdata_batch_operation_get_service (operation) == service); - g_assert_cmpstr (gdata_batch_operation_get_feed_uri (operation), ==, "https://www.google.com/m8/feeds/contacts/default/full/batch"); - - g_object_get (operation, - "service", &service2, - "feed-uri", &feed_uri, - NULL); - - g_assert (service2 == service); - g_assert_cmpstr (feed_uri, ==, "https://www.google.com/m8/feeds/contacts/default/full/batch"); - - g_object_unref (service2); - g_free (feed_uri); - - /* Run a singleton batch operation to insert a new entry */ - contact = gdata_contacts_contact_new (NULL); - gdata_entry_set_title (GDATA_ENTRY (contact), "Fooish Bar"); - - gdata_test_batch_operation_insertion (operation, GDATA_ENTRY (contact), &inserted_entry, NULL); - g_assert (gdata_test_batch_operation_run (operation, NULL, &error) == TRUE); - g_assert_no_error (error); - - g_clear_error (&error); - g_object_unref (operation); - g_object_unref (contact); - - /* Run another batch operation to insert another entry and query the previous one */ - contact2 = gdata_contacts_contact_new (NULL); - gdata_entry_set_title (GDATA_ENTRY (contact2), "Brian"); - - operation = gdata_batchable_create_operation (GDATA_BATCHABLE (service), gdata_contacts_service_get_primary_authorization_domain (), - "https://www.google.com/m8/feeds/contacts/default/full/batch"); - op_id = gdata_test_batch_operation_insertion (operation, GDATA_ENTRY (contact2), &inserted_entry2, NULL); - op_id2 = gdata_test_batch_operation_query (operation, gdata_entry_get_id (inserted_entry), GDATA_TYPE_CONTACTS_CONTACT, inserted_entry, NULL, - NULL); - g_assert_cmpuint (op_id, !=, op_id2); - - g_assert (gdata_test_batch_operation_run (operation, NULL, &error) == TRUE); - g_assert_no_error (error); - - g_clear_error (&error); - g_object_unref (operation); - g_object_unref (contact2); - - /* Run another batch operation to delete the first entry and a fictitious one to test error handling, and update the second entry */ - gdata_entry_set_title (inserted_entry2, "Toby"); - contact3 = gdata_contacts_contact_new ("foobar"); - - operation = gdata_batchable_create_operation (GDATA_BATCHABLE (service), gdata_contacts_service_get_primary_authorization_domain (), - "https://www.google.com/m8/feeds/contacts/default/full/batch"); - op_id = gdata_test_batch_operation_deletion (operation, inserted_entry, NULL); - op_id2 = gdata_test_batch_operation_deletion (operation, GDATA_ENTRY (contact3), &entry_error); - op_id3 = gdata_test_batch_operation_update (operation, inserted_entry2, &inserted_entry3, NULL); - g_assert_cmpuint (op_id, !=, op_id2); - g_assert_cmpuint (op_id, !=, op_id3); - g_assert_cmpuint (op_id2, !=, op_id3); - - g_assert (gdata_test_batch_operation_run (operation, NULL, &error) == TRUE); - g_assert_no_error (error); - - g_assert_error (entry_error, GDATA_SERVICE_ERROR, GDATA_SERVICE_ERROR_PROTOCOL_ERROR); - - g_clear_error (&error); - g_clear_error (&entry_error); - g_object_unref (operation); - g_object_unref (inserted_entry); - g_object_unref (contact3); - - /* Run another batch operation to update the second entry with the wrong ETag (i.e. pass the old version of the entry to the batch operation - * to test error handling */ -#if 0 - operation = gdata_batchable_create_operation (GDATA_BATCHABLE (service), gdata_contacts_service_get_primary_authorization_domain (), - "https://www.google.com/m8/feeds/contacts/default/full/batch"); - gdata_test_batch_operation_update (operation, inserted_entry2, NULL, &entry_error); - g_assert (gdata_test_batch_operation_run (operation, NULL, &error) == TRUE); - g_assert_no_error (error); - - g_assert_error (entry_error, GDATA_SERVICE_ERROR, GDATA_SERVICE_ERROR_CONFLICT); -#endif - g_clear_error (&error); - g_clear_error (&entry_error); -/* g_object_unref (operation);*/ - g_object_unref (inserted_entry2); - - /* Run a final batch operation to delete the second entry */ -/* operation = gdata_batchable_create_operation (GDATA_BATCHABLE (service), gdata_contacts_service_get_primary_authorization_domain (), - "https://www.google.com/m8/feeds/contacts/default/full/batch"); - gdata_test_batch_operation_deletion (operation, inserted_entry3, NULL); - g_assert (gdata_test_batch_operation_run (operation, NULL, &error) == TRUE); - g_assert_no_error (error); -*/ - g_clear_error (&error); - /*g_object_unref (operation);*/ - g_object_unref (inserted_entry3); - - uhm_server_end_trace (mock_server); -} - -typedef struct { - GDataContactsContact *new_contact; -} BatchAsyncData; - -static void -setup_batch_async (BatchAsyncData *data, gconstpointer service) -{ - GDataContactsContact *contact; - GError *error = NULL; - - gdata_test_mock_server_start_trace (mock_server, "setup-batch-async"); - - /* Insert a new contact which we can query asyncly */ - contact = gdata_contacts_contact_new (NULL); - gdata_entry_set_title (GDATA_ENTRY (contact), "Fooish Bar"); - - data->new_contact = gdata_contacts_service_insert_contact (GDATA_CONTACTS_SERVICE (service), contact, NULL, &error); - g_assert_no_error (error); - g_assert (GDATA_IS_CONTACTS_CONTACT (data->new_contact)); - g_clear_error (&error); - - g_object_unref (contact); - - uhm_server_end_trace (mock_server); -} - -static void -test_batch_async_cb (GDataBatchOperation *operation, GAsyncResult *async_result, GMainLoop *main_loop) -{ - GError *error = NULL; - - /* Clear all pending events (such as callbacks for the operations) */ - while (g_main_context_iteration (NULL, FALSE) == TRUE); - - g_assert (gdata_test_batch_operation_run_finish (operation, async_result, &error) == TRUE); - g_assert_no_error (error); - g_clear_error (&error); - - g_main_loop_quit (main_loop); -} - -static void -test_batch_async (BatchAsyncData *data, gconstpointer service) -{ - GDataBatchOperation *operation; - GMainLoop *main_loop; - - gdata_test_mock_server_start_trace (mock_server, "batch-async"); - - /* Run an async query operation on the contact */ - operation = gdata_batchable_create_operation (GDATA_BATCHABLE (service), gdata_contacts_service_get_primary_authorization_domain (), - "https://www.google.com/m8/feeds/contacts/default/full/batch"); - gdata_test_batch_operation_query (operation, gdata_entry_get_id (GDATA_ENTRY (data->new_contact)), GDATA_TYPE_CONTACTS_CONTACT, - GDATA_ENTRY (data->new_contact), NULL, NULL); - - main_loop = g_main_loop_new (NULL, TRUE); - - gdata_batch_operation_run_async (operation, NULL, (GAsyncReadyCallback) test_batch_async_cb, main_loop); - g_main_loop_run (main_loop); - - g_main_loop_unref (main_loop); - g_object_unref (operation); - - uhm_server_end_trace (mock_server); -} - -static void -test_batch_async_cancellation_cb (GDataBatchOperation *operation, GAsyncResult *async_result, GMainLoop *main_loop) -{ - GError *error = NULL; - - /* Clear all pending events (such as callbacks for the operations) */ - while (g_main_context_iteration (NULL, FALSE) == TRUE); - - g_assert (gdata_test_batch_operation_run_finish (operation, async_result, &error) == FALSE); - g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED); - g_clear_error (&error); - - g_main_loop_quit (main_loop); -} - -static void -test_batch_async_cancellation (BatchAsyncData *data, gconstpointer service) -{ - GDataBatchOperation *operation; - GMainLoop *main_loop; - GCancellable *cancellable; - GError *error = NULL; - - gdata_test_mock_server_start_trace (mock_server, "batch-async-cancellation"); - - /* Run an async query operation on the contact */ - operation = gdata_batchable_create_operation (GDATA_BATCHABLE (service), gdata_contacts_service_get_primary_authorization_domain (), - "https://www.google.com/m8/feeds/contacts/default/full/batch"); - gdata_test_batch_operation_query (operation, gdata_entry_get_id (GDATA_ENTRY (data->new_contact)), GDATA_TYPE_CONTACTS_CONTACT, - GDATA_ENTRY (data->new_contact), NULL, &error); - - main_loop = g_main_loop_new (NULL, TRUE); - cancellable = g_cancellable_new (); - - gdata_batch_operation_run_async (operation, cancellable, (GAsyncReadyCallback) test_batch_async_cancellation_cb, main_loop); - g_cancellable_cancel (cancellable); /* this should cancel the operation before it even starts, as we haven't run the main loop yet */ - - g_main_loop_run (main_loop); - - g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED); - g_clear_error (&error); - - g_main_loop_unref (main_loop); - g_object_unref (cancellable); - g_object_unref (operation); - - uhm_server_end_trace (mock_server); -} - -static void -teardown_batch_async (BatchAsyncData *data, gconstpointer service) -{ - GError *error = NULL; - - gdata_test_mock_server_start_trace (mock_server, "teardown-batch-async"); - - /* Delete the contact */ - g_assert (gdata_service_delete_entry (GDATA_SERVICE (service), gdata_contacts_service_get_primary_authorization_domain (), - GDATA_ENTRY (data->new_contact), NULL, &error) == TRUE); - g_assert_no_error (error); - g_clear_error (&error); - - g_object_unref (data->new_contact); - - uhm_server_end_trace (mock_server); -} - -static void -test_group_membership (void) -{ - GDataContactsContact *contact; - GList *groups; - - /* Create a new contact with no groups */ - contact = gdata_contacts_contact_new (NULL); - g_assert (GDATA_IS_CONTACTS_CONTACT (contact)); - g_assert (gdata_contacts_contact_get_groups (contact) == NULL); - g_assert (gdata_contacts_contact_is_group_deleted (contact, "http://notagroup.com/") == FALSE); - - /* Add a group */ - gdata_contacts_contact_add_group (contact, "http://foo.com/group1"); - g_assert (gdata_contacts_contact_is_group_deleted (contact, "http://foo.com/group1") == FALSE); - - groups = gdata_contacts_contact_get_groups (contact); - g_assert_cmpint (g_list_length (groups), ==, 1); - g_assert_cmpstr (groups->data, ==, "http://foo.com/group1"); - - /* Add another group */ - gdata_contacts_contact_add_group (contact, "http://foo.com/group2"); - g_assert (gdata_contacts_contact_is_group_deleted (contact, "http://foo.com/group1") == FALSE); - g_assert (gdata_contacts_contact_is_group_deleted (contact, "http://foo.com/group2") == FALSE); - - groups = gdata_contacts_contact_get_groups (contact); - g_assert_cmpint (g_list_length (groups), ==, 2); - if (strcmp (groups->data, "http://foo.com/group1") == 0) - g_assert_cmpstr (groups->next->data, ==, "http://foo.com/group2"); - else if (strcmp (groups->data, "http://foo.com/group2") == 0) - g_assert_cmpstr (groups->next->data, ==, "http://foo.com/group1"); - else - g_assert_not_reached (); - - /* Remove the first group */ - gdata_contacts_contact_remove_group (contact, "http://foo.com/group1"); - g_assert (gdata_contacts_contact_is_group_deleted (contact, "http://foo.com/group1") == FALSE); /* hasn't been propagated to the server */ - - groups = gdata_contacts_contact_get_groups (contact); - g_assert_cmpint (g_list_length (groups), ==, 1); - g_assert_cmpstr (groups->data, ==, "http://foo.com/group2"); - - g_object_unref (contact); -} - -static void -test_contact_id (void) -{ - GDataContactsContact *contact; - GError *error = NULL; - - /* Check that IDs are changed to the full projection when creating a new contact… */ - contact = gdata_contacts_contact_new ("http://www.google.com/m8/feeds/contacts/libgdata.test@googlemail.com/base/1b46cdd20bfbee3b"); - g_assert_cmpstr (gdata_entry_get_id (GDATA_ENTRY (contact)), ==, - "http://www.google.com/m8/feeds/contacts/libgdata.test@googlemail.com/full/1b46cdd20bfbee3b"); - g_object_unref (contact); - - /* …and when creating one from XML. */ - contact = GDATA_CONTACTS_CONTACT (gdata_parsable_new_from_xml (GDATA_TYPE_CONTACTS_CONTACT, - "<entry xmlns='http://www.w3.org/2005/Atom' " - "xmlns:gd='http://schemas.google.com/g/2005'>" - "<id>http://www.google.com/m8/feeds/contacts/libgdata.test@googlemail.com/base/1b46cdd20bfbee3b</id>" - "<updated>2009-04-25T15:21:53.688Z</updated>" - "<category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/contact/2008#contact'/>" - "<title>Foobar</title>" - "</entry>", -1, &error)); - g_assert_no_error (error); - g_assert (GDATA_IS_CONTACTS_CONTACT (contact)); - g_clear_error (&error); - - g_assert_cmpstr (gdata_entry_get_id (GDATA_ENTRY (contact)), ==, - "http://www.google.com/m8/feeds/contacts/libgdata.test@googlemail.com/full/1b46cdd20bfbee3b"); - - g_object_unref (contact); -} - -static void -mock_server_notify_resolver_cb (GObject *object, GParamSpec *pspec, gpointer user_data) -{ - UhmServer *server; - UhmResolver *resolver; - - server = UHM_SERVER (object); - - /* Set up the expected domain names here. This should technically be split up between - * the different unit test suites, but that's too much effort. */ - resolver = uhm_server_get_resolver (server); - - if (resolver != NULL) { - const gchar *ip_address = uhm_server_get_address (server); - - uhm_resolver_add_A (resolver, "www.google.com", ip_address); - uhm_resolver_add_A (resolver, - "accounts.google.com", ip_address); - } -} - -/* Set up a global GDataAuthorizer to be used for all the tests. Unfortunately, - * the Google Contacts API is effectively limited to OAuth2 - * authorisation, so this requires user interaction when online. - * - * If not online, use a dummy authoriser. */ -static GDataAuthorizer * -create_global_authorizer (void) -{ - GDataOAuth2Authorizer *authorizer = NULL; /* owned */ - gchar *authentication_uri, *authorisation_code; - GError *error = NULL; - - /* If not online, just return a dummy authoriser. */ - if (!uhm_server_get_enable_online (mock_server)) { - return GDATA_AUTHORIZER (gdata_dummy_authorizer_new (GDATA_TYPE_CONTACTS_SERVICE)); - } - - /* Otherwise, go through the interactive OAuth dance. */ - gdata_test_mock_server_start_trace (mock_server, "global-authentication"); - authorizer = gdata_oauth2_authorizer_new (CLIENT_ID, CLIENT_SECRET, - REDIRECT_URI, - GDATA_TYPE_CONTACTS_SERVICE); - - /* Get an authentication URI */ - authentication_uri = gdata_oauth2_authorizer_build_authentication_uri (authorizer, NULL, FALSE); - g_assert (authentication_uri != NULL); - - /* Get the authorisation code off the user. */ - authorisation_code = gdata_test_query_user_for_verifier (authentication_uri); - - g_free (authentication_uri); - - if (authorisation_code == NULL) { - /* Skip tests. */ - g_object_unref (authorizer); - authorizer = NULL; - goto skip_test; - } - - /* Authorise the token */ - g_assert (gdata_oauth2_authorizer_request_authorization (authorizer, authorisation_code, NULL, &error)); - g_assert_no_error (error); - -skip_test: - g_free (authorisation_code); - - uhm_server_end_trace (mock_server); - - return GDATA_AUTHORIZER (authorizer); -} - -int -main (int argc, char *argv[]) -{ - gint retval; - GDataAuthorizer *authorizer = NULL; /* owned */ - GDataService *service = NULL; /* owned */ - GFile *trace_directory = NULL; /* owned */ - gchar *path = NULL; /* owned */ - - gdata_test_init (argc, argv); - - mock_server = gdata_test_get_mock_server (); - g_signal_connect (G_OBJECT (mock_server), "notify::resolver", - (GCallback) mock_server_notify_resolver_cb, NULL); - path = g_test_build_filename (G_TEST_DIST, "traces/contacts", NULL); - trace_directory = g_file_new_for_path (path); - g_free (path); - uhm_server_set_trace_directory (mock_server, trace_directory); - g_object_unref (trace_directory); - - authorizer = create_global_authorizer (); - service = GDATA_SERVICE (gdata_contacts_service_new (authorizer)); - - g_test_add_func ("/contacts/authentication", test_authentication); - - g_test_add ("/contacts/contact/insert", InsertData, service, set_up_insert, test_contact_insert, tear_down_insert); - g_test_add ("/contacts/contact/update", TempContactData, service, set_up_temp_contact, test_contact_update, tear_down_temp_contact); - - g_test_add ("/contacts/query/all_contacts", QueryAllContactsData, service, set_up_query_all_contacts, test_query_all_contacts, - tear_down_query_all_contacts); - g_test_add ("/contacts/query/all_contacts/async", GDataAsyncTestData, service, set_up_query_all_contacts_async, - test_query_all_contacts_async, tear_down_query_all_contacts_async); - g_test_add ("/contacts/query/all_contacts/async/progress_closure", QueryAllContactsData, service, - set_up_query_all_contacts, test_query_all_contacts_async_progress_closure, tear_down_query_all_contacts); - g_test_add ("/contacts/query/all_contacts/cancellation", GDataAsyncTestData, service, set_up_query_all_contacts_async, - test_query_all_contacts_async_cancellation, tear_down_query_all_contacts_async); - - g_test_add_data_func ("/contacts/photo/has_photo", service, test_photo_has_photo); - g_test_add ("/contacts/photo/add", TempContactData, service, set_up_temp_contact, test_photo_add, tear_down_temp_contact); - g_test_add ("/contacts/photo/add/async", GDataAsyncTestData, service, set_up_temp_contact_async, test_photo_add_async, - tear_down_temp_contact_async); - g_test_add ("/contacts/photo/add/async/cancellation", GDataAsyncTestData, service, set_up_temp_contact_async, - test_photo_add_async_cancellation, tear_down_temp_contact_async); - g_test_add ("/contacts/photo/get", TempContactData, service, set_up_temp_contact_with_photo, test_photo_get, tear_down_temp_contact); - g_test_add ("/contacts/photo/get/async", GDataAsyncTestData, service, set_up_temp_contact_with_photo_async, test_photo_get_async, - tear_down_temp_contact_with_photo_async); - g_test_add ("/contacts/photo/get/async/cancellation", GDataAsyncTestData, service, set_up_temp_contact_with_photo_async, - test_photo_get_async_cancellation, tear_down_temp_contact_with_photo_async); - - g_test_add ("/contacts/photo/delete", TempContactData, service, set_up_temp_contact_with_photo, test_photo_delete, - tear_down_temp_contact); - g_test_add ("/contacts/photo/delete/async", GDataAsyncTestData, service, set_up_temp_contact_with_photo_async, - test_photo_delete_async, tear_down_temp_contact_with_photo_async); -/* - Too broken to continue running at the moment. - g_test_add ("/contacts/photo/delete/async/cancellation", GDataAsyncTestData, service, set_up_temp_contact_with_photo_async, - test_photo_delete_async_cancellation, tear_down_temp_contact_with_photo_async); -*/ - - g_test_add_data_func ("/contacts/batch", service, test_batch); - g_test_add ("/contacts/batch/async", BatchAsyncData, service, setup_batch_async, test_batch_async, teardown_batch_async); - g_test_add ("/contacts/batch/async/cancellation", BatchAsyncData, service, setup_batch_async, test_batch_async_cancellation, - teardown_batch_async); - - g_test_add ("/contacts/group/query", QueryAllGroupsData, service, set_up_query_all_groups, test_query_all_groups, - tear_down_query_all_groups); - g_test_add ("/contacts/group/query/async", GDataAsyncTestData, service, set_up_query_all_groups_async, - test_query_all_groups_async, tear_down_query_all_groups_async); - g_test_add ("/contacts/group/query/async/progress_closure", QueryAllGroupsData, service, set_up_query_all_groups, - test_query_all_groups_async_progress_closure, tear_down_query_all_groups); - g_test_add ("/contacts/group/query/async/cancellation", GDataAsyncTestData, service, set_up_query_all_groups_async, - test_query_all_groups_async_cancellation, tear_down_query_all_groups_async); - - g_test_add ("/contacts/group/insert", InsertGroupData, service, set_up_insert_group, test_group_insert, tear_down_insert_group); - g_test_add ("/contacts/group/insert/async", GDataAsyncTestData, service, set_up_insert_group_async, test_group_insert_async, - tear_down_insert_group_async); - g_test_add ("/contacts/group/insert/async/cancellation", GDataAsyncTestData, service, set_up_insert_group_async, - test_group_insert_async_cancellation, tear_down_insert_group_async); - - g_test_add_func ("/contacts/contact/properties", test_contact_properties); - g_test_add_func ("/contacts/contact/escaping", test_contact_escaping); - g_test_add_func ("/contacts/contact/parser/minimal", test_contact_parser_minimal); - g_test_add_func ("/contacts/contact/parser/normal", test_contact_parser_normal); - g_test_add_func ("/contacts/contact/parser/error_handling", test_contact_parser_error_handling); - g_test_add_func ("/contacts/contact/id", test_contact_id); - - g_test_add_func ("/contacts/query/uri", test_query_uri); - g_test_add_func ("/contacts/query/etag", test_query_etag); - g_test_add_func ("/contacts/query/properties", test_query_properties); - - g_test_add_func ("/contacts/group/properties", test_group_properties); - g_test_add_func ("/contacts/group/escaping", test_group_escaping); - g_test_add_func ("/contacts/group/parser/normal", test_group_parser_normal); - g_test_add_func ("/contacts/group/parser/system", test_group_parser_system); - g_test_add_func ("/contacts/group/parser/error_handling", test_group_parser_error_handling); - g_test_add_func ("/contacts/group/membership", test_group_membership); - - retval = g_test_run (); - - g_clear_object (&service); - g_clear_object (&authorizer); - - return retval; -} - -G_GNUC_END_IGNORE_DEPRECATIONS |