/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* This library is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library. If not, see .
*
*/
#include
#include
#include "ebook-test-utils.h"
void
test_print (const gchar *format,
...)
{
va_list args;
const gchar *debug_string;
static gboolean debug_set = FALSE;
static gboolean debug = FALSE;
if (!debug_set) {
debug_string = g_getenv ("EDS_TEST_DEBUG");
if (debug_string) {
debug = (g_ascii_strtoll (debug_string, NULL, 10) >= 1);
}
debug_set = TRUE;
}
if (debug) {
va_start (args, format);
vprintf (format, args);
va_end (args);
}
}
gboolean
ebook_test_utils_callback_quit (gpointer user_data)
{
EBookTestClosure *closure = user_data;
g_main_loop_quit ((GMainLoop *) closure->user_data);
return FALSE;
}
static const gchar *args_data_dir = NULL;
void
ebook_test_utils_read_args (gint argc,
gchar **argv)
{
gint ii;
for (ii = 0; ii < argc; ii++) {
if (g_strcmp0 (argv[ii], "--data-dir") == 0) {
if (ii + 1 < argc)
args_data_dir = argv[ii + 1];
break;
}
}
}
gchar *
ebook_test_utils_new_vcard_from_test_case (const gchar *case_name)
{
gchar *filename;
gchar *case_filename;
GFile * file;
GError *error = NULL;
gchar *vcard;
case_filename = g_strdup_printf ("%s.vcf", case_name);
/* In the case of installed tests, they run in ${pkglibexecdir}/installed-tests
* and the vcards are installed in ${pkglibexecdir}/installed-tests/vcards
*/
if (g_getenv ("TEST_INSTALLED_SERVICES") != NULL) {
filename = g_build_filename (INSTALLED_TEST_DIR, "vcards", case_filename, NULL);
} else {
if (!args_data_dir) {
g_warning ("Data directory not set, pass it with `--data-dir PATH`");
exit(1);
}
filename = g_build_filename (args_data_dir, case_filename, NULL);
}
file = g_file_new_for_path (filename);
if (!g_file_load_contents (file, NULL, &vcard, NULL, NULL, &error)) {
g_warning (
"failed to read test contact file '%s': %s",
filename, error->message);
exit (1);
}
g_free (case_filename);
g_free (filename);
g_object_unref (file);
return vcard;
}
gchar *
ebook_test_utils_book_add_contact_from_test_case_verify (EBook *book,
const gchar *case_name,
EContact **contact)
{
gchar *vcard;
EContact *contact_orig;
EContact *contact_final;
gchar *uid;
vcard = ebook_test_utils_new_vcard_from_test_case (case_name);
contact_orig = e_contact_new_from_vcard (vcard);
uid = g_strdup (ebook_test_utils_book_add_contact (book, contact_orig));
contact_final = ebook_test_utils_book_get_contact (book, uid);
/* verify the contact was added "successfully" (not thorough) */
g_assert_true (ebook_test_utils_contacts_are_equal_shallow (contact_orig, contact_final));
if (contact)
*contact = g_object_ref (contact_final);
return uid;
}
/* This is not a thorough comparison (which is difficult, assuming we give the
* back-ends leniency in implementation) and is best suited for simple tests */
gboolean
ebook_test_utils_contacts_are_equal_shallow (EContact *a,
EContact *b)
{
const gchar *uid_a, *uid_b;
/* Avoid warnings if one or more are NULL, to make this function
* "NULL-friendly" */
if (!a && !b)
return TRUE;
if (!E_IS_CONTACT (a) || !E_IS_CONTACT (b))
return FALSE;
uid_a = e_contact_get_const (a, E_CONTACT_UID);
uid_b = e_contact_get_const (b, E_CONTACT_UID);
return g_strcmp0 (uid_a, uid_b) == 0;
}
const gchar *
ebook_test_utils_book_add_contact (EBook *book,
EContact *contact)
{
GError *error = NULL;
if (!e_book_add_contact (book, contact, &error)) {
ESource *source;
const gchar *name;
source = e_book_get_source (book);
name = e_source_get_display_name (source);
g_warning (
"failed to add contact to addressbook: `%s': %s",
name, error->message);
exit (1);
}
return e_contact_get_const (contact, E_CONTACT_UID);
}
static void
add_contact_cb (EBook *book,
const GError *error,
const gchar *uid,
EBookTestClosure *closure)
{
if (error) {
g_warning (
"failed to asynchronously add the contact '%s': "
"status %d (%s)", uid, error->code, error->message);
exit (1);
}
test_print ("successfully asynchronously added the contact "
"addressbook\n");
if (closure->cb)
(*closure->cb) (closure);
g_free (closure);
}
void
ebook_test_utils_book_async_add_contact (EBook *book,
EContact *contact,
GSourceFunc callback,
gpointer user_data)
{
EBookTestClosure *closure;
closure = g_new0 (EBookTestClosure, 1);
closure->cb = callback;
closure->user_data = user_data;
if (!e_book_add_contact_async (book, contact,
(EBookIdAsyncCallback) add_contact_cb, closure)) {
g_warning ("failed to set up contact add");
exit (1);
}
}
void
ebook_test_utils_book_commit_contact (EBook *book,
EContact *contact)
{
GError *error = NULL;
if (!e_book_commit_contact (book, contact, &error)) {
ESource *source;
const gchar *name;
const gchar *uid;
uid = (const gchar *) e_contact_get_const (contact, E_CONTACT_UID);
source = e_book_get_source (book);
name = e_source_get_display_name (source);
g_warning (
"failed to commit changes to contact '%s' to "
"addressbook: `%s': %s", uid, name, error->message);
exit (1);
}
}
static void
commit_contact_cb (EBook *book,
const GError *error,
EBookTestClosure *closure)
{
if (error) {
g_warning (
"failed to asynchronously commit the contact: "
"status %d (%s)", error->code, error->message);
exit (1);
}
test_print ("successfully asynchronously committed the contact to the "
"addressbook\n");
if (closure->cb)
(*closure->cb) (closure);
g_free (closure);
}
void
ebook_test_utils_book_async_commit_contact (EBook *book,
EContact *contact,
GSourceFunc callback,
gpointer user_data)
{
EBookTestClosure *closure;
closure = g_new0 (EBookTestClosure, 1);
closure->cb = callback;
closure->user_data = user_data;
if (!e_book_commit_contact_async (book, contact,
(EBookAsyncCallback) commit_contact_cb, closure)) {
g_warning ("failed to set up contact commit");
exit (1);
}
}
EContact *
ebook_test_utils_book_get_contact (EBook *book,
const gchar *uid)
{
EContact *contact = NULL;
GError *error = NULL;
if (!e_book_get_contact (book, uid, &contact, &error)) {
ESource *source;
const gchar *name;
source = e_book_get_source (book);
name = e_source_get_display_name (source);
g_warning (
"failed to get contact '%s' in addressbook: `%s': "
"%s", uid, name, error->message);
exit (1);
}
return contact;
}
static void
get_contact_cb (EBook *book,
const GError *error,
EContact *contact,
EBookTestClosure *closure)
{
const gchar *uid;
if (error) {
g_warning (
"failed to asynchronously get the contact: "
"status %d (%s)", error->code, error->message);
exit (1);
}
uid = e_contact_get_const (contact, E_CONTACT_UID);
test_print (
"successfully asynchronously retrieved the contact '%s'\n",
uid);
if (closure->cb)
(*closure->cb) (closure);
g_free (closure);
}
void
ebook_test_utils_book_async_get_contact (EBook *book,
const gchar *uid,
GSourceFunc callback,
gpointer user_data)
{
EBookTestClosure *closure;
closure = g_new0 (EBookTestClosure, 1);
closure->cb = callback;
closure->user_data = user_data;
if (!e_book_get_contact_async (book, uid,
(EBookContactAsyncCallback) get_contact_cb,
closure)) {
g_warning ("failed to set up async getContact");
exit (1);
}
}
GList *
ebook_test_utils_book_get_required_fields (EBook *book)
{
GList *fields = NULL;
GError *error = NULL;
if (!e_book_get_required_fields (book, &fields, &error)) {
ESource *source;
const gchar *name;
source = e_book_get_source (book);
name = e_source_get_display_name (source);
g_warning (
"failed to get required fields for addressbook "
"`%s': %s", name, error->message);
exit (1);
}
return fields;
}
static void
get_required_fields_cb (EBook *book,
const GError *error,
EList *fields,
EBookTestClosure *closure)
{
if (error) {
g_warning (
"failed to asynchronously get the required fields: "
"status %d (%s)", error->code, error->message);
exit (1);
}
closure->list = fields;
test_print ("successfully asynchronously retrieved the required fields\n");
if (closure->cb)
(*closure->cb) (closure);
g_free (closure);
}
void
ebook_test_utils_book_async_get_required_fields (EBook *book,
GSourceFunc callback,
gpointer user_data)
{
EBookTestClosure *closure;
closure = g_new0 (EBookTestClosure, 1);
closure->cb = callback;
closure->user_data = user_data;
if (!e_book_get_required_fields_async (book,
(EBookEListAsyncCallback) get_required_fields_cb,
closure)) {
g_warning ("failed to set up async getRequiredFields");
exit (1);
}
}
const gchar *
ebook_test_utils_book_get_static_capabilities (EBook *book)
{
GError *error = NULL;
const gchar *caps;
if (!(caps = e_book_get_static_capabilities (book, &error))) {
ESource *source;
const gchar *name;
source = e_book_get_source (book);
name = e_source_get_display_name (source);
g_warning (
"failed to get capabilities for addressbook: `%s': "
"%s", name, error->message);
exit (1);
}
return caps;
}
GList *
ebook_test_utils_book_get_supported_auth_methods (EBook *book)
{
GList *fields = NULL;
GError *error = NULL;
if (!e_book_get_supported_auth_methods (book, &fields, &error)) {
ESource *source;
const gchar *name;
source = e_book_get_source (book);
name = e_source_get_display_name (source);
g_warning (
"failed to get supported auth methods for "
"addressbook `%s': %s", name, error ? error->message : "Unknown error");
exit (1);
}
return fields;
}
static void
get_supported_auth_methods_cb (EBook *book,
const GError *error,
EList *methods,
EBookTestClosure *closure)
{
if (error) {
g_warning (
"failed to asynchronously get the supported auth "
"methods: status %d (%s)", error->code, error->message);
exit (1);
}
closure->list = methods;
test_print ("successfully asynchronously retrieved the supported auth "
"methods\n");
if (closure->cb)
(*closure->cb) (closure);
g_free (closure);
}
void
ebook_test_utils_book_async_get_supported_auth_methods (EBook *book,
GSourceFunc callback,
gpointer user_data)
{
EBookTestClosure *closure;
closure = g_new0 (EBookTestClosure, 1);
closure->cb = callback;
closure->user_data = user_data;
if (!e_book_get_supported_auth_methods_async (book,
(EBookEListAsyncCallback) get_supported_auth_methods_cb,
closure)) {
g_warning ("failed to set up async getSupportedAuthMethods");
exit (1);
}
}
GList *
ebook_test_utils_book_get_supported_fields (EBook *book)
{
GList *fields = NULL;
GError *error = NULL;
if (!e_book_get_supported_fields (book, &fields, &error)) {
ESource *source;
const gchar *name;
source = e_book_get_source (book);
name = e_source_get_display_name (source);
g_warning (
"failed to get supported fields for addressbook "
"`%s': %s", name, error->message);
exit (1);
}
return fields;
}
static void
get_supported_fields_cb (EBook *book,
const GError *error,
EList *fields,
EBookTestClosure *closure)
{
if (error) {
g_warning (
"failed to asynchronously get the supported fields: "
"status %d (%s)", error->code, error->message);
exit (1);
}
closure->list = fields;
test_print ("successfully asynchronously retrieved the supported fields\n");
if (closure->cb)
(*closure->cb) (closure);
g_free (closure);
}
void
ebook_test_utils_book_async_get_supported_fields (EBook *book,
GSourceFunc callback,
gpointer user_data)
{
EBookTestClosure *closure;
closure = g_new0 (EBookTestClosure, 1);
closure->cb = callback;
closure->user_data = user_data;
if (!e_book_get_supported_fields_async (book,
(EBookEListAsyncCallback) get_supported_fields_cb,
closure)) {
g_warning ("failed to set up async getSupportedFields");
exit (1);
}
}
void
ebook_test_utils_book_remove_contact (EBook *book,
const gchar *uid)
{
GError *error = NULL;
if (!e_book_remove_contact (book, uid, &error)) {
ESource *source;
const gchar *name;
source = e_book_get_source (book);
name = e_source_get_display_name (source);
g_warning (
"failed to remove contact '%s' from addressbook: "
"`%s': %s", uid, name, error->message);
exit (1);
}
}
static void
remove_contact_cb (EBook *book,
const GError *error,
EBookTestClosure *closure)
{
if (error) {
g_warning (
"failed to asynchronously remove the contact: "
"status %d (%s)", error->code, error->message);
exit (1);
}
test_print ("successfully asynchronously removed the contact\n");
if (closure->cb)
(*closure->cb) (closure);
g_free (closure);
}
void
ebook_test_utils_book_async_remove_contact (EBook *book,
EContact *contact,
GSourceFunc callback,
gpointer user_data)
{
EBookTestClosure *closure;
closure = g_new0 (EBookTestClosure, 1);
closure->cb = callback;
closure->user_data = user_data;
if (!e_book_remove_contact_async (book, contact,
(EBookAsyncCallback) remove_contact_cb,
closure)) {
g_warning (
"failed to set up async removeContacts "
"(for a single contact)");
exit (1);
}
}
static void
remove_contact_by_id_cb (EBook *book,
const GError *error,
EBookTestClosure *closure)
{
if (error) {
g_warning (
"failed to asynchronously remove the contact by id: "
"status %d (%s)", error->code, error->message);
exit (1);
}
test_print ("successfully asynchronously removed the contact by id\n");
if (closure->cb)
(*closure->cb) (closure);
g_free (closure);
}
void
ebook_test_utils_book_async_remove_contact_by_id (EBook *book,
const gchar *uid,
GSourceFunc callback,
gpointer user_data)
{
EBookTestClosure *closure;
closure = g_new0 (EBookTestClosure, 1);
closure->cb = callback;
closure->user_data = user_data;
if (!e_book_remove_contact_by_id_async (book, uid,
(EBookAsyncCallback) remove_contact_by_id_cb,
closure)) {
g_warning ("failed to set up async removeContacts (by id)");
exit (1);
}
}
void
ebook_test_utils_book_remove_contacts (EBook *book,
GList *ids)
{
GError *error = NULL;
if (!e_book_remove_contacts (book, ids, &error)) {
ESource *source;
const gchar *name;
source = e_book_get_source (book);
name = e_source_get_display_name (source);
g_warning (
"failed to remove contacts from addressbook: `%s': %s",
name, error->message);
exit (1);
}
}
static void
remove_contacts_cb (EBook *book,
const GError *error,
EBookTestClosure *closure)
{
if (error) {
g_warning (
"failed to asynchronously remove the contacts: "
"status %d (%s)", error->code, error->message);
exit (1);
}
test_print ("successfully asynchronously removed the contacts\n");
if (closure->cb)
(*closure->cb) (closure);
g_free (closure);
}
void
ebook_test_utils_book_async_remove_contacts (EBook *book,
GList *uids,
GSourceFunc callback,
gpointer user_data)
{
EBookTestClosure *closure;
closure = g_new0 (EBookTestClosure, 1);
closure->cb = callback;
closure->user_data = user_data;
if (!e_book_remove_contacts_async (book, uids,
(EBookAsyncCallback) remove_contacts_cb,
closure)) {
g_warning ("failed to set up async removeContacts");
exit (1);
}
}
void
ebook_test_utils_book_get_book_view (EBook *book,
EBookQuery *query,
EBookView **view)
{
GError *error = NULL;
if (!e_book_get_book_view (book, query, NULL, -1, view, &error)) {
ESource *source;
const gchar *name;
source = e_book_get_source (book);
name = e_source_get_display_name (source);
g_warning (
"failed to get view for addressbook: `%s': %s",
name, error->message);
exit (1);
}
}
static void
get_book_view_cb (EBook *book,
const GError *error,
EBookView *view,
EBookTestClosure *closure)
{
if (error) {
g_warning (
"failed to asynchronously get book view for the "
"book: status %d (%s)", error->code, error->message);
exit (1);
}
closure->view = view;
test_print ("successfully asynchronously retrieved the book view\n");
if (closure->cb)
(*closure->cb) (closure);
}
void
ebook_test_utils_book_async_get_book_view (EBook *book,
EBookQuery *query,
GSourceFunc callback,
gpointer user_data)
{
EBookTestClosure *closure;
closure = g_new0 (EBookTestClosure, 1);
closure->cb = callback;
closure->user_data = user_data;
if (!e_book_get_book_view_async (book, query, NULL, -1, (EBookBookViewAsyncCallback) get_book_view_cb, closure)) {
g_warning ("failed to set up book view retrieval");
exit (1);
}
}