From patchwork Thu Mar 7 13:07:38 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: fengchengwen X-Patchwork-Id: 138105 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 99AC343BCF; Thu, 7 Mar 2024 14:09:56 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 0EDAD42EE6; Thu, 7 Mar 2024 14:09:33 +0100 (CET) Received: from szxga03-in.huawei.com (szxga03-in.huawei.com [45.249.212.189]) by mails.dpdk.org (Postfix) with ESMTP id 6CA4542D83 for ; Thu, 7 Mar 2024 14:09:25 +0100 (CET) Received: from mail.maildlp.com (unknown [172.19.163.174]) by szxga03-in.huawei.com (SkyGuard) with ESMTP id 4Tr8jW6nBmzHqfx; Thu, 7 Mar 2024 21:07:43 +0800 (CST) Received: from dggpeml500024.china.huawei.com (unknown [7.185.36.10]) by mail.maildlp.com (Postfix) with ESMTPS id 4940A143DE3; Thu, 7 Mar 2024 21:09:23 +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_256_GCM_SHA384) id 15.1.2507.35; Thu, 7 Mar 2024 21:09:23 +0800 From: Chengwen Feng To: , , Subject: [PATCH v2 1/5] argparse: refine error message Date: Thu, 7 Mar 2024 13:07:38 +0000 Message-ID: <20240307130742.5578-2-fengchengwen@huawei.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20240307130742.5578-1-fengchengwen@huawei.com> References: <20240220131502.47510-1-fengchengwen@huawei.com> <20240307130742.5578-1-fengchengwen@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.50.165.33] X-ClientProxiedBy: dggems704-chm.china.huawei.com (10.3.19.181) 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 Thu Mar 7 13:07:39 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: fengchengwen X-Patchwork-Id: 138101 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 3078643BCF; Thu, 7 Mar 2024 14:09:27 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 7DFF6410D5; Thu, 7 Mar 2024 14:09:26 +0100 (CET) Received: from szxga04-in.huawei.com (szxga04-in.huawei.com [45.249.212.190]) by mails.dpdk.org (Postfix) with ESMTP id 02B554067E for ; Thu, 7 Mar 2024 14:09:24 +0100 (CET) Received: from mail.maildlp.com (unknown [172.19.88.234]) by szxga04-in.huawei.com (SkyGuard) with ESMTP id 4Tr8hj27q9z2BfJs; Thu, 7 Mar 2024 21:07:01 +0800 (CST) Received: from dggpeml500024.china.huawei.com (unknown [7.185.36.10]) by mail.maildlp.com (Postfix) with ESMTPS id 680F1140336; Thu, 7 Mar 2024 21:09:23 +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_256_GCM_SHA384) id 15.1.2507.35; Thu, 7 Mar 2024 21:09:23 +0800 From: Chengwen Feng To: , , Subject: [PATCH v2 2/5] argparse: remove dead code Date: Thu, 7 Mar 2024 13:07:39 +0000 Message-ID: <20240307130742.5578-3-fengchengwen@huawei.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20240307130742.5578-1-fengchengwen@huawei.com> References: <20240220131502.47510-1-fengchengwen@huawei.com> <20240307130742.5578-1-fengchengwen@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.50.165.33] X-ClientProxiedBy: dggems704-chm.china.huawei.com (10.3.19.181) 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 Thu Mar 7 13:07:40 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: fengchengwen X-Patchwork-Id: 138104 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 3F28E43BCF; Thu, 7 Mar 2024 14:09:50 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id D88C242EDC; Thu, 7 Mar 2024 14:09:31 +0100 (CET) Received: from szxga05-in.huawei.com (szxga05-in.huawei.com [45.249.212.191]) by mails.dpdk.org (Postfix) with ESMTP id 5845642D26 for ; Thu, 7 Mar 2024 14:09:25 +0100 (CET) Received: from mail.maildlp.com (unknown [172.19.88.163]) by szxga05-in.huawei.com (SkyGuard) with ESMTP id 4Tr8hj4dm4z1h0XQ; Thu, 7 Mar 2024 21:07:01 +0800 (CST) Received: from dggpeml500024.china.huawei.com (unknown [7.185.36.10]) by mail.maildlp.com (Postfix) with ESMTPS id 8DBD218001B; Thu, 7 Mar 2024 21:09:23 +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_256_GCM_SHA384) id 15.1.2507.35; Thu, 7 Mar 2024 21:09:23 +0800 From: Chengwen Feng To: , , Subject: [PATCH v2 3/5] argparse: replace flag enum with marco Date: Thu, 7 Mar 2024 13:07:40 +0000 Message-ID: <20240307130742.5578-4-fengchengwen@huawei.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20240307130742.5578-1-fengchengwen@huawei.com> References: <20240220131502.47510-1-fengchengwen@huawei.com> <20240307130742.5578-1-fengchengwen@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.50.165.33] X-ClientProxiedBy: dggems704-chm.china.huawei.com (10.3.19.181) 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 enum rte_argparse_flag's value is u64, but an enum in C is represented as an int. This commit replace these enum values with macro. Fixes: e3e579f5bab5 ("argparse: introduce argparse library") Fixes: 5357c248c960 ("argparse: parse unsigned integers") Signed-off-by: Chengwen Feng --- lib/argparse/rte_argparse.h | 78 ++++++++++++++++--------------------- 1 file changed, 33 insertions(+), 45 deletions(-) diff --git a/lib/argparse/rte_argparse.h b/lib/argparse/rte_argparse.h index 47e231bef9..a6a7790cb4 100644 --- a/lib/argparse/rte_argparse.h +++ b/lib/argparse/rte_argparse.h @@ -37,52 +37,40 @@ extern "C" { #endif +/**@{@name Flag definition (in bitmask form) for an argument + * + * @note Bits[0~1] represent the argument whether has value, + * bits[2~9] represent the value type which used when autosave. + * + * @see struct rte_argparse_arg::flags + */ +/** The argument has no value. */ +#define RTE_ARGPARSE_ARG_NO_VALUE RTE_SHIFT_VAL64(1, 0) +/** The argument must have a value. */ +#define RTE_ARGPARSE_ARG_REQUIRED_VALUE RTE_SHIFT_VAL64(2, 0) +/** The argument has optional value. */ +#define RTE_ARGPARSE_ARG_OPTIONAL_VALUE RTE_SHIFT_VAL64(3, 0) +/** The argument's value is int type. */ +#define RTE_ARGPARSE_ARG_VALUE_INT RTE_SHIFT_VAL64(1, 2) +/** The argument's value is uint8 type. */ +#define RTE_ARGPARSE_ARG_VALUE_U8 RTE_SHIFT_VAL64(2, 2) +/** The argument's value is uint16 type. */ +#define RTE_ARGPARSE_ARG_VALUE_U16 RTE_SHIFT_VAL64(3, 2) +/** The argument's value is uint32 type. */ +#define RTE_ARGPARSE_ARG_VALUE_U32 RTE_SHIFT_VAL64(4, 2) +/** The argument's value is uint64 type. */ +#define RTE_ARGPARSE_ARG_VALUE_U64 RTE_SHIFT_VAL64(5, 2) +/** Max value type. */ +#define RTE_ARGPARSE_ARG_VALUE_MAX RTE_SHIFT_VAL64(6, 2) /** - * Flag definition (in bitmask form) for an argument. + * Flag for that argument support occur multiple times. + * This flag can be set only when the argument is optional. + * When this flag is set, the callback type must be used for parsing. */ -enum rte_argparse_flag { - /* - * Bits 0-1: represent the argument whether has value. - */ - - /** The argument has no value. */ - RTE_ARGPARSE_ARG_NO_VALUE = RTE_SHIFT_VAL64(1, 0), - /** The argument must have a value. */ - RTE_ARGPARSE_ARG_REQUIRED_VALUE = RTE_SHIFT_VAL64(2, 0), - /** The argument has optional value. */ - RTE_ARGPARSE_ARG_OPTIONAL_VALUE = RTE_SHIFT_VAL64(3, 0), - - - /* - * Bits 2-9: represent the value type which used when autosave - */ - - /** The argument's value is int type. */ - RTE_ARGPARSE_ARG_VALUE_INT = RTE_SHIFT_VAL64(1, 2), - /** The argument's value is uint8 type. */ - RTE_ARGPARSE_ARG_VALUE_U8 = RTE_SHIFT_VAL64(2, 2), - /** The argument's value is uint16 type. */ - RTE_ARGPARSE_ARG_VALUE_U16 = RTE_SHIFT_VAL64(3, 2), - /** The argument's value is uint32 type. */ - RTE_ARGPARSE_ARG_VALUE_U32 = RTE_SHIFT_VAL64(4, 2), - /** The argument's value is uint64 type. */ - RTE_ARGPARSE_ARG_VALUE_U64 = RTE_SHIFT_VAL64(5, 2), - /** Max value type. */ - RTE_ARGPARSE_ARG_VALUE_MAX = RTE_SHIFT_VAL64(6, 2), - - - /** - * Bit 10: flag for that argument support occur multiple times. - * This flag can be set only when the argument is optional. - * When this flag is set, the callback type must be used for parsing. - */ - RTE_ARGPARSE_ARG_SUPPORT_MULTI = RTE_BIT64(10), - - /** - * Bits 48-63: reserved for this library implementation usage. - */ - RTE_ARGPARSE_ARG_RESERVED_FIELD = RTE_GENMASK64(63, 48), -}; +#define RTE_ARGPARSE_ARG_SUPPORT_MULTI RTE_BIT64(10) +/** Reserved for this library implementation usage. */ +#define RTE_ARGPARSE_ARG_RESERVED_FIELD RTE_GENMASK64(63, 48) +/**@}*/ /** * A structure used to hold argument's configuration. @@ -126,7 +114,7 @@ struct rte_argparse_arg { */ void *val_set; - /** @see rte_argparse_flag */ + /** Flag definition (RTE_ARGPARSE_ARG_*) for the argument. */ uint64_t flags; }; From patchwork Thu Mar 7 13:07:41 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: fengchengwen X-Patchwork-Id: 138102 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 E519E43BCF; Thu, 7 Mar 2024 14:09:37 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 6993E4067E; Thu, 7 Mar 2024 14:09:29 +0100 (CET) Received: from szxga04-in.huawei.com (szxga04-in.huawei.com [45.249.212.190]) by mails.dpdk.org (Postfix) with ESMTP id 1076B427DD for ; Thu, 7 Mar 2024 14:09:25 +0100 (CET) Received: from mail.maildlp.com (unknown [172.19.88.163]) by szxga04-in.huawei.com (SkyGuard) with ESMTP id 4Tr8hj4MlNz2BfZX; Thu, 7 Mar 2024 21:07:01 +0800 (CST) Received: from dggpeml500024.china.huawei.com (unknown [7.185.36.10]) by mail.maildlp.com (Postfix) with ESMTPS id B45F118001B; Thu, 7 Mar 2024 21:09:23 +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_256_GCM_SHA384) id 15.1.2507.35; Thu, 7 Mar 2024 21:09:23 +0800 From: Chengwen Feng To: , , Subject: [PATCH v2 4/5] argparse: fix argument flags operate as uint32 type Date: Thu, 7 Mar 2024 13:07:41 +0000 Message-ID: <20240307130742.5578-5-fengchengwen@huawei.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20240307130742.5578-1-fengchengwen@huawei.com> References: <20240220131502.47510-1-fengchengwen@huawei.com> <20240307130742.5578-1-fengchengwen@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.50.165.33] X-ClientProxiedBy: dggems704-chm.china.huawei.com (10.3.19.181) 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 | 21 +++++++++++++-------- lib/argparse/rte_argparse.c | 4 ++-- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/app/test/test_argparse.c b/app/test/test_argparse.c index c98bcee56d..7cecd7116c 100644 --- a/app/test/test_argparse.c +++ b/app/test/test_argparse.c @@ -16,6 +16,9 @@ static char *default_argv[1]; static char *strdup_store_array[MAX_STRDUP_STORE_NUM]; static uint32_t strdup_store_index; +#define TEST_ARGPARSE_FLAG_HAS_ARG_BITMASK RTE_SHIFT_VAL64(3, 0) +#define TEST_ARGPARSE_FLAG_VAL_TYPE_BITMASK RTE_SHIFT_VAL64(255, 2) + /* * Define strdup wrapper. * 1. Mainly to fix compile error "warning: assignment discards 'const' @@ -188,7 +191,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 +200,7 @@ test_argparse_invalid_has_val(void) int ret; obj = test_argparse_init_obj(); - obj->args[0].flags &= ~0x3u; + obj->args[0].flags &= ~TEST_ARGPARSE_FLAG_HAS_ARG_BITMASK; ret = rte_argparse_parse(obj, default_argc, default_argv); TEST_ASSERT(ret == -EINVAL, "Argparse parse expect failed!"); @@ -205,7 +208,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 &= ~TEST_ARGPARSE_FLAG_HAS_ARG_BITMASK; 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 +272,9 @@ test_argparse_invalid_arg_flags(void) int ret; obj = test_argparse_init_obj(); - obj->args[0].flags |= ~0x107FFu; + obj->args[0].flags |= ~(TEST_ARGPARSE_FLAG_HAS_ARG_BITMASK | + TEST_ARGPARSE_FLAG_VAL_TYPE_BITMASK | + RTE_ARGPARSE_ARG_SUPPORT_MULTI); ret = rte_argparse_parse(obj, default_argc, default_argv); TEST_ASSERT(ret == -EINVAL, "Argparse parse expect failed!"); @@ -337,7 +342,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 +374,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 +415,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 +650,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 Thu Mar 7 13:07:42 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: fengchengwen X-Patchwork-Id: 138103 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 6299843BCF; Thu, 7 Mar 2024 14:09:44 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 96D7B42ED3; Thu, 7 Mar 2024 14:09:30 +0100 (CET) Received: from szxga01-in.huawei.com (szxga01-in.huawei.com [45.249.212.187]) by mails.dpdk.org (Postfix) with ESMTP id 23D7C427E6 for ; Thu, 7 Mar 2024 14:09:25 +0100 (CET) Received: from mail.maildlp.com (unknown [172.19.163.174]) by szxga01-in.huawei.com (SkyGuard) with ESMTP id 4Tr8hn0np7zwPHm; Thu, 7 Mar 2024 21:07:05 +0800 (CST) Received: from dggpeml500024.china.huawei.com (unknown [7.185.36.10]) by mail.maildlp.com (Postfix) with ESMTPS id CAD42144544; Thu, 7 Mar 2024 21:09:23 +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_256_GCM_SHA384) id 15.1.2507.35; Thu, 7 Mar 2024 21:09:23 +0800 From: Chengwen Feng To: , , Subject: [PATCH v2 5/5] test/argparse: refine testcases Date: Thu, 7 Mar 2024 13:07:42 +0000 Message-ID: <20240307130742.5578-6-fengchengwen@huawei.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20240307130742.5578-1-fengchengwen@huawei.com> References: <20240220131502.47510-1-fengchengwen@huawei.com> <20240307130742.5578-1-fengchengwen@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.50.165.33] X-ClientProxiedBy: dggems704-chm.china.huawei.com (10.3.19.181) 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 7cecd7116c..09a6366b9f 100644 --- a/app/test/test_argparse.c +++ b/app/test/test_argparse.c @@ -199,11 +199,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 &= ~TEST_ARGPARSE_FLAG_HAS_ARG_BITMASK; 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"; @@ -271,6 +273,7 @@ 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 |= ~(TEST_ARGPARSE_FLAG_HAS_ARG_BITMASK | TEST_ARGPARSE_FLAG_VAL_TYPE_BITMASK | @@ -278,16 +281,18 @@ test_argparse_invalid_arg_flags(void) 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); @@ -325,13 +330,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!"); @@ -355,7 +360,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!"); @@ -387,7 +392,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); @@ -421,6 +426,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"; @@ -428,7 +434,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!"); @@ -472,7 +478,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; @@ -493,10 +500,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!"); @@ -547,7 +554,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); @@ -611,7 +618,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!"); @@ -656,6 +663,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; @@ -663,19 +671,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"); @@ -713,6 +722,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; @@ -727,7 +737,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); @@ -735,7 +745,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");