DPDK patches and discussions
 help / color / mirror / Atom feed
* [PATCH 0/7] refactor kvargs test
@ 2023-11-03  9:53 Chengwen Feng
  2023-11-03  9:53 ` [PATCH 1/7] app/test: introduce UT suite framework for kvargs Chengwen Feng
                   ` (11 more replies)
  0 siblings, 12 replies; 39+ messages in thread
From: Chengwen Feng @ 2023-11-03  9:53 UTC (permalink / raw)
  To: thomas, ferruh.yigit; +Cc: dev

When developing patchset [1], I found the kvargs test is hard to 
understand when tried to add some testcase.

So refactor kvargs by:
1. introduce UT suite framework.
2. extract big test_valid_kvargs() to five part.

And add myself for voluntary maintenance of the kvargs library.

Note: to ensure patch independenct, new API which in patchset [1]
are not included in this patchset.

[1] https://patchwork.dpdk.org/project/dpdk/cover/20231103073811.13196-1-fengchengwen@huawei.com/

Chengwen Feng (7):
  app/test: introduce UT suite framework for kvargs
  app/test: extract basic token count testcase for kvargs
  app/test: extract without keys testcase for kvargs
  app/test: extract with keys testcase for kvargs
  app/test: extract parse list value testcase for kvargs
  app/test: extract parse empty elements testcase for kvargs
  maintainers: update for kvargs library

 MAINTAINERS            |   1 +
 app/test/test_kvargs.c | 256 ++++++++++++++++++++---------------------
 2 files changed, 128 insertions(+), 129 deletions(-)

-- 
2.17.1


^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH 1/7] app/test: introduce UT suite framework for kvargs
  2023-11-03  9:53 [PATCH 0/7] refactor kvargs test Chengwen Feng
@ 2023-11-03  9:53 ` Chengwen Feng
  2024-10-11  2:08   ` Stephen Hemminger
  2023-11-03  9:53 ` [PATCH 2/7] app/test: extract basic token count testcase " Chengwen Feng
                   ` (10 subsequent siblings)
  11 siblings, 1 reply; 39+ messages in thread
From: Chengwen Feng @ 2023-11-03  9:53 UTC (permalink / raw)
  To: thomas, ferruh.yigit; +Cc: dev

Introduce unit test suite framework for test_kvargs.c.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
---
 app/test/test_kvargs.c | 20 +++++++++++++-------
 1 file changed, 13 insertions(+), 7 deletions(-)

diff --git a/app/test/test_kvargs.c b/app/test/test_kvargs.c
index 7a60cac4c1..9aeb9aa0aa 100644
--- a/app/test/test_kvargs.c
+++ b/app/test/test_kvargs.c
@@ -1,5 +1,6 @@
 /* SPDX-License-Identifier: BSD-3-Clause
  * Copyright 2014 6WIND S.A.
+ * Copyright(c) 2023 HiSilicon Limited
  */
 
 #include <stdlib.h>
@@ -280,16 +281,21 @@ static int test_invalid_kvargs(void)
 	return -1;
 }
 
+static struct unit_test_suite kvargs_test_suite  = {
+	.suite_name = "Kvargs Unit Test Suite",
+	.setup = NULL,
+	.teardown = NULL,
+	.unit_test_cases = {
+		TEST_CASE(test_valid_kvargs),
+		TEST_CASE(test_invalid_kvargs),
+		TEST_CASES_END() /**< NULL terminate unit test array */
+	}
+};
+
 static int
 test_kvargs(void)
 {
-	printf("== test valid case ==\n");
-	if (test_valid_kvargs() < 0)
-		return -1;
-	printf("== test invalid case ==\n");
-	if (test_invalid_kvargs() < 0)
-		return -1;
-	return 0;
+	return unit_test_suite_runner(&kvargs_test_suite);
 }
 
 REGISTER_FAST_TEST(kvargs_autotest, true, true, test_kvargs);
-- 
2.17.1


^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH 2/7] app/test: extract basic token count testcase for kvargs
  2023-11-03  9:53 [PATCH 0/7] refactor kvargs test Chengwen Feng
  2023-11-03  9:53 ` [PATCH 1/7] app/test: introduce UT suite framework for kvargs Chengwen Feng
@ 2023-11-03  9:53 ` Chengwen Feng
  2023-11-03  9:53 ` [PATCH 3/7] app/test: extract without keys " Chengwen Feng
                   ` (9 subsequent siblings)
  11 siblings, 0 replies; 39+ messages in thread
From: Chengwen Feng @ 2023-11-03  9:53 UTC (permalink / raw)
  To: thomas, ferruh.yigit; +Cc: dev

The test_valid_kvargs() function is too long to understand, extract
the basic token count tests as one stand-alone testcase.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
---
 app/test/test_kvargs.c | 120 ++++++++++++++++-------------------------
 1 file changed, 45 insertions(+), 75 deletions(-)

diff --git a/app/test/test_kvargs.c b/app/test/test_kvargs.c
index 9aeb9aa0aa..a27b2aabfb 100644
--- a/app/test/test_kvargs.c
+++ b/app/test/test_kvargs.c
@@ -36,25 +36,6 @@ static int check_handler(const char *key, const char *value,
 	return 0;
 }
 
-/* test parsing. */
-static int test_kvargs_parsing(const char *args, unsigned int n)
-{
-	struct rte_kvargs *kvlist;
-
-	kvlist = rte_kvargs_parse(args, NULL);
-	if (kvlist == NULL) {
-		printf("rte_kvargs_parse() error: %s\n", args);
-		return -1;
-	}
-	if (kvlist->count != n) {
-		printf("invalid count value %d: %s\n", kvlist->count, args);
-		rte_kvargs_free(kvlist);
-		return -1;
-	}
-	rte_kvargs_free(kvlist);
-	return 0;
-}
-
 /* test a valid case */
 static int test_valid_kvargs(void)
 {
@@ -62,29 +43,6 @@ static int test_valid_kvargs(void)
 	const char *args;
 	const char *valid_keys_list[] = { "foo", "check", NULL };
 	const char **valid_keys;
-	static const struct {
-		unsigned int expected;
-		const char *input;
-	} valid_inputs[] = {
-		{ 2, "foo=1,foo=" },
-		{ 2, "foo=1,foo=" },
-		{ 2, "foo=1,foo" },
-		{ 2, "foo=1,=2" },
-		{ 1, "foo=[1,2" },
-		{ 1, ",=" },
-		{ 1, "foo=[" },
-	};
-	unsigned int i;
-
-	/* empty args is valid */
-	args = "";
-	valid_keys = NULL;
-	kvlist = rte_kvargs_parse(args, valid_keys);
-	if (kvlist == NULL) {
-		printf("rte_kvargs_parse() error");
-		goto fail;
-	}
-	rte_kvargs_free(kvlist);
 
 	/* first test without valid_keys */
 	args = "foo=1234,check=value0,check=value1";
@@ -128,14 +86,6 @@ static int test_valid_kvargs(void)
 		rte_kvargs_free(kvlist);
 		goto fail;
 	}
-	/* count all entries */
-	count = rte_kvargs_count(kvlist, NULL);
-	if (count != 3) {
-		printf("invalid count value %d after rte_kvargs_count(NULL)\n",
-			count);
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
 	/* count all entries with key="nonexistent_key" */
 	count = rte_kvargs_count(kvlist, "nonexistent_key");
 	if (count != 0) {
@@ -190,19 +140,6 @@ static int test_valid_kvargs(void)
 	}
 	rte_kvargs_free(kvlist);
 
-	/* test using empty string (it is valid) */
-	args = "";
-	kvlist = rte_kvargs_parse(args, NULL);
-	if (kvlist == NULL) {
-		printf("rte_kvargs_parse() error\n");
-		goto fail;
-	}
-	if (rte_kvargs_count(kvlist, NULL) != 0) {
-		printf("invalid count value\n");
-		goto fail;
-	}
-	rte_kvargs_free(kvlist);
-
 	/* test using empty elements (it is valid) */
 	args = "foo=1,,check=value2,,";
 	kvlist = rte_kvargs_parse(args, NULL);
@@ -210,10 +147,6 @@ static int test_valid_kvargs(void)
 		printf("rte_kvargs_parse() error\n");
 		goto fail;
 	}
-	if (rte_kvargs_count(kvlist, NULL) != 2) {
-		printf("invalid count value\n");
-		goto fail;
-	}
 	if (rte_kvargs_count(kvlist, "foo") != 1) {
 		printf("invalid count value for 'foo'\n");
 		goto fail;
@@ -224,14 +157,6 @@ static int test_valid_kvargs(void)
 	}
 	rte_kvargs_free(kvlist);
 
-	valid_keys = NULL;
-
-	for (i = 0; i < RTE_DIM(valid_inputs); ++i) {
-		args = valid_inputs[i].input;
-		if (test_kvargs_parsing(args, valid_inputs[i].expected))
-			goto fail;
-	}
-
 	return 0;
 
  fail:
@@ -246,6 +171,50 @@ static int test_valid_kvargs(void)
 	return -1;
 }
 
