Blame gck/test-gck-slot.c

Packit b00eeb
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
Packit b00eeb
/* test-gck-slot.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 <errno.h>
Packit b00eeb
#include <glib.h>
Packit b00eeb
#include <string.h>
Packit b00eeb
Packit b00eeb
#include "gck/gck.h"
Packit b00eeb
#include "gck/gck-private.h"
Packit b00eeb
#include "gck/gck-test.h"
Packit b00eeb
Packit b00eeb
typedef struct {
Packit b00eeb
	GckModule *module;
Packit b00eeb
	GckSlot *slot;
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
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
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
teardown (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	g_object_unref (test->slot);
Packit b00eeb
	g_object_unref (test->module);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_slot_info (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	GckSlotInfo *info;
Packit b00eeb
	GckTokenInfo *token;
Packit b00eeb
	GList *slots, *l;
Packit b00eeb
Packit b00eeb
	slots = gck_module_get_slots (test->module, FALSE);
Packit b00eeb
	g_assert (2 == g_list_length (slots) && "wrong number of slots returned");
Packit b00eeb
	g_assert (GCK_IS_SLOT (slots->data) && "missing slot one");
Packit b00eeb
	g_assert (GCK_IS_SLOT (slots->next->data) && "missing slot two");
Packit b00eeb
Packit b00eeb
	for (l = slots; l; l = g_list_next (l)) {
Packit b00eeb
		info = gck_slot_get_info (GCK_SLOT (l->data));
Packit b00eeb
		g_assert (info != NULL && "no slot info");
Packit b00eeb
Packit b00eeb
		g_assert (strcmp("TEST MANUFACTURER", info->manufacturer_id) == 0);
Packit b00eeb
		g_assert (strcmp("TEST SLOT", info->slot_description) == 0);
Packit b00eeb
		g_assert (55 == info->hardware_version_major);
Packit b00eeb
		g_assert (155 == info->hardware_version_minor);
Packit b00eeb
		g_assert (65 == info->firmware_version_major);
Packit b00eeb
		g_assert (165 == info->firmware_version_minor);
Packit b00eeb
Packit b00eeb
		if (info->flags & CKF_TOKEN_PRESENT) {
Packit b00eeb
			token = gck_slot_get_token_info (test->slot);
Packit b00eeb
			g_assert (token != NULL && "no token info");
Packit b00eeb
Packit b00eeb
			g_assert (strcmp ("TEST MANUFACTURER", token->manufacturer_id) == 0);
Packit b00eeb
			g_assert (strcmp ("TEST LABEL", token->label) == 0);
Packit b00eeb
			g_assert (strcmp ("TEST MODEL", token->model) == 0);
Packit b00eeb
			g_assert (strcmp ("TEST SERIAL", token->serial_number) == 0);
Packit b00eeb
			g_assert (1 == token->max_session_count);
Packit b00eeb
			g_assert (2 == token->session_count);
Packit b00eeb
			g_assert (3 == token->max_rw_session_count);
Packit b00eeb
			g_assert (4 == token->rw_session_count);
Packit b00eeb
			g_assert (5 == token->max_pin_len);
Packit b00eeb
			g_assert (6 == token->min_pin_len);
Packit b00eeb
			g_assert (7 == token->total_public_memory);
Packit b00eeb
			g_assert (8 == token->free_public_memory);
Packit b00eeb
			g_assert (9 == token->total_private_memory);
Packit b00eeb
			g_assert (10 == token->free_private_memory);
Packit b00eeb
			g_assert (75 == token->hardware_version_major);
Packit b00eeb
			g_assert (175 == token->hardware_version_minor);
Packit b00eeb
			g_assert (85 == token->firmware_version_major);
Packit b00eeb
			g_assert (185 == token->firmware_version_minor);
Packit b00eeb
			g_assert (927623999 == token->utc_time);
Packit b00eeb
Packit b00eeb
			gck_token_info_free (token);
Packit b00eeb
		}
Packit b00eeb
Packit b00eeb
		gck_slot_info_free (info);
Packit b00eeb
	}
Packit b00eeb
Packit b00eeb
	gck_list_unref_free (slots);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_slot_props (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	GckModule *mod;
Packit b00eeb
	CK_SLOT_ID slot_id;
Packit b00eeb
Packit b00eeb
	g_object_get (test->slot, "module", &mod, "handle", &slot_id, NULL);
Packit b00eeb
	g_assert (mod == test->module);
Packit b00eeb
	g_assert (slot_id == 52);
Packit b00eeb
Packit b00eeb
	g_object_unref (mod);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_slot_equals_hash (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	GckModule *other_mod;
Packit b00eeb
	GckSlot *other_slot;
Packit b00eeb
	GObject *obj;
Packit b00eeb
	guint hash;
Packit b00eeb
Packit b00eeb
	hash = gck_slot_hash (test->slot);
Packit b00eeb
	g_assert (hash != 0);
Packit b00eeb
Packit b00eeb
	g_assert (gck_slot_equal (test->slot, test->slot));
Packit b00eeb
Packit b00eeb
	other_mod = gck_module_new (gck_module_get_functions (test->module));
Packit b00eeb
	other_slot = g_object_new (GCK_TYPE_SLOT, "module", other_mod, "handle", gck_slot_get_handle (test->slot), NULL);
Packit b00eeb
	g_assert (gck_slot_equal (test->slot, other_slot));
Packit b00eeb
	g_object_unref (other_mod);
Packit b00eeb
	g_object_unref (other_slot);
Packit b00eeb
Packit b00eeb
	obj = g_object_new (G_TYPE_OBJECT, NULL);
Packit b00eeb
	g_assert (!gck_slot_equal (test->slot, obj));
Packit b00eeb
	g_object_unref (obj);
Packit b00eeb
Packit b00eeb
	other_slot = g_object_new (GCK_TYPE_SLOT, "module", test->module, "handle", 8909, NULL);
Packit b00eeb
	g_assert (!gck_slot_equal (test->slot, other_slot));
Packit b00eeb
	g_object_unref (other_slot);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_slot_mechanisms (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	GArray *mechs;
Packit b00eeb
	GckMechanismInfo *info;
Packit b00eeb
	guint i;
Packit b00eeb
Packit b00eeb
	mechs = gck_slot_get_mechanisms (test->slot);
Packit b00eeb
	g_assert (2 == gck_mechanisms_length (mechs) && "wrong number of mech types returned");
Packit b00eeb
Packit b00eeb
	for (i = 0; i < gck_mechanisms_length (mechs); ++i) {
Packit b00eeb
Packit b00eeb
		info = gck_slot_get_mechanism_info (test->slot, gck_mechanisms_at (mechs, i));
Packit b00eeb
		g_assert (info != NULL && "no mech info returned");
Packit b00eeb
Packit b00eeb
		gck_mechanism_info_free (info);
Packit b00eeb
	}
Packit b00eeb
Packit b00eeb
	gck_mechanisms_free (mechs);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_token_info_match_null (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	GckTokenInfo *match;
Packit b00eeb
	GckTokenInfo *token;
Packit b00eeb
	gboolean ret;
Packit b00eeb
Packit b00eeb
	token = gck_slot_get_token_info (test->slot);
Packit b00eeb
	match = g_new0 (GckTokenInfo, 1);
Packit b00eeb
Packit b00eeb
	/* Should match, since no fields are set */
