commit d7de5092247a0efc2c397f12977a7c9925420143 Author: Ingo Franzki Date: Tue Feb 16 17:15:20 2021 +0100 TESTCASES: Add event support tests Signed-off-by: Ingo Franzki 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 +#include +#include + +#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"