Blob Blame History Raw
commit d7de5092247a0efc2c397f12977a7c9925420143
Author: Ingo Franzki <ifranzki@linux.ibm.com>
Date:   Tue Feb 16 17:15:20 2021 +0100

    TESTCASES: Add event support tests
    
    Signed-off-by: Ingo Franzki <ifranzki@linux.ibm.com>

diff --git a/testcases/misc_tests/events.c b/testcases/misc_tests/events.c
new file mode 100644
index 00000000..fecc7bfe
--- /dev/null
+++ b/testcases/misc_tests/events.c
@@ -0,0 +1,190 @@
+/*
+ * COPYRIGHT (c) International Business Machines Corp. 2021
+ *
+ * This program is provided under the terms of the Common Public License,
+ * version 1.0 (CPL-1.0). Any use, reproduction or distribution for this
+ * software constitutes recipient's acceptance of CPL-1.0 terms which can be
+ * found in the file LICENSE file or at
+ * https://opensource.org/licenses/cpl1.0.php
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "event_client.h"
+#include "regress.h"
+#include "defs.h"
+
+const char payload[20] = "12345678901234567890";
+
+static inline void init_event_destination(struct event_destination *dest,
+                                          unsigned int token_type,
+                                          const char *label,
+                                          pid_t process_id)
+{
+    size_t len;
+
+    dest->token_type = token_type;
+    dest->process_id = process_id;
+
+    memset(dest->token_label, ' ', sizeof(dest->token_label));
+    if (label != NULL) {
+        len = strlen(label);
+        memcpy(dest->token_label, label, len > sizeof(dest->token_label) ?
+                                    sizeof(dest->token_label) : len);
+    }
+}
+
+int main(int argc, char **argv)
+{
+    CK_C_INITIALIZE_ARGS cinit_args;
+    int rc, fd = -1, ret = 1;
+    struct event_destination dest;
+    struct event_reply reply;
+
+    UNUSED(argc);
+    UNUSED(argv);
+
+    rc = do_GetFunctionList();
+    if (!rc) {
+        testcase_error("do_getFunctionList(), rc=%s", p11_get_ckr(rc));
+        return rc;
+    }
+
+    /*
+     * Initialize Opencryptoki in this process, so that at least one
+     * process is receiving the events.
+     */
+    memset(&cinit_args, 0x0, sizeof(cinit_args));
+    cinit_args.flags = CKF_OS_LOCKING_OK;
+    funcs->C_Initialize(&cinit_args);
+
+    testcase_setup(0);
+    testcase_begin("Starting event tests");
+
+    // Test fork before C_Initialize
+    testcase_new_assertion();
+
+    rc = send_event(-1, 0x12345, EVENT_FLAGS_NONE, 0, NULL, NULL, NULL);
+    if (rc != 0) {
+        testcase_fail("send_event (simple, one-shot) rc = %d (%s)", rc,
+                      strerror(-rc));
+        goto out;
+    }
+    testcase_pass("send_event (simple, one-shot)");
+
+    rc = send_event(-1, 0x12345, EVENT_FLAGS_NONE, sizeof(payload), payload,
+                    NULL, NULL);
+    if (rc != 0) {
+        testcase_fail("send_event (payload, one-shot) rc = %d (%s)", rc,
+                      strerror(-rc));
+        goto out;
+    }
+    testcase_pass("send_event (payload, one-shot)");
+
+    init_event_destination(&dest, EVENT_TOK_TYPE_CCA, NULL, 0);
+
+    rc = send_event(-1, 0x12345, EVENT_FLAGS_NONE, 0, NULL, &dest, NULL);
+    if (rc != 0) {
+        testcase_fail("send_event (token-type, one-shot) rc = %d (%s)", rc,
+                      strerror(-rc));
+        goto out;
+    }
+    testcase_pass("send_event (token-type, one-shot)");
+
+    init_event_destination(&dest, EVENT_TOK_TYPE_ALL, "cca", 0);
+
+    rc = send_event(-1, 0x12345, EVENT_FLAGS_NONE, 0, NULL, &dest, NULL);
+    if (rc != 0) {
+        testcase_fail("send_event (token-label, one-shot) rc = %d (%s)", rc,
+                      strerror(-rc));
+        goto out;
+    }
+    testcase_pass("send_event (token-label, one-shot)");
+
+    init_event_destination(&dest, EVENT_TOK_TYPE_ALL, NULL, 12345);
+
+    rc = send_event(-1, 0x12345, EVENT_FLAGS_NONE, 0, NULL, &dest, NULL);
+    if (rc != 0) {
+        testcase_fail("send_event (pid, one-shot) rc = %d (%s)", rc,
+                      strerror(-rc));
+        goto out;
+    }
+    testcase_pass("send_event (pid, one-shot)");
+
+    memset(&reply, 0, sizeof(reply));
+
+    rc = send_event(-1, 0x12345, EVENT_FLAGS_REPLY_REQ, 0, NULL, NULL, &reply);
+    if (rc != 0) {
+        testcase_fail("send_event (reply, one-shot) rc = %d (%s)", rc,
+                      strerror(-rc));
+        goto out;
+    }
+    printf("Reply: positive_replies:    %lu\n", reply.positive_replies);
+    printf("       negative_replies:    %lu\n", reply.negative_replies);
+    printf("       nothandled_replies:  %lu\n", reply.nothandled_replies);
+    if (reply.positive_replies + reply.negative_replies +
+            reply.nothandled_replies == 0) {
+        testcase_fail("send_event (reply, one-shot) replies all zero");
+        goto out;
+    }
+    testcase_pass("send_event (reply, one-shot)");
+
+
+    fd = init_event_client();
+    if (fd < 0) {
+        testcase_fail("init_event_client rc = %d (%s)", fd, strerror(-fd));
+        goto out;
+    }
+    testcase_pass("init_event_client()");
+
+    rc = send_event(fd, 0x12345, EVENT_FLAGS_NONE, 0, NULL, NULL, NULL);
+    if (rc != 0) {
+        testcase_fail("send_event (simple) rc = %d (%s)", rc, strerror(-rc));
+        goto out;
+    }
+    testcase_pass("send_event (simple)");
+
+    rc = send_event(fd, 0x12345, EVENT_FLAGS_NONE, sizeof(payload), payload,
+                    NULL, NULL);
+    if (rc != 0) {
+        testcase_fail("send_event (payload) rc = %d (%s)", rc,
+                      strerror(-rc));
+        goto out;
+    }
+    testcase_pass("send_event (payload)");
+
+    memset(&reply, 0, sizeof(reply));
+
+    rc = send_event(-1, 0x12345, EVENT_FLAGS_REPLY_REQ, 0, NULL, NULL, &reply);
+    if (rc != 0) {
+        testcase_fail("send_event (reply) rc = %d (%s)", rc,
+                      strerror(-rc));
+        goto out;
+    }
+    printf("Reply: positive_replies:    %lu\n", reply.positive_replies);
+    printf("       negative_replies:    %lu\n", reply.negative_replies);
+    printf("       nothandled_replies:  %lu\n", reply.nothandled_replies);
+    if (reply.positive_replies + reply.negative_replies +
+            reply.nothandled_replies == 0) {
+        testcase_fail("send_event (reply) replies all zero");
+        goto out;
+    }
+    testcase_pass("send_event (reply)");
+
+    term_event_client(fd);
+    fd = -1;
+
+    ret = 0;
+
+out:
+    if (fd >= 0)
+        term_event_client(fd);
+
+    funcs->C_Finalize(NULL);
+
+    testcase_print_result();
+    return ret;
+}
diff --git a/testcases/misc_tests/misc_tests.mk b/testcases/misc_tests/misc_tests.mk
index 3de11ebe..fb7cc0a1 100644
--- a/testcases/misc_tests/misc_tests.mk
+++ b/testcases/misc_tests/misc_tests.mk
@@ -7,7 +7,8 @@ noinst_PROGRAMS +=							\
 	testcases/misc_tests/fork testcases/misc_tests/multi_instance   \
 	testcases/misc_tests/obj_lock testcases/misc_tests/tok2tok_transport \
 	testcases/misc_tests/obj_lock testcases/misc_tests/reencrypt    \
