Add helper functions to generate, inject, consume and validate the events.

Signed-off-by: Jerin Jacob <jerin.ja...@caviumnetworks.com>
---
 app/test/test_eventdev_octeontx.c | 202 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 202 insertions(+)

diff --git a/app/test/test_eventdev_octeontx.c 
b/app/test/test_eventdev_octeontx.c
index e28880b..8a03920 100644
--- a/app/test/test_eventdev_octeontx.c
+++ b/app/test/test_eventdev_octeontx.c
@@ -54,6 +54,52 @@
 static int evdev;
 static struct rte_mempool *eventdev_test_mempool;
 
+struct event_attr {
+       uint32_t flow_id;
+       uint8_t event_type;
+       uint8_t sub_event_type;
+       uint8_t sched_type;
+       uint8_t queue;
+       uint8_t port;
+};
+
+
+static uint32_t seqn_list_index;
+static int seqn_list[NUM_PACKETS];
+
+static inline void
+seqn_list_init(void)
+{
+       RTE_BUILD_BUG_ON(NUM_PACKETS < MAX_EVENTS);
+       memset(seqn_list, 0, sizeof(seqn_list));
+       seqn_list_index = 0;
+}
+
+static inline int
+seqn_list_update(int val)
+{
+       if (seqn_list_index >= NUM_PACKETS)
+               return TEST_FAILED;
+
+       seqn_list[seqn_list_index++] = val;
+       rte_smp_wmb();
+       return TEST_SUCCESS;
+}
+
+static inline int
+seqn_list_check(int limit)
+{
+       int i;
+
+       for (i = 0; i < limit; i++) {
+               if (seqn_list[i] != i) {
+                       printf("Seqn mismatch %d %d\n", seqn_list[i], i);
+                       return TEST_FAILED;
+               }
+       }
+       return TEST_SUCCESS;
+}
+
 static int
 testsuite_setup(void)
 {
@@ -205,6 +251,162 @@ eventdev_teardown(void)
        rte_mempool_free(eventdev_test_mempool);
 }
 
