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