[meego-commits] 7787: Changes to Trunk/libaccounts-glib

Rolla Selbak no_reply at build.meego.com
Fri Sep 24 06:31:40 UTC 2010


Hi,
I have made the following changes to libaccounts-glib in project Trunk. Please review and accept ASAP.

Thank You,
Rolla Selbak

[This message was auto-generated]

---

Request #7787:

  submit:   Trunk:Testing/libaccounts-glib(r3) -> Trunk/libaccounts-glib


Message:
    Move to Trunk

State:   new          2010-09-23T23:31:39 rolla
Comment: None



changes files:
--------------
--- libaccounts-glib.changes
+++ libaccounts-glib.changes
@@ -0,0 +1,5 @@
+* Wed Sep 15 2010 Fathi Boudra <fathi.boudra at nokia.com> - 0.52
+- Update to 0.52 (BMC#7258)
+- Add libaccounts-glib-tests package
+- Clean up packaging
+
@@ -11 +16 @@
-- First release on top of fedora 12
\ No newline at end of file
+- First release on top of fedora 12

old:
----
  libaccounts-glib-0.45.tar.gz

new:
----
  libaccounts-glib-0.52.tar.gz

spec files:
-----------
--- libaccounts-glib.spec
+++ libaccounts-glib.spec
@@ -1,75 +1,84 @@
 Name: libaccounts-glib
-Version: 0.45
+Version:        0.52
 Release: 1
-Group: System/Libraries
-Summary: Nokia Maemo Accounts base library
 License: LGPLv2.1
-URL: http://gitorious.org/accounts-sso/accounts-glib
+Summary:        Nokia Maemo Accounts base library
+Url:            http://gitorious.org/accounts-sso/accounts-glib
+Group:          System/Libraries
 Source0: %{name}-%{version}.tar.gz
-BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 BuildRequires: automake
-BuildRequires: pkgconfig
 BuildRequires: gtk-doc
-BuildRequires: pkgconfig(glib-2.0)
-BuildRequires: pkgconfig(sqlite3)
+BuildRequires:  pkgconfig
+BuildRequires:  pkgconfig(check) >= 0.9.4
 BuildRequires: pkgconfig(dbus-1)
 BuildRequires: pkgconfig(dbus-glib-1)
+BuildRequires:  pkgconfig(glib-2.0)
 BuildRequires: pkgconfig(libxml-2.0)
-BuildRequires: pkgconfig(check)  >= 0.9.4
+BuildRequires:  pkgconfig(sqlite3)
 
 %description
 %{summary}.
 
-%files
-%defattr(-,root,root,-)
-%doc README COPYING
-%{_libdir}/lib*.so.*
-%{_datadir}/backup-framework/applications/*.conf
-#exclude tests for now
-%exclude %{_bindir}/*test*
-%exclude %{_datadir}/libaccounts-glib0-test
-%exclude /usr/doc/reference
-
 %package devel
 Summary: Development files for %{name}
 Group: Development/Libraries
-Requires: %{name} = %{version}-%{release}
-Requires: glib2-devel
+Requires:       %{name} = %{version}
+Requires:       pkgconfig(glib-2.0)
 Requires: pkgconfig
 
 %description devel
-The %{name}-devel package contains libraries and header files for
-developing applications that use %{name}.
+The %{name}-devel package contains libraries and header files for developing
+applications that use %{name}.
 
-%files devel
-%defattr(-,root,root,-)
-%{_libdir}/*.so
-%exclude %{_libdir}/*.la
-%{_libdir}/pkgconfig/*
-%{_includedir}/*
+%package tests
+Summary:        Tests for %{name}
+Group:          Development/Libraries
+Requires:       %{name} = %{version}
+
+%description tests
+This package contains %{name} tests.
 
 %prep
 %setup -q
 
 %build
 gtkdocize
-autoreconf -i --force
-
-%configure \
-        --disable-static \
-        --disable-gtk-doc
-
+autoreconf -vfi
+%configure --disable-static --disable-gtk-doc
 make %{?_smp_mflags}
 
-
 %install
-rm -rf %{buildroot}
-make install DESTDIR=%{buildroot}
-
-
-%clean
-rm -rf %{buildroot}
+%make_install
 
 %post -p /sbin/ldconfig
 
 %postun -p /sbin/ldconfig
+
+%files
+%defattr(-,root,root,-)
+%doc README COPYING
+%{_libdir}/libaccounts-glib.so.*
+%{_datadir}/backup-framework/applications/accounts.conf
+
+%files devel
+%defattr(-,root,root,-)
+%{_includedir}/libaccounts-glib/ag-account.h
+%{_includedir}/libaccounts-glib/ag-errors.h
+%{_includedir}/libaccounts-glib/ag-manager.h
+%{_includedir}/libaccounts-glib/ag-provider.h
+%{_includedir}/libaccounts-glib/ag-service-type.h
+%{_includedir}/libaccounts-glib/ag-service.h
+%{_libdir}/libaccounts-glib.so
+%{_libdir}/pkgconfig/libaccounts-glib.pc
+
+%files tests
+%defattr(-,root,root,-)
+%{_bindir}/accounts-glib-test.sh
+%{_bindir}/accounts-glib-testsuite
+%{_bindir}/test-process
+%{_datadir}/libaccounts-glib0-test/e-mail.service-type
+%{_datadir}/libaccounts-glib0-test/MyProvider.provider
+%{_datadir}/libaccounts-glib0-test/MyService.service
+%{_datadir}/libaccounts-glib0-test/OtherService.service
+%{_datadir}/libaccounts-glib0-test/tests.xml
+%exclude %{_prefix}/doc/reference

other changes:
--------------

++++++ libaccounts-glib-0.45.tar.gz -> libaccounts-glib-0.52.tar.gz
--- configure.ac
+++ configure.ac
@@ -1,6 +1,6 @@
 dnl Process this file with autoconf to produce a configure script.
 
-AC_INIT(libaccounts-glib, 0.45)
+AC_INIT(libaccounts-glib, 0.52)
 
 AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
 AM_CONFIG_HEADER(config.h)
--- libaccounts-glib/ag-account.c
+++ libaccounts-glib/ag-account.c
@@ -681,6 +681,14 @@
                 "FROM Accounts WHERE id = %u", account->id);
     rows = _ag_manager_exec_query (priv->manager,
                                    (AgQueryCallback)got_account, priv, sql);
+    /* if the query succeeded but we didn't get a row, we must set the
+     * NOT_FOUND error */
+    if (_ag_manager_get_last_error (priv->manager) == NULL && rows != 1)
+    {
+        GError *error = g_error_new (AG_ERRORS, AG_ERROR_ACCOUNT_NOT_FOUND,
+                                     "Account %u not found in DB", account->id);
+        _ag_manager_take_error (priv->manager, error);
+    }
 
     return rows == 1;
 }
