summaryrefslogtreecommitdiff
path: root/p11-kit/tests
diff options
context:
space:
mode:
authorStef Walter <stefw@gnome.org>2013-02-15 21:34:20 +0100
committerStef Walter <stefw@gnome.org>2013-05-21 10:47:53 +0200
commit0cb1132469c1e13be64f85cd6566e6617bfe32cc (patch)
tree9dec0619641038222cf14513d10ab57b88fbda64 /p11-kit/tests
parent5c19f0cf66495f00ccf69eba1d0915f862a88c8d (diff)
Update the proxy module to use managed PKCS#11 modules
Each time C_GetFunctionList is called on the proxy module, a new managed PKCS#11 set of functions is returned. These are all cleaned up when the module is unloaded. We want the proxy module to continue to work even without the highly recommended libffi. For that reason we still keep the old behavior of sharing state in the proxy module.
Diffstat (limited to 'p11-kit/tests')
-rw-r--r--p11-kit/tests/test-mock.c26
-rw-r--r--p11-kit/tests/test-proxy.c116
2 files changed, 124 insertions, 18 deletions
diff --git a/p11-kit/tests/test-mock.c b/p11-kit/tests/test-mock.c
index 955174f..ae1e028 100644
--- a/p11-kit/tests/test-mock.c
+++ b/p11-kit/tests/test-mock.c
@@ -51,24 +51,12 @@ test_get_info (CuTest *tc)
CK_FUNCTION_LIST_PTR module;
CK_INFO info;
CK_RV rv;
- char *string;
module = setup_mock_module (tc, NULL);
rv = (module->C_GetInfo) (&info);
CuAssertTrue (tc, rv == CKR_OK);
-
- CuAssertIntEquals (tc, CRYPTOKI_VERSION_MAJOR, info.cryptokiVersion.major);
- CuAssertIntEquals (tc, CRYPTOKI_VERSION_MINOR, info.cryptokiVersion.minor);
- string = p11_kit_space_strdup (info.manufacturerID, sizeof (info.manufacturerID));
- CuAssertStrEquals (tc, "MOCK MANUFACTURER", string);
- free (string);
- string = p11_kit_space_strdup (info.libraryDescription, sizeof (info.libraryDescription));
- CuAssertStrEquals (tc, "MOCK LIBRARY", string);
- free (string);
- CuAssertIntEquals (tc, 0, info.flags);
- CuAssertIntEquals (tc, 45, info.libraryVersion.major);
- CuAssertIntEquals (tc, 145, info.libraryVersion.minor);
+ CuAssertTrue (tc, memcmp (&info, &MOCK_INFO, sizeof (CK_INFO)) == 0);
teardown_mock_module (tc, module);
}
@@ -86,21 +74,21 @@ test_get_slot_list (CuTest *tc)
/* Normal module has 2 slots, one with token present */
rv = (module->C_GetSlotList) (CK_TRUE, NULL, &count);
CuAssertTrue (tc, rv == CKR_OK);
- CuAssertIntEquals (tc, 1, count);
+ CuAssertIntEquals (tc, MOCK_SLOTS_PRESENT, count);
rv = (module->C_GetSlotList) (CK_FALSE, NULL, &count);
CuAssertTrue (tc, rv == CKR_OK);
- CuAssertIntEquals (tc, 2, count);
+ CuAssertIntEquals (tc, MOCK_SLOTS_ALL, count);
count = 8;
rv = (module->C_GetSlotList) (CK_TRUE, slot_list, &count);
CuAssertTrue (tc, rv == CKR_OK);
- CuAssertIntEquals (tc, 1, count);
+ CuAssertIntEquals (tc, MOCK_SLOTS_PRESENT, count);
CuAssertIntEquals (tc, MOCK_SLOT_ONE_ID, slot_list[0]);
count = 8;
rv = (module->C_GetSlotList) (CK_FALSE, slot_list, &count);
CuAssertTrue (tc, rv == CKR_OK);
- CuAssertIntEquals (tc, 2, count);
+ CuAssertIntEquals (tc, MOCK_SLOTS_ALL, count);
CuAssertIntEquals (tc, MOCK_SLOT_ONE_ID, slot_list[0]);
CuAssertIntEquals (tc, MOCK_SLOT_TWO_ID, slot_list[1]);
@@ -279,6 +267,10 @@ test_wait_for_slot_event (CuTest *tc)
CK_SLOT_ID slot;
CK_RV rv;
+#ifdef MOCK_SKIP_WAIT_TEST
+ return;
+#endif
+
module = setup_mock_module (tc, NULL);
rv = (module->C_WaitForSlotEvent) (0, &slot, NULL);
diff --git a/p11-kit/tests/test-proxy.c b/p11-kit/tests/test-proxy.c
index 99b2431..2ebd848 100644
--- a/p11-kit/tests/test-proxy.c
+++ b/p11-kit/tests/test-proxy.c
@@ -38,8 +38,10 @@
#include "CuTest.h"
#include "library.h"
-#include "pkcs11.h"
+#include "mock.h"
#include "p11-kit.h"
+#include "pkcs11.h"
+#include "proxy.h"
#include <sys/types.h>
@@ -54,6 +56,11 @@
/* This is the proxy module entry point in proxy.c, and linked to this test */
CK_RV C_GetFunctionList (CK_FUNCTION_LIST_PTR_PTR list);
+static CK_SLOT_ID mock_slot_one_id;
+static CK_SLOT_ID mock_slot_two_id;
+static CK_ULONG mock_slots_present;
+static CK_ULONG mock_slots_all;
+
static void
test_initialize_finalize (CuTest *tc)
{
@@ -63,13 +70,117 @@ test_initialize_finalize (CuTest *tc)
rv = C_GetFunctionList (&proxy);
CuAssertTrue (tc, rv == CKR_OK);
+ CuAssertTrue (tc, p11_proxy_module_check (proxy));
+
rv = proxy->C_Initialize (NULL);
CuAssertTrue (tc, rv == CKR_OK);
rv = proxy->C_Finalize (NULL);
CuAssertTrue (tc, rv == CKR_OK);
+
+ p11_proxy_module_cleanup ();
+}
+
+static void
+test_initialize_multiple (CuTest *tc)
+{
+ CK_FUNCTION_LIST_PTR proxy;
+ CK_RV rv;
+
+ rv = C_GetFunctionList (&proxy);
+ CuAssertTrue (tc, rv == CKR_OK);
+
+ CuAssertTrue (tc, p11_proxy_module_check (proxy));
+
+ rv = proxy->C_Initialize (NULL);
+ CuAssertTrue (tc, rv == CKR_OK);
+
+ rv = proxy->C_Initialize (NULL);
+ CuAssertTrue (tc, rv == CKR_OK);
+
+ rv = proxy->C_Finalize (NULL);
+ CuAssertTrue (tc, rv == CKR_OK);
+
+ rv = proxy->C_Finalize (NULL);
+ CuAssertTrue (tc, rv == CKR_OK);
+
+ rv = proxy->C_Finalize (NULL);
+ CuAssertTrue (tc, rv == CKR_CRYPTOKI_NOT_INITIALIZED);
+
+ p11_proxy_module_cleanup ();
+}
+
+static CK_FUNCTION_LIST_PTR
+setup_mock_module (CuTest *tc,
+ CK_SESSION_HANDLE *session)
+{
+ CK_FUNCTION_LIST_PTR proxy;
+ CK_SLOT_ID slots[32];
+ CK_RV rv;
+
+ rv = C_GetFunctionList (&proxy);
+ CuAssertTrue (tc, rv == CKR_OK);
+
+ CuAssertTrue (tc, p11_proxy_module_check (proxy));
+
+ rv = proxy->C_Initialize (NULL);
+ CuAssertTrue (tc, rv == CKR_OK);
+
+ mock_slots_all = 32;
+ rv = proxy->C_GetSlotList (CK_FALSE, slots, &mock_slots_all);
+ CuAssertTrue (tc, rv == CKR_OK);
+ CuAssertTrue (tc, mock_slots_all >= 2);
+
+ /* Assume this is the slot we want to deal with */
+ mock_slot_one_id = slots[0];
+ mock_slot_two_id = slots[1];
+
+ rv = proxy->C_GetSlotList (CK_TRUE, NULL, &mock_slots_present);
+ CuAssertTrue (tc, rv == CKR_OK);
+ CuAssertTrue (tc, mock_slots_present > 1);
+
+ if (session) {
+ rv = (proxy->C_OpenSession) (mock_slot_one_id,
+ CKF_RW_SESSION | CKF_SERIAL_SESSION,
+ NULL, NULL, session);
+ CuAssertTrue (tc, rv == CKR_OK);
+ }
+
+ return proxy;
}
+static void
+teardown_mock_module (CuTest *tc,
+ CK_FUNCTION_LIST_PTR module)
+{
+ CK_RV rv;
+
+ rv = module->C_Finalize (NULL);
+ CuAssertTrue (tc, rv == CKR_OK);
+}
+
+/*
+ * We redefine the mock module slot id so that the tests in test-mock.c
+ * use the proxy mapped slot id rather than the hard coded one
+ */
+#define MOCK_SLOT_ONE_ID mock_slot_one_id
+#define MOCK_SLOT_TWO_ID mock_slot_two_id
+#define MOCK_SLOTS_PRESENT mock_slots_present
+#define MOCK_SLOTS_ALL mock_slots_all
+#define MOCK_INFO mock_info
+#define MOCK_SKIP_WAIT_TEST
+
+static const CK_INFO mock_info = {
+ { CRYPTOKI_VERSION_MAJOR, CRYPTOKI_VERSION_MINOR },
+ "PKCS#11 Kit ",
+ 0,
+ "PKCS#11 Kit Proxy Module ",
+ { 1, 1 }
+};
+
+/* Bring in all the mock module tests */
+#include "test-mock.c"
+
int
main (void)
{
@@ -82,6 +193,9 @@ main (void)
p11_kit_be_quiet ();
SUITE_ADD_TEST (suite, test_initialize_finalize);
+ SUITE_ADD_TEST (suite, test_initialize_multiple);
+
+ test_mock_add_tests (suite);
CuSuiteRun (suite);
CuSuiteSummary (suite, output);