From patchwork Tue Feb 20 13:14:59 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: fengchengwen X-Patchwork-Id: 136922 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 6563143B57; Tue, 20 Feb 2024 14:16:52 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id ACDC94069D; Tue, 20 Feb 2024 14:16:34 +0100 (CET) Received: from szxga04-in.huawei.com (szxga04-in.huawei.com [45.249.212.190]) by mails.dpdk.org (Postfix) with ESMTP id 0F63740289 for ; Tue, 20 Feb 2024 14:16:29 +0100 (CET) Received: from mail.maildlp.com (unknown [172.19.163.44]) by szxga04-in.huawei.com (SkyGuard) with ESMTP id 4TfKdQ0q58z1xnwg; Tue, 20 Feb 2024 21:15:06 +0800 (CST) Received: from dggpeml500024.china.huawei.com (unknown [7.185.36.10]) by mail.maildlp.com (Postfix) with ESMTPS id BE607140118; Tue, 20 Feb 2024 21:16:27 +0800 (CST) Received: from localhost.localdomain (10.50.165.33) by dggpeml500024.china.huawei.com (7.185.36.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Tue, 20 Feb 2024 21:16:27 +0800 From: Chengwen Feng To: , Subject: [PATCH 1/4] argparse: refine error message Date: Tue, 20 Feb 2024 13:14:59 +0000 Message-ID: <20240220131502.47510-2-fengchengwen@huawei.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20240220131502.47510-1-fengchengwen@huawei.com> References: <20240220131502.47510-1-fengchengwen@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.50.165.33] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To dggpeml500024.china.huawei.com (7.185.36.10) X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org This patch refines the error message. Signed-off-by: Chengwen Feng --- lib/argparse/rte_argparse.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/lib/argparse/rte_argparse.c b/lib/argparse/rte_argparse.c index 2d953f1694..48738cd07b 100644 --- a/lib/argparse/rte_argparse.c +++ b/lib/argparse/rte_argparse.c @@ -67,7 +67,7 @@ verify_arg_name(const struct rte_argparse_arg *arg) return -EINVAL; } if (arg->name_long[1] != '-') { - ARGPARSE_LOG(ERR, "optional long name %s must only start with '--'", + ARGPARSE_LOG(ERR, "optional long name %s doesn't start with '--'", arg->name_long); return -EINVAL; } @@ -101,7 +101,7 @@ static int verify_arg_help(const struct rte_argparse_arg *arg) { if (arg->help == NULL) { - ARGPARSE_LOG(ERR, "argument %s must have help info!", arg->name_long); + ARGPARSE_LOG(ERR, "argument %s doesn't have help info!", arg->name_long); return -EINVAL; } @@ -116,13 +116,13 @@ verify_arg_has_val(const struct rte_argparse_arg *arg) if (is_arg_positional(arg)) { if (has_val == RTE_ARGPARSE_ARG_REQUIRED_VALUE) return 0; - ARGPARSE_LOG(ERR, "argument %s is positional, should has zero or required-val!", + ARGPARSE_LOG(ERR, "argument %s is positional, must config required-val!", arg->name_long); return -EINVAL; } if (has_val == 0) { - ARGPARSE_LOG(ERR, "argument %s is optional, has-val config wrong!", + ARGPARSE_LOG(ERR, "argument %s is optional, has-value config wrong!", arg->name_long); return -EINVAL; } @@ -140,13 +140,13 @@ verify_arg_saver(const struct rte_argparse *obj, uint32_t index) if (arg->val_saver == NULL) { if (val_type != 0) { - ARGPARSE_LOG(ERR, "argument %s parse by callback, val-type must be zero!", + ARGPARSE_LOG(ERR, "argument %s parsed by callback, value-type should not be set!", arg->name_long); return -EINVAL; } if (obj->callback == NULL) { - ARGPARSE_LOG(ERR, "argument %s parse by callback, but callback is NULL!", + ARGPARSE_LOG(ERR, "argument %s parsed by callback, but callback is NULL!", arg->name_long); return -EINVAL; } @@ -155,12 +155,12 @@ verify_arg_saver(const struct rte_argparse *obj, uint32_t index) } if (val_type == 0 || val_type >= cmp_max) { - ARGPARSE_LOG(ERR, "argument %s val-type config wrong!", arg->name_long); + ARGPARSE_LOG(ERR, "argument %s value-type config wrong!", arg->name_long); return -EINVAL; } if (has_val == RTE_ARGPARSE_ARG_REQUIRED_VALUE && arg->val_set != NULL) { - ARGPARSE_LOG(ERR, "argument %s has required value, val-set should be NULL!", + ARGPARSE_LOG(ERR, "argument %s has required value, value-set should be NULL!", arg->name_long); return -EINVAL; } @@ -175,7 +175,8 @@ verify_arg_flags(const struct rte_argparse *obj, uint32_t index) uint32_t unused_bits = arg_attr_unused_bits(arg); if (unused_bits != 0) { - ARGPARSE_LOG(ERR, "argument %s flags set wrong!", arg->name_long); + ARGPARSE_LOG(ERR, "argument %s flags unused bits should not be set!", + arg->name_long); return -EINVAL; } @@ -189,7 +190,7 @@ verify_arg_flags(const struct rte_argparse *obj, uint32_t index) } if (arg->val_saver != NULL) { - ARGPARSE_LOG(ERR, "argument %s could occur multiple times, should use callback to parse!", + ARGPARSE_LOG(ERR, "argument %s supports multiple times, should use callback to parse!", arg->name_long); return -EINVAL; } @@ -536,8 +537,10 @@ parse_arg_autosave(struct rte_argparse_arg *arg, const char *value) return ret; } +/* arg_parse indicates the name entered by the user, which can be long-name or short-name. */ static int -parse_arg_val(struct rte_argparse *obj, struct rte_argparse_arg *arg, char *value) +parse_arg_val(struct rte_argparse *obj, const char *arg_name, + struct rte_argparse_arg *arg, char *value) { int ret; @@ -546,7 +549,7 @@ parse_arg_val(struct rte_argparse *obj, struct rte_argparse_arg *arg, char *valu else ret = parse_arg_autosave(arg, value); if (ret != 0) { - ARGPARSE_LOG(ERR, "argument %s parse value fail!", arg->name_long); + ARGPARSE_LOG(ERR, "argument %s parse value fail!", arg_name); return ret; } @@ -582,7 +585,7 @@ parse_args(struct rte_argparse *obj, int argc, char **argv, bool *show_help) return -EINVAL; } arg = find_position_arg(obj, position_index); - ret = parse_arg_val(obj, arg, curr_argv); + ret = parse_arg_val(obj, arg->name_long, arg, curr_argv); if (ret != 0) return ret; continue; @@ -629,7 +632,7 @@ parse_args(struct rte_argparse *obj, int argc, char **argv, bool *show_help) /* Do nothing, because it's optional value, only support arg=val or arg. */ } - ret = parse_arg_val(obj, arg, value); + ret = parse_arg_val(obj, arg_name, arg, value); if (ret != 0) return ret; From patchwork Tue Feb 20 13:15:00 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: fengchengwen X-Patchwork-Id: 136920 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 1B6E843B57; Tue, 20 Feb 2024 14:16:31 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id DA8FD4029B; Tue, 20 Feb 2024 14:16:30 +0100 (CET) Received: from szxga05-in.huawei.com (szxga05-in.huawei.com [45.249.212.191]) by mails.dpdk.org (Postfix) with ESMTP id 165784029B for ; Tue, 20 Feb 2024 14:16:29 +0100 (CET) Received: from mail.maildlp.com (unknown [172.19.163.17]) by szxga05-in.huawei.com (SkyGuard) with ESMTP id 4TfKYP0tfMz1FKdr; Tue, 20 Feb 2024 21:11:37 +0800 (CST) Received: from dggpeml500024.china.huawei.com (unknown [7.185.36.10]) by mail.maildlp.com (Postfix) with ESMTPS id DAEBA1A0172; Tue, 20 Feb 2024 21:16:27 +0800 (CST) Received: from localhost.localdomain (10.50.165.33) by dggpeml500024.china.huawei.com (7.185.36.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Tue, 20 Feb 2024 21:16:27 +0800 From: Chengwen Feng To: , Subject: [PATCH 2/4] argparse: remove dead code Date: Tue, 20 Feb 2024 13:15:00 +0000 Message-ID: <20240220131502.47510-3-fengchengwen@huawei.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20240220131502.47510-1-fengchengwen@huawei.com> References: <20240220131502.47510-1-fengchengwen@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.50.165.33] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To dggpeml500024.china.huawei.com (7.185.36.10) X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org The judgement "obj->callback == NULL" is dead code which can't be reached, because verify_arg_saver() already make sure obj->callback must not be NULL when arg->val_saver is NULL. Signed-off-by: Chengwen Feng --- app/test/test_argparse.c | 7 ------- lib/argparse/rte_argparse.c | 6 ------ 2 files changed, 13 deletions(-) diff --git a/app/test/test_argparse.c b/app/test/test_argparse.c index df11a129ba..c98bcee56d 100644 --- a/app/test/test_argparse.c +++ b/app/test/test_argparse.c @@ -288,13 +288,6 @@ test_argparse_invalid_arg_flags(void) ret = rte_argparse_parse(obj, default_argc, default_argv); TEST_ASSERT(ret == -EINVAL, "Argparse parse expect failed!"); - obj = test_argparse_init_obj(); - obj->args[0].val_saver = NULL; - obj->args[0].flags = RTE_ARGPARSE_ARG_REQUIRED_VALUE | RTE_ARGPARSE_ARG_SUPPORT_MULTI; - obj->callback = NULL; - ret = rte_argparse_parse(obj, default_argc, default_argv); - TEST_ASSERT(ret == -EINVAL, "Argparse parse expect failed!"); - return 0; } diff --git a/lib/argparse/rte_argparse.c b/lib/argparse/rte_argparse.c index 48738cd07b..6e890cdc0d 100644 --- a/lib/argparse/rte_argparse.c +++ b/lib/argparse/rte_argparse.c @@ -195,12 +195,6 @@ verify_arg_flags(const struct rte_argparse *obj, uint32_t index) return -EINVAL; } - if (obj->callback == NULL) { - ARGPARSE_LOG(ERR, "argument %s should use callback to parse, but callback is NULL!", - arg->name_long); - return -EINVAL; - } - return 0; } From patchwork Tue Feb 20 13:15:01 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: fengchengwen X-Patchwork-Id: 136921 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 5DB1743B57; Tue, 20 Feb 2024 14:16:44 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 705B24067C; Tue, 20 Feb 2024 14:16:33 +0100 (CET) Received: from szxga01-in.huawei.com (szxga01-in.huawei.com [45.249.212.187]) by mails.dpdk.org (Postfix) with ESMTP id 1A19C402A7 for ; Tue, 20 Feb 2024 14:16:29 +0100 (CET) Received: from mail.maildlp.com (unknown [172.19.88.194]) by szxga01-in.huawei.com (SkyGuard) with ESMTP id 4TfKd54QCWzsX1F; Tue, 20 Feb 2024 21:14:49 +0800 (CST) Received: from dggpeml500024.china.huawei.com (unknown [7.185.36.10]) by mail.maildlp.com (Postfix) with ESMTPS id 070B0140418; Tue, 20 Feb 2024 21:16:28 +0800 (CST) Received: from localhost.localdomain (10.50.165.33) by dggpeml500024.china.huawei.com (7.185.36.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Tue, 20 Feb 2024 21:16:27 +0800 From: Chengwen Feng To: , Subject: [PATCH 3/4] argparse: fix argument flags operate as uint32 type Date: Tue, 20 Feb 2024 13:15:01 +0000 Message-ID: <20240220131502.47510-4-fengchengwen@huawei.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20240220131502.47510-1-fengchengwen@huawei.com> References: <20240220131502.47510-1-fengchengwen@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.50.165.33] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To dggpeml500024.china.huawei.com (7.185.36.10) X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org The struct rte_argparse_arg's flags was 64bit type, uint64_t should be used instead of uint32_t where the operation happened. Also, the flags' bit16 was also unused, so don't test bit16 in testcase test_argparse_invalid_arg_flags. Fixes: 6c5c6571601c ("argparse: verify argument config") Fixes: 31ed9f9f43bb ("argparse: parse parameters") Signed-off-by: Chengwen Feng --- app/test/test_argparse.c | 16 ++++++++-------- lib/argparse/rte_argparse.c | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/test/test_argparse.c b/app/test/test_argparse.c index c98bcee56d..708a575e16 100644 --- a/app/test/test_argparse.c +++ b/app/test/test_argparse.c @@ -188,7 +188,7 @@ test_argparse_invalid_arg_help(void) static int test_argparse_invalid_has_val(void) { - uint32_t set_mask[] = { 0, + uint64_t set_mask[] = { 0, RTE_ARGPARSE_ARG_NO_VALUE, RTE_ARGPARSE_ARG_OPTIONAL_VALUE }; @@ -197,7 +197,7 @@ test_argparse_invalid_has_val(void) int ret; obj = test_argparse_init_obj(); - obj->args[0].flags &= ~0x3u; + obj->args[0].flags &= ~0x3ull; ret = rte_argparse_parse(obj, default_argc, default_argv); TEST_ASSERT(ret == -EINVAL, "Argparse parse expect failed!"); @@ -205,7 +205,7 @@ test_argparse_invalid_has_val(void) obj = test_argparse_init_obj(); obj->args[0].name_long = "abc"; obj->args[0].name_short = NULL; - obj->args[0].flags &= ~0x3u; + obj->args[0].flags &= ~0x3ull; obj->args[0].flags |= set_mask[index]; ret = rte_argparse_parse(obj, default_argc, default_argv); TEST_ASSERT(ret == -EINVAL, "Argparse parse expect failed!"); @@ -269,7 +269,7 @@ test_argparse_invalid_arg_flags(void) int ret; obj = test_argparse_init_obj(); - obj->args[0].flags |= ~0x107FFu; + obj->args[0].flags |= ~0x7FFull; ret = rte_argparse_parse(obj, default_argc, default_argv); TEST_ASSERT(ret == -EINVAL, "Argparse parse expect failed!"); @@ -337,7 +337,7 @@ test_argparse_invalid_option(void) static int test_argparse_opt_autosave_parse_int_of_no_val(void) { - uint32_t flags = RTE_ARGPARSE_ARG_NO_VALUE | RTE_ARGPARSE_ARG_VALUE_INT; + uint64_t flags = RTE_ARGPARSE_ARG_NO_VALUE | RTE_ARGPARSE_ARG_VALUE_INT; struct rte_argparse *obj; int val_saver = 0; char *argv[2]; @@ -369,7 +369,7 @@ test_argparse_opt_autosave_parse_int_of_no_val(void) static int test_argparse_opt_autosave_parse_int_of_required_val(void) { - uint32_t flags = RTE_ARGPARSE_ARG_REQUIRED_VALUE | RTE_ARGPARSE_ARG_VALUE_INT; + uint64_t flags = RTE_ARGPARSE_ARG_REQUIRED_VALUE | RTE_ARGPARSE_ARG_VALUE_INT; struct rte_argparse *obj; int val_saver = 0; char *argv[3]; @@ -410,7 +410,7 @@ test_argparse_opt_autosave_parse_int_of_required_val(void) static int test_argparse_opt_autosave_parse_int_of_optional_val(void) { - uint32_t flags = RTE_ARGPARSE_ARG_OPTIONAL_VALUE | RTE_ARGPARSE_ARG_VALUE_INT; + uint64_t flags = RTE_ARGPARSE_ARG_OPTIONAL_VALUE | RTE_ARGPARSE_ARG_VALUE_INT; struct rte_argparse *obj; int val_saver = 0; char *argv[2]; @@ -645,7 +645,7 @@ test_argparse_opt_callback_parse_int_of_optional_val(void) static int test_argparse_pos_autosave_parse_int(void) { - uint32_t flags = RTE_ARGPARSE_ARG_REQUIRED_VALUE | RTE_ARGPARSE_ARG_VALUE_INT; + uint64_t flags = RTE_ARGPARSE_ARG_REQUIRED_VALUE | RTE_ARGPARSE_ARG_VALUE_INT; struct rte_argparse *obj; int val_saver = 0; char *argv[3]; diff --git a/lib/argparse/rte_argparse.c b/lib/argparse/rte_argparse.c index 6e890cdc0d..9e799a16c5 100644 --- a/lib/argparse/rte_argparse.c +++ b/lib/argparse/rte_argparse.c @@ -50,7 +50,7 @@ arg_attr_flag_multi(const struct rte_argparse_arg *arg) return RTE_FIELD_GET64(ARG_ATTR_SUPPORT_MULTI_MASK, arg->flags); } -static inline uint32_t +static inline uint64_t arg_attr_unused_bits(const struct rte_argparse_arg *arg) { #define USED_BIT_MASK (ARG_ATTR_HAS_VAL_MASK | ARG_ATTR_VAL_TYPE_MASK | \ @@ -172,7 +172,7 @@ static int verify_arg_flags(const struct rte_argparse *obj, uint32_t index) { const struct rte_argparse_arg *arg = &obj->args[index]; - uint32_t unused_bits = arg_attr_unused_bits(arg); + uint64_t unused_bits = arg_attr_unused_bits(arg); if (unused_bits != 0) { ARGPARSE_LOG(ERR, "argument %s flags unused bits should not be set!", From patchwork Tue Feb 20 13:15:02 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: fengchengwen X-Patchwork-Id: 136923 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 6954343B57; Tue, 20 Feb 2024 14:16:58 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 0620B406B8; Tue, 20 Feb 2024 14:16:36 +0100 (CET) Received: from szxga03-in.huawei.com (szxga03-in.huawei.com [45.249.212.189]) by mails.dpdk.org (Postfix) with ESMTP id 6A949402CE for ; Tue, 20 Feb 2024 14:16:30 +0100 (CET) Received: from mail.maildlp.com (unknown [172.19.88.105]) by szxga03-in.huawei.com (SkyGuard) with ESMTP id 4TfKdQ0TbhzNlnw; Tue, 20 Feb 2024 21:15:06 +0800 (CST) Received: from dggpeml500024.china.huawei.com (unknown [7.185.36.10]) by mail.maildlp.com (Postfix) with ESMTPS id 27B6E140154; Tue, 20 Feb 2024 21:16:28 +0800 (CST) Received: from localhost.localdomain (10.50.165.33) by dggpeml500024.china.huawei.com (7.185.36.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Tue, 20 Feb 2024 21:16:27 +0800 From: Chengwen Feng To: , Subject: [PATCH 4/4] test/argparse: refine testcases Date: Tue, 20 Feb 2024 13:15:02 +0000 Message-ID: <20240220131502.47510-5-fengchengwen@huawei.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20240220131502.47510-1-fengchengwen@huawei.com> References: <20240220131502.47510-1-fengchengwen@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.50.165.33] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To dggpeml500024.china.huawei.com (7.185.36.10) X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Refine testcases, including: 1. add testcase comment. 2. argv[0] should set obj->prog_name. 3. set val_set as NULL in test_argparse_invalid_arg_flags, let it test to the specified code logic. 4. enable index verification in opt_callback_parse_int_of_no_val. Fixes: 6c5c6571601c ("argparse: verify argument config") Fixes: 31ed9f9f43bb ("argparse: parse parameters") Signed-off-by: Chengwen Feng --- app/test/test_argparse.c | 40 +++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/app/test/test_argparse.c b/app/test/test_argparse.c index 708a575e16..5be9552aae 100644 --- a/app/test/test_argparse.c +++ b/app/test/test_argparse.c @@ -196,11 +196,13 @@ test_argparse_invalid_has_val(void) uint32_t index; int ret; + /* test optional arg don't config has-value. */ obj = test_argparse_init_obj(); obj->args[0].flags &= ~0x3ull; ret = rte_argparse_parse(obj, default_argc, default_argv); TEST_ASSERT(ret == -EINVAL, "Argparse parse expect failed!"); + /* test positional arg don't config required-value. */ for (index = 0; index < RTE_DIM(set_mask); index++) { obj = test_argparse_init_obj(); obj->args[0].name_long = "abc"; @@ -268,21 +270,24 @@ test_argparse_invalid_arg_flags(void) struct rte_argparse *obj; int ret; + /* test set unused bits. */ obj = test_argparse_init_obj(); obj->args[0].flags |= ~0x7FFull; ret = rte_argparse_parse(obj, default_argc, default_argv); TEST_ASSERT(ret == -EINVAL, "Argparse parse expect failed!"); + /* test positional arg should not config multiple. */ obj = test_argparse_init_obj(); obj->args[0].name_long = "positional"; obj->args[0].name_short = NULL; obj->args[0].val_saver = (void *)1; - obj->args[0].val_set = (void *)1; + obj->args[0].val_set = NULL; obj->args[0].flags = RTE_ARGPARSE_ARG_REQUIRED_VALUE | RTE_ARGPARSE_ARG_VALUE_INT | RTE_ARGPARSE_ARG_SUPPORT_MULTI; ret = rte_argparse_parse(obj, default_argc, default_argv); TEST_ASSERT(ret == -EINVAL, "Argparse parse expect failed!"); + /* test optional arg enabled multiple but prased by autosave. */ obj = test_argparse_init_obj(); obj->args[0].flags |= RTE_ARGPARSE_ARG_SUPPORT_MULTI; ret = rte_argparse_parse(obj, default_argc, default_argv); @@ -320,13 +325,13 @@ test_argparse_invalid_option(void) int ret; obj = test_argparse_init_obj(); - argv[0] = test_strdup(obj->usage); + argv[0] = test_strdup(obj->prog_name); argv[1] = test_strdup("--invalid"); ret = rte_argparse_parse(obj, 2, argv); TEST_ASSERT(ret == -EINVAL, "Argparse parse expect failed!"); obj = test_argparse_init_obj(); - argv[0] = test_strdup(obj->usage); + argv[0] = test_strdup(obj->prog_name); argv[1] = test_strdup("invalid"); ret = rte_argparse_parse(obj, 2, argv); TEST_ASSERT(ret == -EINVAL, "Argparse parse expect failed!"); @@ -350,7 +355,7 @@ test_argparse_opt_autosave_parse_int_of_no_val(void) obj->args[0].val_set = (void *)100; obj->args[0].flags = flags; obj->args[1].name_long = NULL; - argv[0] = test_strdup(obj->usage); + argv[0] = test_strdup(obj->prog_name); argv[1] = test_strdup("--test-long"); ret = rte_argparse_parse(obj, 2, argv); TEST_ASSERT(ret == 0, "Argparse parse expect success!"); @@ -382,7 +387,7 @@ test_argparse_opt_autosave_parse_int_of_required_val(void) obj->args[0].val_set = NULL; obj->args[0].flags = flags; obj->args[1].name_long = NULL; - argv[0] = test_strdup(obj->usage); + argv[0] = test_strdup(obj->prog_name); argv[1] = test_strdup("--test-long"); argv[2] = test_strdup("100"); ret = rte_argparse_parse(obj, 3, argv); @@ -416,6 +421,7 @@ test_argparse_opt_autosave_parse_int_of_optional_val(void) char *argv[2]; int ret; + /* test without value. */ obj = test_argparse_init_obj(); obj->args[0].name_long = "--test-long"; obj->args[0].name_short = "-t"; @@ -423,7 +429,7 @@ test_argparse_opt_autosave_parse_int_of_optional_val(void) obj->args[0].val_set = (void *)100; obj->args[0].flags = flags; obj->args[1].name_long = NULL; - argv[0] = test_strdup(obj->usage); + argv[0] = test_strdup(obj->prog_name); argv[1] = test_strdup("--test-long"); ret = rte_argparse_parse(obj, 2, argv); TEST_ASSERT(ret == 0, "Argparse parse expect success!"); @@ -467,7 +473,8 @@ test_argparse_opt_autosave_parse_int_of_optional_val(void) static int opt_callback_parse_int_of_no_val(uint32_t index, const char *value, void *opaque) { - RTE_SET_USED(index); + if (index != 1) + return -EINVAL; if (value != NULL) return -EINVAL; *(int *)opaque = 100; @@ -488,10 +495,10 @@ test_argparse_opt_callback_parse_int_of_no_val(void) obj->args[0].name_long = "--test-long"; obj->args[0].name_short = "-t"; obj->args[0].val_saver = NULL; - obj->args[0].val_set = (void *)100; + obj->args[0].val_set = (void *)1; obj->args[0].flags = RTE_ARGPARSE_ARG_NO_VALUE; obj->args[1].name_long = NULL; - argv[0] = test_strdup(obj->usage); + argv[0] = test_strdup(obj->prog_name); argv[1] = test_strdup("--test-long"); ret = rte_argparse_parse(obj, 2, argv); TEST_ASSERT(ret == 0, "Argparse parse expect success!"); @@ -542,7 +549,7 @@ test_argparse_opt_callback_parse_int_of_required_val(void) obj->args[0].val_set = (void *)1; obj->args[0].flags = RTE_ARGPARSE_ARG_REQUIRED_VALUE; obj->args[1].name_long = NULL; - argv[0] = test_strdup(obj->usage); + argv[0] = test_strdup(obj->prog_name); argv[1] = test_strdup("--test-long"); argv[2] = test_strdup("100"); ret = rte_argparse_parse(obj, 3, argv); @@ -606,7 +613,7 @@ test_argparse_opt_callback_parse_int_of_optional_val(void) obj->args[0].val_set = (void *)1; obj->args[0].flags = RTE_ARGPARSE_ARG_OPTIONAL_VALUE; obj->args[1].name_long = NULL; - argv[0] = test_strdup(obj->usage); + argv[0] = test_strdup(obj->prog_name); argv[1] = test_strdup("--test-long"); ret = rte_argparse_parse(obj, 2, argv); TEST_ASSERT(ret == 0, "Argparse parse expect success!"); @@ -651,6 +658,7 @@ test_argparse_pos_autosave_parse_int(void) char *argv[3]; int ret; + /* test positional autosave parse successful. */ obj = test_argparse_init_obj(); obj->args[0].name_long = "test-long"; obj->args[0].name_short = NULL; @@ -658,19 +666,20 @@ test_argparse_pos_autosave_parse_int(void) obj->args[0].val_set = NULL; obj->args[0].flags = flags; obj->args[1].name_long = NULL; - argv[0] = test_strdup(obj->usage); + argv[0] = test_strdup(obj->prog_name); argv[1] = test_strdup("100"); ret = rte_argparse_parse(obj, 2, argv); TEST_ASSERT(ret == 0, "Argparse parse expect success!"); TEST_ASSERT(val_saver == 100, "Argparse parse expect success!"); + /* test positional autosave parse failed. */ obj->args[0].flags = flags; val_saver = 0; argv[1] = test_strdup("100a"); ret = rte_argparse_parse(obj, 2, argv); TEST_ASSERT(ret == -EINVAL, "Argparse parse expect failed!"); - /* test over position parameters. */ + /* test too much position parameters. */ obj->args[0].flags = flags; argv[1] = test_strdup("100"); argv[2] = test_strdup("200"); @@ -708,6 +717,7 @@ test_argparse_pos_callback_parse_int(void) char *argv[3]; int ret; + /* test positional callback parse successful. */ obj = test_argparse_init_obj(); obj->callback = pos_callback_parse_int; obj->opaque = (void *)val_saver; @@ -722,7 +732,7 @@ test_argparse_pos_callback_parse_int(void) obj->args[1].val_set = (void *)2; obj->args[1].flags = RTE_ARGPARSE_ARG_REQUIRED_VALUE; obj->args[2].name_long = NULL; - argv[0] = test_strdup(obj->usage); + argv[0] = test_strdup(obj->prog_name); argv[1] = test_strdup("100"); argv[2] = test_strdup("200"); ret = rte_argparse_parse(obj, 3, argv); @@ -730,7 +740,7 @@ test_argparse_pos_callback_parse_int(void) TEST_ASSERT(val_saver[1] == 100, "Argparse parse expect success!"); TEST_ASSERT(val_saver[2] == 200, "Argparse parse expect success!"); - /* test callback return failed. */ + /* test positional callback parse failed. */ obj->args[0].flags = RTE_ARGPARSE_ARG_REQUIRED_VALUE; obj->args[1].flags = RTE_ARGPARSE_ARG_REQUIRED_VALUE; argv[2] = test_strdup("200a");