@@ -1386,10 +1394,27 @@
     priv = account->priv;
 
     g_return_val_if_fail (AG_IS_ACCOUNT (account), NULL);
-    sqlite3_snprintf (sizeof (sql), sql,
-                      "SELECT DISTINCT Services.name FROM Services "
-                      "JOIN Settings ON Settings.service = Services.id "
-                      "WHERE Settings.key='enabled' AND Settings.value='1';");
+    const char *service_type = ag_manager_get_service_type(priv->manager);
+
+    if (service_type != NULL)
+        sqlite3_snprintf (sizeof (sql), sql,
+                          "SELECT DISTINCT Services.name FROM Services "
+                          "JOIN Settings ON Settings.service = Services.id "
+                          "WHERE Settings.key='enabled' "
+                          "AND Settings.value='1' "
+                          "AND Settings.account='%d' "
+                          "AND Services.type = '%s';",
+                           account->id,
+                           service_type);
+    else
+        sqlite3_snprintf (sizeof (sql), sql,
+                          "SELECT DISTINCT Services.name FROM Services "
+                          "JOIN Settings ON Settings.service = Services.id "
+                          "WHERE Settings.key='enabled' "
+                          "AND Settings.value='1' "
+                          "AND Settings.account='%d';",
+                           account->id);
+
     _ag_manager_exec_query (priv->manager, (AgQueryCallback)add_name_to_list,
                             &list, sql);
 
