xref: /dpdk/app/test/test_metrics.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 <string.h>
7a9de470cSBruce Richardson #include <stdint.h>
8a9de470cSBruce Richardson #include <errno.h>
9a9de470cSBruce Richardson 
10a9de470cSBruce Richardson #include <rte_lcore.h>
11a9de470cSBruce Richardson #include <rte_metrics.h>
12a9de470cSBruce Richardson 
13a9de470cSBruce Richardson #include "test.h"
14a9de470cSBruce Richardson 
15a9de470cSBruce Richardson #define	REG_METRIC_COUNT	6
16a9de470cSBruce Richardson #define	METRIC_LESSER_COUNT	3
17a9de470cSBruce Richardson #define	KEY	1
18a9de470cSBruce Richardson #define	VALUE	1
19a9de470cSBruce Richardson 
20a9de470cSBruce Richardson /* Initializes metric module. This function must be called
21a9de470cSBruce Richardson  * from a primary process before metrics are used
22a9de470cSBruce Richardson  */
23a9de470cSBruce Richardson static int
test_metrics_init(void)24a9de470cSBruce Richardson test_metrics_init(void)
25a9de470cSBruce Richardson {
26a9de470cSBruce Richardson 	rte_metrics_init(rte_socket_id());
27a9de470cSBruce Richardson 	return TEST_SUCCESS;
28a9de470cSBruce Richardson }
29a9de470cSBruce Richardson 
309d10f53eSHarman Kalra /* Deinitialize metric module. This function must be called
319d10f53eSHarman Kalra  * from a primary process after metrics usage is over
329d10f53eSHarman Kalra  */
339d10f53eSHarman Kalra static int
test_metrics_deinitialize(void)349d10f53eSHarman Kalra test_metrics_deinitialize(void)
359d10f53eSHarman Kalra {
369d10f53eSHarman Kalra 	int err = 0;
379d10f53eSHarman Kalra 	err = rte_metrics_deinit();
389d10f53eSHarman Kalra 	TEST_ASSERT(err == 0, "%s, %d", __func__, __LINE__);
399d10f53eSHarman Kalra 
409d10f53eSHarman Kalra 	return TEST_SUCCESS;
419d10f53eSHarman Kalra }
429d10f53eSHarman Kalra 
43a9de470cSBruce Richardson  /* Test Case to check failures when memzone init is not done */
44a9de470cSBruce Richardson static int
test_metrics_without_init(void)45a9de470cSBruce Richardson test_metrics_without_init(void)
46a9de470cSBruce Richardson {
47a9de470cSBruce Richardson 	int err = 0;
48a9de470cSBruce Richardson 	const uint64_t  value[REG_METRIC_COUNT] = {0};
49a9de470cSBruce Richardson 	const char * const mnames[] = {
50a9de470cSBruce Richardson 		"mean_bits_in", "mean_bits_out",
51a9de470cSBruce Richardson 		"peak_bits_in", "peak_bits_out",
52a9de470cSBruce Richardson 	};
53a9de470cSBruce Richardson 
54a9de470cSBruce Richardson 	/* Failure Test: Checking for memzone initialization */
55a9de470cSBruce Richardson 	err = rte_metrics_reg_name("peak_bits_in");
56a9de470cSBruce Richardson 	TEST_ASSERT(err == -EIO, "%s, %d", __func__, __LINE__);
57a9de470cSBruce Richardson 
58a9de470cSBruce Richardson 	err = rte_metrics_reg_names(&mnames[0], 1);
59a9de470cSBruce Richardson 	TEST_ASSERT(err == -EIO, "%s, %d", __func__, __LINE__);
60a9de470cSBruce Richardson 
61a9de470cSBruce Richardson 	err = rte_metrics_update_value(RTE_METRICS_GLOBAL, KEY, VALUE);
62a9de470cSBruce Richardson 	TEST_ASSERT(err == -EIO, "%s, %d", __func__, __LINE__);
63a9de470cSBruce Richardson 
64a9de470cSBruce Richardson 	err = rte_metrics_update_values(RTE_METRICS_GLOBAL, KEY, &value[0], 4);
65a9de470cSBruce Richardson 	TEST_ASSERT(err == -EIO, "%s, %d", __func__, __LINE__);
66a9de470cSBruce Richardson 
67a9de470cSBruce Richardson 	err = rte_metrics_get_names(NULL, 0);
68a9de470cSBruce Richardson 	TEST_ASSERT(err == -EIO, "%s, %d", __func__, __LINE__);
69a9de470cSBruce Richardson 
70a9de470cSBruce Richardson 	err = rte_metrics_get_values(RTE_METRICS_GLOBAL, NULL, 0);
71a9de470cSBruce Richardson 	TEST_ASSERT(err == -EIO, "%s, %d", __func__, __LINE__);
72a9de470cSBruce Richardson 
73a9de470cSBruce Richardson 	return TEST_SUCCESS;
74a9de470cSBruce Richardson }
75a9de470cSBruce Richardson 
76a9de470cSBruce Richardson /* Test Case to validate registering a single metric */
77a9de470cSBruce Richardson static int
test_metrics_reg_name_with_validname(void)78a9de470cSBruce Richardson test_metrics_reg_name_with_validname(void)
79a9de470cSBruce Richardson {
80a9de470cSBruce Richardson 	int err = 0;
81a9de470cSBruce Richardson 
82a9de470cSBruce Richardson 	/* Test to register the new metric name */
83a9de470cSBruce Richardson 	err = rte_metrics_reg_name("peak_bits_out");
84a9de470cSBruce Richardson 	TEST_ASSERT(err >= 0, "%s, %d", __func__, __LINE__);
85a9de470cSBruce Richardson 
86a9de470cSBruce Richardson 	/* Test to register the same metric name */
87a9de470cSBruce Richardson 	err = rte_metrics_reg_name("peak_bits_out");
88a9de470cSBruce Richardson 	TEST_ASSERT(err >= 0, "%s, %d", __func__, __LINE__);
89a9de470cSBruce Richardson 
90a9de470cSBruce Richardson 	/* Test case to validate registering a invalid metric */
91a9de470cSBruce Richardson 	err = rte_metrics_reg_name(NULL);
92a9de470cSBruce Richardson 	TEST_ASSERT(err == -EINVAL, "%s, %d", __func__, __LINE__);
93a9de470cSBruce Richardson 
94a9de470cSBruce Richardson 	return TEST_SUCCESS;
95a9de470cSBruce Richardson }
96a9de470cSBruce Richardson 
97a9de470cSBruce Richardson /* Test case to validate registering a list of valid  metric names */
98a9de470cSBruce Richardson static int
test_metrics_reg_names(void)99a9de470cSBruce Richardson test_metrics_reg_names(void)
100a9de470cSBruce Richardson {
101a9de470cSBruce Richardson 	int err = 0;
102a9de470cSBruce Richardson 	const char * const mnames[] = {
103a9de470cSBruce Richardson 		"mean_bits_in", "mean_bits_out",
104a9de470cSBruce Richardson 		"peak_bits_in", "peak_bits_out",
105a9de470cSBruce Richardson 		};
106a9de470cSBruce Richardson 
107a9de470cSBruce Richardson 	/* Success Test: valid array and count size */
1088ada5b15SPavan Nikhilesh 	err = rte_metrics_reg_names(&mnames[0], RTE_DIM(mnames));
109a9de470cSBruce Richardson 	TEST_ASSERT(err >= 0, "%s, %d", __func__, __LINE__);
110a9de470cSBruce Richardson 
111a9de470cSBruce Richardson 	return TEST_SUCCESS;
112a9de470cSBruce Richardson }
113a9de470cSBruce Richardson 
114a9de470cSBruce Richardson /* Test case to validate update a metric */
115a9de470cSBruce Richardson static int
test_metrics_update_value(void)116a9de470cSBruce Richardson test_metrics_update_value(void)
117a9de470cSBruce Richardson {
118a9de470cSBruce Richardson 	int err = 0;
119a9de470cSBruce Richardson 
120a9de470cSBruce Richardson 	/* Successful Test: Valid port_id, key and value */
121a9de470cSBruce Richardson 	err = rte_metrics_update_value(RTE_METRICS_GLOBAL, KEY, VALUE);
122a9de470cSBruce Richardson 	TEST_ASSERT(err >= 0, "%s, %d", __func__, __LINE__);
123a9de470cSBruce Richardson 
124a9de470cSBruce Richardson 	/* Successful Test: Valid port_id other than RTE_METRICS_GLOBAL, key
125a9de470cSBruce Richardson 	 * and value
126a9de470cSBruce Richardson 	 */
127a9de470cSBruce Richardson 	err = rte_metrics_update_value(9, KEY, VALUE);
128a9de470cSBruce Richardson 	TEST_ASSERT(err >= 0, "%s, %d", __func__, __LINE__);
129a9de470cSBruce Richardson 
130a9de470cSBruce Richardson 	/* Failed Test: Invalid port_id with lower value */
131a9de470cSBruce Richardson 	err = rte_metrics_update_value(-2, KEY, VALUE);
132a9de470cSBruce Richardson 	TEST_ASSERT(err == -EINVAL, "%s, %d", __func__, __LINE__);
133a9de470cSBruce Richardson 
134a9de470cSBruce Richardson 	/* Failed Test: Invalid port_id with higher value */
135a9de470cSBruce Richardson 	err = rte_metrics_update_value(39, KEY, VALUE);
136a9de470cSBruce Richardson 	TEST_ASSERT(err == -EINVAL, "%s, %d", __func__, __LINE__);
137a9de470cSBruce Richardson 
138a9de470cSBruce Richardson 	/* Failed Test: valid port id, value with invalid key */
139a9de470cSBruce Richardson 	err = rte_metrics_update_value(RTE_METRICS_GLOBAL, KEY+12, VALUE);
140a9de470cSBruce Richardson 	TEST_ASSERT(err < 0, "%s, %d", __func__, __LINE__);
141a9de470cSBruce Richardson 
142a9de470cSBruce Richardson 	return TEST_SUCCESS;
143a9de470cSBruce Richardson }
144a9de470cSBruce Richardson 
145a9de470cSBruce Richardson /* Test case to validate update a list of  metrics  */
146a9de470cSBruce Richardson static int
test_metrics_update_values(void)147a9de470cSBruce Richardson test_metrics_update_values(void)
148a9de470cSBruce Richardson {
149a9de470cSBruce Richardson 	int err = 0;
150a9de470cSBruce Richardson 	const uint64_t  value[REG_METRIC_COUNT] = {1, 2, 3, 4, 5, 6};
151a9de470cSBruce Richardson 
152a9de470cSBruce Richardson 	/* Successful Test: update metrics with first set */
153a9de470cSBruce Richardson 	err = rte_metrics_update_values(RTE_METRICS_GLOBAL, 0,
154a9de470cSBruce Richardson 			&value[0], 1);
155a9de470cSBruce Richardson 	TEST_ASSERT(err >= 0, "%s, %d", __func__, __LINE__);
156a9de470cSBruce Richardson 
157a9de470cSBruce Richardson 	/* Successful Test: update metrics with second set */
158a9de470cSBruce Richardson 	err = rte_metrics_update_values(RTE_METRICS_GLOBAL, 1,
159a9de470cSBruce Richardson 			&value[1], 1);
160a9de470cSBruce Richardson 	TEST_ASSERT(err >= 0, "%s, %d", __func__, __LINE__);
161a9de470cSBruce Richardson 
162a9de470cSBruce Richardson 	/* Successful Test: update metrics with third set */
163a9de470cSBruce Richardson 	err = rte_metrics_update_values(RTE_METRICS_GLOBAL, 2,
164a9de470cSBruce Richardson 			&value[2], 4);
165a9de470cSBruce Richardson 	TEST_ASSERT(err >= 0, "%s, %d", __func__, __LINE__);
166a9de470cSBruce Richardson 
167a9de470cSBruce Richardson 	/* Failed Test: Invalid count size */
168a9de470cSBruce Richardson 	err = rte_metrics_update_values(RTE_METRICS_GLOBAL,
1698ada5b15SPavan Nikhilesh 			 KEY, &value[0], RTE_DIM(value));
170a9de470cSBruce Richardson 	TEST_ASSERT(err < 0, "%s, %d", __func__, __LINE__);
171a9de470cSBruce Richardson 
172a9de470cSBruce Richardson 	/* Failed Test: Invalid port_id(lower value) and valid data */
1738ada5b15SPavan Nikhilesh 	err = rte_metrics_update_values(-2, KEY, &value[0], RTE_DIM(value));
174a9de470cSBruce Richardson 	TEST_ASSERT(err == -EINVAL, "%s, %d", __func__, __LINE__);
175a9de470cSBruce Richardson 
176a9de470cSBruce Richardson 	/* Failed Test: Invalid port_id(higher value) and valid data */
1778ada5b15SPavan Nikhilesh 	err = rte_metrics_update_values(39, 1, &value[0], RTE_DIM(value));
178a9de470cSBruce Richardson 	TEST_ASSERT(err == -EINVAL, "%s, %d", __func__, __LINE__);
179a9de470cSBruce Richardson 
180a9de470cSBruce Richardson 	/* Failed Test: Invalid array */
181a9de470cSBruce Richardson 	err = rte_metrics_update_values(RTE_METRICS_GLOBAL,
1828ada5b15SPavan Nikhilesh 			 KEY, NULL, RTE_DIM(value));
183a9de470cSBruce Richardson 	TEST_ASSERT(err == -EINVAL, "%s, %d", __func__, __LINE__);
184a9de470cSBruce Richardson 
185a9de470cSBruce Richardson 	return TEST_SUCCESS;
186a9de470cSBruce Richardson }
187a9de470cSBruce Richardson 
188a9de470cSBruce Richardson /* Test to validate get metric name-key lookup table */
189a9de470cSBruce Richardson static int
test_metrics_get_names(void)190a9de470cSBruce Richardson test_metrics_get_names(void)
191a9de470cSBruce Richardson {
192a9de470cSBruce Richardson 	int err = 0;
193a9de470cSBruce Richardson 	struct rte_metric_name metrics[METRIC_LESSER_COUNT];
194a9de470cSBruce Richardson 	struct rte_metric_name success_metrics[REG_METRIC_COUNT];
195a9de470cSBruce Richardson 
196a9de470cSBruce Richardson 	/* Successful Test: Invalid array list */
197a9de470cSBruce Richardson 	err = rte_metrics_get_names(NULL, 0);
198a9de470cSBruce Richardson 	TEST_ASSERT(err >= 0, "%s, %d", __func__, __LINE__);
199a9de470cSBruce Richardson 
200a9de470cSBruce Richardson 	/* Successful Test: Valid array list, Correct Count Stats same
201a9de470cSBruce Richardson 	 * as memzone stats
202a9de470cSBruce Richardson 	 */
203a9de470cSBruce Richardson 	err = rte_metrics_get_names(success_metrics, REG_METRIC_COUNT);
204a9de470cSBruce Richardson 	TEST_ASSERT(err >= 0, "%s, %d", __func__, __LINE__);
205a9de470cSBruce Richardson 
206a9de470cSBruce Richardson 	/* Successful Test: Valid array list, Increase Count Stats than
207a9de470cSBruce Richardson 	 * memzone stats
208a9de470cSBruce Richardson 	 */
209a9de470cSBruce Richardson 	err = rte_metrics_get_names(success_metrics, REG_METRIC_COUNT+5);
210a9de470cSBruce Richardson 	TEST_ASSERT(err >= 0, "%s, %d", __func__, __LINE__);
211a9de470cSBruce Richardson 
212a9de470cSBruce Richardson 	/* Successful Test, Not update results:
213a9de470cSBruce Richardson 	 * Invalid array list, Lesser Count Stats than allocated stats
214a9de470cSBruce Richardson 	 */
215a9de470cSBruce Richardson 	err = rte_metrics_get_names(metrics, METRIC_LESSER_COUNT);
216a9de470cSBruce Richardson 	TEST_ASSERT(err >= 0, "%s, %d", __func__, __LINE__);
217a9de470cSBruce Richardson 
218a9de470cSBruce Richardson 	return TEST_SUCCESS;
219a9de470cSBruce Richardson }
220a9de470cSBruce Richardson 
221a9de470cSBruce Richardson /* Test to validate get list of metric values  */
222a9de470cSBruce Richardson static int
test_metrics_get_values(void)223a9de470cSBruce Richardson test_metrics_get_values(void)
224a9de470cSBruce Richardson {
225a9de470cSBruce Richardson 	int i = 0;
226a9de470cSBruce Richardson 	int err = 0;
227a9de470cSBruce Richardson 	struct rte_metric_value getvalues[REG_METRIC_COUNT];
228a9de470cSBruce Richardson 
229a9de470cSBruce Richardson 	size_t m_size = sizeof(struct rte_metric_value);
230a9de470cSBruce Richardson 	for (i = 0; i < REG_METRIC_COUNT; i++)
231a9de470cSBruce Richardson 		memset(&getvalues[i], 0, m_size);
232a9de470cSBruce Richardson 
233a9de470cSBruce Richardson 	/* Successful Test, Not update results: valid arguments
234a9de470cSBruce Richardson 	 * count lessthan the memzone stats
235a9de470cSBruce Richardson 	 */
236a9de470cSBruce Richardson 	err = rte_metrics_get_values(RTE_METRICS_GLOBAL, getvalues,
237a9de470cSBruce Richardson 			 METRIC_LESSER_COUNT);
238a9de470cSBruce Richardson 	TEST_ASSERT(err >= 0, "%s, %d", __func__, __LINE__);
239a9de470cSBruce Richardson 
240a9de470cSBruce Richardson 	/* Successful Test, update results: valid arguments */
241a9de470cSBruce Richardson 	err = rte_metrics_get_values(RTE_METRICS_GLOBAL, getvalues,
242a9de470cSBruce Richardson 			 REG_METRIC_COUNT);
243a9de470cSBruce Richardson 	TEST_ASSERT(err >= 0, "%s, %d", __func__, __LINE__);
244a9de470cSBruce Richardson 
245a9de470cSBruce Richardson 	/* Successful Test : valid arguments count greaterthan the
246a9de470cSBruce Richardson 	 * memzone stats
247a9de470cSBruce Richardson 	 */
248a9de470cSBruce Richardson 	err = rte_metrics_get_values(RTE_METRICS_GLOBAL, getvalues,
249a9de470cSBruce Richardson 			REG_METRIC_COUNT+2);
250a9de470cSBruce Richardson 	TEST_ASSERT(err >= 0, "%s, %d", __func__, __LINE__);
251a9de470cSBruce Richardson 
252a9de470cSBruce Richardson 	/* Failure Test: Invalid port_id(lower value) with correct values
253a9de470cSBruce Richardson 	 * and  Capacity
254a9de470cSBruce Richardson 	 */
255a9de470cSBruce Richardson 	err = rte_metrics_get_values(-2, getvalues, REG_METRIC_COUNT);
256a9de470cSBruce Richardson 	TEST_ASSERT(err == -EINVAL, "%s, %d", __func__, __LINE__);
257a9de470cSBruce Richardson 
258a9de470cSBruce Richardson 	/* Failure Test: Invalid port_id(higher value) with correct values
259a9de470cSBruce Richardson 	 * and  Capacity
260a9de470cSBruce Richardson 	 */
261a9de470cSBruce Richardson 	err = rte_metrics_get_values(33, getvalues, REG_METRIC_COUNT);
262a9de470cSBruce Richardson 	TEST_ASSERT(err == -EINVAL, "%s, %d", __func__, __LINE__);
263a9de470cSBruce Richardson 
264a9de470cSBruce Richardson 	/* Successful Test: valid port_id with incorrect values and  valid
265a9de470cSBruce Richardson 	 * capacity
266a9de470cSBruce Richardson 	 */
267a9de470cSBruce Richardson 	err = rte_metrics_get_values(RTE_METRICS_GLOBAL, NULL,
268a9de470cSBruce Richardson 			 REG_METRIC_COUNT);
269a9de470cSBruce Richardson 	TEST_ASSERT(err >= 0, "%s, %d", __func__, __LINE__);
270a9de470cSBruce Richardson 
271a9de470cSBruce Richardson 	return TEST_SUCCESS;
272a9de470cSBruce Richardson }
273a9de470cSBruce Richardson 
274a9de470cSBruce Richardson static struct unit_test_suite metrics_testsuite  = {
275a9de470cSBruce Richardson 	.suite_name = "Metrics Unit Test Suite",
276a9de470cSBruce Richardson 	.setup = NULL,
277a9de470cSBruce Richardson 	.teardown = NULL,
278a9de470cSBruce Richardson 	.unit_test_cases = {
279a9de470cSBruce Richardson 		/* Test Case 1: Test to check all metric APIs without
280a9de470cSBruce Richardson 		 * metrics init
281a9de470cSBruce Richardson 		 */
282a9de470cSBruce Richardson 		TEST_CASE(test_metrics_without_init),
283a9de470cSBruce Richardson 
284a9de470cSBruce Richardson 		/* TEST CASE 2: Test to register valid metrics*/
285a9de470cSBruce Richardson 		TEST_CASE_ST(test_metrics_init, NULL,
286a9de470cSBruce Richardson 				test_metrics_reg_name_with_validname),
287a9de470cSBruce Richardson 
288a9de470cSBruce Richardson 		/* TEST CASE 3: Test to register list of metrics with valid
289a9de470cSBruce Richardson 		 * names and valid count size, invalid names and invalid
290a9de470cSBruce Richardson 		 * count size
291a9de470cSBruce Richardson 		 */
292a9de470cSBruce Richardson 		TEST_CASE(test_metrics_reg_names),
293a9de470cSBruce Richardson 
294a9de470cSBruce Richardson 		/* TEST CASE 4: Test to register a update value with valid port
295a9de470cSBruce Richardson 		 * id and invalid port id
296a9de470cSBruce Richardson 		 */
297a9de470cSBruce Richardson 		TEST_CASE(test_metrics_update_value),
298a9de470cSBruce Richardson 
299a9de470cSBruce Richardson 		/* TEST CASE 5: Test to register update list of values with
300a9de470cSBruce Richardson 		 * valid port id, key, value, count size and invalid port id,
301a9de470cSBruce Richardson 		 * key, value, count size
302a9de470cSBruce Richardson 		 */
303a9de470cSBruce Richardson 		TEST_CASE(test_metrics_update_values),
304a9de470cSBruce Richardson 
305a9de470cSBruce Richardson 		/* TEST CASE 6: Test to get metric names-key with valid
306a9de470cSBruce Richardson 		 * array list, count size and invalid array list, count size
307a9de470cSBruce Richardson 		 */
308a9de470cSBruce Richardson 		TEST_CASE(test_metrics_get_names),
309a9de470cSBruce Richardson 
310a9de470cSBruce Richardson 		/* TEST CASE 7: Test to get list of metric values with valid
311a9de470cSBruce Richardson 		 * port id, array list, count size and invalid port id,
312a9de470cSBruce Richardson 		 * arraylist, count size
313a9de470cSBruce Richardson 		 */
314a9de470cSBruce Richardson 		TEST_CASE(test_metrics_get_values),
3159d10f53eSHarman Kalra 
3169d10f53eSHarman Kalra 		/* TEST CASE 8: Test to unregister metrics*/
3179d10f53eSHarman Kalra 		TEST_CASE(test_metrics_deinitialize),
3189d10f53eSHarman Kalra 
319a9de470cSBruce Richardson 		TEST_CASES_END()
320a9de470cSBruce Richardson 	}
321a9de470cSBruce Richardson };
322a9de470cSBruce Richardson 
323a9de470cSBruce Richardson static int
test_metrics(void)324a9de470cSBruce Richardson test_metrics(void)
325a9de470cSBruce Richardson {
326a9de470cSBruce Richardson 	return unit_test_suite_runner(&metrics_testsuite);
327a9de470cSBruce Richardson }
328a9de470cSBruce Richardson 
329*d83fb967SDavid Marchand REGISTER_FAST_TEST(metrics_autotest, true, true, test_metrics);
330