+static int
+test_basic_token_count(void)
+{
+	static const struct {
+		unsigned int expected;
+		const char *input;
+	} valid_inputs[] = {
+		{ 3, "foo=1,check=1,check=2" },
+		{ 3, "foo=1,check,check=2"   },
+		{ 2, "foo=1,foo="            },
+		{ 2, "foo=1,foo="            },
+		{ 2, "foo=1,foo"             },
+		{ 2, "foo=1,=2"              },
+		{ 2, "foo=1,,foo=2,,"        },
+		{ 1, "foo=[1,2"              },
+		{ 1, ",="                    },
+		{ 1, "foo=["                 },
+		{ 0, ""                      },
+	};
+	struct rte_kvargs *kvlist;
+	unsigned int count;
+	const char *args;
+	unsigned int i;
+
+	for (i = 0; i < RTE_DIM(valid_inputs); i++) {
+		args = valid_inputs[i].input;
+		kvlist = rte_kvargs_parse(args, NULL);
+		if (kvlist == NULL) {
+			printf("rte_kvargs_parse() error: %s\n", args);
+			return -1;
+		}
+		count = rte_kvargs_count(kvlist, NULL);
+		if (count != valid_inputs[i].expected) {
+			printf("invalid count value %u (expected %u): %s\n",
+			       count, valid_inputs[i].expected, args);
+			rte_kvargs_free(kvlist);
+			return -1;
+		}
+		rte_kvargs_free(kvlist);
+	}
+
+	return 0;
+}
+
 /* test several error cases */
 static int test_invalid_kvargs(void)
 {
@@ -287,6 +256,7 @@ static struct unit_test_suite kvargs_test_suite  = {
 	.teardown = NULL,
 	.unit_test_cases = {
 		TEST_CASE(test_valid_kvargs),
+		TEST_CASE(test_basic_token_count),
 		TEST_CASE(test_invalid_kvargs),
 		TEST_CASES_END() /**< NULL terminate unit test array */
 	}
-- 
2.17.1


^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH 3/7] app/test: extract without keys testcase for kvargs
  2023-11-03  9:53 [PATCH 0/7] refactor kvargs test Chengwen Feng
  2023-11-03  9:53 ` [PATCH 1/7] app/test: introduce UT suite framework for kvargs Chengwen Feng
  2023-11-03  9:53 ` [PATCH 2/7] app/test: extract basic token count testcase " Chengwen Feng
@ 2023-11-03  9:53 ` Chengwen Feng
  2023-11-03  9:53 ` [PATCH 4/7] app/test: extract with " Chengwen Feng
                   ` (8 subsequent siblings)
  11 siblings, 0 replies; 39+ messages in thread
From: Chengwen Feng @ 2023-11-03  9:53 UTC (permalink / raw)
  To: thomas, ferruh.yigit; +Cc: dev

The test_valid_kvargs() function is too long to understand, extract
the without keys tests as one stand-alone testcase.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
---
 app/test/test_kvargs.c | 115 ++++++++++++++++++++++-------------------
 1 file changed, 63 insertions(+), 52 deletions(-)

diff --git a/app/test/test_kvargs.c b/app/test/test_kvargs.c
index a27b2aabfb..7ab4becc0b 100644
--- a/app/test/test_kvargs.c
+++ b/app/test/test_kvargs.c
@@ -44,58 +44,6 @@ static int test_valid_kvargs(void)
 	const char *valid_keys_list[] = { "foo", "check", NULL };
 	const char **valid_keys;
 
-	/* first test without valid_keys */
-	args = "foo=1234,check=value0,check=value1";
-	valid_keys = NULL;
-	kvlist = rte_kvargs_parse(args, valid_keys);
-	if (kvlist == NULL) {
-		printf("rte_kvargs_parse() error");
-		goto fail;
-	}
-	/* call check_handler() for all entries with key="check" */
-	count = 0;
-	if (rte_kvargs_process(kvlist, "check", check_handler, NULL) < 0) {
-		printf("rte_kvargs_process() error\n");
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	if (count != 2) {
-		printf("invalid count value %d after rte_kvargs_process(check)\n",
-			count);
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	count = 0;
-	/* call check_handler() for all entries with key="nonexistent_key" */
-	if (rte_kvargs_process(kvlist, "nonexistent_key", check_handler, NULL) < 0) {
-		printf("rte_kvargs_process() error\n");
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	if (count != 0) {
-		printf("invalid count value %d after rte_kvargs_process(nonexistent_key)\n",
-			count);
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	/* count all entries with key="foo" */
-	count = rte_kvargs_count(kvlist, "foo");
-	if (count != 1) {
-		printf("invalid count value %d after rte_kvargs_count(foo)\n",
-			count);
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	/* count all entries with key="nonexistent_key" */
-	count = rte_kvargs_count(kvlist, "nonexistent_key");
-	if (count != 0) {
-		printf("invalid count value %d after rte_kvargs_count(nonexistent_key)\n",
-			count);
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	rte_kvargs_free(kvlist);
-
 	/* second test using valid_keys */
 	args = "foo=droids,check=value0,check=value1,check=wrong_value";
 	valid_keys = valid_keys_list;
@@ -215,6 +163,68 @@ test_basic_token_count(void)
 	return 0;
 }
 
+static int
+test_parse_without_valid_keys(void)
+{
+	const char *args = "foo=1234,check=value0,check=value1";
+	struct rte_kvargs *kvlist;
+
+	kvlist = rte_kvargs_parse(args, NULL);
+	if (kvlist == NULL) {
+		printf("rte_kvargs_parse() error\n");
+		return -1;
+	}
+
+	/* call check_handler() for all entries with key="check" */
+	count = 0;
+	if (rte_kvargs_process(kvlist, "check", check_handler, NULL) < 0) {
+		printf("rte_kvargs_process(check) error\n");
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+	if (count != 2) {
+		printf("invalid count value %u after rte_kvargs_process(check)\n",
+			count);
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	/* call check_handler() for all entries with key="nonexistent_key" */
+	count = 0;
+	if (rte_kvargs_process(kvlist, "nonexistent_key", check_handler, NULL) < 0) {
+		printf("rte_kvargs_process(nonexistent_key) error\n");
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+	if (count != 0) {
+		printf("invalid count value %d after rte_kvargs_process(nonexistent_key)\n",
+			count);
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	/* count all entries with key="foo" */
+	count = rte_kvargs_count(kvlist, "foo");
+	if (count != 1) {
+		printf("invalid count value %d after rte_kvargs_count(foo)\n",
+			count);
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	/* count all entries with key="nonexistent_key" */
+	count = rte_kvargs_count(kvlist, "nonexistent_key");
+	if (count != 0) {
+		printf("invalid count value %d after rte_kvargs_count(nonexistent_key)\n",
+			count);
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	rte_kvargs_free(kvlist);
+	return 0;
+}
+
 /* test several error cases */
 static int test_invalid_kvargs(void)
 {
@@ -257,6 +267,7 @@ static struct unit_test_suite kvargs_test_suite  = {
 	.unit_test_cases = {
 		TEST_CASE(test_valid_kvargs),
 		TEST_CASE(test_basic_token_count),
+		TEST_CASE(test_parse_without_valid_keys),
 		TEST_CASE(test_invalid_kvargs),
 		TEST_CASES_END() /**< NULL terminate unit test array */
 	}
-- 
2.17.1


^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH 4/7] app/test: extract with keys testcase for kvargs
  2023-11-03  9:53 [PATCH 0/7] refactor kvargs test Chengwen Feng
                   ` (2 preceding siblings ...)
  2023-11-03  9:53 ` [PATCH 3/7] app/test: extract without keys " Chengwen Feng
@ 2023-11-03  9:53 ` Chengwen Feng
  2023-11-03  9:53 ` [PATCH 5/7] app/test: extract parse list value " Chengwen Feng
                   ` (7 subsequent siblings)
  11 siblings, 0 replies; 39+ messages in thread
From: Chengwen Feng @ 2023-11-03  9:53 UTC (permalink / raw)
  To: thomas, ferruh.yigit; +Cc: dev

The test_valid_kvargs() function is too long to understand, extract
the with keys tests as one stand-alone testcase.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
---
 app/test/test_kvargs.c | 59 +++++++++++++++++++++++++-----------------
 1 file changed, 35 insertions(+), 24 deletions(-)

diff --git a/app/test/test_kvargs.c b/app/test/test_kvargs.c
index 7ab4becc0b..28b93680f0 100644
--- a/app/test/test_kvargs.c
+++ b/app/test/test_kvargs.c
@@ -44,30 +44,6 @@ static int test_valid_kvargs(void)
 	const char *valid_keys_list[] = { "foo", "check", NULL };
 	const char **valid_keys;
 
-	/* second test using valid_keys */
-	args = "foo=droids,check=value0,check=value1,check=wrong_value";
-	valid_keys = valid_keys_list;
-	kvlist = rte_kvargs_parse(args, valid_keys);
-	if (kvlist == NULL) {
-		printf("rte_kvargs_parse() error");
-		goto fail;
-	}
-	/* call check_handler() on all entries with key="check", it
-	 * should fail as the value is not recognized by the handler */
-	if (rte_kvargs_process(kvlist, "check", check_handler, NULL) == 0) {
-		printf("rte_kvargs_process() is success but should not\n");
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	count = rte_kvargs_count(kvlist, "check");
-	if (count != 3) {
-		printf("invalid count value %d after rte_kvargs_count(check)\n",
-			count);
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	rte_kvargs_free(kvlist);
-
 	/* third test using list as value */
 	args = "foo=[0,1],check=value2";
 	valid_keys = valid_keys_list;
@@ -225,6 +201,40 @@ test_parse_without_valid_keys(void)
 	return 0;
 }
 
+static int
+test_parse_with_valid_keys(void)
+{
+	const char *args = "foo=droids,check=value0,check=value1,check=wrong_value";
+	const char *valid_keys[] = { "foo", "check", NULL };
+	struct rte_kvargs *kvlist;
+
+	kvlist = rte_kvargs_parse(args, valid_keys);
+	if (kvlist == NULL) {
+		printf("rte_kvargs_parse() error\n");
+		return -1;
+	}
+
+	/* call check_handler() on all entries with key="check", it
+	 * should fail as the value is not recognized by the handler
+	 */
+	if (rte_kvargs_process(kvlist, "check", check_handler, NULL) == 0) {
+		printf("rte_kvargs_process(check) is success but should not\n");
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	count = rte_kvargs_count(kvlist, "check");
+	if (count != 3) {
+		printf("invalid count value %u after rte_kvargs_count(check)\n",
+			count);
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	rte_kvargs_free(kvlist);
+	return 0;
+}
+
 /* test several error cases */
 static int test_invalid_kvargs(void)
 {
@@ -268,6 +278,7 @@ static struct unit_test_suite kvargs_test_suite  = {
 		TEST_CASE(test_valid_kvargs),
 		TEST_CASE(test_basic_token_count),
 		TEST_CASE(test_parse_without_valid_keys),
+		TEST_CASE(test_parse_with_valid_keys),
 		TEST_CASE(test_invalid_kvargs),
 		TEST_CASES_END() /**< NULL terminate unit test array */
 	}
-- 
2.17.1


^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH 5/7] app/test: extract parse list value testcase for kvargs
  2023-11-03  9:53 [PATCH 0/7] refactor kvargs test Chengwen Feng
                   ` (3 preceding siblings ...)
  2023-11-03  9:53 ` [PATCH 4/7] app/test: extract with " Chengwen Feng
@ 2023-11-03  9:53 ` Chengwen Feng
  2023-11-03  9:53 ` [PATCH 6/7] app/test: extract parse empty elements " Chengwen Feng
                   ` (6 subsequent siblings)
  11 siblings, 0 replies; 39+ messages in thread
From: Chengwen Feng @ 2023-11-03  9:53 UTC (permalink / raw)
  To: thomas, ferruh.yigit; +Cc: dev

Extract parse list value test as one stand-alone testcase.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
---
 app/test/test_kvargs.c | 54 +++++++++++++++++++++++++-----------------
 1 file changed, 32 insertions(+), 22 deletions(-)

diff --git a/app/test/test_kvargs.c b/app/test/test_kvargs.c
index 28b93680f0..f4257c176f 100644
--- a/app/test/test_kvargs.c
+++ b/app/test/test_kvargs.c
@@ -41,28 +41,7 @@ static int test_valid_kvargs(void)
 {
 	struct rte_kvargs *kvlist;
 	const char *args;
-	const char *valid_keys_list[] = { "foo", "check", NULL };
-	const char **valid_keys;
-
-	/* third test using list as value */
-	args = "foo=[0,1],check=value2";
-	valid_keys = valid_keys_list;
-	kvlist = rte_kvargs_parse(args, valid_keys);
-	if (kvlist == NULL) {
-		printf("rte_kvargs_parse() error\n");
-		goto fail;
-	}
-	if (strcmp(kvlist->pairs[0].value, "[0,1]") != 0) {
-		printf("wrong value %s", kvlist->pairs[0].value);
-		goto fail;
-	}
-	count = kvlist->count;
-	if (count != 2) {
-		printf("invalid count value %d\n", count);
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	rte_kvargs_free(kvlist);
+	const char **valid_keys = NULL;
 
 	/* test using empty elements (it is valid) */
 	args = "foo=1,,check=value2,,";
@@ -235,6 +214,36 @@ test_parse_with_valid_keys(void)
 	return 0;
 }
 
+static int
+test_parse_list_value(void)
+{
+	const char *valid_keys[] = { "foo", "check", NULL };
+	const char *args = "foo=[0,1],check=value2";
+	struct rte_kvargs *kvlist;
+
+	kvlist = rte_kvargs_parse(args, valid_keys);
+	if (kvlist == NULL) {
+		printf("rte_kvargs_parse() error\n");
+		return -1;
+	}
+
+	count = kvlist->count;
+	if (count != 2) {
+		printf("invalid count value %u\n", count);
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	if (strcmp(kvlist->pairs[0].value, "[0,1]") != 0) {
+		printf("wrong value %s", kvlist->pairs[0].value);
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	rte_kvargs_free(kvlist);
+	return 0;
+}
+
 /* test several error cases */
 static int test_invalid_kvargs(void)
 {
@@ -279,6 +288,7 @@ static struct unit_test_suite kvargs_test_suite  = {
 		TEST_CASE(test_basic_token_count),
 		TEST_CASE(test_parse_without_valid_keys),
 		TEST_CASE(test_parse_with_valid_keys),
+		TEST_CASE(test_parse_list_value),
 		TEST_CASE(test_invalid_kvargs),
 		TEST_CASES_END() /**< NULL terminate unit test array */
 	}
-- 
2.17.1


^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH 6/7] app/test: extract parse empty elements testcase for kvargs
  2023-11-03  9:53 [PATCH 0/7] refactor kvargs test Chengwen Feng
                   ` (4 preceding siblings ...)
  2023-11-03  9:53 ` [PATCH 5/7] app/test: extract parse list value " Chengwen Feng
@ 2023-11-03  9:53 ` Chengwen Feng
  2023-11-03  9:53 ` [PATCH 7/7] maintainers: update for kvargs library Chengwen Feng
                   ` (5 subsequent siblings)
  11 siblings, 0 replies; 39+ messages in thread
From: Chengwen Feng @ 2023-11-03  9:53 UTC (permalink / raw)
  To: thomas, ferruh.yigit; +Cc: dev

Extract parse empty elements test as one stand-alone testcase. And
also fix the kvlist was not released when the branch fails.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
---
 app/test/test_kvargs.c | 68 ++++++++++++++++++------------------------
 1 file changed, 29 insertions(+), 39 deletions(-)

diff --git a/app/test/test_kvargs.c b/app/test/test_kvargs.c
index f4257c176f..8cd84fcec0 100644
--- a/app/test/test_kvargs.c
+++ b/app/test/test_kvargs.c
@@ -36,44 +36,6 @@ static int check_handler(const char *key, const char *value,
 	return 0;
 }
 
-/* test a valid case */
-static int test_valid_kvargs(void)
-{
-	struct rte_kvargs *kvlist;
-	const char *args;
-	const char **valid_keys = NULL;
-
-	/* test using empty elements (it is valid) */
-	args = "foo=1,,check=value2,,";
-	kvlist = rte_kvargs_parse(args, NULL);
-	if (kvlist == NULL) {
-		printf("rte_kvargs_parse() error\n");
-		goto fail;
-	}
-	if (rte_kvargs_count(kvlist, "foo") != 1) {
-		printf("invalid count value for 'foo'\n");
-		goto fail;
-	}
-	if (rte_kvargs_count(kvlist, "check") != 1) {
-		printf("invalid count value for 'check'\n");
-		goto fail;
-	}
-	rte_kvargs_free(kvlist);
-
-	return 0;
-
- fail:
-	printf("while processing <%s>", args);
-	if (valid_keys != NULL && *valid_keys != NULL) {
-		printf(" using valid_keys=<%s", *valid_keys);
-		while (*(++valid_keys) != NULL)
-			printf(",%s", *valid_keys);
-		printf(">");
-	}
-	printf("\n");
-	return -1;
-}
-
 static int
 test_basic_token_count(void)
 {
@@ -244,6 +206,34 @@ test_parse_list_value(void)
 	return 0;
 }
 
+static int
+test_parse_empty_elements(void)
+{
+	const char *args = "foo=1,,check=value2,,";
+	struct rte_kvargs *kvlist;
+
+	kvlist = rte_kvargs_parse(args, NULL);
+	if (kvlist == NULL) {
+		printf("rte_kvargs_parse() error\n");
+		return -1;
+	}
+
+	if (rte_kvargs_count(kvlist, "foo") != 1) {
+		printf("invalid count value for 'foo'\n");
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	if (rte_kvargs_count(kvlist, "check") != 1) {
+		printf("invalid count value for 'check'\n");
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	rte_kvargs_free(kvlist);
+	return 0;
+}
+
 /* test several error cases */
 static int test_invalid_kvargs(void)
 {
@@ -284,11 +274,11 @@ static struct unit_test_suite kvargs_test_suite  = {
 	.setup = NULL,
 	.teardown = NULL,
 	.unit_test_cases = {
-		TEST_CASE(test_valid_kvargs),
 		TEST_CASE(test_basic_token_count),
 		TEST_CASE(test_parse_without_valid_keys),
 		TEST_CASE(test_parse_with_valid_keys),
 		TEST_CASE(test_parse_list_value),
+		TEST_CASE(test_parse_empty_elements),
 		TEST_CASE(test_invalid_kvargs),
 		TEST_CASES_END() /**< NULL terminate unit test array */
 	}
-- 
2.17.1


^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH 7/7] maintainers: update for kvargs library
  2023-11-03  9:53 [PATCH 0/7] refactor kvargs test Chengwen Feng
                   ` (5 preceding siblings ...)
  2023-11-03  9:53 ` [PATCH 6/7] app/test: extract parse empty elements " Chengwen Feng
@ 2023-11-03  9:53 ` Chengwen Feng
  2023-12-05  2:55 ` [PATCH 0/7] refactor kvargs test fengchengwen
                   ` (4 subsequent siblings)
  11 siblings, 0 replies; 39+ messages in thread
From: Chengwen Feng @ 2023-11-03  9:53 UTC (permalink / raw)
  To: thomas, ferruh.yigit; +Cc: dev

Add myself for voluntary maintenance of the kvargs library.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
---
 MAINTAINERS | 1 +
 1 file changed, 1 insertion(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index 4083658697..81f97a5e1e 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1651,6 +1651,7 @@ F: examples/cmdline/
 F: doc/guides/sample_app_ug/cmd_line.rst
 
 Key/Value parsing
+M: Chengwen Feng <fengchengwen@huawei.com>
 F: lib/kvargs/
 F: app/test/test_kvargs.c
 
-- 
2.17.1


^ permalink raw reply	[flat|nested] 39+ messages in thread

* Re: [PATCH 0/7] refactor kvargs test
  2023-11-03  9:53 [PATCH 0/7] refactor kvargs test Chengwen Feng
                   ` (6 preceding siblings ...)
  2023-11-03  9:53 ` [PATCH 7/7] maintainers: update for kvargs library Chengwen Feng
@ 2023-12-05  2:55 ` fengchengwen
  2024-10-05 15:49 ` Stephen Hemminger
                   ` (3 subsequent siblings)
  11 siblings, 0 replies; 39+ messages in thread
From: fengchengwen @ 2023-12-05  2:55 UTC (permalink / raw)
  To: thomas, ferruh.yigit; +Cc: dev

Hi Thomas,

  Could you please apply the commits 1~6 ? There commits are independent and could use for current code.

Thanks

On 2023/11/3 17:53, Chengwen Feng wrote:
> When developing patchset [1], I found the kvargs test is hard to 
> understand when tried to add some testcase.
> 
> So refactor kvargs by:
> 1. introduce UT suite framework.
> 2. extract big test_valid_kvargs() to five part.
> 
> And add myself for voluntary maintenance of the kvargs library.
> 
> Note: to ensure patch independenct, new API which in patchset [1]
> are not included in this patchset.
> 
> [1] https://patchwork.dpdk.org/project/dpdk/cover/20231103073811.13196-1-fengchengwen@huawei.com/
> 
> Chengwen Feng (7):
>   app/test: introduce UT suite framework for kvargs
>   app/test: extract basic token count testcase for kvargs
>   app/test: extract without keys testcase for kvargs
>   app/test: extract with keys testcase for kvargs
>   app/test: extract parse list value testcase for kvargs
>   app/test: extract parse empty elements testcase for kvargs
>   maintainers: update for kvargs library
> 
>  MAINTAINERS            |   1 +
>  app/test/test_kvargs.c | 256 ++++++++++++++++++++---------------------
>  2 files changed, 128 insertions(+), 129 deletions(-)
> 

^ permalink raw reply	[flat|nested] 39+ messages in thread

* Re: [PATCH 0/7] refactor kvargs test
  2023-11-03  9:53 [PATCH 0/7] refactor kvargs test Chengwen Feng
                   ` (7 preceding siblings ...)
  2023-12-05  2:55 ` [PATCH 0/7] refactor kvargs test fengchengwen
@ 2024-10-05 15:49 ` Stephen Hemminger
  2024-10-11  3:34 ` [PATCH v2 " Chengwen Feng
                   ` (2 subsequent siblings)
  11 siblings, 0 replies; 39+ messages in thread
From: Stephen Hemminger @ 2024-10-05 15:49 UTC (permalink / raw)
  To: Chengwen Feng; +Cc: thomas, ferruh.yigit, dev

On Fri, 3 Nov 2023 09:53:18 +0000
Chengwen Feng <fengchengwen@huawei.com> wrote:

> When developing patchset [1], I found the kvargs test is hard to 
> understand when tried to add some testcase.
> 
> So refactor kvargs by:
> 1. introduce UT suite framework.
> 2. extract big test_valid_kvargs() to five part.
> 
> And add myself for voluntary maintenance of the kvargs library.
> 
> Note: to ensure patch independenct, new API which in patchset [1]
> are not included in this patchset.
> 
> [1] https://patchwork.dpdk.org/project/dpdk/cover/20231103073811.13196-1-fengchengwen@huawei.com/
> 
> Chengwen Feng (7):
>   app/test: introduce UT suite framework for kvargs
>   app/test: extract basic token count testcase for kvargs
>   app/test: extract without keys testcase for kvargs
>   app/test: extract with keys testcase for kvargs
>   app/test: extract parse list value testcase for kvargs
>   app/test: extract parse empty elements testcase for kvargs
>   maintainers: update for kvargs library
> 
>  MAINTAINERS            |   1 +
>  app/test/test_kvargs.c | 256 ++++++++++++++++++++---------------------
>  2 files changed, 128 insertions(+), 129 deletions(-)
> 

Looks good and still applies clean

Series-Acked-by: Stephen Hemminger <stephen@networkplumber.org.

^ permalink raw reply	[flat|nested] 39+ messages in thread

* Re: [PATCH 1/7] app/test: introduce UT suite framework for kvargs
  2023-11-03  9:53 ` [PATCH 1/7] app/test: introduce UT suite framework for kvargs Chengwen Feng
@ 2024-10-11  2:08   ` Stephen Hemminger
  2024-10-11  3:35     ` fengchengwen
  0 siblings, 1 reply; 39+ messages in thread
From: Stephen Hemminger @ 2024-10-11  2:08 UTC (permalink / raw)
  To: Chengwen Feng; +Cc: thomas, ferruh.yigit, dev

On Fri, 3 Nov 2023 09:53:19 +0000
Chengwen Feng <fengchengwen@huawei.com> wrote:

> Introduce unit test suite framework for test_kvargs.c.
> 
> Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
> ---
>  app/test/test_kvargs.c | 20 +++++++++++++-------
>  1 file changed, 13 insertions(+), 7 deletions(-)
> 
> diff --git a/app/test/test_kvargs.c b/app/test/test_kvargs.c
> index 7a60cac4c1..9aeb9aa0aa 100644
> --- a/app/test/test_kvargs.c
> +++ b/app/test/test_kvargs.c
> @@ -1,5 +1,6 @@
>  /* SPDX-License-Identifier: BSD-3-Clause
>   * Copyright 2014 6WIND S.A.
> + * Copyright(c) 2023 HiSilicon Limited
>   */

The test changes look good and it is always better to have more tests.

IANAL but starting the precedent of allowing adding copyright whenever a file
is touched just leads to lots of meaningless fluff.

^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH v2 0/7] refactor kvargs test
  2023-11-03  9:53 [PATCH 0/7] refactor kvargs test Chengwen Feng
                   ` (8 preceding siblings ...)
  2024-10-05 15:49 ` Stephen Hemminger
@ 2024-10-11  3:34 ` Chengwen Feng
  2024-10-11  3:34   ` [PATCH v2 1/7] app/test: introduce UT suite framework for kvargs Chengwen Feng
                     ` (6 more replies)
  2024-10-22  6:14 ` [PATCH v3 0/8] refactor kvargs test Chengwen Feng
  2024-10-30  8:54 ` [PATCH v4 0/7] refactor kvargs test Chengwen Feng
  11 siblings, 7 replies; 39+ messages in thread
From: Chengwen Feng @ 2024-10-11  3:34 UTC (permalink / raw)
  To: thomas, ferruh.yigit; +Cc: dev, stephen

When developing patchset [1], I found the kvargs test is hard to
understand when tried to add some testcase.

So refactor kvargs by:
1. introduce UT suite framework.
2. extract big test_valid_kvargs() to five part.

And add myself for voluntary maintenance of the kvargs library.

Note: to ensure patch independenct, new API which in patchset [1]
are not included in this patchset.

[1] https://patchwork.dpdk.org/project/dpdk/cover/20231103073811.13196-1-fengchengwen@huawei.com/

Chengwen Feng (7):
  app/test: introduce UT suite framework for kvargs
  app/test: extract basic token count testcase for kvargs
  app/test: extract without keys testcase for kvargs
  app/test: extract with keys testcase for kvargs
  app/test: extract parse list value testcase for kvargs
  app/test: extract parse empty elements testcase for kvargs
  maintainers: update for kvargs library

---
v2: remove copyright line and add Stephen's ack.

 MAINTAINERS            |   1 +
 app/test/test_kvargs.c | 255 ++++++++++++++++++++---------------------
 2 files changed, 127 insertions(+), 129 deletions(-)

-- 
2.17.1


^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH v2 1/7] app/test: introduce UT suite framework for kvargs
  2024-10-11  3:34 ` [PATCH v2 " Chengwen Feng
@ 2024-10-11  3:34   ` Chengwen Feng
  2024-10-11  3:34   ` [PATCH v2 2/7] app/test: extract basic token count testcase " Chengwen Feng
                     ` (5 subsequent siblings)
  6 siblings, 0 replies; 39+ messages in thread
From: Chengwen Feng @ 2024-10-11  3:34 UTC (permalink / raw)
  To: thomas, ferruh.yigit; +Cc: dev, stephen

Introduce unit test suite framework for test_kvargs.c.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
---
 app/test/test_kvargs.c | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/app/test/test_kvargs.c b/app/test/test_kvargs.c
index 7a60cac4c1..1c46fbcaab 100644
--- a/app/test/test_kvargs.c
+++ b/app/test/test_kvargs.c
@@ -280,16 +280,21 @@ static int test_invalid_kvargs(void)
 	return -1;
 }
 
+static struct unit_test_suite kvargs_test_suite  = {
+	.suite_name = "Kvargs Unit Test Suite",
+	.setup = NULL,
+	.teardown = NULL,
+	.unit_test_cases = {
+		TEST_CASE(test_valid_kvargs),
+		TEST_CASE(test_invalid_kvargs),
+		TEST_CASES_END() /**< NULL terminate unit test array */
+	}
+};
+
 static int
 test_kvargs(void)
 {
-	printf("== test valid case ==\n");
-	if (test_valid_kvargs() < 0)
-		return -1;
-	printf("== test invalid case ==\n");
-	if (test_invalid_kvargs() < 0)
-		return -1;
-	return 0;
+	return unit_test_suite_runner(&kvargs_test_suite);
 }
 
 REGISTER_FAST_TEST(kvargs_autotest, true, true, test_kvargs);
-- 
2.17.1


^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH v2 2/7] app/test: extract basic token count testcase for kvargs
  2024-10-11  3:34 ` [PATCH v2 " Chengwen Feng
  2024-10-11  3:34   ` [PATCH v2 1/7] app/test: introduce UT suite framework for kvargs Chengwen Feng
@ 2024-10-11  3:34   ` Chengwen Feng
  2024-10-11  3:34   ` [PATCH v2 3/7] app/test: extract without keys " Chengwen Feng
                     ` (4 subsequent siblings)
  6 siblings, 0 replies; 39+ messages in thread
From: Chengwen Feng @ 2024-10-11  3:34 UTC (permalink / raw)
  To: thomas, ferruh.yigit; +Cc: dev, stephen

The test_valid_kvargs() function is too long to understand, extract
the basic token count tests as one stand-alone testcase.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
---
 app/test/test_kvargs.c | 120 ++++++++++++++++-------------------------
 1 file changed, 45 insertions(+), 75 deletions(-)

diff --git a/app/test/test_kvargs.c b/app/test/test_kvargs.c
index 1c46fbcaab..a9808a6f87 100644
--- a/app/test/test_kvargs.c
+++ b/app/test/test_kvargs.c
@@ -35,25 +35,6 @@ static int check_handler(const char *key, const char *value,
 	return 0;
 }
 
-/* test parsing. */
-static int test_kvargs_parsing(const char *args, unsigned int n)
-{
-	struct rte_kvargs *kvlist;
-
-	kvlist = rte_kvargs_parse(args, NULL);
-	if (kvlist == NULL) {
-		printf("rte_kvargs_parse() error: %s\n", args);
-		return -1;
-	}
-	if (kvlist->count != n) {
-		printf("invalid count value %d: %s\n", kvlist->count, args);
-		rte_kvargs_free(kvlist);
-		return -1;
-	}
-	rte_kvargs_free(kvlist);
-	return 0;
-}
-
 /* test a valid case */
 static int test_valid_kvargs(void)
 {
@@ -61,29 +42,6 @@ static int test_valid_kvargs(void)
 	const char *args;
 	const char *valid_keys_list[] = { "foo", "check", NULL };
 	const char **valid_keys;
-	static const struct {
-		unsigned int expected;
-		const char *input;
-	} valid_inputs[] = {
-		{ 2, "foo=1,foo=" },
-		{ 2, "foo=1,foo=" },
-		{ 2, "foo=1,foo" },
-		{ 2, "foo=1,=2" },
-		{ 1, "foo=[1,2" },
-		{ 1, ",=" },
-		{ 1, "foo=[" },
-	};
-	unsigned int i;
-
-	/* empty args is valid */
-	args = "";
-	valid_keys = NULL;
-	kvlist = rte_kvargs_parse(args, valid_keys);
-	if (kvlist == NULL) {
-		printf("rte_kvargs_parse() error");
-		goto fail;
-	}
-	rte_kvargs_free(kvlist);
 
 	/* first test without valid_keys */
 	args = "foo=1234,check=value0,check=value1";
@@ -127,14 +85,6 @@ static int test_valid_kvargs(void)
 		rte_kvargs_free(kvlist);
 		goto fail;
 	}
-	/* count all entries */
-	count = rte_kvargs_count(kvlist, NULL);
-	if (count != 3) {
-		printf("invalid count value %d after rte_kvargs_count(NULL)\n",
-			count);
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
 	/* count all entries with key="nonexistent_key" */
 	count = rte_kvargs_count(kvlist, "nonexistent_key");
 	if (count != 0) {
@@ -189,19 +139,6 @@ static int test_valid_kvargs(void)
 	}
 	rte_kvargs_free(kvlist);
 
-	/* test using empty string (it is valid) */
-	args = "";
-	kvlist = rte_kvargs_parse(args, NULL);
-	if (kvlist == NULL) {
-		printf("rte_kvargs_parse() error\n");
-		goto fail;
-	}
-	if (rte_kvargs_count(kvlist, NULL) != 0) {
-		printf("invalid count value\n");
-		goto fail;
-	}
-	rte_kvargs_free(kvlist);
-
 	/* test using empty elements (it is valid) */
 	args = "foo=1,,check=value2,,";
 	kvlist = rte_kvargs_parse(args, NULL);
@@ -209,10 +146,6 @@ static int test_valid_kvargs(void)
 		printf("rte_kvargs_parse() error\n");
 		goto fail;
 	}
-	if (rte_kvargs_count(kvlist, NULL) != 2) {
-		printf("invalid count value\n");
-		goto fail;
-	}
 	if (rte_kvargs_count(kvlist, "foo") != 1) {
 		printf("invalid count value for 'foo'\n");
 		goto fail;
@@ -223,14 +156,6 @@ static int test_valid_kvargs(void)
 	}
 	rte_kvargs_free(kvlist);
 
-	valid_keys = NULL;
-
-	for (i = 0; i < RTE_DIM(valid_inputs); ++i) {
-		args = valid_inputs[i].input;
-		if (test_kvargs_parsing(args, valid_inputs[i].expected))
-			goto fail;
-	}
-
 	return 0;
 
  fail:
@@ -245,6 +170,50 @@ static int test_valid_kvargs(void)
 	return -1;
 }
 
+static int
+test_basic_token_count(void)
+{
+	static const struct {
+		unsigned int expected;
+		const char *input;
+	} valid_inputs[] = {
+		{ 3, "foo=1,check=1,check=2" },
+		{ 3, "foo=1,check,check=2"   },
+		{ 2, "foo=1,foo="            },
+		{ 2, "foo=1,foo="            },
+		{ 2, "foo=1,foo"             },
+		{ 2, "foo=1,=2"              },
+		{ 2, "foo=1,,foo=2,,"        },
+		{ 1, "foo=[1,2"              },
+		{ 1, ",="                    },
+		{ 1, "foo=["                 },
+		{ 0, ""                      },
+	};
+	struct rte_kvargs *kvlist;
+	unsigned int count;
+	const char *args;
+	unsigned int i;
+
+	for (i = 0; i < RTE_DIM(valid_inputs); i++) {
+		args = valid_inputs[i].input;
+		kvlist = rte_kvargs_parse(args, NULL);
+		if (kvlist == NULL) {
+			printf("rte_kvargs_parse() error: %s\n", args);
+			return -1;
+		}
+		count = rte_kvargs_count(kvlist, NULL);
+		if (count != valid_inputs[i].expected) {
+			printf("invalid count value %u (expected %u): %s\n",
+			       count, valid_inputs[i].expected, args);
+			rte_kvargs_free(kvlist);
+			return -1;
+		}
+		rte_kvargs_free(kvlist);
+	}
+
+	return 0;
+}
+
 /* test several error cases */
 static int test_invalid_kvargs(void)
 {
@@ -286,6 +255,7 @@ static struct unit_test_suite kvargs_test_suite  = {
 	.teardown = NULL,
 	.unit_test_cases = {
 		TEST_CASE(test_valid_kvargs),
+		TEST_CASE(test_basic_token_count),
 		TEST_CASE(test_invalid_kvargs),
 		TEST_CASES_END() /**< NULL terminate unit test array */
 	}
-- 
2.17.1


^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH v2 3/7] app/test: extract without keys testcase for kvargs
  2024-10-11  3:34 ` [PATCH v2 " Chengwen Feng
  2024-10-11  3:34   ` [PATCH v2 1/7] app/test: introduce UT suite framework for kvargs Chengwen Feng
  2024-10-11  3:34   ` [PATCH v2 2/7] app/test: extract basic token count testcase " Chengwen Feng
@ 2024-10-11  3:34   ` Chengwen Feng
  2024-10-11  3:34   ` [PATCH v2 4/7] app/test: extract with " Chengwen Feng
                     ` (3 subsequent siblings)
  6 siblings, 0 replies; 39+ messages in thread
From: Chengwen Feng @ 2024-10-11  3:34 UTC (permalink / raw)
  To: thomas, ferruh.yigit; +Cc: dev, stephen

The test_valid_kvargs() function is too long to understand, extract
the without keys tests as one stand-alone testcase.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
---
 app/test/test_kvargs.c | 115 ++++++++++++++++++++++-------------------
 1 file changed, 63 insertions(+), 52 deletions(-)

diff --git a/app/test/test_kvargs.c b/app/test/test_kvargs.c
index a9808a6f87..2147080160 100644
--- a/app/test/test_kvargs.c
+++ b/app/test/test_kvargs.c
@@ -43,58 +43,6 @@ static int test_valid_kvargs(void)
 	const char *valid_keys_list[] = { "foo", "check", NULL };
 	const char **valid_keys;
 
-	/* first test without valid_keys */
-	args = "foo=1234,check=value0,check=value1";
-	valid_keys = NULL;
-	kvlist = rte_kvargs_parse(args, valid_keys);
-	if (kvlist == NULL) {
-		printf("rte_kvargs_parse() error");
-		goto fail;
-	}
-	/* call check_handler() for all entries with key="check" */
-	count = 0;
-	if (rte_kvargs_process(kvlist, "check", check_handler, NULL) < 0) {
-		printf("rte_kvargs_process() error\n");
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	if (count != 2) {
-		printf("invalid count value %d after rte_kvargs_process(check)\n",
-			count);
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	count = 0;
-	/* call check_handler() for all entries with key="nonexistent_key" */
-	if (rte_kvargs_process(kvlist, "nonexistent_key", check_handler, NULL) < 0) {
-		printf("rte_kvargs_process() error\n");
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	if (count != 0) {
-		printf("invalid count value %d after rte_kvargs_process(nonexistent_key)\n",
-			count);
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	/* count all entries with key="foo" */
-	count = rte_kvargs_count(kvlist, "foo");
-	if (count != 1) {
-		printf("invalid count value %d after rte_kvargs_count(foo)\n",
-			count);
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	/* count all entries with key="nonexistent_key" */
-	count = rte_kvargs_count(kvlist, "nonexistent_key");
-	if (count != 0) {
-		printf("invalid count value %d after rte_kvargs_count(nonexistent_key)\n",
-			count);
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	rte_kvargs_free(kvlist);
-
 	/* second test using valid_keys */
 	args = "foo=droids,check=value0,check=value1,check=wrong_value";
 	valid_keys = valid_keys_list;
@@ -214,6 +162,68 @@ test_basic_token_count(void)
 	return 0;
 }
 
+static int
+test_parse_without_valid_keys(void)
+{
+	const char *args = "foo=1234,check=value0,check=value1";
+	struct rte_kvargs *kvlist;
+
+	kvlist = rte_kvargs_parse(args, NULL);
+	if (kvlist == NULL) {
+		printf("rte_kvargs_parse() error\n");
+		return -1;
+	}
+
+	/* call check_handler() for all entries with key="check" */
+	count = 0;
+	if (rte_kvargs_process(kvlist, "check", check_handler, NULL) < 0) {
+		printf("rte_kvargs_process(check) error\n");
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+	if (count != 2) {
+		printf("invalid count value %u after rte_kvargs_process(check)\n",
+			count);
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	/* call check_handler() for all entries with key="nonexistent_key" */
+	count = 0;
+	if (rte_kvargs_process(kvlist, "nonexistent_key", check_handler, NULL) < 0) {
+		printf("rte_kvargs_process(nonexistent_key) error\n");
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+	if (count != 0) {
+		printf("invalid count value %d after rte_kvargs_process(nonexistent_key)\n",
+			count);
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	/* count all entries with key="foo" */
+	count = rte_kvargs_count(kvlist, "foo");
+	if (count != 1) {
+		printf("invalid count value %d after rte_kvargs_count(foo)\n",
+			count);
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	/* count all entries with key="nonexistent_key" */
+	count = rte_kvargs_count(kvlist, "nonexistent_key");
+	if (count != 0) {
+		printf("invalid count value %d after rte_kvargs_count(nonexistent_key)\n",
+			count);
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	rte_kvargs_free(kvlist);
+	return 0;
+}
+
 /* test several error cases */
 static int test_invalid_kvargs(void)
 {
@@ -256,6 +266,7 @@ static struct unit_test_suite kvargs_test_suite  = {
 	.unit_test_cases = {
 		TEST_CASE(test_valid_kvargs),
 		TEST_CASE(test_basic_token_count),
+		TEST_CASE(test_parse_without_valid_keys),
 		TEST_CASE(test_invalid_kvargs),
 		TEST_CASES_END() /**< NULL terminate unit test array */
 	}
-- 
2.17.1


^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH v2 4/7] app/test: extract with keys testcase for kvargs
  2024-10-11  3:34 ` [PATCH v2 " Chengwen Feng
                     ` (2 preceding siblings ...)
  2024-10-11  3:34   ` [PATCH v2 3/7] app/test: extract without keys " Chengwen Feng
@ 2024-10-11  3:34   ` Chengwen Feng
  2024-10-11  3:34   ` [PATCH v2 5/7] app/test: extract parse list value " Chengwen Feng
                     ` (2 subsequent siblings)
  6 siblings, 0 replies; 39+ messages in thread
From: Chengwen Feng @ 2024-10-11  3:34 UTC (permalink / raw)
  To: thomas, ferruh.yigit; +Cc: dev, stephen

The test_valid_kvargs() function is too long to understand, extract
the with keys tests as one stand-alone testcase.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
---
 app/test/test_kvargs.c | 59 +++++++++++++++++++++++++-----------------
 1 file changed, 35 insertions(+), 24 deletions(-)

diff --git a/app/test/test_kvargs.c b/app/test/test_kvargs.c
index 2147080160..2869cd16c8 100644
--- a/app/test/test_kvargs.c
+++ b/app/test/test_kvargs.c
@@ -43,30 +43,6 @@ static int test_valid_kvargs(void)
 	const char *valid_keys_list[] = { "foo", "check", NULL };
 	const char **valid_keys;
 
-	/* second test using valid_keys */
-	args = "foo=droids,check=value0,check=value1,check=wrong_value";
-	valid_keys = valid_keys_list;
-	kvlist = rte_kvargs_parse(args, valid_keys);
-	if (kvlist == NULL) {
-		printf("rte_kvargs_parse() error");
-		goto fail;
-	}
-	/* call check_handler() on all entries with key="check", it
-	 * should fail as the value is not recognized by the handler */
-	if (rte_kvargs_process(kvlist, "check", check_handler, NULL) == 0) {
-		printf("rte_kvargs_process() is success but should not\n");
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	count = rte_kvargs_count(kvlist, "check");
-	if (count != 3) {
-		printf("invalid count value %d after rte_kvargs_count(check)\n",
-			count);
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	rte_kvargs_free(kvlist);
-
 	/* third test using list as value */
 	args = "foo=[0,1],check=value2";
 	valid_keys = valid_keys_list;
@@ -224,6 +200,40 @@ test_parse_without_valid_keys(void)
 	return 0;
 }
 
+static int
+test_parse_with_valid_keys(void)
+{
+	const char *args = "foo=droids,check=value0,check=value1,check=wrong_value";
+	const char *valid_keys[] = { "foo", "check", NULL };
+	struct rte_kvargs *kvlist;
+
+	kvlist = rte_kvargs_parse(args, valid_keys);
+	if (kvlist == NULL) {
+		printf("rte_kvargs_parse() error\n");
+		return -1;
+	}
+
+	/* call check_handler() on all entries with key="check", it
+	 * should fail as the value is not recognized by the handler
+	 */
+	if (rte_kvargs_process(kvlist, "check", check_handler, NULL) == 0) {
+		printf("rte_kvargs_process(check) is success but should not\n");
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	count = rte_kvargs_count(kvlist, "check");
+	if (count != 3) {
+		printf("invalid count value %u after rte_kvargs_count(check)\n",
+			count);
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	rte_kvargs_free(kvlist);
+	return 0;
+}
+
 /* test several error cases */
 static int test_invalid_kvargs(void)
 {
@@ -267,6 +277,7 @@ static struct unit_test_suite kvargs_test_suite  = {
 		TEST_CASE(test_valid_kvargs),
 		TEST_CASE(test_basic_token_count),
 		TEST_CASE(test_parse_without_valid_keys),
+		TEST_CASE(test_parse_with_valid_keys),
 		TEST_CASE(test_invalid_kvargs),
 		TEST_CASES_END() /**< NULL terminate unit test array */
 	}
-- 
2.17.1


^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH v2 5/7] app/test: extract parse list value testcase for kvargs
  2024-10-11  3:34 ` [PATCH v2 " Chengwen Feng
                     ` (3 preceding siblings ...)
  2024-10-11  3:34   ` [PATCH v2 4/7] app/test: extract with " Chengwen Feng
@ 2024-10-11  3:34   ` Chengwen Feng
  2024-10-11  3:34   ` [PATCH v2 6/7] app/test: extract parse empty elements " Chengwen Feng
  2024-10-11  3:34   ` [PATCH v2 7/7] maintainers: update for kvargs library Chengwen Feng
  6 siblings, 0 replies; 39+ messages in thread
From: Chengwen Feng @ 2024-10-11  3:34 UTC (permalink / raw)
  To: thomas, ferruh.yigit; +Cc: dev, stephen

Extract parse list value test as one stand-alone testcase.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
---
 app/test/test_kvargs.c | 54 +++++++++++++++++++++++++-----------------
 1 file changed, 32 insertions(+), 22 deletions(-)

diff --git a/app/test/test_kvargs.c b/app/test/test_kvargs.c
index 2869cd16c8..7aad68590b 100644
--- a/app/test/test_kvargs.c
+++ b/app/test/test_kvargs.c
@@ -40,28 +40,7 @@ static int test_valid_kvargs(void)
 {
 	struct rte_kvargs *kvlist;
 	const char *args;
-	const char *valid_keys_list[] = { "foo", "check", NULL };
-	const char **valid_keys;
-
-	/* third test using list as value */
-	args = "foo=[0,1],check=value2";
-	valid_keys = valid_keys_list;
-	kvlist = rte_kvargs_parse(args, valid_keys);
-	if (kvlist == NULL) {
-		printf("rte_kvargs_parse() error\n");
-		goto fail;
-	}
-	if (strcmp(kvlist->pairs[0].value, "[0,1]") != 0) {
-		printf("wrong value %s", kvlist->pairs[0].value);
-		goto fail;
-	}
-	count = kvlist->count;
-	if (count != 2) {
-		printf("invalid count value %d\n", count);
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	rte_kvargs_free(kvlist);
+	const char **valid_keys = NULL;
 
 	/* test using empty elements (it is valid) */
 	args = "foo=1,,check=value2,,";
@@ -234,6 +213,36 @@ test_parse_with_valid_keys(void)
 	return 0;
 }
 
+static int
+test_parse_list_value(void)
+{
+	const char *valid_keys[] = { "foo", "check", NULL };
+	const char *args = "foo=[0,1],check=value2";
+	struct rte_kvargs *kvlist;
+
+	kvlist = rte_kvargs_parse(args, valid_keys);
+	if (kvlist == NULL) {
+		printf("rte_kvargs_parse() error\n");
+		return -1;
+	}
+
+	count = kvlist->count;
+	if (count != 2) {
+		printf("invalid count value %u\n", count);
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	if (strcmp(kvlist->pairs[0].value, "[0,1]") != 0) {
+		printf("wrong value %s", kvlist->pairs[0].value);
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	rte_kvargs_free(kvlist);
+	return 0;
+}
+
 /* test several error cases */
 static int test_invalid_kvargs(void)
 {
@@ -278,6 +287,7 @@ static struct unit_test_suite kvargs_test_suite  = {
 		TEST_CASE(test_basic_token_count),
 		TEST_CASE(test_parse_without_valid_keys),
 		TEST_CASE(test_parse_with_valid_keys),
+		TEST_CASE(test_parse_list_value),
 		TEST_CASE(test_invalid_kvargs),
 		TEST_CASES_END() /**< NULL terminate unit test array */
 	}
-- 
2.17.1


^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH v2 6/7] app/test: extract parse empty elements testcase for kvargs
  2024-10-11  3:34 ` [PATCH v2 " Chengwen Feng
                     ` (4 preceding siblings ...)
  2024-10-11  3:34   ` [PATCH v2 5/7] app/test: extract parse list value " Chengwen Feng
@ 2024-10-11  3:34   ` Chengwen Feng
  2024-10-11  3:34   ` [PATCH v2 7/7] maintainers: update for kvargs library Chengwen Feng
  6 siblings, 0 replies; 39+ messages in thread
From: Chengwen Feng @ 2024-10-11  3:34 UTC (permalink / raw)
  To: thomas, ferruh.yigit; +Cc: dev, stephen

Extract parse empty elements test as one stand-alone testcase. And
also fix the kvlist was not released when the branch fails.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
---
 app/test/test_kvargs.c | 68 ++++++++++++++++++------------------------
 1 file changed, 29 insertions(+), 39 deletions(-)

diff --git a/app/test/test_kvargs.c b/app/test/test_kvargs.c
index 7aad68590b..d7041ba056 100644
--- a/app/test/test_kvargs.c
+++ b/app/test/test_kvargs.c
@@ -35,44 +35,6 @@ static int check_handler(const char *key, const char *value,
 	return 0;
 }
 
-/* test a valid case */
-static int test_valid_kvargs(void)
-{
-	struct rte_kvargs *kvlist;
-	const char *args;
-	const char **valid_keys = NULL;
-
-	/* test using empty elements (it is valid) */
-	args = "foo=1,,check=value2,,";
-	kvlist = rte_kvargs_parse(args, NULL);
-	if (kvlist == NULL) {
-		printf("rte_kvargs_parse() error\n");
-		goto fail;
-	}
-	if (rte_kvargs_count(kvlist, "foo") != 1) {
-		printf("invalid count value for 'foo'\n");
-		goto fail;
-	}
-	if (rte_kvargs_count(kvlist, "check") != 1) {
-		printf("invalid count value for 'check'\n");
-		goto fail;
-	}
-	rte_kvargs_free(kvlist);
-
-	return 0;
-
- fail:
-	printf("while processing <%s>", args);
-	if (valid_keys != NULL && *valid_keys != NULL) {
-		printf(" using valid_keys=<%s", *valid_keys);
-		while (*(++valid_keys) != NULL)
-			printf(",%s", *valid_keys);
-		printf(">");
-	}
-	printf("\n");
-	return -1;
-}
-
 static int
 test_basic_token_count(void)
 {
@@ -243,6 +205,34 @@ test_parse_list_value(void)
 	return 0;
 }
 
+static int
+test_parse_empty_elements(void)
+{
+	const char *args = "foo=1,,check=value2,,";
+	struct rte_kvargs *kvlist;
+
+	kvlist = rte_kvargs_parse(args, NULL);
+	if (kvlist == NULL) {
+		printf("rte_kvargs_parse() error\n");
+		return -1;
+	}
+
+	if (rte_kvargs_count(kvlist, "foo") != 1) {
+		printf("invalid count value for 'foo'\n");
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	if (rte_kvargs_count(kvlist, "check") != 1) {
+		printf("invalid count value for 'check'\n");
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	rte_kvargs_free(kvlist);
+	return 0;
+}
+
 /* test several error cases */
 static int test_invalid_kvargs(void)
 {
@@ -283,11 +273,11 @@ static struct unit_test_suite kvargs_test_suite  = {
 	.setup = NULL,
 	.teardown = NULL,
 	.unit_test_cases = {
-		TEST_CASE(test_valid_kvargs),
 		TEST_CASE(test_basic_token_count),
 		TEST_CASE(test_parse_without_valid_keys),
 		TEST_CASE(test_parse_with_valid_keys),
 		TEST_CASE(test_parse_list_value),
+		TEST_CASE(test_parse_empty_elements),
 		TEST_CASE(test_invalid_kvargs),
 		TEST_CASES_END() /**< NULL terminate unit test array */
 	}
-- 
2.17.1


^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH v2 7/7] maintainers: update for kvargs library
  2024-10-11  3:34 ` [PATCH v2 " Chengwen Feng
                     ` (5 preceding siblings ...)
  2024-10-11  3:34   ` [PATCH v2 6/7] app/test: extract parse empty elements " Chengwen Feng
@ 2024-10-11  3:34   ` Chengwen Feng
  6 siblings, 0 replies; 39+ messages in thread
From: Chengwen Feng @ 2024-10-11  3:34 UTC (permalink / raw)
  To: thomas, ferruh.yigit; +Cc: dev, stephen

Add myself for voluntary maintenance of the kvargs library.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
---
 MAINTAINERS | 1 +
 1 file changed, 1 insertion(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index 7d171e3d45..7e320335d7 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1713,6 +1713,7 @@ F: doc/guides/prog_guide/cmdline.rst
 F: doc/guides/sample_app_ug/cmd_line.rst
 
 Key/Value parsing
+M: Chengwen Feng <fengchengwen@huawei.com>
 F: lib/kvargs/
 F: app/test/test_kvargs.c
 
-- 
2.17.1


^ permalink raw reply	[flat|nested] 39+ messages in thread

* Re: [PATCH 1/7] app/test: introduce UT suite framework for kvargs
  2024-10-11  2:08   ` Stephen Hemminger
@ 2024-10-11  3:35     ` fengchengwen
  0 siblings, 0 replies; 39+ messages in thread
From: fengchengwen @ 2024-10-11  3:35 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: thomas, ferruh.yigit, dev

On 2024/10/11 10:08, Stephen Hemminger wrote:
> On Fri, 3 Nov 2023 09:53:19 +0000
> Chengwen Feng <fengchengwen@huawei.com> wrote:
> 
>> Introduce unit test suite framework for test_kvargs.c.
>>
>> Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
>> ---
>>  app/test/test_kvargs.c | 20 +++++++++++++-------
>>  1 file changed, 13 insertions(+), 7 deletions(-)
>>
>> diff --git a/app/test/test_kvargs.c b/app/test/test_kvargs.c
>> index 7a60cac4c1..9aeb9aa0aa 100644
>> --- a/app/test/test_kvargs.c
>> +++ b/app/test/test_kvargs.c
>> @@ -1,5 +1,6 @@
>>  /* SPDX-License-Identifier: BSD-3-Clause
>>   * Copyright 2014 6WIND S.A.
>> + * Copyright(c) 2023 HiSilicon Limited
>>   */
> 
> The test changes look good and it is always better to have more tests.
> 
> IANAL but starting the precedent of allowing adding copyright whenever a file
> is touched just leads to lots of meaningless fluff.

OK, I sent v2 which remove this line.

^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH v3 0/8] refactor kvargs test
  2023-11-03  9:53 [PATCH 0/7] refactor kvargs test Chengwen Feng
                   ` (9 preceding siblings ...)
  2024-10-11  3:34 ` [PATCH v2 " Chengwen Feng
@ 2024-10-22  6:14 ` Chengwen Feng
  2024-10-22  6:14   ` [PATCH v3 1/8] app/test: introduce UT suite framework for kvargs Chengwen Feng
                     ` (7 more replies)
  2024-10-30  8:54 ` [PATCH v4 0/7] refactor kvargs test Chengwen Feng
  11 siblings, 8 replies; 39+ messages in thread
From: Chengwen Feng @ 2024-10-22  6:14 UTC (permalink / raw)
  To: thomas, ferruh.yigit; +Cc: dev, stephen

When developing patchset [1], I found the kvargs test is hard to
understand when tried to add some testcase.

So refactor kvargs by:
1. introduce UT suite framework.
2. extract big test_valid_kvargs() to five part.

And add myself for voluntary maintenance of the kvargs library.

[1] https://patchwork.dpdk.org/project/dpdk/cover/20231103073811.13196-1-fengchengwen@huawei.com/

Chengwen Feng (8):
  app/test: introduce UT suite framework for kvargs
  app/test: extract basic token count testcase for kvargs
  app/test: extract without keys testcase for kvargs
  app/test: extract with keys testcase for kvargs
  app/test: extract parse list value testcase for kvargs
  app/test: extract parse empty elements testcase for kvargs
  app/test: add process opt testcase for kvargs
  maintainers: update for kvargs library

---
v3: add rte_kvargs_process_opt()'s testcase.
v2: remove copyright line and add Stephen's ack.

 MAINTAINERS            |   1 +
 app/test/test_kvargs.c | 326 +++++++++++++++++++++++++----------------
 2 files changed, 200 insertions(+), 127 deletions(-)

-- 
2.17.1


^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH v3 1/8] app/test: introduce UT suite framework for kvargs
  2024-10-22  6:14 ` [PATCH v3 0/8] refactor kvargs test Chengwen Feng
@ 2024-10-22  6:14   ` Chengwen Feng
  2024-10-22  6:14   ` [PATCH v3 2/8] app/test: extract basic token count testcase " Chengwen Feng
                     ` (6 subsequent siblings)
  7 siblings, 0 replies; 39+ messages in thread
From: Chengwen Feng @ 2024-10-22  6:14 UTC (permalink / raw)
  To: thomas, ferruh.yigit; +Cc: dev, stephen

Introduce unit test suite framework for test_kvargs.c.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
---
 app/test/test_kvargs.c | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/app/test/test_kvargs.c b/app/test/test_kvargs.c
index 7a60cac4c1..1c46fbcaab 100644
--- a/app/test/test_kvargs.c
+++ b/app/test/test_kvargs.c
@@ -280,16 +280,21 @@ static int test_invalid_kvargs(void)
 	return -1;
 }
 
+static struct unit_test_suite kvargs_test_suite  = {
+	.suite_name = "Kvargs Unit Test Suite",
+	.setup = NULL,
+	.teardown = NULL,
+	.unit_test_cases = {
+		TEST_CASE(test_valid_kvargs),
+		TEST_CASE(test_invalid_kvargs),
+		TEST_CASES_END() /**< NULL terminate unit test array */
+	}
+};
+
 static int
 test_kvargs(void)
 {
-	printf("== test valid case ==\n");
-	if (test_valid_kvargs() < 0)
-		return -1;
-	printf("== test invalid case ==\n");
-	if (test_invalid_kvargs() < 0)
-		return -1;
-	return 0;
+	return unit_test_suite_runner(&kvargs_test_suite);
 }
 
 REGISTER_FAST_TEST(kvargs_autotest, true, true, test_kvargs);
-- 
2.17.1


^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH v3 2/8] app/test: extract basic token count testcase for kvargs
  2024-10-22  6:14 ` [PATCH v3 0/8] refactor kvargs test Chengwen Feng
  2024-10-22  6:14   ` [PATCH v3 1/8] app/test: introduce UT suite framework for kvargs Chengwen Feng
@ 2024-10-22  6:14   ` Chengwen Feng
  2024-10-22  6:14   ` [PATCH v3 3/8] app/test: extract without keys " Chengwen Feng
                     ` (5 subsequent siblings)
  7 siblings, 0 replies; 39+ messages in thread
From: Chengwen Feng @ 2024-10-22  6:14 UTC (permalink / raw)
  To: thomas, ferruh.yigit; +Cc: dev, stephen

The test_valid_kvargs() function is too long to understand, extract
the basic token count tests as one stand-alone testcase.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
---
 app/test/test_kvargs.c | 120 ++++++++++++++++-------------------------
 1 file changed, 45 insertions(+), 75 deletions(-)

diff --git a/app/test/test_kvargs.c b/app/test/test_kvargs.c
index 1c46fbcaab..a9808a6f87 100644
--- a/app/test/test_kvargs.c
+++ b/app/test/test_kvargs.c
@@ -35,25 +35,6 @@ static int check_handler(const char *key, const char *value,
 	return 0;
 }
 
-/* test parsing. */
-static int test_kvargs_parsing(const char *args, unsigned int n)
-{
-	struct rte_kvargs *kvlist;
-
-	kvlist = rte_kvargs_parse(args, NULL);
-	if (kvlist == NULL) {
-		printf("rte_kvargs_parse() error: %s\n", args);
-		return -1;
-	}
-	if (kvlist->count != n) {
-		printf("invalid count value %d: %s\n", kvlist->count, args);
-		rte_kvargs_free(kvlist);
-		return -1;
-	}
-	rte_kvargs_free(kvlist);
-	return 0;
-}
-
 /* test a valid case */
 static int test_valid_kvargs(void)
 {
@@ -61,29 +42,6 @@ static int test_valid_kvargs(void)
 	const char *args;
 	const char *valid_keys_list[] = { "foo", "check", NULL };
 	const char **valid_keys;
-	static const struct {
-		unsigned int expected;
-		const char *input;
-	} valid_inputs[] = {
-		{ 2, "foo=1,foo=" },
-		{ 2, "foo=1,foo=" },
-		{ 2, "foo=1,foo" },
-		{ 2, "foo=1,=2" },
-		{ 1, "foo=[1,2" },
-		{ 1, ",=" },
-		{ 1, "foo=[" },
-	};
-	unsigned int i;
-
-	/* empty args is valid */
-	args = "";
-	valid_keys = NULL;
-	kvlist = rte_kvargs_parse(args, valid_keys);
-	if (kvlist == NULL) {
-		printf("rte_kvargs_parse() error");
-		goto fail;
-	}
-	rte_kvargs_free(kvlist);
 
 	/* first test without valid_keys */
 	args = "foo=1234,check=value0,check=value1";
@@ -127,14 +85,6 @@ static int test_valid_kvargs(void)
 		rte_kvargs_free(kvlist);
 		goto fail;
 	}
-	/* count all entries */
-	count = rte_kvargs_count(kvlist, NULL);
-	if (count != 3) {
-		printf("invalid count value %d after rte_kvargs_count(NULL)\n",
-			count);
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
 	/* count all entries with key="nonexistent_key" */
 	count = rte_kvargs_count(kvlist, "nonexistent_key");
 	if (count != 0) {
@@ -189,19 +139,6 @@ static int test_valid_kvargs(void)
 	}
 	rte_kvargs_free(kvlist);
 
-	/* test using empty string (it is valid) */
-	args = "";
-	kvlist = rte_kvargs_parse(args, NULL);
-	if (kvlist == NULL) {
-		printf("rte_kvargs_parse() error\n");
-		goto fail;
-	}
-	if (rte_kvargs_count(kvlist, NULL) != 0) {
-		printf("invalid count value\n");
-		goto fail;
-	}
-	rte_kvargs_free(kvlist);
-
 	/* test using empty elements (it is valid) */
 	args = "foo=1,,check=value2,,";
 	kvlist = rte_kvargs_parse(args, NULL);
@@ -209,10 +146,6 @@ static int test_valid_kvargs(void)
 		printf("rte_kvargs_parse() error\n");
 		goto fail;
 	}
-	if (rte_kvargs_count(kvlist, NULL) != 2) {
-		printf("invalid count value\n");
-		goto fail;
-	}
 	if (rte_kvargs_count(kvlist, "foo") != 1) {
 		printf("invalid count value for 'foo'\n");
 		goto fail;
@@ -223,14 +156,6 @@ static int test_valid_kvargs(void)
 	}
 	rte_kvargs_free(kvlist);
 
-	valid_keys = NULL;
-
-	for (i = 0; i < RTE_DIM(valid_inputs); ++i) {
-		args = valid_inputs[i].input;
-		if (test_kvargs_parsing(args, valid_inputs[i].expected))
-			goto fail;
-	}
-
 	return 0;
 
  fail:
@@ -245,6 +170,50 @@ static int test_valid_kvargs(void)
 	return -1;
 }
 
+static int
+test_basic_token_count(void)
+{
+	static const struct {
+		unsigned int expected;
+		const char *input;
+	} valid_inputs[] = {
+		{ 3, "foo=1,check=1,check=2" },
+		{ 3, "foo=1,check,check=2"   },
+		{ 2, "foo=1,foo="            },
+		{ 2, "foo=1,foo="            },
+		{ 2, "foo=1,foo"             },
+		{ 2, "foo=1,=2"              },
+		{ 2, "foo=1,,foo=2,,"        },
+		{ 1, "foo=[1,2"              },
+		{ 1, ",="                    },
+		{ 1, "foo=["                 },
+		{ 0, ""                      },
+	};
+	struct rte_kvargs *kvlist;
+	unsigned int count;
+	const char *args;
+	unsigned int i;
+
+	for (i = 0; i < RTE_DIM(valid_inputs); i++) {
+		args = valid_inputs[i].input;
+		kvlist = rte_kvargs_parse(args, NULL);
+		if (kvlist == NULL) {
+			printf("rte_kvargs_parse() error: %s\n", args);
+			return -1;
+		}
+		count = rte_kvargs_count(kvlist, NULL);
+		if (count != valid_inputs[i].expected) {
+			printf("invalid count value %u (expected %u): %s\n",
+			       count, valid_inputs[i].expected, args);
+			rte_kvargs_free(kvlist);
+			return -1;
+		}
+		rte_kvargs_free(kvlist);
+	}
+
+	return 0;
+}
+
 /* test several error cases */
 static int test_invalid_kvargs(void)
 {
@@ -286,6 +255,7 @@ static struct unit_test_suite kvargs_test_suite  = {
 	.teardown = NULL,
 	.unit_test_cases = {
 		TEST_CASE(test_valid_kvargs),
+		TEST_CASE(test_basic_token_count),
 		TEST_CASE(test_invalid_kvargs),
 		TEST_CASES_END() /**< NULL terminate unit test array */
 	}
-- 
2.17.1


^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH v3 3/8] app/test: extract without keys testcase for kvargs
  2024-10-22  6:14 ` [PATCH v3 0/8] refactor kvargs test Chengwen Feng
  2024-10-22  6:14   ` [PATCH v3 1/8] app/test: introduce UT suite framework for kvargs Chengwen Feng
  2024-10-22  6:14   ` [PATCH v3 2/8] app/test: extract basic token count testcase " Chengwen Feng
@ 2024-10-22  6:14   ` Chengwen Feng
  2024-10-22  6:14   ` [PATCH v3 4/8] app/test: extract with " Chengwen Feng
                     ` (4 subsequent siblings)
  7 siblings, 0 replies; 39+ messages in thread
From: Chengwen Feng @ 2024-10-22  6:14 UTC (permalink / raw)
  To: thomas, ferruh.yigit; +Cc: dev, stephen

The test_valid_kvargs() function is too long to understand, extract
the without keys tests as one stand-alone testcase.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
---
 app/test/test_kvargs.c | 115 ++++++++++++++++++++++-------------------
 1 file changed, 63 insertions(+), 52 deletions(-)

diff --git a/app/test/test_kvargs.c b/app/test/test_kvargs.c
index a9808a6f87..2147080160 100644
--- a/app/test/test_kvargs.c
+++ b/app/test/test_kvargs.c
@@ -43,58 +43,6 @@ static int test_valid_kvargs(void)
 	const char *valid_keys_list[] = { "foo", "check", NULL };
 	const char **valid_keys;
 
-	/* first test without valid_keys */
-	args = "foo=1234,check=value0,check=value1";
-	valid_keys = NULL;
-	kvlist = rte_kvargs_parse(args, valid_keys);
-	if (kvlist == NULL) {
-		printf("rte_kvargs_parse() error");
-		goto fail;
-	}
-	/* call check_handler() for all entries with key="check" */
-	count = 0;
-	if (rte_kvargs_process(kvlist, "check", check_handler, NULL) < 0) {
-		printf("rte_kvargs_process() error\n");
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	if (count != 2) {
-		printf("invalid count value %d after rte_kvargs_process(check)\n",
-			count);
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	count = 0;
-	/* call check_handler() for all entries with key="nonexistent_key" */
-	if (rte_kvargs_process(kvlist, "nonexistent_key", check_handler, NULL) < 0) {
-		printf("rte_kvargs_process() error\n");
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	if (count != 0) {
-		printf("invalid count value %d after rte_kvargs_process(nonexistent_key)\n",
-			count);
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	/* count all entries with key="foo" */
-	count = rte_kvargs_count(kvlist, "foo");
-	if (count != 1) {
-		printf("invalid count value %d after rte_kvargs_count(foo)\n",
-			count);
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	/* count all entries with key="nonexistent_key" */
-	count = rte_kvargs_count(kvlist, "nonexistent_key");
-	if (count != 0) {
-		printf("invalid count value %d after rte_kvargs_count(nonexistent_key)\n",
-			count);
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	rte_kvargs_free(kvlist);
-
 	/* second test using valid_keys */
 	args = "foo=droids,check=value0,check=value1,check=wrong_value";
 	valid_keys = valid_keys_list;
@@ -214,6 +162,68 @@ test_basic_token_count(void)
 	return 0;
 }
 
+static int
+test_parse_without_valid_keys(void)
+{
+	const char *args = "foo=1234,check=value0,check=value1";
+	struct rte_kvargs *kvlist;
+
+	kvlist = rte_kvargs_parse(args, NULL);
+	if (kvlist == NULL) {
+		printf("rte_kvargs_parse() error\n");
+		return -1;
+	}
+
+	/* call check_handler() for all entries with key="check" */
+	count = 0;
+	if (rte_kvargs_process(kvlist, "check", check_handler, NULL) < 0) {
+		printf("rte_kvargs_process(check) error\n");
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+	if (count != 2) {
+		printf("invalid count value %u after rte_kvargs_process(check)\n",
+			count);
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	/* call check_handler() for all entries with key="nonexistent_key" */
+	count = 0;
+	if (rte_kvargs_process(kvlist, "nonexistent_key", check_handler, NULL) < 0) {
+		printf("rte_kvargs_process(nonexistent_key) error\n");
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+	if (count != 0) {
+		printf("invalid count value %d after rte_kvargs_process(nonexistent_key)\n",
+			count);
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	/* count all entries with key="foo" */
+	count = rte_kvargs_count(kvlist, "foo");
+	if (count != 1) {
+		printf("invalid count value %d after rte_kvargs_count(foo)\n",
+			count);
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	/* count all entries with key="nonexistent_key" */
+	count = rte_kvargs_count(kvlist, "nonexistent_key");
+	if (count != 0) {
+		printf("invalid count value %d after rte_kvargs_count(nonexistent_key)\n",
+			count);
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	rte_kvargs_free(kvlist);
+	return 0;
+}
+
 /* test several error cases */
 static int test_invalid_kvargs(void)
 {
@@ -256,6 +266,7 @@ static struct unit_test_suite kvargs_test_suite  = {
 	.unit_test_cases = {
 		TEST_CASE(test_valid_kvargs),
 		TEST_CASE(test_basic_token_count),
+		TEST_CASE(test_parse_without_valid_keys),
 		TEST_CASE(test_invalid_kvargs),
 		TEST_CASES_END() /**< NULL terminate unit test array */
 	}
-- 
2.17.1


^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH v3 4/8] app/test: extract with keys testcase for kvargs
  2024-10-22  6:14 ` [PATCH v3 0/8] refactor kvargs test Chengwen Feng
                     ` (2 preceding siblings ...)
  2024-10-22  6:14   ` [PATCH v3 3/8] app/test: extract without keys " Chengwen Feng
@ 2024-10-22  6:14   ` Chengwen Feng
  2024-10-22  6:14   ` [PATCH v3 5/8] app/test: extract parse list value " Chengwen Feng
                     ` (3 subsequent siblings)
  7 siblings, 0 replies; 39+ messages in thread
From: Chengwen Feng @ 2024-10-22  6:14 UTC (permalink / raw)
  To: thomas, ferruh.yigit; +Cc: dev, stephen

The test_valid_kvargs() function is too long to understand, extract
the with keys tests as one stand-alone testcase.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
---
 app/test/test_kvargs.c | 60 +++++++++++++++++++++++++-----------------
 1 file changed, 36 insertions(+), 24 deletions(-)

diff --git a/app/test/test_kvargs.c b/app/test/test_kvargs.c
index 2147080160..8b53d6d585 100644
--- a/app/test/test_kvargs.c
+++ b/app/test/test_kvargs.c
@@ -43,30 +43,6 @@ static int test_valid_kvargs(void)
 	const char *valid_keys_list[] = { "foo", "check", NULL };
 	const char **valid_keys;
 
-	/* second test using valid_keys */
-	args = "foo=droids,check=value0,check=value1,check=wrong_value";
-	valid_keys = valid_keys_list;
-	kvlist = rte_kvargs_parse(args, valid_keys);
-	if (kvlist == NULL) {
-		printf("rte_kvargs_parse() error");
-		goto fail;
-	}
-	/* call check_handler() on all entries with key="check", it
-	 * should fail as the value is not recognized by the handler */
-	if (rte_kvargs_process(kvlist, "check", check_handler, NULL) == 0) {
-		printf("rte_kvargs_process() is success but should not\n");
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	count = rte_kvargs_count(kvlist, "check");
-	if (count != 3) {
-		printf("invalid count value %d after rte_kvargs_count(check)\n",
-			count);
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	rte_kvargs_free(kvlist);
-
 	/* third test using list as value */
 	args = "foo=[0,1],check=value2";
 	valid_keys = valid_keys_list;
@@ -224,6 +200,41 @@ test_parse_without_valid_keys(void)
 	return 0;
 }
 
+static int
+test_parse_with_valid_keys(void)
+{
+	const char *args = "foo=droids,check=value0,check=value1,check=wrong_value";
+	const char *valid_keys[] = { "foo", "check", NULL };
+	struct rte_kvargs *kvlist;
+
+	kvlist = rte_kvargs_parse(args, valid_keys);
+	if (kvlist == NULL) {
+		printf("rte_kvargs_parse() error\n");
+		return -1;
+	}
+
+	/* call check_handler() on all entries with key="check", it
+	 * should fail as the value is not recognized by the handler
+	 */
+	count = 0;
+	if (rte_kvargs_process(kvlist, "check", check_handler, NULL) == 0 || count != 2) {
+		printf("rte_kvargs_process(check) is success but should not\n");
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	count = rte_kvargs_count(kvlist, "check");
+	if (count != 3) {
+		printf("invalid count value %u after rte_kvargs_count(check)\n",
+			count);
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	rte_kvargs_free(kvlist);
+	return 0;
+}
+
 /* test several error cases */
 static int test_invalid_kvargs(void)
 {
@@ -267,6 +278,7 @@ static struct unit_test_suite kvargs_test_suite  = {
 		TEST_CASE(test_valid_kvargs),
 		TEST_CASE(test_basic_token_count),
 		TEST_CASE(test_parse_without_valid_keys),
+		TEST_CASE(test_parse_with_valid_keys),
 		TEST_CASE(test_invalid_kvargs),
 		TEST_CASES_END() /**< NULL terminate unit test array */
 	}
-- 
2.17.1


^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH v3 5/8] app/test: extract parse list value testcase for kvargs
  2024-10-22  6:14 ` [PATCH v3 0/8] refactor kvargs test Chengwen Feng
                     ` (3 preceding siblings ...)
  2024-10-22  6:14   ` [PATCH v3 4/8] app/test: extract with " Chengwen Feng
@ 2024-10-22  6:14   ` Chengwen Feng
  2024-10-22  6:14   ` [PATCH v3 6/8] app/test: extract parse empty elements " Chengwen Feng
                     ` (2 subsequent siblings)
  7 siblings, 0 replies; 39+ messages in thread
From: Chengwen Feng @ 2024-10-22  6:14 UTC (permalink / raw)
  To: thomas, ferruh.yigit; +Cc: dev, stephen

Extract parse list value test as one stand-alone testcase.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
---
 app/test/test_kvargs.c | 54 +++++++++++++++++++++++++-----------------
 1 file changed, 32 insertions(+), 22 deletions(-)

diff --git a/app/test/test_kvargs.c b/app/test/test_kvargs.c
index 8b53d6d585..f8d668f2cc 100644
--- a/app/test/test_kvargs.c
+++ b/app/test/test_kvargs.c
@@ -40,28 +40,7 @@ static int test_valid_kvargs(void)
 {
 	struct rte_kvargs *kvlist;
 	const char *args;
-	const char *valid_keys_list[] = { "foo", "check", NULL };
-	const char **valid_keys;
-
-	/* third test using list as value */
-	args = "foo=[0,1],check=value2";
-	valid_keys = valid_keys_list;
-	kvlist = rte_kvargs_parse(args, valid_keys);
-	if (kvlist == NULL) {
-		printf("rte_kvargs_parse() error\n");
-		goto fail;
-	}
-	if (strcmp(kvlist->pairs[0].value, "[0,1]") != 0) {
-		printf("wrong value %s", kvlist->pairs[0].value);
-		goto fail;
-	}
-	count = kvlist->count;
-	if (count != 2) {
-		printf("invalid count value %d\n", count);
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	rte_kvargs_free(kvlist);
+	const char **valid_keys = NULL;
 
 	/* test using empty elements (it is valid) */
 	args = "foo=1,,check=value2,,";
@@ -235,6 +214,36 @@ test_parse_with_valid_keys(void)
 	return 0;
 }
 
+static int
+test_parse_list_value(void)
+{
+	const char *valid_keys[] = { "foo", "check", NULL };
+	const char *args = "foo=[0,1],check=value2";
+	struct rte_kvargs *kvlist;
+
+	kvlist = rte_kvargs_parse(args, valid_keys);
+	if (kvlist == NULL) {
+		printf("rte_kvargs_parse() error\n");
+		return -1;
+	}
+
+	count = kvlist->count;
+	if (count != 2) {
+		printf("invalid count value %u\n", count);
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	if (strcmp(kvlist->pairs[0].value, "[0,1]") != 0) {
+		printf("wrong value %s", kvlist->pairs[0].value);
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	rte_kvargs_free(kvlist);
+	return 0;
+}
+
 /* test several error cases */
 static int test_invalid_kvargs(void)
 {
@@ -279,6 +288,7 @@ static struct unit_test_suite kvargs_test_suite  = {
 		TEST_CASE(test_basic_token_count),
 		TEST_CASE(test_parse_without_valid_keys),
 		TEST_CASE(test_parse_with_valid_keys),
+		TEST_CASE(test_parse_list_value),
 		TEST_CASE(test_invalid_kvargs),
 		TEST_CASES_END() /**< NULL terminate unit test array */
 	}
-- 
2.17.1


^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH v3 6/8] app/test: extract parse empty elements testcase for kvargs
  2024-10-22  6:14 ` [PATCH v3 0/8] refactor kvargs test Chengwen Feng
                     ` (4 preceding siblings ...)
  2024-10-22  6:14   ` [PATCH v3 5/8] app/test: extract parse list value " Chengwen Feng
@ 2024-10-22  6:14   ` Chengwen Feng
  2024-10-22  6:14   ` [PATCH v3 7/8] app/test: add process opt " Chengwen Feng
  2024-10-22  6:14   ` [PATCH v3 8/8] maintainers: update for kvargs library Chengwen Feng
  7 siblings, 0 replies; 39+ messages in thread
From: Chengwen Feng @ 2024-10-22  6:14 UTC (permalink / raw)
  To: thomas, ferruh.yigit; +Cc: dev, stephen

Extract parse empty elements test as one stand-alone testcase. And
also fix the kvlist was not released when the branch fails.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
---
 app/test/test_kvargs.c | 68 ++++++++++++++++++------------------------
 1 file changed, 29 insertions(+), 39 deletions(-)

diff --git a/app/test/test_kvargs.c b/app/test/test_kvargs.c
index f8d668f2cc..d1e668ac4a 100644
--- a/app/test/test_kvargs.c
+++ b/app/test/test_kvargs.c
@@ -35,44 +35,6 @@ static int check_handler(const char *key, const char *value,
 	return 0;
 }
 
-/* test a valid case */
-static int test_valid_kvargs(void)
-{
-	struct rte_kvargs *kvlist;
-	const char *args;
-	const char **valid_keys = NULL;
-
-	/* test using empty elements (it is valid) */
-	args = "foo=1,,check=value2,,";
-	kvlist = rte_kvargs_parse(args, NULL);
-	if (kvlist == NULL) {
-		printf("rte_kvargs_parse() error\n");
-		goto fail;
-	}
-	if (rte_kvargs_count(kvlist, "foo") != 1) {
-		printf("invalid count value for 'foo'\n");
-		goto fail;
-	}
-	if (rte_kvargs_count(kvlist, "check") != 1) {
-		printf("invalid count value for 'check'\n");
-		goto fail;
-	}
-	rte_kvargs_free(kvlist);
-
-	return 0;
-
- fail:
-	printf("while processing <%s>", args);
-	if (valid_keys != NULL && *valid_keys != NULL) {
-		printf(" using valid_keys=<%s", *valid_keys);
-		while (*(++valid_keys) != NULL)
-			printf(",%s", *valid_keys);
-		printf(">");
-	}
-	printf("\n");
-	return -1;
-}
-
 static int
 test_basic_token_count(void)
 {
@@ -244,6 +206,34 @@ test_parse_list_value(void)
 	return 0;
 }
 
+static int
+test_parse_empty_elements(void)
+{
+	const char *args = "foo=1,,check=value2,,";
+	struct rte_kvargs *kvlist;
+
+	kvlist = rte_kvargs_parse(args, NULL);
+	if (kvlist == NULL) {
+		printf("rte_kvargs_parse() error\n");
+		return -1;
+	}
+
+	if (rte_kvargs_count(kvlist, "foo") != 1) {
+		printf("invalid count value for 'foo'\n");
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	if (rte_kvargs_count(kvlist, "check") != 1) {
+		printf("invalid count value for 'check'\n");
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	rte_kvargs_free(kvlist);
+	return 0;
+}
+
 /* test several error cases */
 static int test_invalid_kvargs(void)
 {
@@ -284,11 +274,11 @@ static struct unit_test_suite kvargs_test_suite  = {
 	.setup = NULL,
 	.teardown = NULL,
 	.unit_test_cases = {
-		TEST_CASE(test_valid_kvargs),
 		TEST_CASE(test_basic_token_count),
 		TEST_CASE(test_parse_without_valid_keys),
 		TEST_CASE(test_parse_with_valid_keys),
 		TEST_CASE(test_parse_list_value),
+		TEST_CASE(test_parse_empty_elements),
 		TEST_CASE(test_invalid_kvargs),
 		TEST_CASES_END() /**< NULL terminate unit test array */
 	}
-- 
2.17.1


^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH v3 7/8] app/test: add process opt testcase for kvargs
  2024-10-22  6:14 ` [PATCH v3 0/8] refactor kvargs test Chengwen Feng
                     ` (5 preceding siblings ...)
  2024-10-22  6:14   ` [PATCH v3 6/8] app/test: extract parse empty elements " Chengwen Feng
@ 2024-10-22  6:14   ` Chengwen Feng
  2024-10-22  6:14   ` [PATCH v3 8/8] maintainers: update for kvargs library Chengwen Feng
  7 siblings, 0 replies; 39+ messages in thread
From: Chengwen Feng @ 2024-10-22  6:14 UTC (permalink / raw)
  To: thomas, ferruh.yigit; +Cc: dev, stephen

This commit adds rte_kvargs_process_opt() API's testcase.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
---
 app/test/test_kvargs.c | 106 ++++++++++++++++++++++++++++++++++-------
 1 file changed, 90 insertions(+), 16 deletions(-)

diff --git a/app/test/test_kvargs.c b/app/test/test_kvargs.c
index d1e668ac4a..43bb7a0243 100644
--- a/app/test/test_kvargs.c
+++ b/app/test/test_kvargs.c
@@ -11,14 +11,20 @@
 
 #include "test.h"
 
+typedef int (*f_kvargs_process)(const struct rte_kvargs *kvlist,
+				const char *key_match, arg_handler_t handler,
+				void *opaque_arg);
+
+static bool use_kvargs_process_opt[] = { false, true };
+
 /* incremented in handler, to check it is properly called once per
  * key/value association */
 static unsigned count;
 
 /* this handler increment the "count" variable at each call and check
  * that the key is "check" and the value is "value%d" */
-static int check_handler(const char *key, const char *value,
-	__rte_unused void *opaque)
+static int
+check_handler(const char *key, const char *value, __rte_unused void *opaque)
 {
 	char buf[16];
 
@@ -35,6 +41,18 @@ static int check_handler(const char *key, const char *value,
 	return 0;
 }
 
+static int
+check_only_handler(const char *key, const char *value, __rte_unused void *opaque)
+{
+	if (strcmp(key, "check"))
+		return -1;
+
+	if (value != NULL)
+		return -1;
+
+	return 0;
+}
+
 static int
 test_basic_token_count(void)
 {
@@ -80,8 +98,11 @@ test_basic_token_count(void)
 }
 
 static int
-test_parse_without_valid_keys(void)
+test_parse_without_valid_keys(const void *params)
 {
+	const bool use_opt = *(const bool *)params;
+	f_kvargs_process proc_func = use_opt ? rte_kvargs_process_opt : rte_kvargs_process;
+	const char *proc_name = use_opt ? "rte_kvargs_process_opt" : "rte_kvargs_process";
 	const char *args = "foo=1234,check=value0,check=value1";
 	struct rte_kvargs *kvlist;
 
@@ -93,28 +114,28 @@ test_parse_without_valid_keys(void)
 
 	/* call check_handler() for all entries with key="check" */
 	count = 0;
-	if (rte_kvargs_process(kvlist, "check", check_handler, NULL) < 0) {
-		printf("rte_kvargs_process(check) error\n");
+	if (proc_func(kvlist, "check", check_handler, NULL) < 0) {
+		printf("%s(check) error\n", proc_name);
 		rte_kvargs_free(kvlist);
 		return -1;
 	}
 	if (count != 2) {
-		printf("invalid count value %u after rte_kvargs_process(check)\n",
-			count);
+		printf("invalid count value %u after %s(check)\n",
+			count, proc_name);
 		rte_kvargs_free(kvlist);
 		return -1;
 	}
 
 	/* call check_handler() for all entries with key="nonexistent_key" */
 	count = 0;
-	if (rte_kvargs_process(kvlist, "nonexistent_key", check_handler, NULL) < 0) {
-		printf("rte_kvargs_process(nonexistent_key) error\n");
+	if (proc_func(kvlist, "nonexistent_key", check_handler, NULL) < 0) {
+		printf("%s(nonexistent_key) error\n", proc_name);
 		rte_kvargs_free(kvlist);
 		return -1;
 	}
 	if (count != 0) {
-		printf("invalid count value %d after rte_kvargs_process(nonexistent_key)\n",
-			count);
+		printf("invalid count value %d after %s(nonexistent_key)\n",
+			count, proc_name);
 		rte_kvargs_free(kvlist);
 		return -1;
 	}
@@ -142,8 +163,11 @@ test_parse_without_valid_keys(void)
 }
 
 static int
-test_parse_with_valid_keys(void)
+test_parse_with_valid_keys(const void *params)
 {
+	const bool use_opt = *(const bool *)params;
+	f_kvargs_process proc_func = use_opt ? rte_kvargs_process_opt : rte_kvargs_process;
+	const char *proc_name = use_opt ? "rte_kvargs_process_opt" : "rte_kvargs_process";
 	const char *args = "foo=droids,check=value0,check=value1,check=wrong_value";
 	const char *valid_keys[] = { "foo", "check", NULL };
 	struct rte_kvargs *kvlist;
@@ -158,8 +182,8 @@ test_parse_with_valid_keys(void)
 	 * should fail as the value is not recognized by the handler
 	 */
 	count = 0;
-	if (rte_kvargs_process(kvlist, "check", check_handler, NULL) == 0 || count != 2) {
-		printf("rte_kvargs_process(check) is success but should not\n");
+	if (proc_func(kvlist, "check", check_handler, NULL) == 0 || count != 2) {
+		printf("%s(check) is success but should not\n", proc_name);
 		rte_kvargs_free(kvlist);
 		return -1;
 	}
@@ -218,6 +242,13 @@ test_parse_empty_elements(void)
 		return -1;
 	}
 
+	count = kvlist->count;
+	if (count != 2) {
+		printf("invalid count value %u\n", count);
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
 	if (rte_kvargs_count(kvlist, "foo") != 1) {
 		printf("invalid count value for 'foo'\n");
 		rte_kvargs_free(kvlist);
@@ -234,6 +265,34 @@ test_parse_empty_elements(void)
 	return 0;
 }
 
+static int
+test_parse_with_only_key(void)
+{
+	const char *args = "foo,check";
+	struct rte_kvargs *kvlist;
+
+	kvlist = rte_kvargs_parse(args, NULL);
+	if (kvlist == NULL) {
+		printf("rte_kvargs_parse() error\n");
+		return -1;
+	}
+
+	if (rte_kvargs_process(kvlist, "check", check_only_handler, NULL) == 0) {
+		printf("rte_kvargs_process(check) error\n");
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	if (rte_kvargs_process_opt(kvlist, "check", check_only_handler, NULL) != 0) {
+		printf("rte_kvargs_process_opt(check) error\n");
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	rte_kvargs_free(kvlist);
+	return 0;
+}
+
 /* test several error cases */
 static int test_invalid_kvargs(void)
 {
@@ -275,10 +334,25 @@ static struct unit_test_suite kvargs_test_suite  = {
 	.teardown = NULL,
 	.unit_test_cases = {
 		TEST_CASE(test_basic_token_count),
-		TEST_CASE(test_parse_without_valid_keys),
-		TEST_CASE(test_parse_with_valid_keys),
+		TEST_CASE_NAMED_WITH_DATA("test_parse_without_valid_keys_no_opt",
+					  NULL, NULL,
+					  test_parse_without_valid_keys,
+					  &use_kvargs_process_opt[0]),
+		TEST_CASE_NAMED_WITH_DATA("test_parse_without_valid_keys_with_opt",
+					  NULL, NULL,
+					  test_parse_without_valid_keys,
+					  &use_kvargs_process_opt[1]),
+		TEST_CASE_NAMED_WITH_DATA("test_parse_with_valid_keys_no_opt",
+					  NULL, NULL,
+					  test_parse_with_valid_keys,
+					  &use_kvargs_process_opt[0]),
+		TEST_CASE_NAMED_WITH_DATA("test_parse_with_valid_keys_with_opt",
+					  NULL, NULL,
+					  test_parse_with_valid_keys,
+					  &use_kvargs_process_opt[1]),
 		TEST_CASE(test_parse_list_value),
 		TEST_CASE(test_parse_empty_elements),
+		TEST_CASE(test_parse_with_only_key),
 		TEST_CASE(test_invalid_kvargs),
 		TEST_CASES_END() /**< NULL terminate unit test array */
 	}
-- 
2.17.1


^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH v3 8/8] maintainers: update for kvargs library
  2024-10-22  6:14 ` [PATCH v3 0/8] refactor kvargs test Chengwen Feng
                     ` (6 preceding siblings ...)
  2024-10-22  6:14   ` [PATCH v3 7/8] app/test: add process opt " Chengwen Feng
@ 2024-10-22  6:14   ` Chengwen Feng
  7 siblings, 0 replies; 39+ messages in thread
From: Chengwen Feng @ 2024-10-22  6:14 UTC (permalink / raw)
  To: thomas, ferruh.yigit; +Cc: dev, stephen

Add myself for voluntary maintenance of the kvargs library.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
---
 MAINTAINERS | 1 +
 1 file changed, 1 insertion(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index cd78bc7db1..f0bcebc651 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1718,6 +1718,7 @@ F: doc/guides/prog_guide/cmdline.rst
 F: doc/guides/sample_app_ug/cmd_line.rst
 
 Key/Value parsing
+M: Chengwen Feng <fengchengwen@huawei.com>
 F: lib/kvargs/
 F: app/test/test_kvargs.c
 
-- 
2.17.1


^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH v4 0/7] refactor kvargs test
  2023-11-03  9:53 [PATCH 0/7] refactor kvargs test Chengwen Feng
                   ` (10 preceding siblings ...)
  2024-10-22  6:14 ` [PATCH v3 0/8] refactor kvargs test Chengwen Feng
@ 2024-10-30  8:54 ` Chengwen Feng
  2024-10-30  8:54   ` [PATCH v4 1/7] app/test: introduce UT suite framework for kvargs Chengwen Feng
                     ` (7 more replies)
  11 siblings, 8 replies; 39+ messages in thread
From: Chengwen Feng @ 2024-10-30  8:54 UTC (permalink / raw)
  To: thomas, ferruh.yigit, david.marchand; +Cc: dev, stephen

When developing patchset [1], I found the kvargs test is hard to
understand when tried to add some testcase.

So refactor kvargs by:
1. introduce UT suite framework.
2. extract big test_valid_kvargs() to five part.
3. add new introduced rte_kvargs_process_opt() UT.

[1] https://patchwork.dpdk.org/project/dpdk/cover/20231103073811.13196-1-fengchengwen@huawei.com/

Chengwen Feng (7):
  app/test: introduce UT suite framework for kvargs
  app/test: extract basic token count testcase for kvargs
  app/test: extract without keys testcase for kvargs
  app/test: extract with keys testcase for kvargs
  app/test: extract parse list value testcase for kvargs
  app/test: extract parse empty elements testcase for kvargs
  app/test: add process opt testcase for kvargs

---
v4: remove maintainer commit.
v3: add rte_kvargs_process_opt()'s testcase.
v2: remove copyright line and add Stephen's ack.

 app/test/test_kvargs.c | 326 +++++++++++++++++++++++++----------------
 1 file changed, 199 insertions(+), 127 deletions(-)

-- 
2.17.1


^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH v4 1/7] app/test: introduce UT suite framework for kvargs
  2024-10-30  8:54 ` [PATCH v4 0/7] refactor kvargs test Chengwen Feng
@ 2024-10-30  8:54   ` Chengwen Feng
  2024-10-30  8:54   ` [PATCH v4 2/7] app/test: extract basic token count testcase " Chengwen Feng
                     ` (6 subsequent siblings)
  7 siblings, 0 replies; 39+ messages in thread
From: Chengwen Feng @ 2024-10-30  8:54 UTC (permalink / raw)
  To: thomas, ferruh.yigit, david.marchand; +Cc: dev, stephen

Introduce unit test suite framework for test_kvargs.c.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
---
 app/test/test_kvargs.c | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/app/test/test_kvargs.c b/app/test/test_kvargs.c
index 7a60cac4c1..1c46fbcaab 100644
--- a/app/test/test_kvargs.c
+++ b/app/test/test_kvargs.c
@@ -280,16 +280,21 @@ static int test_invalid_kvargs(void)
 	return -1;
 }
 
+static struct unit_test_suite kvargs_test_suite  = {
+	.suite_name = "Kvargs Unit Test Suite",
+	.setup = NULL,
+	.teardown = NULL,
+	.unit_test_cases = {
+		TEST_CASE(test_valid_kvargs),
+		TEST_CASE(test_invalid_kvargs),
+		TEST_CASES_END() /**< NULL terminate unit test array */
+	}
+};
+
 static int
 test_kvargs(void)
 {
-	printf("== test valid case ==\n");
-	if (test_valid_kvargs() < 0)
-		return -1;
-	printf("== test invalid case ==\n");
-	if (test_invalid_kvargs() < 0)
-		return -1;
-	return 0;
+	return unit_test_suite_runner(&kvargs_test_suite);
 }
 
 REGISTER_FAST_TEST(kvargs_autotest, true, true, test_kvargs);
-- 
2.17.1


^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH v4 2/7] app/test: extract basic token count testcase for kvargs
  2024-10-30  8:54 ` [PATCH v4 0/7] refactor kvargs test Chengwen Feng
  2024-10-30  8:54   ` [PATCH v4 1/7] app/test: introduce UT suite framework for kvargs Chengwen Feng
@ 2024-10-30  8:54   ` Chengwen Feng
  2024-10-30  8:54   ` [PATCH v4 3/7] app/test: extract without keys " Chengwen Feng
                     ` (5 subsequent siblings)
  7 siblings, 0 replies; 39+ messages in thread
From: Chengwen Feng @ 2024-10-30  8:54 UTC (permalink / raw)
  To: thomas, ferruh.yigit, david.marchand; +Cc: dev, stephen

The test_valid_kvargs() function is too long to understand, extract
the basic token count tests as one stand-alone testcase.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
---
 app/test/test_kvargs.c | 120 ++++++++++++++++-------------------------
 1 file changed, 45 insertions(+), 75 deletions(-)

diff --git a/app/test/test_kvargs.c b/app/test/test_kvargs.c
index 1c46fbcaab..a9808a6f87 100644
--- a/app/test/test_kvargs.c
+++ b/app/test/test_kvargs.c
@@ -35,25 +35,6 @@ static int check_handler(const char *key, const char *value,
 	return 0;
 }
 
-/* test parsing. */
-static int test_kvargs_parsing(const char *args, unsigned int n)
-{
-	struct rte_kvargs *kvlist;
-
-	kvlist = rte_kvargs_parse(args, NULL);
-	if (kvlist == NULL) {
-		printf("rte_kvargs_parse() error: %s\n", args);
-		return -1;
-	}
-	if (kvlist->count != n) {
-		printf("invalid count value %d: %s\n", kvlist->count, args);
-		rte_kvargs_free(kvlist);
-		return -1;
-	}
-	rte_kvargs_free(kvlist);
-	return 0;
-}
-
 /* test a valid case */
 static int test_valid_kvargs(void)
 {
@@ -61,29 +42,6 @@ static int test_valid_kvargs(void)
 	const char *args;
 	const char *valid_keys_list[] = { "foo", "check", NULL };
 	const char **valid_keys;
-	static const struct {
-		unsigned int expected;
-		const char *input;
-	} valid_inputs[] = {
-		{ 2, "foo=1,foo=" },
-		{ 2, "foo=1,foo=" },
-		{ 2, "foo=1,foo" },
-		{ 2, "foo=1,=2" },
-		{ 1, "foo=[1,2" },
-		{ 1, ",=" },
-		{ 1, "foo=[" },
-	};
-	unsigned int i;
-
-	/* empty args is valid */
-	args = "";
-	valid_keys = NULL;
-	kvlist = rte_kvargs_parse(args, valid_keys);
-	if (kvlist == NULL) {
-		printf("rte_kvargs_parse() error");
-		goto fail;
-	}
-	rte_kvargs_free(kvlist);
 
 	/* first test without valid_keys */
 	args = "foo=1234,check=value0,check=value1";
@@ -127,14 +85,6 @@ static int test_valid_kvargs(void)
 		rte_kvargs_free(kvlist);
 		goto fail;
 	}
-	/* count all entries */
-	count = rte_kvargs_count(kvlist, NULL);
-	if (count != 3) {
-		printf("invalid count value %d after rte_kvargs_count(NULL)\n",
-			count);
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
 	/* count all entries with key="nonexistent_key" */
 	count = rte_kvargs_count(kvlist, "nonexistent_key");
 	if (count != 0) {
@@ -189,19 +139,6 @@ static int test_valid_kvargs(void)
 	}
 	rte_kvargs_free(kvlist);
 
-	/* test using empty string (it is valid) */
-	args = "";
-	kvlist = rte_kvargs_parse(args, NULL);
-	if (kvlist == NULL) {
-		printf("rte_kvargs_parse() error\n");
-		goto fail;
-	}
-	if (rte_kvargs_count(kvlist, NULL) != 0) {
-		printf("invalid count value\n");
-		goto fail;
-	}
-	rte_kvargs_free(kvlist);
-
 	/* test using empty elements (it is valid) */
 	args = "foo=1,,check=value2,,";
 	kvlist = rte_kvargs_parse(args, NULL);
@@ -209,10 +146,6 @@ static int test_valid_kvargs(void)
 		printf("rte_kvargs_parse() error\n");
 		goto fail;
 	}
-	if (rte_kvargs_count(kvlist, NULL) != 2) {
-		printf("invalid count value\n");
-		goto fail;
-	}
 	if (rte_kvargs_count(kvlist, "foo") != 1) {
 		printf("invalid count value for 'foo'\n");
 		goto fail;
@@ -223,14 +156,6 @@ static int test_valid_kvargs(void)
 	}
 	rte_kvargs_free(kvlist);
 
-	valid_keys = NULL;
-
-	for (i = 0; i < RTE_DIM(valid_inputs); ++i) {
-		args = valid_inputs[i].input;
-		if (test_kvargs_parsing(args, valid_inputs[i].expected))
-			goto fail;
-	}
-
 	return 0;
 
  fail:
@@ -245,6 +170,50 @@ static int test_valid_kvargs(void)
 	return -1;
 }
 
+static int
+test_basic_token_count(void)
+{
+	static const struct {
+		unsigned int expected;
+		const char *input;
+	} valid_inputs[] = {
+		{ 3, "foo=1,check=1,check=2" },
+		{ 3, "foo=1,check,check=2"   },
+		{ 2, "foo=1,foo="            },
+		{ 2, "foo=1,foo="            },
+		{ 2, "foo=1,foo"             },
+		{ 2, "foo=1,=2"              },
+		{ 2, "foo=1,,foo=2,,"        },
+		{ 1, "foo=[1,2"              },
+		{ 1, ",="                    },
+		{ 1, "foo=["                 },
+		{ 0, ""                      },
+	};
+	struct rte_kvargs *kvlist;
+	unsigned int count;
+	const char *args;
+	unsigned int i;
+
+	for (i = 0; i < RTE_DIM(valid_inputs); i++) {
+		args = valid_inputs[i].input;
+		kvlist = rte_kvargs_parse(args, NULL);
+		if (kvlist == NULL) {
+			printf("rte_kvargs_parse() error: %s\n", args);
+			return -1;
+		}
+		count = rte_kvargs_count(kvlist, NULL);
+		if (count != valid_inputs[i].expected) {
+			printf("invalid count value %u (expected %u): %s\n",
+			       count, valid_inputs[i].expected, args);
+			rte_kvargs_free(kvlist);
+			return -1;
+		}
+		rte_kvargs_free(kvlist);
+	}
+
+	return 0;
+}
+
 /* test several error cases */
 static int test_invalid_kvargs(void)
 {
@@ -286,6 +255,7 @@ static struct unit_test_suite kvargs_test_suite  = {
 	.teardown = NULL,
 	.unit_test_cases = {
 		TEST_CASE(test_valid_kvargs),
+		TEST_CASE(test_basic_token_count),
 		TEST_CASE(test_invalid_kvargs),
 		TEST_CASES_END() /**< NULL terminate unit test array */
 	}
-- 
2.17.1


^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH v4 3/7] app/test: extract without keys testcase for kvargs
  2024-10-30  8:54 ` [PATCH v4 0/7] refactor kvargs test Chengwen Feng
  2024-10-30  8:54   ` [PATCH v4 1/7] app/test: introduce UT suite framework for kvargs Chengwen Feng
  2024-10-30  8:54   ` [PATCH v4 2/7] app/test: extract basic token count testcase " Chengwen Feng
@ 2024-10-30  8:54   ` Chengwen Feng
  2024-10-30  8:54   ` [PATCH v4 4/7] app/test: extract with " Chengwen Feng
                     ` (4 subsequent siblings)
  7 siblings, 0 replies; 39+ messages in thread
From: Chengwen Feng @ 2024-10-30  8:54 UTC (permalink / raw)
  To: thomas, ferruh.yigit, david.marchand; +Cc: dev, stephen

The test_valid_kvargs() function is too long to understand, extract
the without keys tests as one stand-alone testcase.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
---
 app/test/test_kvargs.c | 115 ++++++++++++++++++++++-------------------
 1 file changed, 63 insertions(+), 52 deletions(-)

diff --git a/app/test/test_kvargs.c b/app/test/test_kvargs.c
index a9808a6f87..2147080160 100644
--- a/app/test/test_kvargs.c
+++ b/app/test/test_kvargs.c
@@ -43,58 +43,6 @@ static int test_valid_kvargs(void)
 	const char *valid_keys_list[] = { "foo", "check", NULL };
 	const char **valid_keys;
 
-	/* first test without valid_keys */
-	args = "foo=1234,check=value0,check=value1";
-	valid_keys = NULL;
-	kvlist = rte_kvargs_parse(args, valid_keys);
-	if (kvlist == NULL) {
-		printf("rte_kvargs_parse() error");
-		goto fail;
-	}
-	/* call check_handler() for all entries with key="check" */
-	count = 0;
-	if (rte_kvargs_process(kvlist, "check", check_handler, NULL) < 0) {
-		printf("rte_kvargs_process() error\n");
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	if (count != 2) {
-		printf("invalid count value %d after rte_kvargs_process(check)\n",
-			count);
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	count = 0;
-	/* call check_handler() for all entries with key="nonexistent_key" */
-	if (rte_kvargs_process(kvlist, "nonexistent_key", check_handler, NULL) < 0) {
-		printf("rte_kvargs_process() error\n");
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	if (count != 0) {
-		printf("invalid count value %d after rte_kvargs_process(nonexistent_key)\n",
-			count);
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	/* count all entries with key="foo" */
-	count = rte_kvargs_count(kvlist, "foo");
-	if (count != 1) {
-		printf("invalid count value %d after rte_kvargs_count(foo)\n",
-			count);
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	/* count all entries with key="nonexistent_key" */
-	count = rte_kvargs_count(kvlist, "nonexistent_key");
-	if (count != 0) {
-		printf("invalid count value %d after rte_kvargs_count(nonexistent_key)\n",
-			count);
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	rte_kvargs_free(kvlist);
-
 	/* second test using valid_keys */
 	args = "foo=droids,check=value0,check=value1,check=wrong_value";
 	valid_keys = valid_keys_list;
@@ -214,6 +162,68 @@ test_basic_token_count(void)
 	return 0;
 }
 
+static int
+test_parse_without_valid_keys(void)
+{
+	const char *args = "foo=1234,check=value0,check=value1";
+	struct rte_kvargs *kvlist;
+
+	kvlist = rte_kvargs_parse(args, NULL);
+	if (kvlist == NULL) {
+		printf("rte_kvargs_parse() error\n");
+		return -1;
+	}
+
+	/* call check_handler() for all entries with key="check" */
+	count = 0;
+	if (rte_kvargs_process(kvlist, "check", check_handler, NULL) < 0) {
+		printf("rte_kvargs_process(check) error\n");
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+	if (count != 2) {
+		printf("invalid count value %u after rte_kvargs_process(check)\n",
+			count);
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	/* call check_handler() for all entries with key="nonexistent_key" */
+	count = 0;
+	if (rte_kvargs_process(kvlist, "nonexistent_key", check_handler, NULL) < 0) {
+		printf("rte_kvargs_process(nonexistent_key) error\n");
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+	if (count != 0) {
+		printf("invalid count value %d after rte_kvargs_process(nonexistent_key)\n",
+			count);
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	/* count all entries with key="foo" */
+	count = rte_kvargs_count(kvlist, "foo");
+	if (count != 1) {
+		printf("invalid count value %d after rte_kvargs_count(foo)\n",
+			count);
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	/* count all entries with key="nonexistent_key" */
+	count = rte_kvargs_count(kvlist, "nonexistent_key");
+	if (count != 0) {
+		printf("invalid count value %d after rte_kvargs_count(nonexistent_key)\n",
+			count);
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	rte_kvargs_free(kvlist);
+	return 0;
+}
+
 /* test several error cases */
 static int test_invalid_kvargs(void)
 {
@@ -256,6 +266,7 @@ static struct unit_test_suite kvargs_test_suite  = {
 	.unit_test_cases = {
 		TEST_CASE(test_valid_kvargs),
 		TEST_CASE(test_basic_token_count),
+		TEST_CASE(test_parse_without_valid_keys),
 		TEST_CASE(test_invalid_kvargs),
 		TEST_CASES_END() /**< NULL terminate unit test array */
 	}
-- 
2.17.1


^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH v4 4/7] app/test: extract with keys testcase for kvargs
  2024-10-30  8:54 ` [PATCH v4 0/7] refactor kvargs test Chengwen Feng
                     ` (2 preceding siblings ...)
  2024-10-30  8:54   ` [PATCH v4 3/7] app/test: extract without keys " Chengwen Feng
@ 2024-10-30  8:54   ` Chengwen Feng
  2024-10-30  8:54   ` [PATCH v4 5/7] app/test: extract parse list value " Chengwen Feng
                     ` (3 subsequent siblings)
  7 siblings, 0 replies; 39+ messages in thread
From: Chengwen Feng @ 2024-10-30  8:54 UTC (permalink / raw)
  To: thomas, ferruh.yigit, david.marchand; +Cc: dev, stephen

The test_valid_kvargs() function is too long to understand, extract
the with keys tests as one stand-alone testcase.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
---
 app/test/test_kvargs.c | 60 +++++++++++++++++++++++++-----------------
 1 file changed, 36 insertions(+), 24 deletions(-)

diff --git a/app/test/test_kvargs.c b/app/test/test_kvargs.c
index 2147080160..8b53d6d585 100644
--- a/app/test/test_kvargs.c
+++ b/app/test/test_kvargs.c
@@ -43,30 +43,6 @@ static int test_valid_kvargs(void)
 	const char *valid_keys_list[] = { "foo", "check", NULL };
 	const char **valid_keys;
 
-	/* second test using valid_keys */
-	args = "foo=droids,check=value0,check=value1,check=wrong_value";
-	valid_keys = valid_keys_list;
-	kvlist = rte_kvargs_parse(args, valid_keys);
-	if (kvlist == NULL) {
-		printf("rte_kvargs_parse() error");
-		goto fail;
-	}
-	/* call check_handler() on all entries with key="check", it
-	 * should fail as the value is not recognized by the handler */
-	if (rte_kvargs_process(kvlist, "check", check_handler, NULL) == 0) {
-		printf("rte_kvargs_process() is success but should not\n");
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	count = rte_kvargs_count(kvlist, "check");
-	if (count != 3) {
-		printf("invalid count value %d after rte_kvargs_count(check)\n",
-			count);
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	rte_kvargs_free(kvlist);
-
 	/* third test using list as value */
 	args = "foo=[0,1],check=value2";
 	valid_keys = valid_keys_list;
@@ -224,6 +200,41 @@ test_parse_without_valid_keys(void)
 	return 0;
 }
 
+static int
+test_parse_with_valid_keys(void)
+{
+	const char *args = "foo=droids,check=value0,check=value1,check=wrong_value";
+	const char *valid_keys[] = { "foo", "check", NULL };
+	struct rte_kvargs *kvlist;
+
+	kvlist = rte_kvargs_parse(args, valid_keys);
+	if (kvlist == NULL) {
+		printf("rte_kvargs_parse() error\n");
+		return -1;
+	}
+
+	/* call check_handler() on all entries with key="check", it
+	 * should fail as the value is not recognized by the handler
+	 */
+	count = 0;
+	if (rte_kvargs_process(kvlist, "check", check_handler, NULL) == 0 || count != 2) {
+		printf("rte_kvargs_process(check) is success but should not\n");
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	count = rte_kvargs_count(kvlist, "check");
+	if (count != 3) {
+		printf("invalid count value %u after rte_kvargs_count(check)\n",
+			count);
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	rte_kvargs_free(kvlist);
+	return 0;
+}
+
 /* test several error cases */
 static int test_invalid_kvargs(void)
 {
@@ -267,6 +278,7 @@ static struct unit_test_suite kvargs_test_suite  = {
 		TEST_CASE(test_valid_kvargs),
 		TEST_CASE(test_basic_token_count),
 		TEST_CASE(test_parse_without_valid_keys),
+		TEST_CASE(test_parse_with_valid_keys),
 		TEST_CASE(test_invalid_kvargs),
 		TEST_CASES_END() /**< NULL terminate unit test array */
 	}
-- 
2.17.1


^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH v4 5/7] app/test: extract parse list value testcase for kvargs
  2024-10-30  8:54 ` [PATCH v4 0/7] refactor kvargs test Chengwen Feng
                     ` (3 preceding siblings ...)
  2024-10-30  8:54   ` [PATCH v4 4/7] app/test: extract with " Chengwen Feng
@ 2024-10-30  8:54   ` Chengwen Feng
  2024-10-30  8:54   ` [PATCH v4 6/7] app/test: extract parse empty elements " Chengwen Feng
                     ` (2 subsequent siblings)
  7 siblings, 0 replies; 39+ messages in thread
From: Chengwen Feng @ 2024-10-30  8:54 UTC (permalink / raw)
  To: thomas, ferruh.yigit, david.marchand; +Cc: dev, stephen

Extract parse list value test as one stand-alone testcase.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
---
 app/test/test_kvargs.c | 54 +++++++++++++++++++++++++-----------------
 1 file changed, 32 insertions(+), 22 deletions(-)

diff --git a/app/test/test_kvargs.c b/app/test/test_kvargs.c
index 8b53d6d585..f8d668f2cc 100644
--- a/app/test/test_kvargs.c
+++ b/app/test/test_kvargs.c
@@ -40,28 +40,7 @@ static int test_valid_kvargs(void)
 {
 	struct rte_kvargs *kvlist;
 	const char *args;
-	const char *valid_keys_list[] = { "foo", "check", NULL };
-	const char **valid_keys;
-
-	/* third test using list as value */
-	args = "foo=[0,1],check=value2";
-	valid_keys = valid_keys_list;
-	kvlist = rte_kvargs_parse(args, valid_keys);
-	if (kvlist == NULL) {
-		printf("rte_kvargs_parse() error\n");
-		goto fail;
-	}
-	if (strcmp(kvlist->pairs[0].value, "[0,1]") != 0) {
-		printf("wrong value %s", kvlist->pairs[0].value);
-		goto fail;
-	}
-	count = kvlist->count;
-	if (count != 2) {
-		printf("invalid count value %d\n", count);
-		rte_kvargs_free(kvlist);
-		goto fail;
-	}
-	rte_kvargs_free(kvlist);
+	const char **valid_keys = NULL;
 
 	/* test using empty elements (it is valid) */
 	args = "foo=1,,check=value2,,";
@@ -235,6 +214,36 @@ test_parse_with_valid_keys(void)
 	return 0;
 }
 
+static int
+test_parse_list_value(void)
+{
+	const char *valid_keys[] = { "foo", "check", NULL };
+	const char *args = "foo=[0,1],check=value2";
+	struct rte_kvargs *kvlist;
+
+	kvlist = rte_kvargs_parse(args, valid_keys);
+	if (kvlist == NULL) {
+		printf("rte_kvargs_parse() error\n");
+		return -1;
+	}
+
+	count = kvlist->count;
+	if (count != 2) {
+		printf("invalid count value %u\n", count);
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	if (strcmp(kvlist->pairs[0].value, "[0,1]") != 0) {
+		printf("wrong value %s", kvlist->pairs[0].value);
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	rte_kvargs_free(kvlist);
+	return 0;
+}
+
 /* test several error cases */
 static int test_invalid_kvargs(void)
 {
@@ -279,6 +288,7 @@ static struct unit_test_suite kvargs_test_suite  = {
 		TEST_CASE(test_basic_token_count),
 		TEST_CASE(test_parse_without_valid_keys),
 		TEST_CASE(test_parse_with_valid_keys),
+		TEST_CASE(test_parse_list_value),
 		TEST_CASE(test_invalid_kvargs),
 		TEST_CASES_END() /**< NULL terminate unit test array */
 	}
-- 
2.17.1


^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH v4 6/7] app/test: extract parse empty elements testcase for kvargs
  2024-10-30  8:54 ` [PATCH v4 0/7] refactor kvargs test Chengwen Feng
                     ` (4 preceding siblings ...)
  2024-10-30  8:54   ` [PATCH v4 5/7] app/test: extract parse list value " Chengwen Feng
@ 2024-10-30  8:54   ` Chengwen Feng
  2024-10-30  8:54   ` [PATCH v4 7/7] app/test: add process opt " Chengwen Feng
  2024-11-01  2:26   ` [PATCH v4 0/7] refactor kvargs test lihuisong (C)
  7 siblings, 0 replies; 39+ messages in thread
From: Chengwen Feng @ 2024-10-30  8:54 UTC (permalink / raw)
  To: thomas, ferruh.yigit, david.marchand; +Cc: dev, stephen

Extract parse empty elements test as one stand-alone testcase. And
also fix the kvlist was not released when the branch fails.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
---
 app/test/test_kvargs.c | 68 ++++++++++++++++++------------------------
 1 file changed, 29 insertions(+), 39 deletions(-)

diff --git a/app/test/test_kvargs.c b/app/test/test_kvargs.c
index f8d668f2cc..d1e668ac4a 100644
--- a/app/test/test_kvargs.c
+++ b/app/test/test_kvargs.c
@@ -35,44 +35,6 @@ static int check_handler(const char *key, const char *value,
 	return 0;
 }
 
-/* test a valid case */
-static int test_valid_kvargs(void)
-{
-	struct rte_kvargs *kvlist;
-	const char *args;
-	const char **valid_keys = NULL;
-
-	/* test using empty elements (it is valid) */
-	args = "foo=1,,check=value2,,";
-	kvlist = rte_kvargs_parse(args, NULL);
-	if (kvlist == NULL) {
-		printf("rte_kvargs_parse() error\n");
-		goto fail;
-	}
-	if (rte_kvargs_count(kvlist, "foo") != 1) {
-		printf("invalid count value for 'foo'\n");
-		goto fail;
-	}
-	if (rte_kvargs_count(kvlist, "check") != 1) {
-		printf("invalid count value for 'check'\n");
-		goto fail;
-	}
-	rte_kvargs_free(kvlist);
-
-	return 0;
-
- fail:
-	printf("while processing <%s>", args);
-	if (valid_keys != NULL && *valid_keys != NULL) {
-		printf(" using valid_keys=<%s", *valid_keys);
-		while (*(++valid_keys) != NULL)
-			printf(",%s", *valid_keys);
-		printf(">");
-	}
-	printf("\n");
-	return -1;
-}
-
 static int
 test_basic_token_count(void)
 {
@@ -244,6 +206,34 @@ test_parse_list_value(void)
 	return 0;
 }
 
+static int
+test_parse_empty_elements(void)
+{
+	const char *args = "foo=1,,check=value2,,";
+	struct rte_kvargs *kvlist;
+
+	kvlist = rte_kvargs_parse(args, NULL);
+	if (kvlist == NULL) {
+		printf("rte_kvargs_parse() error\n");
+		return -1;
+	}
+
+	if (rte_kvargs_count(kvlist, "foo") != 1) {
+		printf("invalid count value for 'foo'\n");
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	if (rte_kvargs_count(kvlist, "check") != 1) {
+		printf("invalid count value for 'check'\n");
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	rte_kvargs_free(kvlist);
+	return 0;
+}
+
 /* test several error cases */
 static int test_invalid_kvargs(void)
 {
@@ -284,11 +274,11 @@ static struct unit_test_suite kvargs_test_suite  = {
 	.setup = NULL,
 	.teardown = NULL,
 	.unit_test_cases = {
-		TEST_CASE(test_valid_kvargs),
 		TEST_CASE(test_basic_token_count),
 		TEST_CASE(test_parse_without_valid_keys),
 		TEST_CASE(test_parse_with_valid_keys),
 		TEST_CASE(test_parse_list_value),
+		TEST_CASE(test_parse_empty_elements),
 		TEST_CASE(test_invalid_kvargs),
 		TEST_CASES_END() /**< NULL terminate unit test array */
 	}
-- 
2.17.1


^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH v4 7/7] app/test: add process opt testcase for kvargs
  2024-10-30  8:54 ` [PATCH v4 0/7] refactor kvargs test Chengwen Feng
                     ` (5 preceding siblings ...)
  2024-10-30  8:54   ` [PATCH v4 6/7] app/test: extract parse empty elements " Chengwen Feng
@ 2024-10-30  8:54   ` Chengwen Feng
  2024-11-01  2:26   ` [PATCH v4 0/7] refactor kvargs test lihuisong (C)
  7 siblings, 0 replies; 39+ messages in thread
From: Chengwen Feng @ 2024-10-30  8:54 UTC (permalink / raw)
  To: thomas, ferruh.yigit, david.marchand; +Cc: dev, stephen

This commit adds rte_kvargs_process_opt() API's testcase.

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
---
 app/test/test_kvargs.c | 106 ++++++++++++++++++++++++++++++++++-------
 1 file changed, 90 insertions(+), 16 deletions(-)

diff --git a/app/test/test_kvargs.c b/app/test/test_kvargs.c
index d1e668ac4a..43bb7a0243 100644
--- a/app/test/test_kvargs.c
+++ b/app/test/test_kvargs.c
@@ -11,14 +11,20 @@
 
 #include "test.h"
 
+typedef int (*f_kvargs_process)(const struct rte_kvargs *kvlist,
+				const char *key_match, arg_handler_t handler,
+				void *opaque_arg);
+
+static bool use_kvargs_process_opt[] = { false, true };
+
 /* incremented in handler, to check it is properly called once per
  * key/value association */
 static unsigned count;
 
 /* this handler increment the "count" variable at each call and check
  * that the key is "check" and the value is "value%d" */
-static int check_handler(const char *key, const char *value,
-	__rte_unused void *opaque)
+static int
+check_handler(const char *key, const char *value, __rte_unused void *opaque)
 {
 	char buf[16];
 
@@ -35,6 +41,18 @@ static int check_handler(const char *key, const char *value,
 	return 0;
 }
 
+static int
+check_only_handler(const char *key, const char *value, __rte_unused void *opaque)
+{
+	if (strcmp(key, "check"))
+		return -1;
+
+	if (value != NULL)
+		return -1;
+
+	return 0;
+}
+
 static int
 test_basic_token_count(void)
 {
@@ -80,8 +98,11 @@ test_basic_token_count(void)
 }
 
 static int
-test_parse_without_valid_keys(void)
+test_parse_without_valid_keys(const void *params)
 {
+	const bool use_opt = *(const bool *)params;
+	f_kvargs_process proc_func = use_opt ? rte_kvargs_process_opt : rte_kvargs_process;
+	const char *proc_name = use_opt ? "rte_kvargs_process_opt" : "rte_kvargs_process";
 	const char *args = "foo=1234,check=value0,check=value1";
 	struct rte_kvargs *kvlist;
 
@@ -93,28 +114,28 @@ test_parse_without_valid_keys(void)
 
 	/* call check_handler() for all entries with key="check" */
 	count = 0;
-	if (rte_kvargs_process(kvlist, "check", check_handler, NULL) < 0) {
-		printf("rte_kvargs_process(check) error\n");
+	if (proc_func(kvlist, "check", check_handler, NULL) < 0) {
+		printf("%s(check) error\n", proc_name);
 		rte_kvargs_free(kvlist);
 		return -1;
 	}
 	if (count != 2) {
-		printf("invalid count value %u after rte_kvargs_process(check)\n",
-			count);
+		printf("invalid count value %u after %s(check)\n",
+			count, proc_name);
 		rte_kvargs_free(kvlist);
 		return -1;
 	}
 
 	/* call check_handler() for all entries with key="nonexistent_key" */
 	count = 0;
-	if (rte_kvargs_process(kvlist, "nonexistent_key", check_handler, NULL) < 0) {
-		printf("rte_kvargs_process(nonexistent_key) error\n");
+	if (proc_func(kvlist, "nonexistent_key", check_handler, NULL) < 0) {
+		printf("%s(nonexistent_key) error\n", proc_name);
 		rte_kvargs_free(kvlist);
 		return -1;
 	}
 	if (count != 0) {
-		printf("invalid count value %d after rte_kvargs_process(nonexistent_key)\n",
-			count);
+		printf("invalid count value %d after %s(nonexistent_key)\n",
+			count, proc_name);
 		rte_kvargs_free(kvlist);
 		return -1;
 	}
@@ -142,8 +163,11 @@ test_parse_without_valid_keys(void)
 }
 
 static int
-test_parse_with_valid_keys(void)
+test_parse_with_valid_keys(const void *params)
 {
+	const bool use_opt = *(const bool *)params;
+	f_kvargs_process proc_func = use_opt ? rte_kvargs_process_opt : rte_kvargs_process;
+	const char *proc_name = use_opt ? "rte_kvargs_process_opt" : "rte_kvargs_process";
 	const char *args = "foo=droids,check=value0,check=value1,check=wrong_value";
 	const char *valid_keys[] = { "foo", "check", NULL };
 	struct rte_kvargs *kvlist;
@@ -158,8 +182,8 @@ test_parse_with_valid_keys(void)
 	 * should fail as the value is not recognized by the handler
 	 */
 	count = 0;
-	if (rte_kvargs_process(kvlist, "check", check_handler, NULL) == 0 || count != 2) {
-		printf("rte_kvargs_process(check) is success but should not\n");
+	if (proc_func(kvlist, "check", check_handler, NULL) == 0 || count != 2) {
+		printf("%s(check) is success but should not\n", proc_name);
 		rte_kvargs_free(kvlist);
 		return -1;
 	}
@@ -218,6 +242,13 @@ test_parse_empty_elements(void)
 		return -1;
 	}
 
+	count = kvlist->count;
+	if (count != 2) {
+		printf("invalid count value %u\n", count);
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
 	if (rte_kvargs_count(kvlist, "foo") != 1) {
 		printf("invalid count value for 'foo'\n");
 		rte_kvargs_free(kvlist);
@@ -234,6 +265,34 @@ test_parse_empty_elements(void)
 	return 0;
 }
 
+static int
+test_parse_with_only_key(void)
+{
+	const char *args = "foo,check";
+	struct rte_kvargs *kvlist;
+
+	kvlist = rte_kvargs_parse(args, NULL);
+	if (kvlist == NULL) {
+		printf("rte_kvargs_parse() error\n");
+		return -1;
+	}
+
+	if (rte_kvargs_process(kvlist, "check", check_only_handler, NULL) == 0) {
+		printf("rte_kvargs_process(check) error\n");
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	if (rte_kvargs_process_opt(kvlist, "check", check_only_handler, NULL) != 0) {
+		printf("rte_kvargs_process_opt(check) error\n");
+		rte_kvargs_free(kvlist);
+		return -1;
+	}
+
+	rte_kvargs_free(kvlist);
+	return 0;
+}
+
 /* test several error cases */
 static int test_invalid_kvargs(void)
 {
@@ -275,10 +334,25 @@ static struct unit_test_suite kvargs_test_suite  = {
 	.teardown = NULL,
 	.unit_test_cases = {
 		TEST_CASE(test_basic_token_count),
-		TEST_CASE(test_parse_without_valid_keys),
-		TEST_CASE(test_parse_with_valid_keys),
+		TEST_CASE_NAMED_WITH_DATA("test_parse_without_valid_keys_no_opt",
+					  NULL, NULL,
+					  test_parse_without_valid_keys,
+					  &use_kvargs_process_opt[0]),
+		TEST_CASE_NAMED_WITH_DATA("test_parse_without_valid_keys_with_opt",
+					  NULL, NULL,
+					  test_parse_without_valid_keys,
+					  &use_kvargs_process_opt[1]),
+		TEST_CASE_NAMED_WITH_DATA("test_parse_with_valid_keys_no_opt",
+					  NULL, NULL,
+					  test_parse_with_valid_keys,
+					  &use_kvargs_process_opt[0]),
+		TEST_CASE_NAMED_WITH_DATA("test_parse_with_valid_keys_with_opt",
+					  NULL, NULL,
+					  test_parse_with_valid_keys,
+					  &use_kvargs_process_opt[1]),
 		TEST_CASE(test_parse_list_value),
 		TEST_CASE(test_parse_empty_elements),
+		TEST_CASE(test_parse_with_only_key),
 		TEST_CASE(test_invalid_kvargs),
 		TEST_CASES_END() /**< NULL terminate unit test array */
 	}
-- 
2.17.1


^ permalink raw reply	[flat|nested] 39+ messages in thread

* Re: [PATCH v4 0/7] refactor kvargs test
  2024-10-30  8:54 ` [PATCH v4 0/7] refactor kvargs test Chengwen Feng
                     ` (6 preceding siblings ...)
  2024-10-30  8:54   ` [PATCH v4 7/7] app/test: add process opt " Chengwen Feng
@ 2024-11-01  2:26   ` lihuisong (C)
  2024-11-19 19:52     ` Thomas Monjalon
  7 siblings, 1 reply; 39+ messages in thread
From: lihuisong (C) @ 2024-11-01  2:26 UTC (permalink / raw)
  To: Chengwen Feng, thomas, ferruh.yigit, david.marchand; +Cc: dev, stephen

For this series,
Acked-by: Huisong Li <lihuisong@huawei.com>
在 2024/10/30 16:54, Chengwen Feng 写道:
> When developing patchset [1], I found the kvargs test is hard to
> understand when tried to add some testcase.
>
> So refactor kvargs by:
> 1. introduce UT suite framework.
> 2. extract big test_valid_kvargs() to five part.
> 3. add new introduced rte_kvargs_process_opt() UT.
>
> [1] https://patchwork.dpdk.org/project/dpdk/cover/20231103073811.13196-1-fengchengwen@huawei.com/
>
> Chengwen Feng (7):
>    app/test: introduce UT suite framework for kvargs
>    app/test: extract basic token count testcase for kvargs
>    app/test: extract without keys testcase for kvargs
>    app/test: extract with keys testcase for kvargs
>    app/test: extract parse list value testcase for kvargs
>    app/test: extract parse empty elements testcase for kvargs
>    app/test: add process opt testcase for kvargs
>
> ---
> v4: remove maintainer commit.
> v3: add rte_kvargs_process_opt()'s testcase.
> v2: remove copyright line and add Stephen's ack.
>
>   app/test/test_kvargs.c | 326 +++++++++++++++++++++++++----------------
>   1 file changed, 199 insertions(+), 127 deletions(-)
>

^ permalink raw reply	[flat|nested] 39+ messages in thread

* Re: [PATCH v4 0/7] refactor kvargs test
  2024-11-01  2:26   ` [PATCH v4 0/7] refactor kvargs test lihuisong (C)
@ 2024-11-19 19:52     ` Thomas Monjalon
  0 siblings, 0 replies; 39+ messages in thread
From: Thomas Monjalon @ 2024-11-19 19:52 UTC (permalink / raw)
  To: Chengwen Feng; +Cc: ferruh.yigit, david.marchand, dev, stephen, lihuisong (C)

01/11/2024 03:26, lihuisong (C):
> For this series,
> Acked-by: Huisong Li <lihuisong@huawei.com>
> 在 2024/10/30 16:54, Chengwen Feng 写道:
> > When developing patchset [1], I found the kvargs test is hard to
> > understand when tried to add some testcase.
> >
> > So refactor kvargs by:
> > 1. introduce UT suite framework.
> > 2. extract big test_valid_kvargs() to five part.
> > 3. add new introduced rte_kvargs_process_opt() UT.
> >
> > [1] https://patchwork.dpdk.org/project/dpdk/cover/20231103073811.13196-1-fengchengwen@huawei.com/
> >
> > Chengwen Feng (7):
> >    app/test: introduce UT suite framework for kvargs
> >    app/test: extract basic token count testcase for kvargs
> >    app/test: extract without keys testcase for kvargs
> >    app/test: extract with keys testcase for kvargs
> >    app/test: extract parse list value testcase for kvargs
> >    app/test: extract parse empty elements testcase for kvargs
> >    app/test: add process opt testcase for kvargs

Applied, thanks.



^ permalink raw reply	[flat|nested] 39+ messages in thread

end of thread, other threads:[~2024-11-19 19:52 UTC | newest]

Thread overview: 39+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-11-03  9:53 [PATCH 0/7] refactor kvargs test Chengwen Feng
2023-11-03  9:53 ` [PATCH 1/7] app/test: introduce UT suite framework for kvargs Chengwen Feng
2024-10-11  2:08   ` Stephen Hemminger
2024-10-11  3:35     ` fengchengwen
2023-11-03  9:53 ` [PATCH 2/7] app/test: extract basic token count testcase " Chengwen Feng
2023-11-03  9:53 ` [PATCH 3/7] app/test: extract without keys " Chengwen Feng
2023-11-03  9:53 ` [PATCH 4/7] app/test: extract with " Chengwen Feng
2023-11-03  9:53 ` [PATCH 5/7] app/test: extract parse list value " Chengwen Feng
2023-11-03  9:53 ` [PATCH 6/7] app/test: extract parse empty elements " Chengwen Feng
2023-11-03  9:53 ` [PATCH 7/7] maintainers: update for kvargs library Chengwen Feng
2023-12-05  2:55 ` [PATCH 0/7] refactor kvargs test fengchengwen
2024-10-05 15:49 ` Stephen Hemminger
2024-10-11  3:34 ` [PATCH v2 " Chengwen Feng
2024-10-11  3:34   ` [PATCH v2 1/7] app/test: introduce UT suite framework for kvargs Chengwen Feng
2024-10-11  3:34   ` [PATCH v2 2/7] app/test: extract basic token count testcase " Chengwen Feng
2024-10-11  3:34   ` [PATCH v2 3/7] app/test: extract without keys " Chengwen Feng
2024-10-11  3:34   ` [PATCH v2 4/7] app/test: extract with " Chengwen Feng
2024-10-11  3:34   ` [PATCH v2 5/7] app/test: extract parse list value " Chengwen Feng
2024-10-11  3:34   ` [PATCH v2 6/7] app/test: extract parse empty elements " Chengwen Feng
2024-10-11  3:34   ` [PATCH v2 7/7] maintainers: update for kvargs library Chengwen Feng
2024-10-22  6:14 ` [PATCH v3 0/8] refactor kvargs test Chengwen Feng
2024-10-22  6:14   ` [PATCH v3 1/8] app/test: introduce UT suite framework for kvargs Chengwen Feng
2024-10-22  6:14   ` [PATCH v3 2/8] app/test: extract basic token count testcase " Chengwen Feng
2024-10-22  6:14   ` [PATCH v3 3/8] app/test: extract without keys " Chengwen Feng
2024-10-22  6:14   ` [PATCH v3 4/8] app/test: extract with " Chengwen Feng
2024-10-22  6:14   ` [PATCH v3 5/8] app/test: extract parse list value " Chengwen Feng
2024-10-22  6:14   ` [PATCH v3 6/8] app/test: extract parse empty elements " Chengwen Feng
2024-10-22  6:14   ` [PATCH v3 7/8] app/test: add process opt " Chengwen Feng
2024-10-22  6:14   ` [PATCH v3 8/8] maintainers: update for kvargs library Chengwen Feng
2024-10-30  8:54 ` [PATCH v4 0/7] refactor kvargs test Chengwen Feng
2024-10-30  8:54   ` [PATCH v4 1/7] app/test: introduce UT suite framework for kvargs Chengwen Feng
2024-10-30  8:54   ` [PATCH v4 2/7] app/test: extract basic token count testcase " Chengwen Feng
2024-10-30  8:54   ` [PATCH v4 3/7] app/test: extract without keys " Chengwen Feng
2024-10-30  8:54   ` [PATCH v4 4/7] app/test: extract with " Chengwen Feng
2024-10-30  8:54   ` [PATCH v4 5/7] app/test: extract parse list value " Chengwen Feng
2024-10-30  8:54   ` [PATCH v4 6/7] app/test: extract parse empty elements " Chengwen Feng
2024-10-30  8:54   ` [PATCH v4 7/7] app/test: add process opt " Chengwen Feng
2024-11-01  2:26   ` [PATCH v4 0/7] refactor kvargs test lihuisong (C)
2024-11-19 19:52     ` Thomas Monjalon

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).