Add a new test for rte_memzero_explicit.
Test strategy is based of glibc bzero_explicit test which
is based off a test in the OpenBSD regression test suite.

Signed-off-by: Stephen Hemminger <step...@networkplumber.org>
---
 app/test/test_string_fns.c | 56 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 56 insertions(+)

diff --git a/app/test/test_string_fns.c b/app/test/test_string_fns.c
index ce07c17228..b4fe3a7c30 100644
--- a/app/test/test_string_fns.c
+++ b/app/test/test_string_fns.c
@@ -8,6 +8,10 @@
 #include <errno.h>
 #include <string.h>
 
+#include <rte_debug.h>
+#include <rte_launch.h>
+#include <rte_lcore.h>
+#include <rte_random.h>
 #include <rte_string_fns.h>
 
 #include "test.h"
@@ -205,12 +209,64 @@ test_rte_str_skip_leading_spaces(void)
        return 0;
 }
 
+/*
+ * This test does a variation of what OpenBSD regression suite does to test 
explicit bzero.
+ * One thread creates a buffer then zeros it but does not touch after that.
+ * Other thread checks that buffer has been cleared.
+ * A broken implementation would get optimized away.
+ */
+#define TEST_DATA_SIZE 123
+static int
+run_memzero_explicit(void *arg)
+{
+       uint8_t *data = arg;
+
+       for (unsigned int i = 0; i < TEST_DATA_SIZE; i++)
+               data[i] = rte_rand_max(256);
+
+       rte_memzero_explicit(data, TEST_DATA_SIZE);
+       return 0;
+}
+
+static unsigned int
+get_worker_lcore(void)
+{
+       unsigned int lcore_id = rte_get_next_lcore(-1, 1, 0);
+
+       /* avoid checkers (like Coverity) false positives */
+       RTE_VERIFY(lcore_id < RTE_MAX_LCORE);
+
+       return lcore_id;
+}
+
+static int
+test_rte_memzero_explicit(void)
+{
+       if (rte_lcore_count() < 2) {
+               printf("Need multiple cores to run memzero explicit test.\n");
+               return TEST_SKIPPED;
+       }
+
+       uint8_t test_data[TEST_DATA_SIZE] = { 1 };
+       unsigned int worker_lcore_id = get_worker_lcore();
+       int rc = rte_eal_remote_launch(run_memzero_explicit, test_data, 
worker_lcore_id);
+       TEST_ASSERT(rc == 0, "Worker thread launch failed");
+
+       rte_eal_mp_wait_lcore();
+
+       for (unsigned int i = 0; i < TEST_DATA_SIZE; i++)
+               TEST_ASSERT(test_data[i] == 0, "rte_memset_explicit did not 
zero");
+
+       return TEST_SUCCESS;
+}
+
 static struct unit_test_suite test_suite = {
        .suite_name = "String functions tests",
        .unit_test_cases = {
                TEST_CASE(test_rte_strsplit),
                TEST_CASE(test_rte_strlcat),
                TEST_CASE(test_rte_str_skip_leading_spaces),
+               TEST_CASE(test_rte_memzero_explicit),
                TEST_CASES_END()
        }
 };
-- 
2.47.2

Reply via email to