--- libaccounts-glib/ag-errors.h
+++ libaccounts-glib/ag-errors.h
@@ -37,6 +37,8 @@
     AG_ERROR_DB,
     AG_ERROR_DISPOSED,
     AG_ERROR_DELETED,
+    AG_ERROR_DB_LOCKED,
+    AG_ERROR_ACCOUNT_NOT_FOUND,
 } AgError;
 
 G_END_DECLS
--- libaccounts-glib/ag-internals.h
+++ libaccounts-glib/ag-internals.h
@@ -92,6 +92,10 @@
 gint _ag_manager_exec_query (AgManager *manager,
                              AgQueryCallback callback, gpointer user_data,
                              const gchar *sql);
+G_GNUC_INTERNAL
+void _ag_manager_take_error (AgManager *manager, GError *error);
+G_GNUC_INTERNAL
+const GError *_ag_manager_get_last_error (AgManager *manager);
 
 struct _AgService {
     /*< private >*/
@@ -101,6 +105,7 @@
     gchar *type;
     gchar *provider;
     gchar *icon_name;
+    gchar *i18n_domain;
     gchar *file_data;
     gsize type_data_offset;
     gint id;
@@ -126,6 +131,7 @@
 struct _AgProvider {
     /*< private >*/
     gint ref_count;
+    gchar *i18n_domain;
     gchar *name;
     gchar *display_name;
     gchar *file_data;
--- libaccounts-glib/ag-manager.c
+++ libaccounts-glib/ag-manager.c
@@ -93,8 +93,11 @@
     /* D-Bus object paths we are listening to */
     GPtrArray *object_paths;
 
+    GError *last_error;
+
     guint db_timeout;
 
+    guint abort_on_db_timeout : 1;
     guint is_disposed : 1;
 
     gchar *service_type;
@@ -126,6 +129,35 @@
 static void store_cb_data_free (StoreCbData *sd);
 static void account_weak_notify (gpointer userdata, GObject *dead_account);
 
+static void
+set_error_from_db (AgManager *manager)
+{
+    AgManagerPrivate *priv = manager->priv;
+    AgError code;
+    GError *error;
+
+    switch (sqlite3_errcode (priv->db))
+    {
+    case SQLITE_DONE:
+    case SQLITE_OK:
+        _ag_manager_take_error (manager, NULL);
+        return;
+    case SQLITE_BUSY:
+        code = AG_ERROR_DB_LOCKED;
+        if (priv->abort_on_db_timeout)
+            g_error ("Accounts DB timeout: causing application to abort.");
+        break;
+    default:
+        code = AG_ERROR_DB;
+        break;
+    }
+
+    error = g_error_new (AG_ERRORS, code, "SQLite error %d: %s",
+                         sqlite3_errcode (priv->db),
+                         sqlite3_errmsg (priv->db));
+    _ag_manager_take_error (manager, error);
+}
+
 static gboolean
 timed_unref_account (gpointer account)
 {
@@ -320,8 +352,14 @@
         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
     }
 
-    DEBUG_INFO ("path = %s, time = %lu-%lu",
-                dbus_message_get_path (msg), ts.tv_sec, ts.tv_nsec);
+    DEBUG_INFO ("path = %s, time = %lu-%lu (%p)",
+                dbus_message_get_path (msg), ts.tv_sec, ts.tv_nsec,
+                manager);
+
+    /* Do not process the same signal more than once. */
+    if (check_signal_processed (priv, &ts))
+        return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
     for (list = priv->emitted_signals; list != NULL; list = list->next)
     {
         EmittedSignalData *esd = list->data;
@@ -343,9 +381,6 @@
         }
     }
 
-    if (check_signal_processed (priv, &ts))
-        return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-
     /* we must mark our emitted signals for reprocessing, because the current
      * signal might modify some of the fields that were previously modified by
      * us.
@@ -806,10 +841,10 @@
     int ret;
 
     error = NULL;
-    ret = sqlite3_exec (db, "PRAGMA synchronous = 0", NULL, NULL, &error);
+    ret = sqlite3_exec (db, "PRAGMA synchronous = 1", NULL, NULL, &error);
     if (ret != SQLITE_OK)
     {
-        g_warning ("%s: couldn't set asynchronous mode (%s)",
+        g_warning ("%s: couldn't set synchronous mode (%s)",
                    G_STRFUNC, error);
         sqlite3_free (error);
     }
@@ -1184,6 +1219,9 @@
     }
     g_free (priv->service_type);
 
+    if (priv->last_error)
+        g_error_free (priv->last_error);
+
     G_OBJECT_CLASS (ag_manager_parent_class)->finalize (object);
 }
 
@@ -1320,6 +1358,27 @@
     return list;
 }
 
+void
+_ag_manager_take_error (AgManager *manager, GError *error)
+{
+    AgManagerPrivate *priv;
+
+    g_return_if_fail (AG_IS_MANAGER (manager));
+    priv = manager->priv;
+
+    if (priv->last_error)
+        g_free (priv->last_error);
+    priv->last_error = error;
+}
+
+const GError *
+_ag_manager_get_last_error (AgManager *manager)
+{
+    g_return_val_if_fail (AG_IS_MANAGER (manager), NULL);
+
+    return manager->priv->last_error;
+}
+
 /**
  * ag_manager_list:
  * @manager: the #AgManager.
@@ -1446,11 +1505,30 @@
  * @account_id.
  *
  * Returns: an #AgAccount, on which the client must call g_object_unref()
- * when it's done with it.
+ * when it's done with it, or %NULL if an error occurs.
  */
 AgAccount *
 ag_manager_get_account (AgManager *manager, AgAccountId account_id)
 {
+    return ag_manager_load_account (manager, account_id, NULL);
+}
+
+/**
+ * ag_manager_load_account:
+ * @manager: the #AgManager.
+ * @account_id: the #AgAccountId of the account.
+ * @error: pointer to a #GError, or %NULL.
+ *
+ * Instantiates the object representing the account identified by
+ * @account_id.
+ *
+ * Returns: an #AgAccount, on which the client must call g_object_unref()
+ * when it's done with it, or %NULL if an error occurs.
+ */
+AgAccount *
+ag_manager_load_account (AgManager *manager, AgAccountId account_id,
+                         GError **error)
+{
     AgManagerPrivate *priv;
     AgAccount *account;
 
@@ -1474,6 +1552,13 @@
         g_hash_table_insert (priv->accounts, GUINT_TO_POINTER (account_id),
                              account);
     }
+    else if (priv->last_error != NULL)
+    {
+        g_set_error_literal (error,
+                             priv->last_error->domain,
+                             priv->last_error->code,
+                             priv->last_error->message);
+    }
     return account;
 }
 