-	testcases/misc_tests/cca_export_import_test
+	testcases/misc_tests/cca_export_import_test			\
+	testcases/misc_tests/events
 
 testcases_misc_tests_obj_mgmt_tests_CFLAGS = ${testcases_inc}
 testcases_misc_tests_obj_mgmt_tests_LDADD =				\
@@ -73,3 +74,8 @@ testcases_misc_tests_cca_export_import_test_LDADD =			\
 	testcases/common/libcommon.la
 testcases_misc_tests_cca_export_import_test_SOURCES =			\
 	testcases/misc_tests/cca_export_import_test.c
+	
+testcases_misc_tests_events_CFLAGS = ${testcases_inc}
+testcases_misc_tests_events_LDADD = testcases/common/libcommon.la
+testcases_misc_tests_events_SOURCES = testcases/misc_tests/events.c	\
+	usr/lib/common/event_client.c
diff --git a/testcases/ock_tests.sh.in b/testcases/ock_tests.sh.in
index 64c77a7d..6558b031 100755
--- a/testcases/ock_tests.sh.in
+++ b/testcases/ock_tests.sh.in
@@ -53,6 +53,7 @@ OCK_TESTS+=" pkcs11/findobjects pkcs11/generate_keypair"
 OCK_TESTS+=" pkcs11/get_interface pkcs11/getobjectsize pkcs11/sess_opstate"
 OCK_TESTS+=" misc_tests/fork misc_tests/obj_mgmt_tests" 
 OCK_TESTS+=" misc_tests/obj_mgmt_lock_tests misc_tests/reencrypt"
+OCK_TESTS+=" misc_tests/events"
 OCK_TEST=""
 OCK_BENCHS="pkcs11/*bench"