aboutsummaryrefslogtreecommitdiff
path: root/test/validation/api/event/event.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/validation/api/event/event.c')
-rw-r--r--test/validation/api/event/event.c471
1 files changed, 471 insertions, 0 deletions
diff --git a/test/validation/api/event/event.c b/test/validation/api/event/event.c
new file mode 100644
index 000000000..a4f967791
--- /dev/null
+++ b/test/validation/api/event/event.c
@@ -0,0 +1,471 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright (c) 2017-2018 Linaro Limited
+ * Copyright (c) 2023 Nokia
+ */
+
+#include <odp_api.h>
+#include <odp_cunit_common.h>
+
+#define NUM_EVENTS 100
+#define EVENT_SIZE 100
+#define EVENT_BURST 10
+
+static void event_test_free(void)
+{
+ odp_pool_t pool;
+ odp_pool_param_t pool_param;
+ int i;
+ odp_buffer_t buf;
+ odp_packet_t pkt;
+ odp_timeout_t tmo;
+ odp_event_subtype_t subtype;
+ odp_event_t event[EVENT_BURST];
+
+ /* Buffer events */
+ odp_pool_param_init(&pool_param);
+ pool_param.buf.num = NUM_EVENTS;
+ pool_param.buf.size = EVENT_SIZE;
+ pool_param.type = ODP_POOL_BUFFER;
+
+ pool = odp_pool_create("event_free", &pool_param);
+ CU_ASSERT_FATAL(pool != ODP_POOL_INVALID);
+
+ for (i = 0; i < EVENT_BURST; i++) {
+ buf = odp_buffer_alloc(pool);
+ CU_ASSERT(odp_event_is_valid(odp_buffer_to_event(buf)) == 1);
+ CU_ASSERT_FATAL(buf != ODP_BUFFER_INVALID);
+ event[i] = odp_buffer_to_event(buf);
+ CU_ASSERT(odp_event_type(event[i]) == ODP_EVENT_BUFFER);
+ CU_ASSERT(odp_event_subtype(event[i]) == ODP_EVENT_NO_SUBTYPE);
+ CU_ASSERT(odp_event_types(event[i], &subtype) ==
+ ODP_EVENT_BUFFER);
+ CU_ASSERT(subtype == ODP_EVENT_NO_SUBTYPE);
+ }
+
+ for (i = 0; i < EVENT_BURST; i++)
+ odp_event_free(event[i]);
+
+ CU_ASSERT(odp_pool_destroy(pool) == 0);
+
+ /* Packet events */
+ odp_pool_param_init(&pool_param);
+ pool_param.pkt.num = NUM_EVENTS;
+ pool_param.pkt.len = EVENT_SIZE;
+ pool_param.type = ODP_POOL_PACKET;
+
+ pool = odp_pool_create("event_free", &pool_param);
+ CU_ASSERT_FATAL(pool != ODP_POOL_INVALID);
+
+ for (i = 0; i < EVENT_BURST; i++) {
+ pkt = odp_packet_alloc(pool, EVENT_SIZE);
+ CU_ASSERT(odp_event_is_valid(odp_packet_to_event(pkt)) == 1);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ event[i] = odp_packet_to_event(pkt);
+ CU_ASSERT(odp_event_type(event[i]) == ODP_EVENT_PACKET);
+ CU_ASSERT(odp_event_subtype(event[i]) ==
+ ODP_EVENT_PACKET_BASIC);
+ CU_ASSERT(odp_event_types(event[i], &subtype) ==
+ ODP_EVENT_PACKET);
+ CU_ASSERT(subtype == ODP_EVENT_PACKET_BASIC);
+ }
+
+ for (i = 0; i < EVENT_BURST; i++)
+ odp_event_free(event[i]);
+
+ CU_ASSERT(odp_pool_destroy(pool) == 0);
+
+ /* Timeout events */
+ odp_pool_param_init(&pool_param);
+ pool_param.tmo.num = NUM_EVENTS;
+ pool_param.type = ODP_POOL_TIMEOUT;
+
+ pool = odp_pool_create("event_free", &pool_param);
+ CU_ASSERT_FATAL(pool != ODP_POOL_INVALID);
+
+ for (i = 0; i < EVENT_BURST; i++) {
+ tmo = odp_timeout_alloc(pool);
+ CU_ASSERT(odp_event_is_valid(odp_timeout_to_event(tmo)) == 1);
+ CU_ASSERT_FATAL(tmo != ODP_TIMEOUT_INVALID);
+ event[i] = odp_timeout_to_event(tmo);
+ CU_ASSERT(odp_event_type(event[i]) == ODP_EVENT_TIMEOUT);
+ CU_ASSERT(odp_event_subtype(event[i]) == ODP_EVENT_NO_SUBTYPE);
+ CU_ASSERT(odp_event_types(event[i], &subtype) ==
+ ODP_EVENT_TIMEOUT);
+ CU_ASSERT(subtype == ODP_EVENT_NO_SUBTYPE);
+ }
+
+ for (i = 0; i < EVENT_BURST; i++)
+ odp_event_free(event[i]);
+
+ CU_ASSERT(odp_pool_destroy(pool) == 0);
+}
+
+static void event_test_free_multi(void)
+{
+ odp_pool_t pool;
+ odp_pool_param_t pool_param;
+ int i, j;
+ odp_buffer_t buf;
+ odp_packet_t pkt;
+ odp_timeout_t tmo;
+ odp_event_t event[EVENT_BURST];
+
+ /* Buffer events */
+ odp_pool_param_init(&pool_param);
+ pool_param.buf.num = NUM_EVENTS;
+ pool_param.buf.size = EVENT_SIZE;
+ pool_param.type = ODP_POOL_BUFFER;
+
+ pool = odp_pool_create("event_free", &pool_param);
+ CU_ASSERT_FATAL(pool != ODP_POOL_INVALID);
+
+ for (j = 0; j < 2; j++) {
+ for (i = 0; i < EVENT_BURST; i++) {
+ buf = odp_buffer_alloc(pool);
+ CU_ASSERT_FATAL(buf != ODP_BUFFER_INVALID);
+ event[i] = odp_buffer_to_event(buf);
+ }
+
+ if (j == 0)
+ odp_event_free_multi(event, EVENT_BURST);
+ else
+ odp_event_free_sp(event, EVENT_BURST);
+ }
+
+ CU_ASSERT(odp_pool_destroy(pool) == 0);
+
+ /* Packet events */
+ odp_pool_param_init(&pool_param);
+ pool_param.pkt.num = NUM_EVENTS;
+ pool_param.pkt.len = EVENT_SIZE;
+ pool_param.type = ODP_POOL_PACKET;
+
+ pool = odp_pool_create("event_free", &pool_param);
+ CU_ASSERT_FATAL(pool != ODP_POOL_INVALID);
+
+ for (j = 0; j < 2; j++) {
+ for (i = 0; i < EVENT_BURST; i++) {
+ pkt = odp_packet_alloc(pool, EVENT_SIZE);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ event[i] = odp_packet_to_event(pkt);
+ }
+
+ if (j == 0)
+ odp_event_free_multi(event, EVENT_BURST);
+ else
+ odp_event_free_sp(event, EVENT_BURST);
+ }
+
+ CU_ASSERT(odp_pool_destroy(pool) == 0);
+
+ /* Timeout events */
+ odp_pool_param_init(&pool_param);
+ pool_param.tmo.num = NUM_EVENTS;
+ pool_param.type = ODP_POOL_TIMEOUT;
+
+ pool = odp_pool_create("event_free", &pool_param);
+ CU_ASSERT_FATAL(pool != ODP_POOL_INVALID);
+
+ for (j = 0; j < 2; j++) {
+ for (i = 0; i < EVENT_BURST; i++) {
+ tmo = odp_timeout_alloc(pool);
+ CU_ASSERT_FATAL(tmo != ODP_TIMEOUT_INVALID);
+ event[i] = odp_timeout_to_event(tmo);
+ }
+
+ if (j == 0)
+ odp_event_free_multi(event, EVENT_BURST);
+ else
+ odp_event_free_sp(event, EVENT_BURST);
+ }
+
+ CU_ASSERT(odp_pool_destroy(pool) == 0);
+}
+
+static void event_test_free_multi_mixed(void)
+{
+ odp_pool_t pool1, pool2, pool3;
+ odp_pool_param_t pool_param;
+ int i, j;
+ odp_buffer_t buf;
+ odp_packet_t pkt;
+ odp_timeout_t tmo;
+ odp_event_t event[3 * EVENT_BURST];
+
+ /* Buffer events */
+ odp_pool_param_init(&pool_param);
+ pool_param.buf.num = NUM_EVENTS;
+ pool_param.buf.size = EVENT_SIZE;
+ pool_param.type = ODP_POOL_BUFFER;
+
+ pool1 = odp_pool_create("event_free1", &pool_param);
+ CU_ASSERT_FATAL(pool1 != ODP_POOL_INVALID);
+
+ /* Packet events */
+ odp_pool_param_init(&pool_param);
+ pool_param.pkt.num = NUM_EVENTS;
+ pool_param.pkt.len = EVENT_SIZE;
+ pool_param.type = ODP_POOL_PACKET;
+
+ pool2 = odp_pool_create("event_free2", &pool_param);
+ CU_ASSERT_FATAL(pool2 != ODP_POOL_INVALID);
+
+ /* Timeout events */
+ odp_pool_param_init(&pool_param);
+ pool_param.tmo.num = NUM_EVENTS;
+ pool_param.type = ODP_POOL_TIMEOUT;
+
+ pool3 = odp_pool_create("event_free3", &pool_param);
+ CU_ASSERT_FATAL(pool3 != ODP_POOL_INVALID);
+
+ for (j = 0; j < 2; j++) {
+ for (i = 0; i < 3 * EVENT_BURST;) {
+ buf = odp_buffer_alloc(pool1);
+ CU_ASSERT_FATAL(buf != ODP_BUFFER_INVALID);
+ event[i] = odp_buffer_to_event(buf);
+ i++;
+ pkt = odp_packet_alloc(pool2, EVENT_SIZE);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ event[i] = odp_packet_to_event(pkt);
+ i++;
+ tmo = odp_timeout_alloc(pool3);
+ CU_ASSERT_FATAL(tmo != ODP_TIMEOUT_INVALID);
+ event[i] = odp_timeout_to_event(tmo);
+ i++;
+ }
+
+ if (j == 0)
+ odp_event_free_multi(event, 3 * EVENT_BURST);
+ else
+ odp_event_free_sp(event, 3 * EVENT_BURST);
+ }
+
+ CU_ASSERT(odp_pool_destroy(pool1) == 0);
+ CU_ASSERT(odp_pool_destroy(pool2) == 0);
+ CU_ASSERT(odp_pool_destroy(pool3) == 0);
+}
+
+#define NUM_TYPE_TEST 6
+
+static void type_test_init(odp_pool_t *buf_pool, odp_pool_t *pkt_pool,
+ odp_event_t buf_event[],
+ odp_event_t pkt_event[],
+ odp_event_t event[])
+{
+ odp_pool_t pool1, pool2;
+ odp_pool_param_t pool_param;
+ int i;
+ odp_buffer_t buf;
+ odp_packet_t pkt;
+
+ /* Buffer events */
+ odp_pool_param_init(&pool_param);
+ pool_param.buf.num = NUM_EVENTS;
+ pool_param.buf.size = EVENT_SIZE;
+ pool_param.type = ODP_POOL_BUFFER;
+
+ pool1 = odp_pool_create("event_type_buf", &pool_param);
+ CU_ASSERT_FATAL(pool1 != ODP_POOL_INVALID);
+
+ for (i = 0; i < NUM_TYPE_TEST; i++) {
+ buf = odp_buffer_alloc(pool1);
+ CU_ASSERT_FATAL(buf != ODP_BUFFER_INVALID);
+ buf_event[i] = odp_buffer_to_event(buf);
+ }
+
+ /* Packet events */
+ odp_pool_param_init(&pool_param);
+ pool_param.pkt.num = NUM_EVENTS;
+ pool_param.pkt.len = EVENT_SIZE;
+ pool_param.type = ODP_POOL_PACKET;
+
+ pool2 = odp_pool_create("event_type_pkt", &pool_param);
+ CU_ASSERT_FATAL(pool2 != ODP_POOL_INVALID);
+
+ for (i = 0; i < NUM_TYPE_TEST; i++) {
+ pkt = odp_packet_alloc(pool2, EVENT_SIZE);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ pkt_event[i] = odp_packet_to_event(pkt);
+ }
+
+ /* 1 buf, 1 pkt, 2 buf, 2 pkt, 3 buf, 3 pkt */
+ event[0] = buf_event[0];
+ event[1] = pkt_event[0];
+ event[2] = buf_event[1];
+ event[3] = buf_event[2];
+ event[4] = pkt_event[1];
+ event[5] = pkt_event[2];
+ event[6] = buf_event[3];
+ event[7] = buf_event[4];
+ event[8] = buf_event[5];
+ event[9] = pkt_event[3];
+ event[10] = pkt_event[4];
+ event[11] = pkt_event[5];
+
+ *buf_pool = pool1;
+ *pkt_pool = pool2;
+}
+
+static void event_test_type_multi(void)
+{
+ odp_pool_t buf_pool, pkt_pool;
+ odp_event_type_t type;
+ int num;
+ odp_event_t buf_event[NUM_TYPE_TEST];
+ odp_event_t pkt_event[NUM_TYPE_TEST];
+ odp_event_t event[2 * NUM_TYPE_TEST];
+
+ type_test_init(&buf_pool, &pkt_pool, buf_event, pkt_event, event);
+
+ num = odp_event_type_multi(&event[0], 12, &type);
+ CU_ASSERT(num == 1);
+ CU_ASSERT(type == ODP_EVENT_BUFFER);
+
+ num = odp_event_type_multi(&event[1], 11, &type);
+ CU_ASSERT(num == 1);
+ CU_ASSERT(type == ODP_EVENT_PACKET);
+
+ num = odp_event_type_multi(&event[2], 10, &type);
+ CU_ASSERT(num == 2);
+ CU_ASSERT(type == ODP_EVENT_BUFFER);
+
+ num = odp_event_type_multi(&event[4], 8, &type);
+ CU_ASSERT(num == 2);
+ CU_ASSERT(type == ODP_EVENT_PACKET);
+
+ num = odp_event_type_multi(&event[6], 6, &type);
+ CU_ASSERT(num == 3);
+ CU_ASSERT(type == ODP_EVENT_BUFFER);
+
+ num = odp_event_type_multi(&event[9], 3, &type);
+ CU_ASSERT(num == 3);
+ CU_ASSERT(type == ODP_EVENT_PACKET);
+
+ odp_event_free_multi(buf_event, NUM_TYPE_TEST);
+ odp_event_free_multi(pkt_event, NUM_TYPE_TEST);
+
+ CU_ASSERT(odp_pool_destroy(buf_pool) == 0);
+ CU_ASSERT(odp_pool_destroy(pkt_pool) == 0);
+}
+
+static void event_test_types_multi(void)
+{
+ odp_pool_t buf_pool, pkt_pool;
+ odp_event_t buf_event[NUM_TYPE_TEST];
+ odp_event_t pkt_event[NUM_TYPE_TEST];
+ odp_event_t event[2 * NUM_TYPE_TEST];
+ odp_event_type_t event_types[2 * NUM_TYPE_TEST];
+ odp_event_subtype_t event_subtypes[2 * NUM_TYPE_TEST];
+ int i;
+
+ type_test_init(&buf_pool, &pkt_pool, buf_event, pkt_event, event);
+
+ /* Only buffers */
+ odp_event_types_multi(buf_event, event_types, event_subtypes, NUM_TYPE_TEST);
+ for (i = 0; i < NUM_TYPE_TEST; i++) {
+ CU_ASSERT(event_types[i] == ODP_EVENT_BUFFER);
+ CU_ASSERT(event_subtypes[i] == ODP_EVENT_NO_SUBTYPE);
+ }
+
+ /* Only packets */
+ odp_event_types_multi(pkt_event, event_types, event_subtypes, NUM_TYPE_TEST);
+ for (i = 0; i < NUM_TYPE_TEST; i++) {
+ CU_ASSERT(event_types[i] == ODP_EVENT_PACKET);
+ CU_ASSERT(event_subtypes[i] == ODP_EVENT_PACKET_BASIC);
+ }
+
+ /* Mixed events: B P BB PP BBB PPP */
+ odp_event_types_multi(event, event_types, NULL, 2 * NUM_TYPE_TEST);
+ for (i = 0; i < 2 * NUM_TYPE_TEST; i++) {
+ if (i == 0 || i == 2 || i == 3 || i == 6 || i == 7 || i == 8) {
+ /* CU_ASSERT requires extra brackets */
+ CU_ASSERT(event_types[i] == ODP_EVENT_BUFFER);
+ } else {
+ CU_ASSERT(event_types[i] == ODP_EVENT_PACKET);
+ }
+ }
+
+ odp_event_free_multi(buf_event, NUM_TYPE_TEST);
+ odp_event_free_multi(pkt_event, NUM_TYPE_TEST);
+
+ CU_ASSERT(odp_pool_destroy(buf_pool) == 0);
+ CU_ASSERT(odp_pool_destroy(pkt_pool) == 0);
+}
+
+static void event_test_filter_packet(void)
+{
+ odp_pool_t buf_pool, pkt_pool;
+ int i, num_pkt, num_rem;
+ int num = 2 * NUM_TYPE_TEST;
+ odp_event_t buf_event[NUM_TYPE_TEST];
+ odp_event_t pkt_event[NUM_TYPE_TEST];
+ odp_event_t event[num];
+ odp_packet_t packet[num];
+ odp_event_t remain[num];
+
+ type_test_init(&buf_pool, &pkt_pool, buf_event, pkt_event, event);
+
+ for (i = 0; i < num; i++) {
+ packet[i] = ODP_PACKET_INVALID;
+ remain[i] = ODP_EVENT_INVALID;
+ }
+
+ num_pkt = odp_event_filter_packet(event, packet, remain, num);
+ CU_ASSERT(num_pkt == NUM_TYPE_TEST);
+
+ for (i = 0; i < num_pkt; i++)
+ CU_ASSERT(packet[i] != ODP_PACKET_INVALID);
+
+ num_rem = num - num_pkt;
+ CU_ASSERT(num_rem == NUM_TYPE_TEST);
+
+ for (i = 0; i < num_rem; i++) {
+ CU_ASSERT(remain[i] != ODP_EVENT_INVALID);
+ CU_ASSERT(odp_event_type(remain[i]) == ODP_EVENT_BUFFER);
+ }
+
+ odp_event_free_multi(event, num);
+
+ CU_ASSERT(odp_pool_destroy(buf_pool) == 0);
+ CU_ASSERT(odp_pool_destroy(pkt_pool) == 0);
+}
+
+static void event_test_is_valid(void)
+{
+ CU_ASSERT(odp_event_is_valid(ODP_EVENT_INVALID) == 0);
+ CU_ASSERT(odp_buffer_is_valid(ODP_BUFFER_INVALID) == 0);
+ CU_ASSERT(odp_packet_is_valid(ODP_PACKET_INVALID) == 0);
+ CU_ASSERT(odp_packet_vector_valid(ODP_PACKET_VECTOR_INVALID) == 0);
+}
+
+odp_testinfo_t event_suite[] = {
+ ODP_TEST_INFO(event_test_free),
+ ODP_TEST_INFO(event_test_free_multi),
+ ODP_TEST_INFO(event_test_free_multi_mixed),
+ ODP_TEST_INFO(event_test_type_multi),
+ ODP_TEST_INFO(event_test_types_multi),
+ ODP_TEST_INFO(event_test_filter_packet),
+ ODP_TEST_INFO(event_test_is_valid),
+ ODP_TEST_INFO_NULL,
+};
+
+odp_suiteinfo_t event_suites[] = {
+ {"Event", NULL, NULL, event_suite},
+ ODP_SUITE_INFO_NULL,
+};
+
+int main(int argc, char *argv[])
+{
+ int ret;
+
+ /* parse common options: */
+ if (odp_cunit_parse_options(&argc, argv))
+ return -1;
+
+ ret = odp_cunit_register(event_suites);
+
+ if (ret == 0)
+ ret = odp_cunit_run();
+
+ return ret;
+}