@@ -1794,6 +1879,7 @@
                 }
 
             default:
+                set_error_from_db (manager);
                 g_warning ("%s: runtime error while executing \"%s\": %s",
                            G_STRFUNC, sql, sqlite3_errmsg (db));
                 sqlite3_finalize (stmt);
@@ -1902,6 +1988,34 @@
 }
 
 /**
+ * ag_manager_set_abort_on_db_timeout:
+ * @manager: the #AgManager.
+ * @abort: whether to abort when a DB timeout occurs.
+ *
+ * Tells libaccounts whether it should make the client application abort when
+ * a timeout error occurs. The default is %FALSE.
+ */
+void
+ag_manager_set_abort_on_db_timeout (AgManager *manager, gboolean abort)
+{
+    g_return_if_fail (AG_IS_MANAGER (manager));
+    manager->priv->abort_on_db_timeout = abort;
+}
+
+/**
+ * ag_manager_get_abort_on_db_timeout:
+ * @manager: the #AgManager.
+ *
+ * Returns: whether the library will abort when a timeout error occurs.
+ */
+gboolean
+ag_manager_get_abort_on_db_timeout (AgManager *manager)
+{
+    g_return_val_if_fail (AG_IS_MANAGER (manager), FALSE);
+    return manager->priv->abort_on_db_timeout;
+}
+
+/**
  * ag_manager_load_service_type:
  * @manager: the #AgManager.
  * @service_type: the name of the service type.
--- libaccounts-glib/ag-manager.h
+++ libaccounts-glib/ag-manager.h
@@ -80,6 +80,9 @@
 
 AgAccount *ag_manager_get_account (AgManager *manager,
                                    AgAccountId account_id);
+AgAccount *ag_manager_load_account (AgManager *manager,
+                                    AgAccountId account_id,
+                                    GError **error);
 AgAccount *ag_manager_create_account (AgManager *manager,
                                       const gchar *provider_name);
 
@@ -99,6 +102,8 @@
 
 void ag_manager_set_db_timeout (AgManager *manager, guint timeout_ms);
 guint ag_manager_get_db_timeout (AgManager *manager);
+void ag_manager_set_abort_on_db_timeout (AgManager *manager, gboolean abort);
+gboolean ag_manager_get_abort_on_db_timeout (AgManager *manager);
 
 AgServiceType *ag_manager_load_service_type (AgManager *manager,
                                              const gchar *service_type);
--- libaccounts-glib/ag-provider.c
+++ libaccounts-glib/ag-provider.c
@@ -167,9 +167,13 @@
                 ok = _ag_xml_dup_element_data (reader, &provider->display_name);
                 /* that's the only thing we are interested of: we can stop the
                  * parsing now. */
