Blame gck/test-gck-session.c

Packit b00eeb
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
Packit b00eeb
/* test-gck-session.c - the GObject PKCS#11 wrapper library
Packit b00eeb
Packit b00eeb
   Copyright (C) 2011 Collabora Ltd.
Packit b00eeb
Packit b00eeb
   The Gnome Keyring Library is free software; you can redistribute it and/or
Packit b00eeb
   modify it under the terms of the GNU Library General Public License as
Packit b00eeb
   published by the Free Software Foundation; either version 2 of the
Packit b00eeb
   License, or (at your option) any later version.
Packit b00eeb
Packit b00eeb
   The Gnome Keyring Library is distributed in the hope that it will be useful,
Packit b00eeb
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit b00eeb
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit b00eeb
   Library General Public License for more details.
Packit b00eeb
Packit b00eeb
   You should have received a copy of the GNU Library General Public
Packit b00eeb
   License along with the Gnome Library; see the file COPYING.LIB.  If not,
Packit b00eeb
   see <http://www.gnu.org/licenses/>.
Packit b00eeb
Packit b00eeb
   Author: Stef Walter <stefw@collabora.co.uk>
Packit b00eeb
*/
Packit b00eeb
Packit b00eeb
#include "config.h"
Packit b00eeb
Packit b00eeb
#include "gck/gck.h"
Packit b00eeb
#include "gck/gck-test.h"
Packit b00eeb
Packit b00eeb
#include "egg/egg-testing.h"
Packit b00eeb
#include "egg/mock-interaction.h"
Packit b00eeb
Packit b00eeb
#include <glib.h>
Packit b00eeb
Packit b00eeb
#include <errno.h>
Packit b00eeb
#include <stdlib.h>
Packit b00eeb
#include <stdio.h>
Packit b00eeb
#include <string.h>
Packit b00eeb
Packit b00eeb
typedef struct {
Packit b00eeb
	GckModule *module;
Packit b00eeb
	GckSlot *slot;
Packit b00eeb
	GckSession *session;
Packit b00eeb
} Test;
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
setup (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	GError *err = NULL;
Packit b00eeb
	GList *slots;
Packit b00eeb
Packit b00eeb
	/* Successful load */
Packit b00eeb
	test->module = gck_module_initialize (BUILDDIR "/.libs/libmock-test-module.so", NULL, &err;;
Packit b00eeb
	g_assert_no_error (err);
Packit b00eeb
	g_assert (GCK_IS_MODULE (test->module));
Packit b00eeb
	g_object_add_weak_pointer (G_OBJECT (test->module), (gpointer *)&test->module);
Packit b00eeb
Packit b00eeb
	slots = gck_module_get_slots (test->module, TRUE);
Packit b00eeb
	g_assert (slots != NULL);
Packit b00eeb
Packit b00eeb
	test->slot = GCK_SLOT (slots->data);
Packit b00eeb
	g_object_ref (test->slot);
Packit b00eeb
	gck_list_unref_free (slots);
Packit b00eeb
	g_object_add_weak_pointer (G_OBJECT (test->slot), (gpointer *)&test->slot);
Packit b00eeb
Packit b00eeb
	test->session = gck_slot_open_session (test->slot, 0, NULL, &err;;
Packit b00eeb
	g_assert_no_error (err);
Packit b00eeb
	g_assert (GCK_IS_SESSION (test->session));
Packit b00eeb
	g_object_add_weak_pointer (G_OBJECT (test->session), (gpointer *)&test->session);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
teardown (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	g_object_unref (test->session);
Packit b00eeb
	g_object_unref (test->slot);
Packit b00eeb
	g_object_unref (test->module);
Packit b00eeb
Packit b00eeb
	g_assert (test->session == NULL);
Packit b00eeb
	g_assert (test->slot == NULL);
Packit b00eeb
	g_assert (test->module == NULL);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_session_props (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	GckModule *mod;
Packit b00eeb
	GckSlot *sl;
Packit b00eeb
	gulong handle;
Packit b00eeb
Packit b00eeb
	g_object_get (test->session, "module", &mod, "handle", &handle, "slot", &sl, NULL);
Packit b00eeb
	g_assert (mod == test->module);
Packit b00eeb
	g_assert (sl == test->slot);
Packit b00eeb
	g_object_unref (mod);
Packit b00eeb
	g_object_unref (sl);
Packit b00eeb
Packit b00eeb
	g_assert (handle != 0);
Packit b00eeb
	g_assert (gck_session_get_handle (test->session) == handle);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_session_info (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	GckSessionInfo *info;
Packit b00eeb
Packit b00eeb
	info = gck_session_get_info (test->session);
Packit b00eeb
	g_assert (info != NULL && "no session info");
Packit b00eeb
Packit b00eeb
	g_assert (info->slot_id == gck_slot_get_handle (test->slot));
Packit b00eeb
	g_assert ((info->flags & CKF_SERIAL_SESSION) == CKF_SERIAL_SESSION);
Packit b00eeb
	g_assert (info->device_error == 1414);
Packit b00eeb
	gck_session_info_free (info);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
fetch_async_result (GObject *source, GAsyncResult *result, gpointer user_data)
Packit b00eeb
{
Packit b00eeb
	*((GAsyncResult**)user_data) = result;
Packit b00eeb
	g_object_ref (result);
Packit b00eeb
	egg_test_wait_stop ();
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_open_close_session (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	GckSession *sess;
Packit b00eeb
	GAsyncResult *result = NULL;
Packit b00eeb
	GError *err = NULL;
Packit b00eeb
Packit b00eeb
	sess = gck_slot_open_session (test->slot, 0, NULL, &err;;
Packit b00eeb
	g_assert_no_error (err);
Packit b00eeb
	g_assert (GCK_IS_SESSION (sess));
Packit b00eeb
Packit b00eeb
	g_object_unref (sess);
Packit b00eeb
Packit b00eeb
	/* Test opening async */
Packit b00eeb
	gck_slot_open_session_async (test->slot, 0, NULL, fetch_async_result, &result);
Packit b00eeb
Packit b00eeb
	egg_test_wait_until (500);
Packit b00eeb
	g_assert (result != NULL);
Packit b00eeb
Packit b00eeb
	/* Get the result */
Packit b00eeb
	g_object_add_weak_pointer (G_OBJECT (result), (gpointer *)&result);
Packit b00eeb
	sess = gck_slot_open_session_finish (test->slot, result, &err;;
Packit b00eeb
	g_assert_no_error (err);
Packit b00eeb
	g_assert (GCK_IS_SESSION (sess));
Packit b00eeb
	g_object_add_weak_pointer (G_OBJECT (sess), (gpointer *)&sess;;
Packit b00eeb
Packit b00eeb
	g_object_unref (result);
Packit b00eeb
	g_assert (result == NULL);
Packit b00eeb
Packit b00eeb
	g_object_unref (sess);
Packit b00eeb
	g_assert (sess == NULL);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_session_initable (Test *test,
Packit b00eeb
                       gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	GckSession *sess;
Packit b00eeb
	GAsyncResult *result = NULL;
Packit b00eeb
	GError *err = NULL;
Packit b00eeb
Packit b00eeb
	sess = gck_session_open (test->slot, 0, NULL, NULL, &err;;
Packit b00eeb
	g_assert_no_error (err);
Packit b00eeb
	g_assert (GCK_IS_SESSION (sess));
Packit b00eeb
Packit b00eeb
	g_object_unref (sess);
Packit b00eeb
Packit b00eeb
	/* Test opening async */
Packit b00eeb
	gck_session_open_async (test->slot, 0, NULL, NULL, fetch_async_result, &result);
Packit b00eeb
Packit b00eeb
	egg_test_wait_until (500);
Packit b00eeb
	g_assert (result != NULL);
Packit b00eeb
Packit b00eeb
	/* Get the result */
Packit b00eeb
	sess = gck_session_open_finish (result, &err;;
Packit b00eeb
	g_assert_no_error (err);
Packit b00eeb
	g_assert (GCK_IS_SESSION (sess));
Packit b00eeb
Packit b00eeb
	g_object_unref (result);
Packit b00eeb
	g_object_unref (sess);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_session_already (Test *test,
Packit b00eeb
                      gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	CK_FUNCTION_LIST_PTR funcs;
Packit b00eeb
	gulong handle;
Packit b00eeb
	GckSession *session;
Packit b00eeb
	GAsyncResult *result = NULL;
Packit b00eeb
	GError *error = NULL;
Packit b00eeb
	GObject *source;
Packit b00eeb
	CK_RV rv;
Packit b00eeb
Packit b00eeb
	funcs = gck_module_get_functions (test->module);
Packit b00eeb
	g_assert (funcs != NULL);
Packit b00eeb
Packit b00eeb
	rv = funcs->C_OpenSession (gck_slot_get_handle (test->slot), CKF_SERIAL_SESSION,
Packit b00eeb
	                           NULL, NULL, &handle);
Packit b00eeb
	gck_assert_cmprv (rv, ==, CKR_OK);
Packit b00eeb
	g_assert (handle != 0);
Packit b00eeb
Packit b00eeb
	session = g_initable_new (GCK_TYPE_SESSION, NULL, &error,
Packit b00eeb
	                          "slot", test->slot,
Packit b00eeb
	                          "handle", handle,
Packit b00eeb
	                          NULL);
Packit b00eeb
Packit b00eeb
	g_assert_no_error (error);
Packit b00eeb
	g_assert (GCK_IS_SESSION (session));
Packit b00eeb
	gck_assert_cmpulong (handle, ==, gck_session_get_handle (session));
Packit b00eeb
	g_object_unref (session);
Packit b00eeb
Packit b00eeb
	rv = funcs->C_OpenSession (gck_slot_get_handle (test->slot), CKF_SERIAL_SESSION,
Packit b00eeb
	                           NULL, NULL, &handle);
Packit b00eeb
	gck_assert_cmprv (rv, ==, CKR_OK);
Packit b00eeb
	g_assert (handle != 0);
Packit b00eeb
Packit b00eeb
	/* Test opening async */
Packit b00eeb
	g_async_initable_new_async (GCK_TYPE_SESSION, G_PRIORITY_DEFAULT, NULL,
Packit b00eeb
	                            fetch_async_result, &result,
Packit b00eeb
	                            "slot", test->slot,
Packit b00eeb
	                            "handle", handle,
Packit b00eeb
	                            NULL);
Packit b00eeb
Packit b00eeb
	egg_test_wait_until (500);
Packit b00eeb
	g_assert (result != NULL);
Packit b00eeb
Packit b00eeb
	/* Get the result */
Packit b00eeb
	source = g_async_result_get_source_object (result);
Packit b00eeb
	session = GCK_SESSION (g_async_initable_new_finish (G_ASYNC_INITABLE (source), result, &error));
Packit b00eeb
	g_object_unref (source);
Packit b00eeb
	g_assert_no_error (error);
Packit b00eeb
	g_assert (GCK_IS_SESSION (session));
Packit b00eeb
	gck_assert_cmpulong (handle, ==, gck_session_get_handle (session));
Packit b00eeb
Packit b00eeb
	g_object_unref (result);
Packit b00eeb
	g_object_unref (session);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_open_interaction (Test *test,
Packit b00eeb
                       gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	GckSession *sess;
Packit b00eeb
	GAsyncResult *result = NULL;
Packit b00eeb
	GError *err = NULL;
Packit b00eeb
	GTlsInteraction *interaction;
Packit b00eeb
Packit b00eeb
	interaction = mock_interaction_new ("booo");
Packit b00eeb
Packit b00eeb
	sess = gck_session_open (test->slot, GCK_SESSION_LOGIN_USER, interaction, NULL, &err;;
Packit b00eeb
	g_assert_no_error (err);
Packit b00eeb
	g_assert (GCK_IS_SESSION (sess));
Packit b00eeb
Packit b00eeb
	g_object_unref (sess);
Packit b00eeb
Packit b00eeb
	/* Test opening async */
Packit b00eeb
	gck_session_open_async (test->slot, GCK_SESSION_LOGIN_USER, interaction, NULL, fetch_async_result, &result);
Packit b00eeb
Packit b00eeb
	egg_test_wait_until (500);
Packit b00eeb
	g_assert (result != NULL);
Packit b00eeb
Packit b00eeb
	/* Get the result */
Packit b00eeb
	sess = gck_session_open_finish (result, &err;;
Packit b00eeb
	g_assert_no_error (err);
Packit b00eeb
	g_assert (GCK_IS_SESSION (sess));
Packit b00eeb
Packit b00eeb
	g_object_unref (interaction);
Packit b00eeb
	g_object_unref (result);
Packit b00eeb
	g_object_unref (sess);
Packit b00eeb
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_init_set_pin (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	GAsyncResult *result = NULL;
Packit b00eeb
	GError *err = NULL;
Packit b00eeb
	gboolean ret;
Packit b00eeb
Packit b00eeb
	/* init pin */
Packit b00eeb
	ret = gck_session_init_pin (test->session, (guchar*)"booo", 4, NULL, &err;;
Packit b00eeb
	g_assert_no_error (err);
Packit b00eeb
	g_assert (ret);
Packit b00eeb
Packit b00eeb
	/* set pin */
Packit b00eeb
	ret = gck_session_set_pin (test->session, (guchar*)"booo", 4, (guchar*)"tooo", 4, NULL, &err;;
Packit b00eeb
	g_assert_no_error (err);
Packit b00eeb
	g_assert (ret);
Packit b00eeb
Packit b00eeb
	/* init pin async */
Packit b00eeb
	gck_session_init_pin_async (test->session, (guchar*)"booo", 4, NULL, fetch_async_result, &result);
Packit b00eeb
	egg_test_wait_until (500);
Packit b00eeb
	g_assert (result != NULL);
Packit b00eeb
	ret = gck_session_init_pin_finish (test->session, result, &err;;
Packit b00eeb
	g_assert_no_error (err);
Packit b00eeb
	g_assert (ret);
Packit b00eeb
	g_object_unref (result);
Packit b00eeb
	result = NULL;
Packit b00eeb
Packit b00eeb
	/* set pin async */
Packit b00eeb
	gck_session_set_pin_async (test->session, (guchar*)"booo", 4, (guchar*)"tooo", 4, NULL, fetch_async_result, &result);
Packit b00eeb
	egg_test_wait_until (500);
Packit b00eeb
	g_assert (result != NULL);
Packit b00eeb
	ret = gck_session_set_pin_finish (test->session, result, &err;;
Packit b00eeb
	g_assert_no_error (err);
Packit b00eeb
	g_assert (ret);
Packit b00eeb
	g_object_unref (result);
Packit b00eeb
	result = NULL;
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_login_logout (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	GAsyncResult *result = NULL;
Packit b00eeb
	GError *err = NULL;
Packit b00eeb
	gboolean ret;
Packit b00eeb
	gulong state;
Packit b00eeb
Packit b00eeb
	/* login/logout */
Packit b00eeb
	ret = gck_session_login (test->session, CKU_USER, (guchar*)"booo", 4, NULL, &err;;
Packit b00eeb
	g_assert_no_error (err);
Packit b00eeb
	g_assert (ret);
Packit b00eeb
Packit b00eeb
	state = gck_session_get_state (test->session);
Packit b00eeb
	gck_assert_cmpulong (state, ==, CKS_RO_USER_FUNCTIONS);
Packit b00eeb
Packit b00eeb
	ret = gck_session_logout (test->session, NULL, &err;;
Packit b00eeb
	g_assert_no_error (err);
Packit b00eeb
	g_assert (ret);
Packit b00eeb
Packit b00eeb
	state = gck_session_get_state (test->session);
Packit b00eeb
	gck_assert_cmpulong (state, ==, CKS_RO_PUBLIC_SESSION);
Packit b00eeb
Packit b00eeb
	/* login async */
Packit b00eeb
	gck_session_login_async (test->session, CKU_USER, (guchar*)"booo", 4, NULL, fetch_async_result, &result);
Packit b00eeb
	egg_test_wait_until (500);
Packit b00eeb
	g_assert (result != NULL);
Packit b00eeb
Packit b00eeb
	ret = gck_session_login_finish (test->session, result, &err;;
Packit b00eeb
	g_assert_no_error (err);
Packit b00eeb
	g_assert (ret);
Packit b00eeb
Packit b00eeb
	g_object_unref (result);
Packit b00eeb
	result = NULL;
Packit b00eeb
Packit b00eeb
	state = gck_session_get_state (test->session);
Packit b00eeb
	gck_assert_cmpulong (state, ==, CKS_RO_USER_FUNCTIONS);
Packit b00eeb
Packit b00eeb
	/* logout async */
Packit b00eeb
	gck_session_logout_async (test->session, NULL, fetch_async_result, &result);
Packit b00eeb
	egg_test_wait_until (500);
Packit b00eeb
	g_assert (result != NULL);
Packit b00eeb
Packit b00eeb
	ret = gck_session_logout_finish (test->session, result, &err;;
Packit b00eeb
	g_assert_no_error (err);
Packit b00eeb
	g_assert (ret);
Packit b00eeb
Packit b00eeb
	state = gck_session_get_state (test->session);
Packit b00eeb
	gck_assert_cmpulong (state, ==, CKS_RO_PUBLIC_SESSION);
Packit b00eeb
Packit b00eeb
	g_object_unref (result);
Packit b00eeb
	result = NULL;
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_login_interactive (Test *test,
Packit b00eeb
                        gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	GAsyncResult *result = NULL;
Packit b00eeb
	GError *error = NULL;
Packit b00eeb
	gboolean ret;
Packit b00eeb
	gulong state;
Packit b00eeb
	GTlsInteraction *interaction;
Packit b00eeb
Packit b00eeb
	interaction = mock_interaction_new ("booo");
Packit b00eeb
Packit b00eeb
	/* login/logout */
Packit b00eeb
	ret = gck_session_login_interactive (test->session, CKU_USER, interaction, NULL, &error);
Packit b00eeb
	g_assert_no_error (error);
Packit b00eeb
	g_assert (ret);
Packit b00eeb
Packit b00eeb
	state = gck_session_get_state (test->session);
Packit b00eeb
	gck_assert_cmpulong (state, ==, CKS_RO_USER_FUNCTIONS);
Packit b00eeb
Packit b00eeb
	ret = gck_session_logout (test->session, NULL, &error);
Packit b00eeb
	g_assert_no_error (error);
Packit b00eeb
	g_assert (ret);
Packit b00eeb
Packit b00eeb
	state = gck_session_get_state (test->session);
Packit b00eeb
	gck_assert_cmpulong (state, ==, CKS_RO_PUBLIC_SESSION);
Packit b00eeb
Packit b00eeb
	/* login async */
Packit b00eeb
	gck_session_login_interactive_async (test->session, CKU_USER, interaction, NULL, fetch_async_result, &result);
Packit b00eeb
	egg_test_wait_until (500);
Packit b00eeb
	g_assert (result != NULL);
Packit b00eeb
Packit b00eeb
	ret = gck_session_login_interactive_finish (test->session, result, &error);
Packit b00eeb
	g_assert_no_error (error);
Packit b00eeb
	g_assert (ret);
Packit b00eeb
Packit b00eeb
	g_object_unref (result);
Packit b00eeb
	result = NULL;
Packit b00eeb
Packit b00eeb
	state = gck_session_get_state (test->session);
Packit b00eeb
	gck_assert_cmpulong (state, ==, CKS_RO_USER_FUNCTIONS);
Packit b00eeb
Packit b00eeb
	ret = gck_session_logout (test->session, NULL, &error);
Packit b00eeb
	g_assert_no_error (error);
Packit b00eeb
	g_assert (ret);
Packit b00eeb
Packit b00eeb
	state = gck_session_get_state (test->session);
Packit b00eeb
	gck_assert_cmpulong (state, ==, CKS_RO_PUBLIC_SESSION);
Packit b00eeb
Packit b00eeb
	g_object_unref (interaction);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static gboolean
Packit b00eeb
authenticate_token (GckModule *module, GckSlot *slot, gchar *label, gchar **password, gpointer unused)
Packit b00eeb
{
Packit b00eeb
	g_assert (unused == GUINT_TO_POINTER (35));
Packit b00eeb
	g_assert (password != NULL);
Packit b00eeb
	g_assert (*password == NULL);
Packit b00eeb
	g_assert (GCK_IS_MODULE (module));
Packit b00eeb
	g_assert (GCK_IS_SLOT (slot));
Packit b00eeb
Packit b00eeb
	*password = g_strdup ("booo");
Packit b00eeb
	return TRUE;
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_auto_login (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	GckBuilder builder = GCK_BUILDER_INIT;
Packit b00eeb
	GckObject *object;
Packit b00eeb
	GckSession *new_session;
Packit b00eeb
	GAsyncResult *result = NULL;
Packit b00eeb
	GError *err = NULL;
Packit b00eeb
	GckAttributes *attrs;
Packit b00eeb
	gboolean ret;
Packit b00eeb
Packit b00eeb
	gck_builder_add_ulong (&builder, CKA_CLASS, CKO_DATA);
Packit b00eeb
	gck_builder_add_string (&builder, CKA_LABEL, "TEST OBJECT");
Packit b00eeb
	gck_builder_add_boolean (&builder, CKA_PRIVATE, CK_TRUE);
Packit b00eeb
	attrs = gck_attributes_ref_sink (gck_builder_end (&builder));
Packit b00eeb
Packit b00eeb
	/* Try to do something that requires a login */
Packit b00eeb
	object = gck_session_create_object (test->session, attrs, NULL, &err;;
Packit b00eeb
	g_assert (!object);
Packit b00eeb
	g_assert (err && err->code == CKR_USER_NOT_LOGGED_IN);
Packit b00eeb
	g_clear_error (&err;;
Packit b00eeb
Packit b00eeb
	/* Setup for auto login */
Packit b00eeb
	g_signal_connect (test->module, "authenticate-slot", G_CALLBACK (authenticate_token), GUINT_TO_POINTER (35));
Packit b00eeb
	new_session = gck_slot_open_session (test->slot, GCK_SESSION_READ_WRITE | GCK_SESSION_LOGIN_USER, NULL, &err;;
Packit b00eeb
	g_assert_no_error (err);
Packit b00eeb
	g_assert (GCK_IS_SESSION (new_session));
Packit b00eeb
Packit b00eeb
	/* Try again to do something that requires a login */
Packit b00eeb
	object = gck_session_create_object (new_session, attrs, NULL, &err;;
Packit b00eeb
	g_assert_no_error (err);
Packit b00eeb
	g_assert (GCK_IS_OBJECT (object));
Packit b00eeb
	g_object_unref (object);
Packit b00eeb
Packit b00eeb
	/* We should now be logged in, try to log out */
Packit b00eeb
	ret = gck_session_logout (new_session, NULL, &err;;
Packit b00eeb
	g_assert_no_error (err);
Packit b00eeb
	g_assert (ret);
Packit b00eeb
Packit b00eeb
	g_object_unref (new_session);
Packit b00eeb
Packit b00eeb
	/* Now try the same thing, but asyncronously */
Packit b00eeb
	gck_slot_open_session_async (test->slot, GCK_SESSION_READ_WRITE | GCK_SESSION_LOGIN_USER, NULL, fetch_async_result, &result);
Packit b00eeb
	egg_test_wait_until (500);
Packit b00eeb
	g_assert (result != NULL);
Packit b00eeb
	new_session = gck_slot_open_session_finish (test->slot, result, &err;;
Packit b00eeb
	g_assert_no_error (err);
Packit b00eeb
	g_assert (GCK_IS_SESSION (new_session));
Packit b00eeb
	g_object_unref (result);
Packit b00eeb
Packit b00eeb
	result = NULL;
Packit b00eeb
	gck_session_create_object_async (new_session, attrs, NULL, fetch_async_result, &result);
Packit b00eeb
	egg_test_wait_until (500);
Packit b00eeb
	g_assert (result != NULL);
Packit b00eeb
	object = gck_session_create_object_finish (new_session, result, &err;;
Packit b00eeb
	g_assert_no_error (err);
Packit b00eeb
	g_assert (GCK_IS_OBJECT (object));
Packit b00eeb
	g_object_unref (result);
Packit b00eeb
	g_object_unref (object);
Packit b00eeb
Packit b00eeb
	/* We should now be logged in, try to log out */
Packit b00eeb
	ret = gck_session_logout (new_session, NULL, &err;;
Packit b00eeb
	g_assert_no_error (err);
Packit b00eeb
	g_assert (ret);
Packit b00eeb
Packit b00eeb
	gck_attributes_unref (attrs);
Packit b00eeb
	g_object_unref (new_session);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
int
Packit b00eeb
main (int argc, char **argv)
Packit b00eeb
{
Packit b00eeb
	g_test_init (&argc, &argv, NULL);
Packit b00eeb
Packit b00eeb
	g_set_prgname ("test-gck-session");
Packit b00eeb
Packit b00eeb
	g_test_add ("/gck/session/session_props", Test, NULL, setup, test_session_props, teardown);
Packit b00eeb
	g_test_add ("/gck/session/session_info", Test, NULL, setup, test_session_info, teardown);
Packit b00eeb
	g_test_add ("/gck/session/open_close_session", Test, NULL, setup, test_open_close_session, teardown);
Packit b00eeb
	g_test_add ("/gck/session/open_initable", Test, NULL, setup, test_session_initable, teardown);
Packit b00eeb
	g_test_add ("/gck/session/open_already", Test, NULL, setup, test_session_already, teardown);
Packit b00eeb
	g_test_add ("/gck/session/open_interaction", Test, NULL, setup, test_open_interaction, teardown);
Packit b00eeb
	g_test_add ("/gck/session/init_set_pin", Test, NULL, setup, test_init_set_pin, teardown);
Packit b00eeb
	g_test_add ("/gck/session/login_logout", Test, NULL, setup, test_login_logout, teardown);
Packit b00eeb
	g_test_add ("/gck/session/login_interactive", Test, NULL, setup, test_login_interactive, teardown);
Packit b00eeb
	g_test_add ("/gck/session/auto_login", Test, NULL, setup, test_auto_login, teardown);
Packit b00eeb
Packit b00eeb
	return egg_tests_run_with_loop ();
Packit b00eeb
}