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