+static inline void
+update_event_and_validation_attr(struct rte_mbuf *m, struct rte_event *ev,
+                       uint32_t flow_id, uint8_t event_type,
+                       uint8_t sub_event_type, uint8_t sched_type,
+                       uint8_t queue, uint8_t port)
+{
+       struct event_attr *attr;
+
+       /* Store the event attributes in mbuf for future reference */
+       attr = rte_pktmbuf_mtod(m, struct event_attr *);
+       attr->flow_id = flow_id;
+       attr->event_type = event_type;
+       attr->sub_event_type = sub_event_type;
+       attr->sched_type = sched_type;
+       attr->queue = queue;
+       attr->port = port;
+
+       ev->flow_id = flow_id;
+       ev->sub_event_type = sub_event_type;
+       ev->event_type = event_type;
+       /* Inject the new event */
+       ev->op = RTE_EVENT_OP_NEW;
+       ev->sched_type = sched_type;
+       ev->queue_id = queue;
+       ev->mbuf = m;
+}
+
+static inline int
+inject_events(uint32_t flow_id, uint8_t event_type, uint8_t sub_event_type,
+               uint8_t sched_type, uint8_t queue, uint8_t port,
+               unsigned int events)
+{
+       struct rte_mbuf *m;
+       unsigned int i;
+
+       for (i = 0; i < events; i++) {
+               struct rte_event ev = {0};
+
+               m = rte_pktmbuf_alloc(eventdev_test_mempool);
+               TEST_ASSERT_NOT_NULL(m, "mempool alloc failed");
+
+               m->seqn = i;
+               update_event_and_validation_attr(m, &ev, flow_id, event_type,
+                       sub_event_type, sched_type, queue, port);
+               rte_event_enqueue_burst(evdev, port, &ev, 1);
+       }
+       return 0;
+}
+
+static inline int
+check_excess_events(uint8_t port)
+{
+       int i;
+       uint16_t valid_event;
+       struct rte_event ev;
+
+       /* Check for excess events, try for a few times and exit */
+       for (i = 0; i < 32; i++) {
+               valid_event = rte_event_dequeue_burst(evdev, port, &ev, 1, 0);
+
+               TEST_ASSERT_SUCCESS(valid_event, "Unexpected valid event=%d",
+                                       ev.mbuf->seqn);
+       }
+       return 0;
+}
+
+static inline int
+generate_random_events(const unsigned int total_events)
+{
+       struct rte_event_dev_info info;
+       unsigned int i;
+       int ret;
+
+       ret = rte_event_dev_info_get(evdev, &info);
+       TEST_ASSERT_SUCCESS(ret, "Failed to get event dev info");
+       for (i = 0; i < total_events; i++) {
+               ret = inject_events(
+                       rte_rand() % info.max_event_queue_flows /*flow_id */,
+                       rte_rand() % (RTE_EVENT_TYPE_CPU + 1) /* event_type */,
+                       rte_rand() % 256 /* sub_event_type */,
+                       rte_rand() % (RTE_SCHED_TYPE_PARALLEL + 1),
+                       rte_rand() % rte_event_queue_count(evdev) /* queue */,
+                       0 /* port */,
+                       1 /* events */);
+               if (ret)
+                       return TEST_FAILED;
+       }
+       return ret;
+}
+
+static inline int
+validate_event(struct rte_event *ev)
+{
+       struct event_attr *attr;
+
+       attr = rte_pktmbuf_mtod(ev->mbuf, struct event_attr *);
+       TEST_ASSERT_EQUAL(attr->flow_id, ev->flow_id,
+                       "flow_id mismatch enq=%d deq =%d",
+                       attr->flow_id, ev->flow_id);
+       TEST_ASSERT_EQUAL(attr->event_type, ev->event_type,
+                       "event_type mismatch enq=%d deq =%d",
+                       attr->event_type, ev->event_type);
+       TEST_ASSERT_EQUAL(attr->sub_event_type, ev->sub_event_type,
+                       "sub_event_type mismatch enq=%d deq =%d",
+                       attr->sub_event_type, ev->sub_event_type);
+       TEST_ASSERT_EQUAL(attr->sched_type, ev->sched_type,
+                       "sched_type mismatch enq=%d deq =%d",
+                       attr->sched_type, ev->sched_type);
+       TEST_ASSERT_EQUAL(attr->queue, ev->queue_id,
+                       "queue mismatch enq=%d deq =%d",
+                       attr->queue, ev->queue_id);
+       return 0;
+}
+
+typedef int (*validate_event_cb)(uint32_t index, uint8_t port,
+                                struct rte_event *ev);
+
+static inline int
+consume_events(uint8_t port, const uint32_t total_events, validate_event_cb fn)
+{
+       int ret;
+       uint16_t valid_event;
+       uint32_t events = 0, forward_progress_cnt = 0, index = 0;
+       struct rte_event ev;
+
+       while (1) {
+               if (++forward_progress_cnt > UINT16_MAX) {
+                       printf("Detected deadlock\n");
+                       return TEST_FAILED;
+               }
+
+               valid_event = rte_event_dequeue_burst(evdev, port, &ev, 1, 0);
+               if (!valid_event)
+                       continue;
+
+               forward_progress_cnt = 0;
+               ret = validate_event(&ev);
+               if (ret)
+                       return TEST_FAILED;
+
+               if (fn != NULL) {
+                       ret = fn(index, port, &ev);
+                       TEST_ASSERT_SUCCESS(ret,
+                               "Failed to validate test specific event");
+               }
+
+               ++index;
+
+               rte_pktmbuf_free(ev.mbuf);
+               if (++events >= total_events)
+                       break;
+       }
+
+       return check_excess_events(port);
+}
+
 static struct unit_test_suite eventdev_octeontx_testsuite  = {
        .suite_name = "eventdev octeontx unit test suite",
        .setup = testsuite_setup,
-- 
2.5.5

Reply via email to