14418919fSjohnjiang /* SPDX-License-Identifier: BSD-3-Clause
24418919fSjohnjiang * Copyright(c) 2018 Intel Corporation
34418919fSjohnjiang */
44418919fSjohnjiang
54418919fSjohnjiang #include <stdio.h>
64418919fSjohnjiang #include <stdint.h>
74418919fSjohnjiang #include <string.h>
84418919fSjohnjiang
94418919fSjohnjiang #include <rte_latencystats.h>
104418919fSjohnjiang #include "rte_lcore.h"
114418919fSjohnjiang #include "rte_metrics.h"
124418919fSjohnjiang
134418919fSjohnjiang #include "sample_packet_forward.h"
144418919fSjohnjiang #include "test.h"
154418919fSjohnjiang
164418919fSjohnjiang #define NUM_STATS 4
174418919fSjohnjiang #define LATENCY_NUM_PACKETS 10
184418919fSjohnjiang #define QUEUE_ID 0
194418919fSjohnjiang
204418919fSjohnjiang static uint16_t portid;
214418919fSjohnjiang static struct rte_ring *ring;
224418919fSjohnjiang
234418919fSjohnjiang static struct rte_metric_name lat_stats_strings[] = {
244418919fSjohnjiang {"min_latency_ns"},
254418919fSjohnjiang {"avg_latency_ns"},
264418919fSjohnjiang {"max_latency_ns"},
274418919fSjohnjiang {"jitter_ns"},
284418919fSjohnjiang };
294418919fSjohnjiang
304418919fSjohnjiang /* Test case for latency init with metrics init */
test_latency_init(void)314418919fSjohnjiang static int test_latency_init(void)
324418919fSjohnjiang {
334418919fSjohnjiang int ret = 0;
344418919fSjohnjiang
354418919fSjohnjiang /* Metrics Initialization */
364418919fSjohnjiang rte_metrics_init(rte_socket_id());
374418919fSjohnjiang
384418919fSjohnjiang ret = rte_latencystats_init(1, NULL);
394418919fSjohnjiang TEST_ASSERT(ret >= 0, "Test Failed: rte_latencystats_init failed");
404418919fSjohnjiang
414418919fSjohnjiang return TEST_SUCCESS;
424418919fSjohnjiang }
434418919fSjohnjiang
444418919fSjohnjiang /* Test case to update the latency stats */
test_latency_update(void)454418919fSjohnjiang static int test_latency_update(void)
464418919fSjohnjiang {
474418919fSjohnjiang int ret = 0;
484418919fSjohnjiang
494418919fSjohnjiang ret = rte_latencystats_update();
504418919fSjohnjiang TEST_ASSERT(ret >= 0, "Test Failed: rte_latencystats_update failed");
514418919fSjohnjiang
524418919fSjohnjiang return TEST_SUCCESS;
534418919fSjohnjiang }
544418919fSjohnjiang
554418919fSjohnjiang /* Test case to uninit latency stats */
test_latency_uninit(void)564418919fSjohnjiang static int test_latency_uninit(void)
574418919fSjohnjiang {
584418919fSjohnjiang int ret = 0;
594418919fSjohnjiang
604418919fSjohnjiang ret = rte_latencystats_uninit();
614418919fSjohnjiang TEST_ASSERT(ret >= 0, "Test Failed: rte_latencystats_uninit failed");
624418919fSjohnjiang
63*2d9fd380Sjfb8856606 ret = rte_metrics_deinit();
64*2d9fd380Sjfb8856606 TEST_ASSERT(ret >= 0, "Test Failed: rte_metrics_deinit failed");
65*2d9fd380Sjfb8856606
664418919fSjohnjiang return TEST_SUCCESS;
674418919fSjohnjiang }
684418919fSjohnjiang
694418919fSjohnjiang /* Test case to get names of latency stats */
test_latencystats_get_names(void)704418919fSjohnjiang static int test_latencystats_get_names(void)
714418919fSjohnjiang {
724418919fSjohnjiang int ret = 0, i = 0;
734418919fSjohnjiang int size = 0;
744418919fSjohnjiang struct rte_metric_name names[NUM_STATS];
754418919fSjohnjiang
764418919fSjohnjiang size_t m_size = sizeof(struct rte_metric_name);
774418919fSjohnjiang for (i = 0; i < NUM_STATS; i++)
784418919fSjohnjiang memset(&names[i], 0, m_size);
794418919fSjohnjiang
804418919fSjohnjiang /* Success Test: Valid names and size */
814418919fSjohnjiang size = NUM_STATS;
824418919fSjohnjiang ret = rte_latencystats_get_names(names, size);
834418919fSjohnjiang for (i = 0; i <= NUM_STATS; i++) {
844418919fSjohnjiang if (strcmp(lat_stats_strings[i].name, names[i].name) == 0)
854418919fSjohnjiang printf(" %s\n", names[i].name);
864418919fSjohnjiang else
874418919fSjohnjiang printf("Failed: Names are not matched\n");
884418919fSjohnjiang }
894418919fSjohnjiang TEST_ASSERT((ret == NUM_STATS), "Test Failed to get metrics names");
904418919fSjohnjiang
914418919fSjohnjiang /* Failure Test: Invalid names and valid size */
924418919fSjohnjiang ret = rte_latencystats_get_names(NULL, size);
934418919fSjohnjiang TEST_ASSERT((ret == NUM_STATS), "Test Failed to get the metrics count,"
944418919fSjohnjiang "Actual: %d Expected: %d", ret, NUM_STATS);
954418919fSjohnjiang
964418919fSjohnjiang /* Failure Test: Valid names and invalid size */
974418919fSjohnjiang size = 0;
984418919fSjohnjiang ret = rte_latencystats_get_names(names, size);
994418919fSjohnjiang TEST_ASSERT((ret == NUM_STATS), "Test Failed to get the metrics count,"
1004418919fSjohnjiang "Actual: %d Expected: %d", ret, NUM_STATS);
1014418919fSjohnjiang
1024418919fSjohnjiang return TEST_SUCCESS;
1034418919fSjohnjiang }
1044418919fSjohnjiang
1054418919fSjohnjiang /* Test case to get latency stats values */
test_latencystats_get(void)1064418919fSjohnjiang static int test_latencystats_get(void)
1074418919fSjohnjiang {
1084418919fSjohnjiang int ret = 0, i = 0;
1094418919fSjohnjiang int size = 0;
1104418919fSjohnjiang struct rte_metric_value values[NUM_STATS];
1114418919fSjohnjiang
1124418919fSjohnjiang size_t v_size = sizeof(struct rte_metric_value);
1134418919fSjohnjiang for (i = 0; i < NUM_STATS; i++)
1144418919fSjohnjiang memset(&values[i], 0, v_size);
1154418919fSjohnjiang
1164418919fSjohnjiang /* Success Test: Valid values and valid size */
1174418919fSjohnjiang size = NUM_STATS;
1184418919fSjohnjiang ret = rte_latencystats_get(values, size);
1194418919fSjohnjiang TEST_ASSERT((ret == NUM_STATS), "Test Failed to get latency metrics"
1204418919fSjohnjiang " values");
1214418919fSjohnjiang
1224418919fSjohnjiang /* Failure Test: Invalid values and valid size */
1234418919fSjohnjiang ret = rte_latencystats_get(NULL, size);
1244418919fSjohnjiang TEST_ASSERT((ret == NUM_STATS), "Test Failed to get the stats count,"
1254418919fSjohnjiang "Actual: %d Expected: %d", ret, NUM_STATS);
1264418919fSjohnjiang
1274418919fSjohnjiang /* Failure Test: Valid values and invalid size */
1284418919fSjohnjiang size = 0;
1294418919fSjohnjiang ret = rte_latencystats_get(values, size);
1304418919fSjohnjiang TEST_ASSERT((ret == NUM_STATS), "Test Failed to get the stats count,"
1314418919fSjohnjiang "Actual: %d Expected: %d", ret, NUM_STATS);
1324418919fSjohnjiang
1334418919fSjohnjiang return TEST_SUCCESS;
1344418919fSjohnjiang }
1354418919fSjohnjiang
test_latency_ring_setup(void)1364418919fSjohnjiang static int test_latency_ring_setup(void)
1374418919fSjohnjiang {
1384418919fSjohnjiang test_ring_setup(&ring, &portid);
1394418919fSjohnjiang
1404418919fSjohnjiang return TEST_SUCCESS;
1414418919fSjohnjiang }
1424418919fSjohnjiang
test_latency_ring_free(void)1434418919fSjohnjiang static void test_latency_ring_free(void)
1444418919fSjohnjiang {
1454418919fSjohnjiang test_ring_free(ring);
1464418919fSjohnjiang test_vdev_uninit("net_ring_net_ringa");
1474418919fSjohnjiang }
1484418919fSjohnjiang
test_latency_packet_forward(void)1494418919fSjohnjiang static int test_latency_packet_forward(void)
1504418919fSjohnjiang {
1514418919fSjohnjiang int ret;
1524418919fSjohnjiang struct rte_mbuf *pbuf[LATENCY_NUM_PACKETS] = { };
1534418919fSjohnjiang struct rte_mempool *mp;
1544418919fSjohnjiang char poolname[] = "mbuf_pool";
1554418919fSjohnjiang
1564418919fSjohnjiang ret = test_get_mbuf_from_pool(&mp, pbuf, poolname);
1574418919fSjohnjiang if (ret < 0) {
1584418919fSjohnjiang printf("allocate mbuf pool Failed\n");
1594418919fSjohnjiang return TEST_FAILED;
1604418919fSjohnjiang }
1614418919fSjohnjiang ret = test_packet_forward(pbuf, portid, QUEUE_ID);
1624418919fSjohnjiang if (ret < 0)
1634418919fSjohnjiang printf("send pkts Failed\n");
1644418919fSjohnjiang test_put_mbuf_to_pool(mp, pbuf);
1654418919fSjohnjiang
1664418919fSjohnjiang return TEST_SUCCESS;
1674418919fSjohnjiang }
1684418919fSjohnjiang
1694418919fSjohnjiang static struct
1704418919fSjohnjiang unit_test_suite latencystats_testsuite = {
1714418919fSjohnjiang .suite_name = "Latency Stats Unit Test Suite",
1724418919fSjohnjiang .setup = test_latency_ring_setup,
1734418919fSjohnjiang .teardown = test_latency_ring_free,
1744418919fSjohnjiang .unit_test_cases = {
1754418919fSjohnjiang
1764418919fSjohnjiang /* Test Case 1: To check latency init with
1774418919fSjohnjiang * metrics init
1784418919fSjohnjiang */
1794418919fSjohnjiang TEST_CASE_ST(NULL, NULL, test_latency_init),
1804418919fSjohnjiang
1814418919fSjohnjiang /* Test Case 2: Do packet forwarding for metrics
1824418919fSjohnjiang * calculation and check the latency metrics values
1834418919fSjohnjiang * are updated
1844418919fSjohnjiang */
1854418919fSjohnjiang TEST_CASE_ST(test_latency_packet_forward, NULL,
1864418919fSjohnjiang test_latency_update),
1874418919fSjohnjiang /* Test Case 3: To check whether latency stats names
1884418919fSjohnjiang * are retrieved
1894418919fSjohnjiang */
1904418919fSjohnjiang TEST_CASE_ST(NULL, NULL, test_latencystats_get_names),
1914418919fSjohnjiang
1924418919fSjohnjiang /* Test Case 4: To check whether latency stats
1934418919fSjohnjiang * values are retrieved
1944418919fSjohnjiang */
1954418919fSjohnjiang TEST_CASE_ST(NULL, NULL, test_latencystats_get),
1964418919fSjohnjiang
1974418919fSjohnjiang /* Test Case 5: To check uninit of latency test */
1984418919fSjohnjiang TEST_CASE_ST(NULL, NULL, test_latency_uninit),
1994418919fSjohnjiang
2004418919fSjohnjiang TEST_CASES_END()
2014418919fSjohnjiang }
2024418919fSjohnjiang };
2034418919fSjohnjiang
test_latencystats(void)2044418919fSjohnjiang static int test_latencystats(void)
2054418919fSjohnjiang {
2064418919fSjohnjiang return unit_test_suite_runner(&latencystats_testsuite);
2074418919fSjohnjiang }
2084418919fSjohnjiang
2094418919fSjohnjiang REGISTER_TEST_COMMAND(latencystats_autotest, test_latencystats);
210