test/metrics: add unit tests for metrics library
authorHari Kumar Vemula <hari.kumarx.vemula@intel.com>
Mon, 8 Oct 2018 13:01:27 +0000 (14:01 +0100)
committerThomas Monjalon <thomas@monjalon.net>
Mon, 29 Oct 2018 03:00:54 +0000 (04:00 +0100)
Unit testcases are added for metrics library
Added metrics unit test to autotest list
Updated meson build file
Updated MAINTAINERSHIP for metrics unit test

Signed-off-by: Hari Kumar Vemula <hari.kumarx.vemula@intel.com>
Reviewed-by: Reshma Pattan <reshma.pattan@intel.com>
Reviewed-by: Remy Horton <remy.horton@intel.com>
Acked-by: Remy Horton <remy.horton@intel.com>
MAINTAINERS
test/test/Makefile
test/test/autotest_data.py
test/test/meson.build
test/test/test_metrics.c [new file with mode: 0644]

index 8d0ca10..e60379d 100644 (file)
@@ -1192,6 +1192,7 @@ F: doc/guides/sample_app_ug/l2_forward_job_stats.rst
 Metrics
 M: Remy Horton <remy.horton@intel.com>
 F: lib/librte_metrics/
+F: test/test/test_metrics.c
 
 Bit-rate statistics
 M: Remy Horton <remy.horton@intel.com>
index 6b77e15..ab4fec3 100644 (file)
@@ -184,6 +184,8 @@ SRCS-$(CONFIG_RTE_LIBRTE_CRYPTODEV) += test_cryptodev_blockcipher.c
 SRCS-$(CONFIG_RTE_LIBRTE_CRYPTODEV) += test_cryptodev.c
 SRCS-$(CONFIG_RTE_LIBRTE_CRYPTODEV) += test_cryptodev_asym.c
 
+SRCS-$(CONFIG_RTE_LIBRTE_METRICS) += test_metrics.c
+
 ifeq ($(CONFIG_RTE_COMPRESSDEV_TEST),y)
 SRCS-$(CONFIG_RTE_LIBRTE_COMPRESSDEV) += test_compressdev.c
 endif
index e7df68f..0fb7866 100644 (file)
@@ -488,6 +488,12 @@ parallel_test_list = [
        "Func":    default_autotest,
        "Report":  None,
     },
+    {
+        "Name":    "Metrics autotest",
+        "Command": "metrics_autotest",
+        "Func":    default_autotest,
+        "Report":  None,
+    },
     #
     #Please always keep all dump tests at the end and together!
     #
