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