xref: /f-stack/dpdk/app/test/test_latencystats.c (revision 2d9fd380)
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