xref: /dpdk/app/test/test_latencystats.c (revision d83fb967212efa19d272e7fa65d17c9ad94b17c1)
1a9de470cSBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
2a9de470cSBruce Richardson  * Copyright(c) 2018 Intel Corporation
3a9de470cSBruce Richardson  */
4a9de470cSBruce Richardson 
5a9de470cSBruce Richardson #include <stdio.h>
6a9de470cSBruce Richardson #include <stdint.h>
7a9de470cSBruce Richardson #include <string.h>
8a9de470cSBruce Richardson 
9b66412f2SKonstantin Ananyev #include <rte_ethdev.h>
10a9de470cSBruce Richardson #include <rte_latencystats.h>
11a9de470cSBruce Richardson #include "rte_lcore.h"
12a9de470cSBruce Richardson #include "rte_metrics.h"
13a9de470cSBruce Richardson 
14a9de470cSBruce Richardson #include "sample_packet_forward.h"
15a9de470cSBruce Richardson #include "test.h"
16a9de470cSBruce Richardson 
17a9de470cSBruce Richardson #define NUM_STATS 4
18a9de470cSBruce Richardson #define LATENCY_NUM_PACKETS 10
19a9de470cSBruce Richardson #define QUEUE_ID 0
20a9de470cSBruce Richardson 
21d1705276SFerruh Yigit static uint16_t portid;
22d1705276SFerruh Yigit static struct rte_ring *ring;
23a9de470cSBruce Richardson 
24d1705276SFerruh Yigit static struct rte_metric_name lat_stats_strings[] = {
25a9de470cSBruce Richardson 	{"min_latency_ns"},
26a9de470cSBruce Richardson 	{"avg_latency_ns"},
27a9de470cSBruce Richardson 	{"max_latency_ns"},
28a9de470cSBruce Richardson 	{"jitter_ns"},
29a9de470cSBruce Richardson };
30a9de470cSBruce Richardson 
31a9de470cSBruce Richardson /* Test case for latency init with metrics init */
test_latency_init(void)32a9de470cSBruce Richardson static int test_latency_init(void)
33a9de470cSBruce Richardson {
34a9de470cSBruce Richardson 	int ret = 0;
35a9de470cSBruce Richardson 
36a9de470cSBruce Richardson 	/* Metrics Initialization */
37a9de470cSBruce Richardson 	rte_metrics_init(rte_socket_id());
38a9de470cSBruce Richardson 
39a9de470cSBruce Richardson 	ret = rte_latencystats_init(1, NULL);
40a9de470cSBruce Richardson 	TEST_ASSERT(ret >= 0, "Test Failed: rte_latencystats_init failed");
41a9de470cSBruce Richardson 
42a9de470cSBruce Richardson 	return TEST_SUCCESS;
43a9de470cSBruce Richardson }
44a9de470cSBruce Richardson 
45a9de470cSBruce Richardson /* Test case to update the latency stats */
test_latency_update(void)46a9de470cSBruce Richardson static int test_latency_update(void)
47a9de470cSBruce Richardson {
48a9de470cSBruce Richardson 	int ret = 0;
49a9de470cSBruce Richardson 
50a9de470cSBruce Richardson 	ret = rte_latencystats_update();
51a9de470cSBruce Richardson 	TEST_ASSERT(ret >= 0, "Test Failed: rte_latencystats_update failed");
52a9de470cSBruce Richardson 
53a9de470cSBruce Richardson 	return TEST_SUCCESS;
54a9de470cSBruce Richardson }
55a9de470cSBruce Richardson 
56a9de470cSBruce Richardson /* Test case to uninit latency stats */
test_latency_uninit(void)57a9de470cSBruce Richardson static int test_latency_uninit(void)
58a9de470cSBruce Richardson {
59a9de470cSBruce Richardson 	int ret = 0;
60a9de470cSBruce Richardson 
61a9de470cSBruce Richardson 	ret = rte_latencystats_uninit();
62a9de470cSBruce Richardson 	TEST_ASSERT(ret >= 0, "Test Failed: rte_latencystats_uninit failed");
63a9de470cSBruce Richardson 
64d3f7095bSHemant Agrawal 	ret = rte_metrics_deinit();
65d3f7095bSHemant Agrawal 	TEST_ASSERT(ret >= 0, "Test Failed: rte_metrics_deinit failed");
66d3f7095bSHemant Agrawal 
67a9de470cSBruce Richardson 	return TEST_SUCCESS;
68a9de470cSBruce Richardson }
69a9de470cSBruce Richardson 
70a9de470cSBruce Richardson /* Test case to get names of latency stats */
test_latencystats_get_names(void)71a9de470cSBruce Richardson static int test_latencystats_get_names(void)
72a9de470cSBruce Richardson {
73a9de470cSBruce Richardson 	int ret = 0, i = 0;
74a9de470cSBruce Richardson 	int size = 0;
75a9de470cSBruce Richardson 	struct rte_metric_name names[NUM_STATS];
76a9de470cSBruce Richardson 
77a9de470cSBruce Richardson 	size_t m_size = sizeof(struct rte_metric_name);
78a9de470cSBruce Richardson 	for (i = 0; i < NUM_STATS; i++)
79a9de470cSBruce Richardson 		memset(&names[i], 0, m_size);
80a9de470cSBruce Richardson 
81a9de470cSBruce Richardson 	/* Success Test: Valid names and size */
82a9de470cSBruce Richardson 	size = NUM_STATS;
83a9de470cSBruce Richardson 	ret = rte_latencystats_get_names(names, size);
84cb3dd14cSDavid Marchand 	for (i = 0; i < NUM_STATS; i++) {
85a9de470cSBruce Richardson 		if (strcmp(lat_stats_strings[i].name, names[i].name) == 0)
86a9de470cSBruce Richardson 			printf(" %s\n", names[i].name);
87a9de470cSBruce Richardson 		else
88a9de470cSBruce Richardson 			printf("Failed: Names are not matched\n");
89a9de470cSBruce Richardson 	}
90a9de470cSBruce Richardson 	TEST_ASSERT((ret == NUM_STATS), "Test Failed to get metrics names");
91a9de470cSBruce Richardson 
92a9de470cSBruce Richardson 	/* Failure Test: Invalid names and valid size */
93a9de470cSBruce Richardson 	ret = rte_latencystats_get_names(NULL, size);
94a9de470cSBruce Richardson 	TEST_ASSERT((ret == NUM_STATS), "Test Failed to get the metrics count,"
95a9de470cSBruce Richardson 		    "Actual: %d Expected: %d", ret, NUM_STATS);
96a9de470cSBruce Richardson 
97a9de470cSBruce Richardson 	/* Failure Test: Valid names and invalid size */
98a9de470cSBruce Richardson 	size = 0;
99a9de470cSBruce Richardson 	ret = rte_latencystats_get_names(names, size);
100a9de470cSBruce Richardson 	TEST_ASSERT((ret == NUM_STATS), "Test Failed to get the metrics count,"
101a9de470cSBruce Richardson 		    "Actual: %d Expected: %d", ret, NUM_STATS);
102a9de470cSBruce Richardson 
103a9de470cSBruce Richardson 	return TEST_SUCCESS;
104a9de470cSBruce Richardson }
105a9de470cSBruce Richardson 
106a9de470cSBruce Richardson /* Test case to get latency stats values */
test_latencystats_get(void)107a9de470cSBruce Richardson static int test_latencystats_get(void)
108a9de470cSBruce Richardson {
109a9de470cSBruce Richardson 	int ret = 0, i = 0;
110a9de470cSBruce Richardson 	int size = 0;
111a9de470cSBruce Richardson 	struct rte_metric_value values[NUM_STATS];
112a9de470cSBruce Richardson 
113a9de470cSBruce Richardson 	size_t v_size = sizeof(struct rte_metric_value);
114a9de470cSBruce Richardson 	for (i = 0; i < NUM_STATS; i++)
115a9de470cSBruce Richardson 		memset(&values[i], 0, v_size);
116a9de470cSBruce Richardson 
117a9de470cSBruce Richardson 	/* Success Test: Valid values and valid size */
118a9de470cSBruce Richardson 	size = NUM_STATS;
119a9de470cSBruce Richardson 	ret = rte_latencystats_get(values, size);
120a9de470cSBruce Richardson 	TEST_ASSERT((ret == NUM_STATS), "Test Failed to get latency metrics"
121a9de470cSBruce Richardson 			" values");
122a9de470cSBruce Richardson 
123a9de470cSBruce Richardson 	/* Failure Test: Invalid values and valid size */
124a9de470cSBruce Richardson 	ret = rte_latencystats_get(NULL, size);
125a9de470cSBruce Richardson 	TEST_ASSERT((ret == NUM_STATS), "Test Failed to get the stats count,"
126a9de470cSBruce Richardson 		    "Actual: %d Expected: %d", ret, NUM_STATS);
127a9de470cSBruce Richardson 
128a9de470cSBruce Richardson 	/* Failure Test: Valid values and invalid size */
129a9de470cSBruce Richardson 	size = 0;
130a9de470cSBruce Richardson 	ret = rte_latencystats_get(values, size);
131a9de470cSBruce Richardson 	TEST_ASSERT((ret == NUM_STATS), "Test Failed to get the stats count,"
132a9de470cSBruce Richardson 		    "Actual: %d Expected: %d", ret, NUM_STATS);
133a9de470cSBruce Richardson 
134a9de470cSBruce Richardson 	return TEST_SUCCESS;
135a9de470cSBruce Richardson }
136a9de470cSBruce Richardson 
test_latency_ring_setup(void)137a9de470cSBruce Richardson static int test_latency_ring_setup(void)
138a9de470cSBruce Richardson {
139a9de470cSBruce Richardson 	test_ring_setup(&ring, &portid);
140a9de470cSBruce Richardson 
141a9de470cSBruce Richardson 	return TEST_SUCCESS;
142a9de470cSBruce Richardson }
143a9de470cSBruce Richardson 
test_latency_ring_free(void)144a9de470cSBruce Richardson static void test_latency_ring_free(void)
145a9de470cSBruce Richardson {
146a9de470cSBruce Richardson 	test_ring_free(ring);
147a9de470cSBruce Richardson 	test_vdev_uninit("net_ring_net_ringa");
148a9de470cSBruce Richardson }
149a9de470cSBruce Richardson 
test_latency_packet_forward(void)150a9de470cSBruce Richardson static int test_latency_packet_forward(void)
151a9de470cSBruce Richardson {
152a9de470cSBruce Richardson 	int ret;
153a9de470cSBruce Richardson 	struct rte_mbuf *pbuf[LATENCY_NUM_PACKETS] = { };
154a9de470cSBruce Richardson 	struct rte_mempool *mp;
155a9de470cSBruce Richardson 	char poolname[] = "mbuf_pool";
156a9de470cSBruce Richardson 
157a9de470cSBruce Richardson 	ret = test_get_mbuf_from_pool(&mp, pbuf, poolname);
158a9de470cSBruce Richardson 	if (ret < 0) {
159a9de470cSBruce Richardson 		printf("allocate mbuf pool Failed\n");
160a9de470cSBruce Richardson 		return TEST_FAILED;
161a9de470cSBruce Richardson 	}
162b66412f2SKonstantin Ananyev 	ret = test_dev_start(portid, mp);
163b66412f2SKonstantin Ananyev 	if (ret < 0) {
164b66412f2SKonstantin Ananyev 		printf("test_dev_start(%hu, %p) failed, error code: %d\n",
165b66412f2SKonstantin Ananyev 			portid, mp, ret);
166b66412f2SKonstantin Ananyev 		return TEST_FAILED;
167b66412f2SKonstantin Ananyev 	}
168b66412f2SKonstantin Ananyev 
169a9de470cSBruce Richardson 	ret = test_packet_forward(pbuf, portid, QUEUE_ID);
170a9de470cSBruce Richardson 	if (ret < 0)
171a9de470cSBruce Richardson 		printf("send pkts Failed\n");
172b66412f2SKonstantin Ananyev 
173b66412f2SKonstantin Ananyev 	rte_eth_dev_stop(portid);
174a9de470cSBruce Richardson 	test_put_mbuf_to_pool(mp, pbuf);
175a9de470cSBruce Richardson 
176b66412f2SKonstantin Ananyev 	return (ret >= 0) ? TEST_SUCCESS : TEST_FAILED;
177a9de470cSBruce Richardson }
178a9de470cSBruce Richardson 
179a9de470cSBruce Richardson static struct
180a9de470cSBruce Richardson unit_test_suite latencystats_testsuite = {
181a9de470cSBruce Richardson 	.suite_name = "Latency Stats Unit Test Suite",
182a9de470cSBruce Richardson 	.setup = test_latency_ring_setup,
183a9de470cSBruce Richardson 	.teardown = test_latency_ring_free,
184a9de470cSBruce Richardson 	.unit_test_cases = {
185a9de470cSBruce Richardson 
186a9de470cSBruce Richardson 		/* Test Case 1: To check latency init with
187a9de470cSBruce Richardson 		 * metrics init
188a9de470cSBruce Richardson 		 */
189a9de470cSBruce Richardson 		TEST_CASE_ST(NULL, NULL, test_latency_init),
190a9de470cSBruce Richardson 
191a9de470cSBruce Richardson 		/* Test Case 2: Do packet forwarding for metrics
192a9de470cSBruce Richardson 		 * calculation and check the latency metrics values
193a9de470cSBruce Richardson 		 * are updated
194a9de470cSBruce Richardson 		 */
195a9de470cSBruce Richardson 		TEST_CASE_ST(test_latency_packet_forward, NULL,
196a9de470cSBruce Richardson 				test_latency_update),
197a9de470cSBruce Richardson 		/* Test Case 3: To check whether latency stats names
198a9de470cSBruce Richardson 		 * are retrieved
199a9de470cSBruce Richardson 		 */
200a9de470cSBruce Richardson 		TEST_CASE_ST(NULL, NULL, test_latencystats_get_names),
201a9de470cSBruce Richardson 
202a9de470cSBruce Richardson 		/* Test Case 4: To check whether latency stats
203a9de470cSBruce Richardson 		 * values are retrieved
204a9de470cSBruce Richardson 		 */
205a9de470cSBruce Richardson 		TEST_CASE_ST(NULL, NULL, test_latencystats_get),
206a9de470cSBruce Richardson 
207a9de470cSBruce Richardson 		/* Test Case 5: To check uninit of latency test */
208a9de470cSBruce Richardson 		TEST_CASE_ST(NULL, NULL, test_latency_uninit),
209a9de470cSBruce Richardson 
210a9de470cSBruce Richardson 		TEST_CASES_END()
211a9de470cSBruce Richardson 	}
212a9de470cSBruce Richardson };
213a9de470cSBruce Richardson 
test_latencystats(void)214a9de470cSBruce Richardson static int test_latencystats(void)
215a9de470cSBruce Richardson {
216a9de470cSBruce Richardson 	return unit_test_suite_runner(&latencystats_testsuite);
217a9de470cSBruce Richardson }
218a9de470cSBruce Richardson 
219*d83fb967SDavid Marchand REGISTER_FAST_TEST(latencystats_autotest, true, true, test_latencystats);
220