index b707547..554e994 100644 (file)
@@ -68,6 +68,7 @@ test_sources = files('commands.c',
        'test_mempool_perf.c',
        'test_memzone.c',
        'test_meter.c',
+       'test_metrics.c',
        'test_mp_secondary.c',
        'test_per_lcore.c',
        'test_pmd_perf.c',
@@ -116,6 +117,7 @@ test_deps = ['acl',
        'hash',
        'lpm',
        'member',
+       'metrics',
        'pipeline',
        'port',
        'reorder',
@@ -197,6 +199,7 @@ test_names = [
        'mempool_perf_autotest',
        'memzone_autotest',
        'meter_autotest',
+       'metrics_autotest',
        'multiprocess_autotest',
        'per_lcore_autotest',
        'pmd_perf_autotest',
diff --git a/test/test/test_metrics.c b/test/test/test_metrics.c
new file mode 100644 (file)
index 0000000..94d54d7
--- /dev/null
@@ -0,0 +1,313 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018 Intel Corporation
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdint.h>
+#include <errno.h>
+
+#include <rte_lcore.h>
+#include <rte_metrics.h>
+
+#include "test.h"
+
+#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
+#define        REG_METRIC_COUNT        6
+#define        METRIC_LESSER_COUNT     3
+#define        KEY     1
+#define        VALUE   1
+
+/* Initializes metric module. This function must be called
+ * from a primary process before metrics are used
+ */
+static int
+test_metrics_init(void)
+{
+       rte_metrics_init(rte_socket_id());
+       return TEST_SUCCESS;
+}
+
+ /* Test Case to check failures when memzone init is not done */
+static int
+test_metrics_without_init(void)
+{
+       int err = 0;
+       const uint64_t  value[REG_METRIC_COUNT] = {0};
+       const char * const mnames[] = {
+               "mean_bits_in", "mean_bits_out",
+               "peak_bits_in", "peak_bits_out",
+       };
+
+       /* Failure Test: Checking for memzone initialization */
+       err = rte_metrics_reg_name("peak_bits_in");
+       TEST_ASSERT(err == -EIO, "%s, %d", __func__, __LINE__);
+
+       err = rte_metrics_reg_names(&mnames[0], 1);
+       TEST_ASSERT(err == -EIO, "%s, %d", __func__, __LINE__);
+
+       err = rte_metrics_update_value(RTE_METRICS_GLOBAL, KEY, VALUE);
+       TEST_ASSERT(err == -EIO, "%s, %d", __func__, __LINE__);
+
+       err = rte_metrics_update_values(RTE_METRICS_GLOBAL, KEY, &value[0], 4);
+       TEST_ASSERT(err == -EIO, "%s, %d", __func__, __LINE__);
+
+       err = rte_metrics_get_names(NULL, 0);
+       TEST_ASSERT(err == -EIO, "%s, %d", __func__, __LINE__);
+
+       err = rte_metrics_get_values(RTE_METRICS_GLOBAL, NULL, 0);
+       TEST_ASSERT(err == -EIO, "%s, %d", __func__, __LINE__);
+
+       return TEST_SUCCESS;
+}
+
+/* Test Case to validate registering a single metric */
+static int
+test_metrics_reg_name_with_validname(void)
+{
+       int err = 0;
+
+       /* Test to register the new metric name */
+       err = rte_metrics_reg_name("peak_bits_out");
+       TEST_ASSERT(err >= 0, "%s, %d", __func__, __LINE__);
+
+       /* Test to register the same metric name */
+       err = rte_metrics_reg_name("peak_bits_out");
+       TEST_ASSERT(err >= 0, "%s, %d", __func__, __LINE__);
+
+       /* Test case to validate registering a invalid metric */
+       err = rte_metrics_reg_name(NULL);
+       TEST_ASSERT(err == -EINVAL, "%s, %d", __func__, __LINE__);
+
+       return TEST_SUCCESS;
+}
+
+/* Test case to validate registering a list of valid  metric names */
+static int
+test_metrics_reg_names(void)
+{
+       int err = 0;
+       const char * const mnames[] = {
+               "mean_bits_in", "mean_bits_out",
+               "peak_bits_in", "peak_bits_out",
+               };
+
+       /* Success Test: valid array and count size */
+       err = rte_metrics_reg_names(&mnames[0], ARRAY_SIZE(mnames));
+       TEST_ASSERT(err >= 0, "%s, %d", __func__, __LINE__);
+
+       return TEST_SUCCESS;
+}
+
+/* Test case to validate update a metric */
+static int
+test_metrics_update_value(void)
+{
+       int err = 0;
+
+       /* Successful Test: Valid port_id, key and value */
+       err = rte_metrics_update_value(RTE_METRICS_GLOBAL, KEY, VALUE);
+       TEST_ASSERT(err >= 0, "%s, %d", __func__, __LINE__);
+
+       /* Successful Test: Valid port_id otherthan RTE_METRICS_GLOBAL, key
+        * and value
+        */
+       err = rte_metrics_update_value(9, KEY, VALUE);
+       TEST_ASSERT(err >= 0, "%s, %d", __func__, __LINE__);
+
+       /* Failed Test: Invalid port_id with lower value */
+       err = rte_metrics_update_value(-2, KEY, VALUE);
+       TEST_ASSERT(err == -EINVAL, "%s, %d", __func__, __LINE__);
+
+       /* Failed Test: Invalid port_id with higher value */
+       err = rte_metrics_update_value(39, KEY, VALUE);
+       TEST_ASSERT(err == -EINVAL, "%s, %d", __func__, __LINE__);
+
+       /* Failed Test: valid port id, value with invalid key */
+       err = rte_metrics_update_value(RTE_METRICS_GLOBAL, KEY+12, VALUE);
+       TEST_ASSERT(err < 0, "%s, %d", __func__, __LINE__);
+
+       return TEST_SUCCESS;
+}
+
+/* Test case to validate update a list of  metrics  */
+static int
+test_metrics_update_values(void)
+{
+       int err = 0;
+       const uint64_t  value[REG_METRIC_COUNT] = {1, 2, 3, 4, 5, 6};
+
+       /* Successful Test: update metrics with first set */
+       err = rte_metrics_update_values(RTE_METRICS_GLOBAL, 0,
+                       &value[0], 1);
+       TEST_ASSERT(err >= 0, "%s, %d", __func__, __LINE__);
+
+       /* Successful Test: update metrics with second set */
+       err = rte_metrics_update_values(RTE_METRICS_GLOBAL, 1,
+                       &value[1], 1);
+       TEST_ASSERT(err >= 0, "%s, %d", __func__, __LINE__);
+
+       /* Successful Test: update metrics with third set */
+       err = rte_metrics_update_values(RTE_METRICS_GLOBAL, 2,
+                       &value[2], 4);
+       TEST_ASSERT(err >= 0, "%s, %d", __func__, __LINE__);
+
+       /* Failed Test: Invalid count size */
+       err = rte_metrics_update_values(RTE_METRICS_GLOBAL,
+                        KEY, &value[0], 0);
+       TEST_ASSERT(err < 0, "%s, %d", __func__, __LINE__);
+
+       /* Failed Test: Invalid port_id(lower value) and valid data */
+       err = rte_metrics_update_values(-2, KEY, &value[0], ARRAY_SIZE(value));
+       TEST_ASSERT(err == -EINVAL, "%s, %d", __func__, __LINE__);
+
+       /* Failed Test: Invalid port_id(higher value) and valid data */
+       err = rte_metrics_update_values(39, 1, &value[0], ARRAY_SIZE(value));
+       TEST_ASSERT(err == -EINVAL, "%s, %d", __func__, __LINE__);
+
+       /* Failed Test: Invalid array */
+       err = rte_metrics_update_values(RTE_METRICS_GLOBAL,
+                        KEY, NULL, ARRAY_SIZE(value));
+       TEST_ASSERT(err == -EINVAL, "%s, %d", __func__, __LINE__);
+
+       return TEST_SUCCESS;
+}
+
+/* Test to validate get metric name-key lookup table */
+static int
+test_metrics_get_names(void)
+{
+       int err = 0;
+       struct rte_metric_name metrics[METRIC_LESSER_COUNT];
+       struct rte_metric_name success_metrics[REG_METRIC_COUNT];
+
+       /* Successful Test: Invalid array list */
+       err = rte_metrics_get_names(NULL, 0);
+       TEST_ASSERT(err >= 0, "%s, %d", __func__, __LINE__);
+
+       /* Successful Test: Valid array list, Correct Count Stats same
+        * as memzone stats
+        */
+       err = rte_metrics_get_names(success_metrics, REG_METRIC_COUNT);
+       TEST_ASSERT(err >= 0, "%s, %d", __func__, __LINE__);
+
+       /* Successful Test: Valid array list, Increase Count Stats than
+        * memzone stats
+        */
+       err = rte_metrics_get_names(success_metrics, REG_METRIC_COUNT+5);
+       TEST_ASSERT(err >= 0, "%s, %d", __func__, __LINE__);
+
+       /* Successful Test, Not update results:
+        * Invalid array list, Lesser Count Stats than allocated stats
+        */
+       err = rte_metrics_get_names(metrics, METRIC_LESSER_COUNT);
+       TEST_ASSERT(err >= 0, "%s, %d", __func__, __LINE__);
+
+       return TEST_SUCCESS;
+}
+
+/* Test to validate get list of metric values  */
+static int
+test_metrics_get_values(void)
+{
+       int i = 0;
+       int err = 0;
+       struct rte_metric_value getvalues[REG_METRIC_COUNT];
+
+       size_t m_size = sizeof(struct rte_metric_value);
+       for (i = 0; i < REG_METRIC_COUNT; i++)
+               memset(&getvalues[i], 0, m_size);
+
+       /* Successful Test, Not update results: valid arguments
+        * count lessthan the memzone stats
+        */
+       err = rte_metrics_get_values(RTE_METRICS_GLOBAL, getvalues,
+                        METRIC_LESSER_COUNT);
+       TEST_ASSERT(err >= 0, "%s, %d", __func__, __LINE__);
+
+       /* Successful Test, update results: valid arguments */
+       err = rte_metrics_get_values(RTE_METRICS_GLOBAL, getvalues,
+                        REG_METRIC_COUNT);
+       TEST_ASSERT(err >= 0, "%s, %d", __func__, __LINE__);
+
+       /* Successful Test : valid arguments count greaterthan the
+        * memzone stats
+        */
+       err = rte_metrics_get_values(RTE_METRICS_GLOBAL, getvalues,
+                       REG_METRIC_COUNT+2);
+       TEST_ASSERT(err >= 0, "%s, %d", __func__, __LINE__);
+
+       /* Failure Test: Invalid port_id(lower value) with correct values
+        * and  Capacity
+        */
+       err = rte_metrics_get_values(-2, getvalues, REG_METRIC_COUNT);
+       TEST_ASSERT(err == -EINVAL, "%s, %d", __func__, __LINE__);
+
+       /* Failure Test: Invalid port_id(higher value) with correct values
+        * and  Capacity
+        */
+       err = rte_metrics_get_values(33, getvalues, REG_METRIC_COUNT);
+       TEST_ASSERT(err == -EINVAL, "%s, %d", __func__, __LINE__);
+
+       /* Successful Test: valid port_id with incorrect values and  valid
+        * capacity
+        */
+       err = rte_metrics_get_values(RTE_METRICS_GLOBAL, NULL,
+                        REG_METRIC_COUNT);
+       TEST_ASSERT(err >= 0, "%s, %d", __func__, __LINE__);
+
+       return TEST_SUCCESS;
+}
+
+static struct unit_test_suite metrics_testsuite  = {
+       .suite_name = "Metrics Unit Test Suite",
+       .setup = NULL,
+       .teardown = NULL,
+       .unit_test_cases = {
+               /* Test Case 1: Test to check all metric APIs without
+                * metrics init
+                */
+               TEST_CASE(test_metrics_without_init),
+
+               /* TEST CASE 2: Test to register valid metrics*/
+               TEST_CASE_ST(test_metrics_init, NULL,
+                               test_metrics_reg_name_with_validname),
+
+               /* TEST CASE 3: Test to register list of metrics with valid
+                * names and valid count size, invalid names and invalid
+                * count size
+                */
+               TEST_CASE(test_metrics_reg_names),
+
+               /* TEST CASE 4: Test to register a update value with valid port
+                * id and invalid port id
+                */
+               TEST_CASE(test_metrics_update_value),
+
+               /* TEST CASE 5: Test to register update list of values with
+                * valid port id, key, value, count size and invalid port id,
+                * key, value, count size
+                */
+               TEST_CASE(test_metrics_update_values),
+
+               /* TEST CASE 6: Test to get metric names-key with valid
+                * array list, count size and invalid array list, count size
+                */
+               TEST_CASE(test_metrics_get_names),
+
+               /* TEST CASE 7: Test to get list of metric values with valid
+                * port id, array list, count size and invalid port id,
+                * arraylist, count size
+                */
+               TEST_CASE(test_metrics_get_values),
+               TEST_CASES_END()
+       }
+};
+
+static int
+test_metrics(void)
+{
+       return unit_test_suite_runner(&metrics_testsuite);
+}
+
+REGISTER_TEST_COMMAND(metrics_autotest, test_metrics);