Skip to content

Commit

Permalink
test/kvargs: add processing optional value
Browse files Browse the repository at this point in the history
This commit adds rte_kvargs_process_opt() API's testcase.

Signed-off-by: Chengwen Feng <[email protected]>
Acked-by: Huisong Li <[email protected]>
  • Loading branch information
fengchengwen authored and tmonjalo committed Nov 19, 2024
1 parent 8b1656a commit 0e95a67
Showing 1 changed file with 90 additions and 16 deletions.
106 changes: 90 additions & 16 deletions app/test/test_kvargs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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];

Expand All @@ -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)
{
Expand Down Expand Up @@ -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;

Expand All @@ -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;
}
Expand Down Expand Up @@ -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;
Expand All @@ -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;
}
Expand Down Expand Up @@ -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);
Expand All @@ -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)
{
Expand Down Expand Up @@ -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 */
}
Expand Down

0 comments on commit 0e95a67

Please sign in to comment.