-                return TRUE;
             }
-            else
+            else if (strcmp (name, "translations") == 0)
+            {
+                ok = _ag_xml_dup_element_data (reader,
+                                               &provider->i18n_domain);
+            }
+	    else
                 ok = TRUE;
 
             if (G_UNLIKELY (!ok)) return FALSE;
@@ -184,16 +188,20 @@
 read_provider_file (xmlTextReaderPtr reader, AgProvider *provider)
 {
     const xmlChar *name;
-    int ret;
+    int ret, type;
 
     ret = xmlTextReaderRead (reader);
     while (ret == 1)
     {
-        name = xmlTextReaderConstName (reader);
-        if (G_LIKELY (name &&
-                      strcmp ((const gchar *)name, "provider") == 0))
+        type = xmlTextReaderNodeType (reader);
+        if (type == XML_READER_TYPE_ELEMENT)
         {
-            return parse_provider (reader, provider);
+            name = xmlTextReaderConstName (reader);
+            if (G_LIKELY (name &&
+                          strcmp ((const gchar *)name, "provider") == 0))
+            {
+                return parse_provider (reader, provider);
+            }
         }
 
         ret = xmlTextReaderNext (reader);
@@ -325,6 +333,20 @@
 }
 
 /**
+ * ag_provider_get_i18n_domain:
+ * @provider: the #AgProvider.
+ *
+ * Returns: the translation domain.
+ */
+const gchar *
+ag_provider_get_i18n_domain (AgProvider *provider)
+{
+    g_return_val_if_fail (provider != NULL, NULL);
+    return provider->i18n_domain;
+}
+
+
+/**
  * ag_provider_get_display_name:
  * @provider: the #AgProvider.
  *
@@ -405,6 +427,7 @@
     if (provider->ref_count == 0)
     {
         g_free (provider->name);
+	g_free (provider->i18n_domain);
         g_free (provider->display_name);
         g_free (provider->file_data);
         g_slice_free (AgProvider, provider);
--- libaccounts-glib/ag-provider.h
+++ libaccounts-glib/ag-provider.h
@@ -33,6 +33,7 @@
 
 const gchar *ag_provider_get_name (AgProvider *provider);
 const gchar *ag_provider_get_display_name (AgProvider *provider);
+const gchar *ag_provider_get_i18n_domain (AgProvider *provider);
 void ag_provider_get_file_contents (AgProvider *provider,
                                     const gchar **contents);
 AgProvider *ag_provider_ref (AgProvider *provider);
--- libaccounts-glib/ag-service.c
+++ libaccounts-glib/ag-service.c
@@ -206,6 +206,11 @@
             {
                 ok = _ag_xml_dup_element_data (reader, &service->icon_name);
             }
+            else if (strcmp (name, "translations") == 0)
+            {
+                ok = _ag_xml_dup_element_data (reader, &service->i18n_domain);
+            }
+
             else if (strcmp (name, "template") == 0)
             {
                 ok = parse_template (reader, service);
@@ -481,7 +486,22 @@
     return service->icon_name;
 }
 
+/**
+ * ag_service_get_i18n_domain:
+ * @service: the #AgService.
+ *
+ * Returns: the name of the translation catalog.
+ */
+const gchar *
+ag_service_get_i18n_domain (AgService *service)
+{
+    g_return_val_if_fail (service != NULL, NULL);
+
+    if (!service->file_data)
+        _ag_service_load_from_file (service);
 
+    return service->i18n_domain;
+}
 
 /**
  * ag_service_get_file_contents:
@@ -559,7 +579,8 @@
         g_free (service->name);
         g_free (service->display_name);
         g_free (service->icon_name);
-        g_free (service->type);
+	g_free (service->i18n_domain);
+	g_free (service->type);
         g_free (service->provider);
         g_free (service->file_data);
         if (service->default_settings)
--- libaccounts-glib/ag-service.h
+++ libaccounts-glib/ag-service.h
@@ -36,6 +36,7 @@
 const gchar *ag_service_get_service_type (AgService *service);
 const gchar *ag_service_get_provider (AgService *service);
 const gchar *ag_service_get_icon_name (AgService *service);
+const gchar *ag_service_get_i18n_domain (AgService *service);
 void ag_service_get_file_contents (AgService *service,
                                    const gchar **contents,
                                    gsize *data_offset);
--- tests/accounts-glib-test.sh.in
+++ tests/accounts-glib-test.sh.in
@@ -5,6 +5,7 @@
 datadir=@datadir@
 
 export AG_SERVICES=@testdatadir@/
+export AG_SERVICE_TYPES=@testdatadir@/
 export AG_PROVIDERS=@testdatadir@/	
 export ACCOUNTS=/tmp/ 
 
--- tests/check_ag.c
+++ tests/check_ag.c
@@ -325,6 +325,7 @@
     const gboolean check_automatically = TRUE;
     const gchar *display_name = "My test account";
     AgSettingSource source;
+    GError *error = NULL;
 
     g_type_init ();
 
@@ -416,9 +417,17 @@
     g_object_unref (manager);
 
     manager = ag_manager_new ();
-    account = ag_manager_get_account (manager, account_id);
+
+    /* first, try to load an unexisting account */
+    account = ag_manager_load_account (manager, account_id + 2, &error);
+    fail_unless (account == NULL, "Loading a non-existing account!");
+    fail_unless (error != NULL, "Error is NULL");
+    g_clear_error (&error);
+
+    account = ag_manager_load_account (manager, account_id, &error);
     fail_unless (AG_IS_ACCOUNT (account),
                  "Couldn't load account %u", account_id);
+    fail_unless (error == NULL, "Error is not NULL");
 
     provider_name = ag_account_get_provider_name (account);
     fail_unless (g_strcmp0 (provider_name, PROVIDER) == 0,
@@ -1802,16 +1811,42 @@
     gint n_services;
     AgService *service1, *service2;
 
+    /*
+     * Two additional managers:
+     * manager2 : e-mail type
+     * manager3 : sharing type
+     * */
+    AgManager *manager2, *manager3;
+
+    /*
+     * Same instances of account:
+     * account2: from e-mail type manager
+     * account3: from sharing manager
+     * */
+    AgAccount *account2, *account3;
+
+    /*
+     * new account for the same manager
+     * */
+    AgAccount *account4;
+
     g_type_init ();
 
     /* delete the database */
     g_unlink (db_filename);
+
     manager = ag_manager_new ();
+    fail_unless (manager != NULL);
+
+    manager2 = ag_manager_new_for_service_type ("e-mail");
+    fail_unless (manager2 != NULL);
+
+    manager3 = ag_manager_new_for_service_type ("sharing");
+    fail_unless (manager3 != NULL);
 
     account = ag_manager_create_account (manager, "maemo");
     fail_unless (account != NULL);
 
-
     service1 = ag_manager_get_service (manager, "MyService");
     fail_unless (service1 != NULL);
     service2 = ag_manager_get_service (manager, "OtherService");
@@ -1827,9 +1862,9 @@
     ag_account_store (account, account_store_now_cb, TEST_STRING);
 
     services = ag_account_list_enabled_services (account);
-
     n_services = g_list_length (services);
     fail_unless (n_services == 1, "Got %d services, expecting 1", n_services);
+    ag_manager_list_free (services);
 
     /* 2 services, 2 enabled  */
     ag_account_select_service (account, service2);
@@ -1840,15 +1875,42 @@
 
     n_services = g_list_length (services);
     fail_unless (n_services == 2, "Got %d services, expecting 2", n_services);
+    ag_manager_list_free (services);
+
+    account2 = ag_manager_get_account (manager2, account->id);
+    fail_unless (account2 != NULL);
+
+    account3 = ag_manager_get_account (manager3, account->id);
+    fail_unless (account3 != NULL);
+
+    services = ag_account_list_enabled_services (account2);
+
+    n_services = g_list_length (services);
+    fail_unless (n_services == 1, "Got %d services, expecting 1", n_services);
+    ag_manager_list_free (services);
+
+    services = ag_account_list_enabled_services (account3);
+
+    n_services = g_list_length (services);
+    fail_unless (n_services == 1, "Got %d services, expecting 1", n_services);
+    ag_manager_list_free (services);
 
     /* 2 services, 0 enabled  */
+    account4 = ag_manager_create_account (manager, "maemo");
+    fail_unless (account4 != NULL);
+
     ag_account_select_service (account, service1);
     ag_account_set_enabled (account, FALSE);
 
     ag_account_select_service (account, service2);
     ag_account_set_enabled (account, FALSE);
+
     ag_account_store (account, account_store_now_cb, TEST_STRING);
 
+    ag_account_select_service (account4, service2);
+    ag_account_set_enabled (account4, TRUE);
+    ag_account_store (account4, account_store_now_cb, TEST_STRING);
+
     services = ag_account_list_enabled_services (account);
 
     n_services = g_list_length (services);
@@ -1859,6 +1921,12 @@
     ag_service_unref (service2);
     ag_manager_list_free (services);
 
+    g_object_unref (account2);
+    g_object_unref (account3);
+    g_object_unref (account4);
+    g_object_unref (manager2);
+    g_object_unref (manager3);
+
     end_test ();
 }
 END_TEST




More information about the MeeGo-commits mailing list