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 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 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 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 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 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 */ 108*8ada5b15SPavan 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 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 otherthan 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 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, 169*8ada5b15SPavan 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 */ 173*8ada5b15SPavan 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 */ 177*8ada5b15SPavan 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, 182*8ada5b15SPavan 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 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 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 324a9de470cSBruce Richardson test_metrics(void) 325a9de470cSBruce Richardson { 326a9de470cSBruce Richardson return unit_test_suite_runner(&metrics_testsuite); 327a9de470cSBruce Richardson } 328a9de470cSBruce Richardson 329a9de470cSBruce Richardson REGISTER_TEST_COMMAND(metrics_autotest, test_metrics); 330