Blame gck/test-gck-enumerator.c

Packit Service f02b19
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
Packit Service f02b19
/* test-gck-enumerator.c - the GObject PKCS#11 wrapper library
Packit Service f02b19
Packit Service f02b19
   Copyright (C) 2011 Collabora Ltd.
Packit Service f02b19
Packit Service f02b19
   The Gnome Keyring Library is free software; you can redistribute it and/or
Packit Service f02b19
   modify it under the terms of the GNU Library General Public License as
Packit Service f02b19
   published by the Free Software Foundation; either version 2 of the
Packit Service f02b19
   License, or (at your option) any later version.
Packit Service f02b19
Packit Service f02b19
   The Gnome Keyring Library is distributed in the hope that it will be useful,
Packit Service f02b19
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service f02b19
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service f02b19
   Library General Public License for more details.
Packit Service f02b19
Packit Service f02b19
   You should have received a copy of the GNU Library General Public
Packit Service f02b19
   License along with the Gnome Library; see the file COPYING.LIB.  If not,
Packit Service f02b19
   see <http://www.gnu.org/licenses/>.
Packit Service f02b19
Packit Service f02b19
   Author: Stef Walter <stefw@collabora.co.uk>
Packit Service f02b19
*/
Packit Service f02b19
Packit Service f02b19
#include "config.h"
Packit Service f02b19
Packit Service f02b19
#include "gck/gck.h"
Packit Service f02b19
#include "gck/gck-mock.h"
Packit Service f02b19
#include "gck/gck-private.h"
Packit Service f02b19
#include "gck/gck-test.h"
Packit Service f02b19
Packit Service f02b19
#include "egg/egg-testing.h"
Packit Service f02b19
#include "egg/mock-interaction.h"
Packit Service f02b19
Packit Service f02b19
#include <glib.h>
Packit Service f02b19
Packit Service f02b19
#include <errno.h>
Packit Service f02b19
#include <stdlib.h>
Packit Service f02b19
#include <stdio.h>
Packit Service f02b19
#include <string.h>
Packit Service f02b19
Packit Service f02b19
typedef struct {
Packit Service f02b19
	GList *modules;
Packit Service f02b19
	GckModule *module;
Packit Service f02b19
} Test;
Packit Service f02b19
Packit Service f02b19
static void
Packit Service f02b19
setup (Test *test, gconstpointer unused)
Packit Service f02b19
{
Packit Service f02b19
	GError *err = NULL;
Packit Service f02b19
Packit Service f02b19
	/* Successful load */
Packit Service f02b19
	test->module = gck_module_initialize (BUILDDIR "/.libs/libmock-test-module.so", NULL, &err;;
Packit Service f02b19
	g_assert_no_error (err);
Packit Service f02b19
	g_assert (GCK_IS_MODULE (test->module));
Packit Service f02b19
	g_object_add_weak_pointer (G_OBJECT (test->module), (gpointer *)&test->module);
Packit Service f02b19
Packit Service f02b19
	test->modules = g_list_append (NULL, g_object_ref (test->module));
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
static void
Packit Service f02b19
teardown (Test *test, gconstpointer unused)
Packit Service f02b19
{
Packit Service f02b19
	gck_list_unref_free (test->modules);
Packit Service f02b19
Packit Service f02b19
	g_object_unref (test->module);
Packit Service f02b19
	g_assert (test->module == NULL);
Packit Service f02b19
Packit Service f02b19
	g_thread_pool_stop_unused_threads ();
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
static void
Packit Service f02b19
test_create (Test *test, gconstpointer unused)
Packit Service f02b19
{
Packit Service f02b19
	GckUriData *uri_data;
Packit Service f02b19
	GType object_type;
Packit Service f02b19
	GckEnumerator *en;
Packit Service f02b19
Packit Service f02b19
	uri_data = gck_uri_data_new ();
Packit Service f02b19
	en = _gck_enumerator_new_for_modules (test->modules, 0, uri_data);
Packit Service f02b19
	g_assert (GCK_IS_ENUMERATOR (en));
Packit Service f02b19
Packit Service f02b19
	g_object_get (en, "object-type", &object_type, NULL);
Packit Service f02b19
	g_assert (object_type == GCK_TYPE_OBJECT);
Packit Service f02b19
Packit Service f02b19
	g_object_unref (en);
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
static void
Packit Service f02b19
test_create_slots (Test *test, gconstpointer unused)
Packit Service f02b19
{
Packit Service f02b19
	GckUriData *uri_data;
Packit Service f02b19
	GckEnumerator *en;
Packit Service f02b19
	GList *slots;
Packit Service f02b19
Packit Service f02b19
	uri_data = gck_uri_data_new ();
Packit Service f02b19
	slots = gck_module_get_slots (test->module, FALSE);
Packit Service f02b19
	en = _gck_enumerator_new_for_slots (slots, 0, uri_data);
Packit Service f02b19
	g_assert (GCK_IS_ENUMERATOR (en));
Packit Service f02b19
	g_object_unref (en);
Packit Service f02b19
	gck_list_unref_free (slots);
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
static void
Packit Service f02b19
test_next (Test *test, gconstpointer unused)
Packit Service f02b19
{
Packit Service f02b19
	GckUriData *uri_data;
Packit Service f02b19
	GError *error = NULL;
Packit Service f02b19
	GckEnumerator *en;
Packit Service f02b19
	GckObject *obj;
Packit Service f02b19
Packit Service f02b19
	uri_data = gck_uri_data_new ();
Packit Service f02b19
	en = _gck_enumerator_new_for_modules (test->modules, 0, uri_data);
Packit Service f02b19
	g_assert (GCK_IS_ENUMERATOR (en));
Packit Service f02b19
Packit Service f02b19
	obj = gck_enumerator_next (en, NULL, &error);
Packit Service f02b19
	g_assert (GCK_IS_OBJECT (obj));
Packit Service f02b19
Packit Service f02b19
	g_object_unref (obj);
Packit Service f02b19
	g_object_unref (en);
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
static void
Packit Service f02b19
test_next_slots (Test *test, gconstpointer unused)
Packit Service f02b19
{
Packit Service f02b19
	GckUriData *uri_data;
Packit Service f02b19
	GError *error = NULL;
Packit Service f02b19
	GList *slots = NULL;
Packit Service f02b19
	GckEnumerator *en;
Packit Service f02b19
	GckObject *obj;
Packit Service f02b19
Packit Service f02b19
	uri_data = gck_uri_data_new ();
Packit Service f02b19
	slots = gck_module_get_slots (test->module, FALSE);
Packit Service f02b19
	en = _gck_enumerator_new_for_slots (slots, 0, uri_data);
Packit Service f02b19
	g_assert (GCK_IS_ENUMERATOR (en));
Packit Service f02b19
Packit Service f02b19
	obj = gck_enumerator_next (en, NULL, &error);
Packit Service f02b19
	g_assert (GCK_IS_OBJECT (obj));
Packit Service f02b19
Packit Service f02b19
	g_object_unref (obj);
Packit Service f02b19
	g_object_unref (en);
Packit Service f02b19
	gck_list_unref_free (slots);
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
static void
Packit Service f02b19
test_next_and_resume (Test *test, gconstpointer unused)
Packit Service f02b19
{
Packit Service f02b19
	GckUriData *uri_data;
Packit Service f02b19
	GError *error = NULL;
Packit Service f02b19
	GckEnumerator *en;
Packit Service f02b19
	GckObject *obj, *obj2;
Packit Service f02b19
Packit Service f02b19
	uri_data = gck_uri_data_new ();
Packit Service f02b19
	en = _gck_enumerator_new_for_modules (test->modules, 0, uri_data);
Packit Service f02b19
	g_assert (GCK_IS_ENUMERATOR (en));
Packit Service f02b19
Packit Service f02b19
	obj = gck_enumerator_next (en, NULL, &error);
Packit Service f02b19
	g_assert_no_error (error);
Packit Service f02b19
	g_assert (GCK_IS_OBJECT (obj));
Packit Service f02b19
Packit Service f02b19
	obj2 = gck_enumerator_next (en, NULL, &error);
Packit Service f02b19
	g_assert_no_error (error);
Packit Service f02b19
	g_assert (GCK_IS_OBJECT (obj2));
Packit Service f02b19
Packit Service f02b19
	g_assert (!gck_object_equal (obj, obj2));
Packit Service f02b19
Packit Service f02b19
	g_object_unref (obj);
Packit Service f02b19
	g_object_unref (obj2);
Packit Service f02b19
	g_object_unref (en);
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
static void
Packit Service f02b19
test_next_n (Test *test, gconstpointer unused)
Packit Service f02b19
{
Packit Service f02b19
	GckUriData *uri_data;
Packit Service f02b19
	GError *error = NULL;
Packit Service f02b19
	GckEnumerator *en;
Packit Service f02b19
	GList *objects, *l;
Packit Service f02b19
Packit Service f02b19
	uri_data = gck_uri_data_new ();
Packit Service f02b19
	en = _gck_enumerator_new_for_modules (test->modules, 0, uri_data);
Packit Service f02b19
	g_assert (GCK_IS_ENUMERATOR (en));
Packit Service f02b19
Packit Service f02b19
	objects = gck_enumerator_next_n (en, -1, NULL, &error);
Packit Service f02b19
	g_assert_no_error (error);
Packit Service f02b19
	g_assert_cmpint (g_list_length (objects), ==, 5);
Packit Service f02b19
	for (l = objects; l; l = g_list_next (l))
Packit Service f02b19
		g_assert (GCK_IS_OBJECT (l->data));
Packit Service f02b19
Packit Service f02b19
	gck_list_unref_free (objects);
Packit Service f02b19
	g_object_unref (en);
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
static void
Packit Service f02b19
fetch_async_result (GObject *source, GAsyncResult *result, gpointer user_data)
Packit Service f02b19
{
Packit Service f02b19
	*((GAsyncResult**)user_data) = result;
Packit Service f02b19
	g_object_ref (result);
Packit Service f02b19
	egg_test_wait_stop ();
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
static void
Packit Service f02b19
test_next_async (Test *test, gconstpointer unused)
Packit Service f02b19
{
Packit Service f02b19
	GckUriData *uri_data;
Packit Service f02b19
	GAsyncResult *result = NULL;
Packit Service f02b19
	GError *error = NULL;
Packit Service f02b19
	GckEnumerator *en;
Packit Service f02b19
	GList *objects, *l;
Packit Service f02b19
Packit Service f02b19
	uri_data = gck_uri_data_new ();
Packit Service f02b19
	en = _gck_enumerator_new_for_modules (test->modules, 0, uri_data);
Packit Service f02b19
	g_assert (GCK_IS_ENUMERATOR (en));
Packit Service f02b19
Packit Service f02b19
	gck_enumerator_next_async (en, -1, NULL, fetch_async_result, &result);
Packit Service f02b19
	egg_test_wait_until (500);
Packit Service f02b19
	g_assert (result);
Packit Service f02b19
Packit Service f02b19
	objects = gck_enumerator_next_finish (en, result, &error);
Packit Service f02b19
	g_assert_no_error (error);
Packit Service f02b19
	g_assert_cmpint (g_list_length (objects), ==, 5);
Packit Service f02b19
	for (l = objects; l; l = g_list_next (l))
Packit Service f02b19
		g_assert (GCK_IS_OBJECT (l->data));
Packit Service f02b19
Packit Service f02b19
	g_object_unref (result);
Packit Service f02b19
	gck_list_unref_free (objects);
Packit Service f02b19
	g_object_unref (en);
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
Packit Service f02b19
static void
Packit Service f02b19
test_enumerate_session (Test *test,
Packit Service f02b19
                        gconstpointer unused)
Packit Service f02b19
{
Packit Service f02b19
	GckBuilder builder = GCK_BUILDER_INIT;
Packit Service f02b19
	GckEnumerator *en;
Packit Service f02b19
	GError *error = NULL;
Packit Service f02b19
	GckSession *session;
Packit Service f02b19
	GckObject *obj;
Packit Service f02b19
	GList *slots;
Packit Service f02b19
Packit Service f02b19
	slots = gck_module_get_slots (test->module, FALSE);
Packit Service f02b19
	g_assert (slots != NULL && GCK_IS_SLOT (slots->data));
Packit Service f02b19
Packit Service f02b19
	session = gck_session_open (slots->data, 0, NULL, NULL, &error);
Packit Service f02b19
	g_assert_no_error (error);
Packit Service f02b19
Packit Service f02b19
	en = gck_session_enumerate_objects (session, gck_builder_end (&builder));
Packit Service f02b19
	g_assert (GCK_IS_ENUMERATOR (en));
Packit Service f02b19
Packit Service f02b19
	obj = gck_enumerator_next (en, NULL, &error);
Packit Service f02b19
	g_assert (GCK_IS_OBJECT (obj));
Packit Service f02b19
Packit Service f02b19
	g_object_unref (obj);
Packit Service f02b19
	g_object_unref (en);
Packit Service f02b19
	g_object_unref (session);
Packit Service f02b19
	gck_list_unref_free (slots);
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
static void
Packit Service f02b19
test_attribute_match (Test *test, gconstpointer unused)
Packit Service f02b19
{
Packit Service f02b19
	GckBuilder builder = GCK_BUILDER_INIT;
Packit Service f02b19
	GckUriData *uri_data;
Packit Service f02b19
	GError *error = NULL;
Packit Service f02b19
	GckEnumerator *en;
Packit Service f02b19
	GList *objects;
Packit Service f02b19
Packit Service f02b19
	uri_data = gck_uri_data_new ();
Packit Service f02b19
	gck_builder_add_string (&builder, CKA_LABEL, "Private Capitalize Key");
Packit Service f02b19
	uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder));
Packit Service f02b19
	en = _gck_enumerator_new_for_modules (test->modules, 0, uri_data);
Packit Service f02b19
	g_assert (GCK_IS_ENUMERATOR (en));
Packit Service f02b19
Packit Service f02b19
	objects = gck_enumerator_next_n (en, -1, NULL, &error);
Packit Service f02b19
	g_assert_no_error (error);
Packit Service f02b19
	g_assert_cmpint (g_list_length (objects), ==, 1);
Packit Service f02b19
	g_assert (GCK_IS_OBJECT (objects->data));
Packit Service f02b19
Packit Service f02b19
	gck_list_unref_free (objects);
Packit Service f02b19
	g_object_unref (en);
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
static void
Packit Service f02b19
test_authenticate_interaction (Test *test,
Packit Service f02b19
                               gconstpointer unused)
Packit Service f02b19
{
Packit Service f02b19
	GTlsInteraction *interaction;
Packit Service f02b19
	GTlsInteraction *check;
Packit Service f02b19
	GckUriData *uri_data;
Packit Service f02b19
	GError *error = NULL;
Packit Service f02b19
	GckEnumerator *en;
Packit Service f02b19
	GckObject *obj;
Packit Service f02b19
Packit Service f02b19
	uri_data = gck_uri_data_new ();
Packit Service f02b19
	en = _gck_enumerator_new_for_modules (test->modules, GCK_SESSION_LOGIN_USER, uri_data);
Packit Service f02b19
	g_assert (GCK_IS_ENUMERATOR (en));
Packit Service f02b19
	g_object_add_weak_pointer (G_OBJECT (en), (gpointer *)&en);
Packit Service f02b19
Packit Service f02b19
	interaction = mock_interaction_new ("booo");
Packit Service f02b19
	g_object_add_weak_pointer (G_OBJECT (interaction), (gpointer *)&interaction);
Packit Service f02b19
	g_object_set (en, "interaction", interaction, NULL);
Packit Service f02b19
Packit Service f02b19
	check = NULL;
Packit Service f02b19
	g_object_get (en, "interaction", &check, NULL);
Packit Service f02b19
	g_assert (interaction == check);
Packit Service f02b19
	g_object_unref (interaction);
Packit Service f02b19
	g_object_unref (check);
Packit Service f02b19
Packit Service f02b19
	obj = gck_enumerator_next (en, NULL, &error);
Packit Service f02b19
	g_assert (GCK_IS_OBJECT (obj));
Packit Service f02b19
	g_object_add_weak_pointer (G_OBJECT (obj), (gpointer *)&obj);
Packit Service f02b19
Packit Service f02b19
	g_object_unref (obj);
Packit Service f02b19
	g_object_unref (en);
Packit Service f02b19
Packit Service f02b19
	g_assert (en == NULL);
Packit Service f02b19
	g_assert (obj == NULL);
Packit Service f02b19
	g_assert (interaction == NULL);
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
static gboolean
Packit Service f02b19
on_authenticate_token (GckModule *module,
Packit Service f02b19
                       GckSlot *slot,
Packit Service f02b19
                       gchar *label,
Packit Service f02b19
                       gchar **password,
Packit Service f02b19
                       gpointer unused)
Packit Service f02b19
{
Packit Service f02b19
	g_assert (unused == GUINT_TO_POINTER (35));
Packit Service f02b19
	g_assert (password != NULL);
Packit Service f02b19
	g_assert (*password == NULL);
Packit Service f02b19
	g_assert (GCK_IS_MODULE (module));
Packit Service f02b19
	g_assert (GCK_IS_SLOT (slot));
Packit Service f02b19
Packit Service f02b19
	*password = g_strdup ("booo");
Packit Service f02b19
	return TRUE;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
static void
Packit Service f02b19
test_authenticate_compat (Test *test,
Packit Service f02b19
                          gconstpointer unused)
Packit Service f02b19
{
Packit Service f02b19
	GckUriData *uri_data;
Packit Service f02b19
	GError *error = NULL;
Packit Service f02b19
	GckEnumerator *en;
Packit Service f02b19
	GckObject *obj;
Packit Service f02b19
	gulong sig;
Packit Service f02b19
Packit Service f02b19
	sig = g_signal_connect (test->modules->data, "authenticate-slot",
Packit Service f02b19
	                        G_CALLBACK (on_authenticate_token), GUINT_TO_POINTER (35));
Packit Service f02b19
Packit Service f02b19
	uri_data = gck_uri_data_new ();
Packit Service f02b19
	en = _gck_enumerator_new_for_modules (test->modules, GCK_SESSION_LOGIN_USER, uri_data);
Packit Service f02b19
	g_assert (GCK_IS_ENUMERATOR (en));
Packit Service f02b19
	g_object_add_weak_pointer (G_OBJECT (en), (gpointer *)&en);
Packit Service f02b19
Packit Service f02b19
	obj = gck_enumerator_next (en, NULL, &error);
Packit Service f02b19
	g_assert (GCK_IS_OBJECT (obj));
Packit Service f02b19
	g_object_add_weak_pointer (G_OBJECT (obj), (gpointer *)&obj);
Packit Service f02b19
Packit Service f02b19
	g_object_unref (obj);
Packit Service f02b19
	g_object_unref (en);
Packit Service f02b19
Packit Service f02b19
	g_signal_handler_disconnect (test->modules->data, sig);
Packit Service f02b19
Packit Service f02b19
	g_assert (obj == NULL);
Packit Service f02b19
	g_assert (en == NULL);
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
static void
Packit Service f02b19
test_token_match (Test *test, gconstpointer unused)
Packit Service f02b19
{
Packit Service f02b19
	GckUriData *uri_data;
Packit Service f02b19
	GError *error = NULL;
Packit Service f02b19
	GckEnumerator *en;
Packit Service f02b19
	GList *objects;
Packit Service f02b19
Packit Service f02b19
	uri_data = gck_uri_data_new ();
Packit Service f02b19
	uri_data->token_info = g_new0 (GckTokenInfo, 1);
Packit Service f02b19
	uri_data->token_info->label = g_strdup ("Invalid token name");
Packit Service f02b19
	en = _gck_enumerator_new_for_modules (test->modules, 0, uri_data);
Packit Service f02b19
	g_assert (GCK_IS_ENUMERATOR (en));
Packit Service f02b19
Packit Service f02b19
	objects = gck_enumerator_next_n (en, -1, NULL, &error);
Packit Service f02b19
	g_assert_cmpint (g_list_length (objects), ==, 0);
Packit Service f02b19
	g_assert (error == NULL);
Packit Service f02b19
Packit Service f02b19
	gck_list_unref_free (objects);
Packit Service f02b19
	g_object_unref (en);
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
enum {
Packit Service f02b19
	PROP_0,
Packit Service f02b19
	PROP_ATTRIBUTES,
Packit Service f02b19
};
Packit Service f02b19
Packit Service f02b19
static const gulong mock_attribute_types[] = {
Packit Service f02b19
	CKA_CLASS,
Packit Service f02b19
	CKA_ID,
Packit Service f02b19
	CKA_LABEL,
Packit Service f02b19
};
Packit Service f02b19
Packit Service f02b19
typedef struct {
Packit Service f02b19
	GckObject parent;
Packit Service f02b19
	GckAttributes *attrs;
Packit Service f02b19
} MockObject;
Packit Service f02b19
Packit Service f02b19
typedef struct {
Packit Service f02b19
	GckObjectClass parent;
Packit Service f02b19
} MockObjectClass;
Packit Service f02b19
Packit Service f02b19
GType mock_object_get_type (void) G_GNUC_CONST;
Packit Service f02b19
static void mock_object_cache_init (GckObjectCacheIface *iface);
Packit Service f02b19
Packit Service f02b19
#define MOCK_TYPE_OBJECT     (mock_object_get_type())
Packit Service f02b19
#define MOCK_OBJECT(obj)     (G_TYPE_CHECK_INSTANCE_CAST((obj), MOCK_TYPE_OBJECT, MockObject))
Packit Service f02b19
#define MOCK_IS_OBJECT(obj)  (G_TYPE_CHECK_INSTANCE_TYPE((obj), MOCK_TYPE_OBJECT))
Packit Service f02b19
Packit Service f02b19
G_DEFINE_TYPE_WITH_CODE (MockObject, mock_object, GCK_TYPE_OBJECT,
Packit Service f02b19
                         G_IMPLEMENT_INTERFACE (GCK_TYPE_OBJECT_CACHE,
Packit Service f02b19
                                                mock_object_cache_init);
Packit Service f02b19
);
Packit Service f02b19
Packit Service f02b19
static void
Packit Service f02b19
mock_object_init (MockObject *self)
Packit Service f02b19
{
Packit Service f02b19
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
static void
Packit Service f02b19
mock_object_get_property (GObject *obj,
Packit Service f02b19
                          guint prop_id,
Packit Service f02b19
                          GValue *value,
Packit Service f02b19
                          GParamSpec *pspec)
Packit Service f02b19
{
Packit Service f02b19
	MockObject *self = (MockObject *)obj;
Packit Service f02b19
Packit Service f02b19
	switch (prop_id) {
Packit Service f02b19
	case PROP_ATTRIBUTES:
Packit Service f02b19
		g_value_set_boxed (value, self->attrs);
Packit Service f02b19
		break;
Packit Service f02b19
	default:
Packit Service f02b19
		G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
Packit Service f02b19
		break;
Packit Service f02b19
	}
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
static void
Packit Service f02b19
mock_object_set_property (GObject *obj,
Packit Service f02b19
                          guint prop_id,
Packit Service f02b19
                          const GValue *value,
Packit Service f02b19
                          GParamSpec *pspec)
Packit Service f02b19
{
Packit Service f02b19
	MockObject *self = (MockObject *)obj;
Packit Service f02b19
Packit Service f02b19
	switch (prop_id) {
Packit Service f02b19
	case PROP_ATTRIBUTES:
Packit Service f02b19
		g_assert (self->attrs == NULL);
Packit Service f02b19
		self->attrs = g_value_dup_boxed (value);
Packit Service f02b19
		g_assert (self->attrs != NULL);
Packit Service f02b19
		break;
Packit Service f02b19
	default:
Packit Service f02b19
		G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
Packit Service f02b19
		break;
Packit Service f02b19
	}
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
static void
Packit Service f02b19
mock_object_finalize (GObject *obj)
Packit Service f02b19
{
Packit Service f02b19
	MockObject *self = (MockObject *)obj;
Packit Service f02b19
	gck_attributes_unref (self->attrs);
Packit Service f02b19
	G_OBJECT_CLASS (mock_object_parent_class)->finalize (obj);
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
static void
Packit Service f02b19
mock_object_class_init (MockObjectClass *klass)
Packit Service f02b19
{
Packit Service f02b19
	GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
Packit Service f02b19
Packit Service f02b19
	gobject_class->get_property = mock_object_get_property;
Packit Service f02b19
	gobject_class->set_property = mock_object_set_property;
Packit Service f02b19
	gobject_class->finalize = mock_object_finalize;
Packit Service f02b19
Packit Service f02b19
	g_object_class_override_property (gobject_class, PROP_ATTRIBUTES, "attributes");
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
static void
Packit Service f02b19
mock_object_fill (GckObjectCache *object,
Packit Service f02b19
                  GckAttributes *attrs)
Packit Service f02b19
{
Packit Service f02b19
	GckBuilder builder = GCK_BUILDER_INIT;
Packit Service f02b19
	MockObject *self = MOCK_OBJECT (object);
Packit Service f02b19
Packit Service f02b19
	gck_builder_add_all (&builder, self->attrs);
Packit Service f02b19
	gck_builder_set_all (&builder, attrs);
Packit Service f02b19
Packit Service f02b19
	gck_attributes_unref (self->attrs);
Packit Service f02b19
	self->attrs = gck_attributes_ref_sink (gck_builder_end (&builder));
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
static void
Packit Service f02b19
mock_object_cache_init (GckObjectCacheIface *iface)
Packit Service f02b19
{
Packit Service f02b19
	iface->default_types = mock_attribute_types;
Packit Service f02b19
	iface->n_default_types = G_N_ELEMENTS (mock_attribute_types);
Packit Service f02b19
	iface->fill = mock_object_fill;
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
static void
Packit Service f02b19
test_attribute_get (Test *test,
Packit Service f02b19
                    gconstpointer unused)
Packit Service f02b19
{
Packit Service f02b19
	GckUriData *uri_data;
Packit Service f02b19
	GError *error = NULL;
Packit Service f02b19
	GckEnumerator *en;
Packit Service f02b19
	GList *objects, *l;
Packit Service f02b19
	MockObject *mock;
Packit Service f02b19
Packit Service f02b19
	uri_data = gck_uri_data_new ();
Packit Service f02b19
	en = _gck_enumerator_new_for_modules (test->modules, 0, uri_data);
Packit Service f02b19
	g_object_set (en, "object-type", mock_object_get_type (), NULL);
Packit Service f02b19
Packit Service f02b19
	objects = gck_enumerator_next_n (en, -1, NULL, &error);
Packit Service f02b19
	g_assert_no_error (error);
Packit Service f02b19
	g_assert_cmpint (g_list_length (objects), ==, 5);
Packit Service f02b19
Packit Service f02b19
	for (l = objects; l != NULL; l = g_list_next (l)) {
Packit Service f02b19
		mock = l->data;
Packit Service f02b19
		g_assert (G_TYPE_CHECK_INSTANCE_TYPE (mock, mock_object_get_type ()));
Packit Service f02b19
		g_assert (mock->attrs != NULL);
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
	gck_list_unref_free (objects);
Packit Service f02b19
	g_object_unref (en);
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
static void
Packit Service f02b19
test_attribute_get_one_at_a_time (Test *test,
Packit Service f02b19
                                  gconstpointer unused)
Packit Service f02b19
{
Packit Service f02b19
	GckUriData *uri_data;
Packit Service f02b19
	GError *error = NULL;
Packit Service f02b19
	GckEnumerator *en;
Packit Service f02b19
	MockObject *mock;
Packit Service f02b19
	GckObject *object;
Packit Service f02b19
Packit Service f02b19
	uri_data = gck_uri_data_new ();
Packit Service f02b19
	en = _gck_enumerator_new_for_modules (test->modules, 0, uri_data);
Packit Service f02b19
	g_object_set (en, "object-type", mock_object_get_type (), NULL);
Packit Service f02b19
Packit Service f02b19
	for (;;) {
Packit Service f02b19
		object = gck_enumerator_next (en, NULL, &error);
Packit Service f02b19
		g_assert_no_error (error);
Packit Service f02b19
		if (object == NULL)
Packit Service f02b19
			break;
Packit Service f02b19
Packit Service f02b19
		g_assert (G_TYPE_CHECK_INSTANCE_TYPE (object, mock_object_get_type ()));
Packit Service f02b19
		mock = (MockObject *)object;
Packit Service f02b19
		g_assert (mock->attrs != NULL);
Packit Service f02b19
		g_object_unref (object);
Packit Service f02b19
	}
Packit Service f02b19
Packit Service f02b19
	g_object_unref (en);
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
static void
Packit Service f02b19
test_chained (Test *test,
Packit Service f02b19
              gconstpointer unused)
Packit Service f02b19
{
Packit Service f02b19
	GckBuilder builder = GCK_BUILDER_INIT;
Packit Service f02b19
	GckEnumerator *one;
Packit Service f02b19
	GckEnumerator *two;
Packit Service f02b19
	GckEnumerator *three;
Packit Service f02b19
	GckUriData *uri_data;
Packit Service f02b19
	GError *error = NULL;
Packit Service f02b19
	GList *objects;
Packit Service f02b19
Packit Service f02b19
	uri_data = gck_uri_data_new ();
Packit Service f02b19
	gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PUBLIC_KEY);
Packit Service f02b19
	uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder));
Packit Service f02b19
	one = _gck_enumerator_new_for_modules (test->modules, 0, uri_data);
Packit Service f02b19
Packit Service f02b19
	uri_data = gck_uri_data_new ();
Packit Service f02b19
	gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PRIVATE_KEY);
Packit Service f02b19
	uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder));
Packit Service f02b19
	two = _gck_enumerator_new_for_modules (test->modules, 0, uri_data);
Packit Service f02b19
	gck_enumerator_set_chained (one, two);
Packit Service f02b19
Packit Service f02b19
	uri_data = gck_uri_data_new ();
Packit Service f02b19
	gck_builder_add_ulong (&builder, CKA_CLASS, CKO_DATA);
Packit Service f02b19
	uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder));
Packit Service f02b19
	three = _gck_enumerator_new_for_modules (test->modules, 0, uri_data);
Packit Service f02b19
	gck_enumerator_set_chained (two, three);
Packit Service f02b19
Packit Service f02b19
	g_object_unref (two);
Packit Service f02b19
	g_object_unref (three);
Packit Service f02b19
Packit Service f02b19
	objects = gck_enumerator_next_n (one, -1, NULL, &error);
Packit Service f02b19
	g_assert_no_error (error);
Packit Service f02b19
	g_assert_cmpint (g_list_length (objects), ==, 5);
Packit Service f02b19
Packit Service f02b19
	gck_list_unref_free (objects);
Packit Service f02b19
	g_object_unref (one);
Packit Service f02b19
}
Packit Service f02b19
Packit Service f02b19
int
Packit Service f02b19
main (int argc, char **argv)
Packit Service f02b19
{
Packit Service f02b19
	g_test_init (&argc, &argv, NULL);
Packit Service f02b19
Packit Service f02b19
	g_set_prgname ("test-gck-enumerator");
Packit Service f02b19
Packit Service f02b19
	g_test_add ("/gck/enumerator/create", Test, NULL, setup, test_create, teardown);
Packit Service f02b19
	g_test_add ("/gck/enumerator/create_slots", Test, NULL, setup, test_create_slots, teardown);
Packit Service f02b19
	g_test_add ("/gck/enumerator/next", Test, NULL, setup, test_next, teardown);
Packit Service f02b19
	g_test_add ("/gck/enumerator/next_slots", Test, NULL, setup, test_next_slots, teardown);
Packit Service f02b19
	g_test_add ("/gck/enumerator/next_and_resume", Test, NULL, setup, test_next_and_resume, teardown);
Packit Service f02b19
	g_test_add ("/gck/enumerator/next_n", Test, NULL, setup, test_next_n, teardown);
Packit Service f02b19
	g_test_add ("/gck/enumerator/next_async", Test, NULL, setup, test_next_async, teardown);
Packit Service f02b19
	g_test_add ("/gck/enumerator/session", Test, NULL, setup, test_enumerate_session, teardown);
Packit Service f02b19
	g_test_add ("/gck/enumerator/authenticate-interaction", Test, NULL, setup, test_authenticate_interaction, teardown);
Packit Service f02b19
	g_test_add ("/gck/enumerator/authenticate-compat", Test, NULL, setup, test_authenticate_compat, teardown);
Packit Service f02b19
	g_test_add ("/gck/enumerator/attribute_match", Test, NULL, setup, test_attribute_match, teardown);
Packit Service f02b19
	g_test_add ("/gck/enumerator/token_match", Test, NULL, setup, test_token_match, teardown);
Packit Service f02b19
	g_test_add ("/gck/enumerator/attribute_get", Test, NULL, setup, test_attribute_get, teardown);
Packit Service f02b19
	g_test_add ("/gck/enumerator/attribute_get_one_at_a_time", Test, NULL, setup, test_attribute_get_one_at_a_time, teardown);
Packit Service f02b19
	g_test_add ("/gck/enumerator/chained", Test, NULL, setup, test_chained, teardown);
Packit Service f02b19
Packit Service f02b19
	return egg_tests_run_with_loop ();
Packit Service f02b19
}