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