summaryrefslogtreecommitdiff
path: root/src/object.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/object.c')
-rw-r--r--src/object.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/object.c b/src/object.c
index 1b9427a..db82fbc 100644
--- a/src/object.c
+++ b/src/object.c
@@ -36,6 +36,51 @@ test_destroy_object(CK_SESSION_HANDLE session_rw, CK_SESSION_HANDLE session_ro)
}
static int
+compar_object_handles(const void *one, const void *two)
+{
+ CK_OBJECT_HANDLE a = *((CK_SLOT_ID*)one);
+ CK_OBJECT_HANDLE b = *((CK_SLOT_ID*)two);
+ if(a == b)
+ return 0;
+ if(a > b)
+ return 1;
+ return -1;
+}
+
+static int
+test_find_consistent(CK_SESSION_HANDLE session)
+{
+ CK_OBJECT_HANDLE_PTR objects;
+ CK_OBJECT_HANDLE_PTR check;
+ CK_ULONG n_objects;
+ CK_ULONG i, n_check;
+
+ objects = p11t_object_find(session, NULL, 0, &n_objects);
+ if(!objects)
+ return CONTINUE;
+
+ qsort(objects, n_objects, sizeof(CK_OBJECT_HANDLE), compar_object_handles);
+
+ for(i = 0; i < 10; ++i)
+ {
+ check = p11t_object_find(session, NULL, 0, &n_check);
+ if(check == NULL)
+ P11T_CHECK_FAIL_MSG("Consistently finds same objects", "no objects found");
+ if(n_objects != n_check)
+ P11T_CHECK_FAIL_MSG("Consistently finds same objects", "wrong number of objects found");
+ qsort(check, n_check, sizeof(CK_OBJECT_HANDLE), compar_object_handles);
+ if(memcmp(objects, check, n_check * sizeof(CK_OBJECT_HANDLE)) != 0)
+ P11T_CHECK_FAIL_MSG("Consistently finds same objects", "different objects found");
+
+ free(check);
+ }
+
+ free(objects);
+
+ return CONTINUE;
+}
+
+static int
test_find_objects(CK_SESSION_HANDLE session)
{
CK_OBJECT_HANDLE objects[1024];
@@ -311,6 +356,7 @@ p11t_object_tests(void)
continue;
test_find_objects(session_ro);
+ test_find_consistent(session_ro);
test_objects(session_ro);
if(!p11t_session_login(session_ro))
@@ -322,6 +368,7 @@ p11t_object_tests(void)
if(session_rw != CK_INVALID)
{
test_find_objects(session_rw);
+ test_find_consistent(session_rw);
test_objects(session_rw);
test_create_object(session_rw, session_ro);
test_copy_object(session_rw, session_ro);