summaryrefslogtreecommitdiff
path: root/tests/account-store.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/account-store.c')
-rw-r--r--tests/account-store.c274
1 files changed, 274 insertions, 0 deletions
diff --git a/tests/account-store.c b/tests/account-store.c
new file mode 100644
index 00000000..5483527a
--- /dev/null
+++ b/tests/account-store.c
@@ -0,0 +1,274 @@
+/*
+ * MC account storage backend inspector
+ *
+ * Copyright © 2010 Nokia Corporation
+ * Copyright © 2010 Collabora Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <glib.h>
+#include <glib-object.h>
+
+#include "account-store-default.h"
+
+#define DOCSTRING_A \
+ "%s OP BACKEND ACCOUNT [KEY [VALUE]]\n\n" \
+ " OP := <get | set | del | has | list>\n" \
+ " BACKEND := <"
+
+#define DOCSTRING_B \
+ ">\n" \
+ " ACCOUNT := <MANAGER>/<PROTOCOL>/<ACCOUNT-UID>\n" \
+ " KEY := <manager | protocol | DisplayName | param-<PARAMETER>>\n" \
+ " VALUE := <STRING>\n\n"
+
+#if ENABLE_LIBACCOUNTS_SSO
+#include "account-store-libaccounts.h"
+#endif
+
+typedef struct {
+ const gchar *name;
+ gchar * (*get) (const gchar *account, const gchar *key);
+ gboolean (*set) (const gchar *account, const gchar *key, const gchar *value);
+ gboolean (*delete) (const gchar *account);
+ gboolean (*exists) (const gchar *account);
+ GStrv (*list) (void);
+} Backend;
+
+typedef enum {
+ OP_UNKNOWN,
+ OP_GET,
+ OP_SET,
+ OP_DELETE,
+ OP_EXISTS,
+ OP_LIST,
+} Operation;
+
+const Backend backends[] = {
+ { "default",
+ default_get,
+ default_set,
+ default_delete,
+ default_exists,
+ default_list, },
+
+#if ENABLE_LIBACCOUNTS_SSO
+ { "libaccounts",
+ libaccounts_get,
+ libaccounts_set,
+ libaccounts_delete,
+ libaccounts_exists,
+ libaccounts_list, },
+#endif
+
+ { NULL }
+};
+
+static void usage (const gchar *name, const gchar *fmt,
+ ...) G_GNUC_NORETURN;
+
+#if ENABLE_GNOME_KEYRING
+#include <gnome-keyring.h>
+
+static void
+setup_default_keyring (void)
+{
+ GnomeKeyringResult result;
+
+ g_debug ("Setting default keyring to: %s", g_getenv ("MC_KEYRING_NAME"));
+
+ if (g_getenv ("MC_KEYRING_NAME") != NULL)
+ {
+ const gchar *keyring_name = g_getenv ("MC_KEYRING_NAME");
+
+ g_debug ("MC Keyring name: %s", keyring_name);
+
+ if ((result = gnome_keyring_set_default_keyring_sync (keyring_name)) ==
+ GNOME_KEYRING_RESULT_OK)
+ {
+ g_debug ("Successfully set up temporary keyring %s for tests",
+ keyring_name);
+ }
+ else
+ {
+ g_warning ("Failed to set %s as the default keyring: %s",
+ keyring_name, gnome_keyring_result_to_message (result));
+ }
+ }
+}
+#endif
+
+int main (int argc, char **argv)
+{
+ int i;
+ const gchar *op_name = NULL;
+ const gchar *backend = NULL;
+ const gchar *account = NULL;
+ const gchar *setting = NULL;
+ const gchar *value = NULL;
+ const Backend *store = NULL;
+ Operation op = OP_UNKNOWN;
+ gchar *output = NULL;
+ gboolean success = FALSE;
+
+ g_type_init ();
+ g_set_application_name (argv[0]);
+
+#if ENABLE_GNOME_KEYRING
+ setup_default_keyring ();
+#endif
+
+ if (argc < 3)
+ usage (argv[0], "");
+
+ op_name = argv[1];
+ backend = argv[2];
+
+ for (i = 0; backends[i].name != NULL; i++)
+ {
+ if (g_str_equal (backends[i].name, backend))
+ {
+ store = &backends[i];
+ break;
+ }
+ }
+
+ if (store == NULL)
+ usage (argv[0], "No such backend %s", backend);
+
+ if (g_str_equal (op_name, "get"))
+ op = OP_GET;
+ else if (g_str_equal (op_name, "set"))
+ op = OP_SET;
+ else if (g_str_equal (op_name, "del"))
+ op = OP_DELETE;
+ else if (g_str_equal (op_name, "has"))
+ op = OP_EXISTS;
+ else if (g_str_equal (op_name, "list"))
+ op = OP_LIST;
+
+ switch (op)
+ {
+ case OP_SET:
+
+ if (argc >= 6)
+ value = argv[5];
+
+ case OP_GET:
+
+ if (argc < 5)
+ usage (argv[0], "op '%s' requires an account and key", op_name);
+
+ account = argv[3];
+ setting = argv[4];
+
+ if (account == NULL || *account == '\0')
+ usage (argv[0], "op '%s' requires an account", op_name);
+
+ if (setting == NULL || *setting == '\0')
+ usage (argv[0], "op '%s' requires a key", op_name);
+
+ break;
+
+ case OP_DELETE:
+ case OP_EXISTS:
+
+ if (argc < 4)
+ usage (argv[0], "op '%s' requires an account", op_name);
+
+ account = argv[3];
+ break;
+
+ case OP_LIST:
+ if (argc < 3)
+ usage (argv[0], "op '%s' requires an backend", op_name);
+ break;
+
+ case OP_UNKNOWN:
+ usage (argv[0], "Unknown operation: %s", op_name);
+ }
+
+ /* if we got this far, we have all the args we need: */
+ switch (op)
+ {
+ GStrv list;
+
+ case OP_GET:
+ output = store->get (account, setting);
+ success = output != NULL;
+ break;
+
+ case OP_SET:
+ success = store->set (account, setting, value);
+ output = g_strdup_printf ("%s.%s set to '%s' in %s",
+ account, setting, value, store->name);
+ break;
+
+ case OP_DELETE:
+ success = store->delete (account);
+ output = g_strdup_printf ("%s deleted from %s", account, store->name);
+ break;
+
+ case OP_EXISTS:
+ success = store->exists (account);
+ if (success)
+ output = g_strdup_printf ("Exists in %s", store->name);
+ break;
+
+ case OP_LIST:
+ list = store->list ();
+ output = g_strjoinv ("\n", list);
+ g_strfreev (list);
+ break;
+
+ default:
+ output = g_strdup ("Unknown operation");
+ }
+
+ if (output != NULL)
+ printf ("%s\n", output);
+
+ g_free (output);
+
+ return success ? 0 : 1;
+}
+
+static void
+usage (const gchar *name, const gchar *fmt, ...)
+{
+ guint i;
+ va_list ap;
+
+ fprintf (stderr, DOCSTRING_A, name);
+
+ fprintf (stderr, "%s", backends[0].name);
+
+ for (i = 1; backends[i].name != NULL; i++)
+ fprintf (stderr, " | %s", backends[i].name);
+
+ fprintf (stderr, DOCSTRING_B);
+
+ va_start (ap, fmt);
+ vfprintf (stderr, fmt, ap);
+ va_end (ap);
+
+ exit (1);
+}