Packit b00eeb
	ret = _gck_token_info_match (match, token);
Packit b00eeb
	g_assert (ret);
Packit b00eeb
Packit b00eeb
	gck_token_info_free (match);
Packit b00eeb
	gck_token_info_free (token);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_token_info_match_label (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	GckTokenInfo *match;
Packit b00eeb
	GckTokenInfo *token;
Packit b00eeb
	gboolean ret;
Packit b00eeb
Packit b00eeb
	token = gck_slot_get_token_info (test->slot);
Packit b00eeb
	match = g_new0 (GckTokenInfo, 1);
Packit b00eeb
Packit b00eeb
	/* Should match since the label and serial are matching */
Packit b00eeb
	match->label = g_strdup (token->label);
Packit b00eeb
	match->serial_number = g_strdup (token->serial_number);
Packit b00eeb
	ret = _gck_token_info_match (match, token);
Packit b00eeb
	g_assert (ret);
Packit b00eeb
Packit b00eeb
	gck_token_info_free (match);
Packit b00eeb
	gck_token_info_free (token);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_token_info_match_different (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	GckTokenInfo *match;
Packit b00eeb
	GckTokenInfo *token;
Packit b00eeb
	gboolean ret;
Packit b00eeb
Packit b00eeb
	token = gck_slot_get_token_info (test->slot);
Packit b00eeb
	match = g_new0 (GckTokenInfo, 1);
Packit b00eeb
Packit b00eeb
	/* Should not match since serial is different */
Packit b00eeb
	match->label = g_strdup (token->label);
Packit b00eeb
	match->serial_number = g_strdup ("393939393939393");
Packit b00eeb
	ret = _gck_token_info_match (match, token);
Packit b00eeb
	g_assert (!ret);
Packit b00eeb
Packit b00eeb
	gck_token_info_free (match);
Packit b00eeb
	gck_token_info_free (token);
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_test_add ("/gck/slot/slot_info", Test, NULL, setup, test_slot_info, teardown);
Packit b00eeb
	g_test_add ("/gck/slot/slot_props", Test, NULL, setup, test_slot_props, teardown);
Packit b00eeb
	g_test_add ("/gck/slot/slot_equals_hash", Test, NULL, setup, test_slot_equals_hash, teardown);
Packit b00eeb
	g_test_add ("/gck/slot/slot_mechanisms", Test, NULL, setup, test_slot_mechanisms, teardown);
Packit b00eeb
	g_test_add ("/gck/slot/token_info_match_null", Test, NULL, setup, test_token_info_match_null, teardown);
Packit b00eeb
	g_test_add ("/gck/slot/token_info_match_label", Test, NULL, setup, test_token_info_match_label, teardown);
Packit b00eeb
	g_test_add ("/gck/slot/token_info_match_different", Test, NULL, setup, test_token_info_match_different, teardown);
Packit b00eeb
Packit b00eeb
	return g_test_run ();
Packit b00eeb
}