From patchwork Thu Aug 1 17:29:10 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Hemminger X-Patchwork-Id: 142852 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 CFC3745715; Thu, 1 Aug 2024 19:31:02 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id D2178427B7; Thu, 1 Aug 2024 19:30:46 +0200 (CEST) Received: from mail-pf1-f181.google.com (mail-pf1-f181.google.com [209.85.210.181]) by mails.dpdk.org (Postfix) with ESMTP id 6F82940E4B for ; Thu, 1 Aug 2024 19:30:42 +0200 (CEST) Received: by mail-pf1-f181.google.com with SMTP id d2e1a72fcca58-70eae5896bcso6295489b3a.2 for ; Thu, 01 Aug 2024 10:30:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=networkplumber-org.20230601.gappssmtp.com; s=20230601; t=1722533441; x=1723138241; darn=dpdk.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=CvrugBp6JW2ZDSjkZo/6sovuHrtS23lm8bFocmhgl90=; b=ZMP+eKgFaIPQAZ4KFHBG8V0l81QSazJowELYs9bQJYlA4JPvF3qwAOYS2AygAlqGkJ B9oLSbcfhgF33NaLSEPsvRjVTogwPZysylZnmWGw33LjCirIBv4tJjDkkHClGPBxsif4 AoDzd6BmT+eKVMa9EfE9roJkYlaRrjL0owTWtur8quZB03K4JZho6xZfddgZ3WGxHp0s 8lj2moUYfQ3U5Zd1Dimv1GL4frzlqfmuljaUi4K3zaAkeFymoKa+G7uSwb6DSmdgbX6f CCgrM43io+cojGY80pNOblzNM09pmpcYFA0DbQuhfDILX+Xw4WV38KcTPui8QYufeM6k kDUw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1722533441; x=1723138241; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=CvrugBp6JW2ZDSjkZo/6sovuHrtS23lm8bFocmhgl90=; b=SREYEBGFH734ToolE2kQYvq7wy1FHYdL9bKGu8eDNPeoeJCWqD/ecFTmSWvj+B+caU 45b+VA0mEyOkOAI2HzdDRCCHeB8qRyuNX+EBx0HkngsfTL6vrWuRH2yJNPQtK0CvmQbY ihx0xKj5+yPNvflXwF1v2t4AzQGVz9omA69eqYHUYjWH7//cyabb4kyu3qqk0S6dX0Jz MVHFaIuIZqwsktKOVSghLY5qUMFuEsCJR0HT19cUY/ZlhpOijYNsi+7QF9h+AMbIWctW QbhJ1LFhyn5qH3Ctry7+F4dMRtYNu3GDK2l4oAiSIQlj/cfm5bR4tA3cFBadtOznsZUH gVPA== X-Gm-Message-State: AOJu0Ywj1HChclRluL7P0FEI48Bm8TzILWoVz/mfXFuJKhyt1Em3m1cJ KLArhtQXYBX6bIBSaDoFY4X+gp7pxLrKRgIC0Fa9WGn60EIOVrOs3sBapaZThiZrbCL+lYERmL3 c X-Google-Smtp-Source: AGHT+IEoXPJGju5eQydKSLDKNWqPe/Xcf3urHS4LDqUZEvphUKUkSDqD5Ic41mhpL6tlFF/TTal8jw== X-Received: by 2002:a05:6a00:22d6:b0:70a:f22d:caf5 with SMTP id d2e1a72fcca58-7106cf8aba9mr1090894b3a.5.1722533441449; Thu, 01 Aug 2024 10:30:41 -0700 (PDT) Received: from hermes.local (204-195-96-226.wavecable.com. [204.195.96.226]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7106ec02a3fsm100170b3a.16.2024.08.01.10.30.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 Aug 2024 10:30:41 -0700 (PDT) From: Stephen Hemminger To: dev@dpdk.org Cc: Stephen Hemminger Subject: [PATCH v4 3/3] test: restore cfgfile tests Date: Thu, 1 Aug 2024 10:29:10 -0700 Message-ID: <20240801173029.65710-4-stephen@networkplumber.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240801173029.65710-1-stephen@networkplumber.org> References: <20240730225520.83314-1-stephen@networkplumber.org> <20240801173029.65710-1-stephen@networkplumber.org> MIME-Version: 1.0 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 These tests were not built since the conversion to meson. Instead of using embedded resource functions, put data in include file and generate temporary file before the test. Signed-off-by: Stephen Hemminger Tested-by: Bruce Richardson Acked-by: Bruce Richardson --- app/meson.build | 3 +- app/test/meson.build | 6 +- app/test/test_cfgfile.c | 153 +++++++++++++++++++---------- app/test/test_cfgfiles/meson.build | 19 ++++ 4 files changed, 129 insertions(+), 52 deletions(-) create mode 100644 app/test/test_cfgfiles/meson.build diff --git a/app/meson.build b/app/meson.build index 5b2c80c7a1..e2db888ae1 100644 --- a/app/meson.build +++ b/app/meson.build @@ -55,6 +55,7 @@ foreach app:apps build = true reason = '' # set if build == false to explain sources = [] + resources = [] includes = [] cflags = default_cflags ldflags = default_ldflags @@ -115,7 +116,7 @@ foreach app:apps endif exec = executable('dpdk-' + name, - sources, + [ sources, resources ], c_args: cflags, link_args: ldflags, link_whole: link_libs, diff --git a/app/test/meson.build b/app/test/meson.build index 62478c0bb6..b2bb7c36f6 100644 --- a/app/test/meson.build +++ b/app/test/meson.build @@ -35,7 +35,7 @@ source_file_deps = { 'test_bitratestats.c': ['metrics', 'bitratestats', 'ethdev'] + sample_packet_forward_deps, 'test_bpf.c': ['bpf', 'net'], 'test_byteorder.c': [], -# 'test_cfgfile.c': ['cfgfile'], + 'test_cfgfile.c': ['cfgfile'], 'test_cksum.c': ['net'], 'test_cksum_perf.c': ['net'], 'test_cmdline.c': [], @@ -261,3 +261,7 @@ if not is_windows build_by_default: true, install: false) endif + +subdir('test_cfgfiles') + +resources += test_cfgfile_h diff --git a/app/test/test_cfgfile.c b/app/test/test_cfgfile.c index a5e3d8699c..7cfcaf348a 100644 --- a/app/test/test_cfgfile.c +++ b/app/test/test_cfgfile.c @@ -5,48 +5,54 @@ #include #include #include -#include +#include + +#ifdef RTE_EXEC_ENV_WINDOWS +#include +#endif #include #include "test.h" -#include "resource.h" - - -#define CFG_FILES_ETC "test_cfgfiles/etc" -REGISTER_LINKED_RESOURCE(test_cfgfiles); +#include "test_cfgfiles.h" static int -test_cfgfile_setup(void) +make_tmp_file(char *filename, const char *prefix, const char *data) { - const struct resource *r; - int ret; + size_t len = strlen(data); + size_t count; + FILE *f; - r = resource_find("test_cfgfiles"); - TEST_ASSERT_NOT_NULL(r, "missing resource test_cfgfiles"); +#ifdef RTE_EXEC_ENV_WINDOWS + char tempDirName[MAX_PATH - 14]; - ret = resource_untar(r); - TEST_ASSERT_SUCCESS(ret, "failed to untar %s", r->name); + if (GetTempPathA(sizeof(tempDirName), tempDirName) == 0) + return -1; - return 0; -} + if (GetTempFileNameA(tempDirName, prefix, 0, filename) == 0) + return -1; -static int -test_cfgfile_cleanup(void) -{ - const struct resource *r; - int ret; + f = fopen(filename, "wt"); +#else + snprintf(filename, PATH_MAX, "/tmp/%s_XXXXXXX", prefix); - r = resource_find("test_cfgfiles"); - TEST_ASSERT_NOT_NULL(r, "missing resource test_cfgfiles"); + int fd = mkstemp(filename); + if (fd < 0) + return -1; - ret = resource_rm_by_tar(r); - TEST_ASSERT_SUCCESS(ret, "Failed to delete resource %s", r->name); + f = fdopen(fd, "w"); +#endif + if (f == NULL) + return -1; - return 0; + count = fwrite(data, sizeof(char), len, f); + fclose(f); + + return (count == len) ? 0 : -1; } + static int _test_cfgfile_sample(struct rte_cfgfile *cfgfile) { @@ -87,9 +93,13 @@ static int test_cfgfile_sample1(void) { struct rte_cfgfile *cfgfile; + char filename[PATH_MAX]; int ret; - cfgfile = rte_cfgfile_load(CFG_FILES_ETC "/sample1.ini", 0); + ret = make_tmp_file(filename, "sample1", sample1_ini); + TEST_ASSERT_SUCCESS(ret, "Failed to setup temp file"); + + cfgfile = rte_cfgfile_load(filename, 0); TEST_ASSERT_NOT_NULL(cfgfile, "Failed to load config file"); ret = _test_cfgfile_sample(cfgfile); @@ -98,6 +108,8 @@ test_cfgfile_sample1(void) ret = rte_cfgfile_close(cfgfile); TEST_ASSERT_SUCCESS(ret, "Failed to close cfgfile"); + remove(filename); + return 0; } @@ -106,15 +118,18 @@ test_cfgfile_sample2(void) { struct rte_cfgfile_parameters params; struct rte_cfgfile *cfgfile; + char filename[PATH_MAX]; int ret; + ret = make_tmp_file(filename, "sample2", sample2_ini); + TEST_ASSERT_SUCCESS(ret, "Failed to setup temp file"); + /* override comment character */ memset(¶ms, 0, sizeof(params)); params.comment_character = '#'; - cfgfile = rte_cfgfile_load_with_params(CFG_FILES_ETC "/sample2.ini", 0, - ¶ms); - TEST_ASSERT_NOT_NULL(cfgfile, "Failed to parse sample2.ini"); + cfgfile = rte_cfgfile_load_with_params(filename, 0, ¶ms); + TEST_ASSERT_NOT_NULL(cfgfile, "Failed to parse sample2"); ret = _test_cfgfile_sample(cfgfile); TEST_ASSERT_SUCCESS(ret, "Failed to validate sample file: %d", ret); @@ -122,6 +137,8 @@ test_cfgfile_sample2(void) ret = rte_cfgfile_close(cfgfile); TEST_ASSERT_SUCCESS(ret, "Failed to close cfgfile"); + remove(filename); + return 0; } @@ -129,10 +146,14 @@ static int test_cfgfile_realloc_sections(void) { struct rte_cfgfile *cfgfile; + char filename[PATH_MAX]; int ret; const char *value; - cfgfile = rte_cfgfile_load(CFG_FILES_ETC "/realloc_sections.ini", 0); + ret = make_tmp_file(filename, "realloc", realloc_sections_ini); + TEST_ASSERT_SUCCESS(ret, "Failed to setup temp file"); + + cfgfile = rte_cfgfile_load(filename, 0); TEST_ASSERT_NOT_NULL(cfgfile, "Failed to load config file"); ret = rte_cfgfile_num_sections(cfgfile, NULL, 0); @@ -152,13 +173,15 @@ test_cfgfile_realloc_sections(void) TEST_ASSERT(strcmp("value8_section9", value) == 0, "key unexpected value: %s", value); - ret = rte_cfgfile_save(cfgfile, "/tmp/cfgfile_save.ini"); + ret = rte_cfgfile_save(cfgfile, "/tmp/cfg_save.ini"); TEST_ASSERT_SUCCESS(ret, "Failed to save *.ini file"); - remove("/tmp/cfgfile_save.ini"); + remove("/tmp/cfg_save.ini"); ret = rte_cfgfile_close(cfgfile); TEST_ASSERT_SUCCESS(ret, "Failed to close cfgfile"); + remove(filename); + return 0; } @@ -166,10 +189,16 @@ static int test_cfgfile_invalid_section_header(void) { struct rte_cfgfile *cfgfile; + char filename[PATH_MAX]; + int ret; + + ret = make_tmp_file(filename, "invalid", invalid_section_ini); + TEST_ASSERT_SUCCESS(ret, "Failed to setup temp file"); - cfgfile = rte_cfgfile_load(CFG_FILES_ETC "/invalid_section.ini", 0); + cfgfile = rte_cfgfile_load(filename, 0); TEST_ASSERT_NULL(cfgfile, "Expected failure did not occur"); + remove(filename); return 0; } @@ -178,15 +207,20 @@ test_cfgfile_invalid_comment(void) { struct rte_cfgfile_parameters params; struct rte_cfgfile *cfgfile; + char filename[PATH_MAX]; + int ret; /* override comment character with an invalid one */ memset(¶ms, 0, sizeof(params)); params.comment_character = '$'; - cfgfile = rte_cfgfile_load_with_params(CFG_FILES_ETC "/sample2.ini", 0, - ¶ms); + ret = make_tmp_file(filename, "sample2", sample2_ini); + TEST_ASSERT_SUCCESS(ret, "Failed to setup temp file"); + + cfgfile = rte_cfgfile_load_with_params(filename, 0, ¶ms); TEST_ASSERT_NULL(cfgfile, "Expected failure did not occur"); + remove(filename); return 0; } @@ -194,10 +228,16 @@ static int test_cfgfile_invalid_key_value_pair(void) { struct rte_cfgfile *cfgfile; + char filename[PATH_MAX]; + int ret; + + ret = make_tmp_file(filename, "empty_key", empty_key_value_ini); + TEST_ASSERT_SUCCESS(ret, "Failed to setup temp file"); - cfgfile = rte_cfgfile_load(CFG_FILES_ETC "/empty_key_value.ini", 0); + cfgfile = rte_cfgfile_load(filename, 0); TEST_ASSERT_NULL(cfgfile, "Expected failure did not occur"); + remove(filename); return 0; } @@ -206,11 +246,14 @@ test_cfgfile_empty_key_value_pair(void) { struct rte_cfgfile *cfgfile; const char *value; + char filename[PATH_MAX]; int ret; - cfgfile = rte_cfgfile_load(CFG_FILES_ETC "/empty_key_value.ini", - CFG_FLAG_EMPTY_VALUES); - TEST_ASSERT_NOT_NULL(cfgfile, "Failed to parse empty_key_value.ini"); + ret = make_tmp_file(filename, "empty_key_value", empty_key_value_ini); + TEST_ASSERT_SUCCESS(ret, "Failed to setup temp file"); + + cfgfile = rte_cfgfile_load(filename, CFG_FLAG_EMPTY_VALUES); + TEST_ASSERT_NOT_NULL(cfgfile, "Failed to parse empty_key_value"); ret = rte_cfgfile_num_sections(cfgfile, NULL, 0); TEST_ASSERT(ret == 1, "Unexpected number of sections: %d", ret); @@ -227,6 +270,7 @@ test_cfgfile_empty_key_value_pair(void) ret = rte_cfgfile_close(cfgfile); TEST_ASSERT_SUCCESS(ret, "Failed to close cfgfile"); + remove(filename); return 0; } @@ -234,10 +278,16 @@ static int test_cfgfile_missing_section(void) { struct rte_cfgfile *cfgfile; + char filename[PATH_MAX]; + int ret; + + ret = make_tmp_file(filename, "missing_section", missing_section_ini); + TEST_ASSERT_SUCCESS(ret, "Failed to setup temp file"); - cfgfile = rte_cfgfile_load(CFG_FILES_ETC "/missing_section.ini", 0); + cfgfile = rte_cfgfile_load(filename, 0); TEST_ASSERT_NULL(cfgfile, "Expected failure did not occur"); + remove(filename); return 0; } @@ -246,10 +296,13 @@ test_cfgfile_global_properties(void) { struct rte_cfgfile *cfgfile; const char *value; + char filename[PATH_MAX]; int ret; - cfgfile = rte_cfgfile_load(CFG_FILES_ETC "/missing_section.ini", - CFG_FLAG_GLOBAL_SECTION); + ret = make_tmp_file(filename, "missing_section", missing_section_ini); + TEST_ASSERT_SUCCESS(ret, "Failed to setup temp file"); + + cfgfile = rte_cfgfile_load(filename, CFG_FLAG_GLOBAL_SECTION); TEST_ASSERT_NOT_NULL(cfgfile, "Failed to load config file"); ret = rte_cfgfile_num_sections(cfgfile, NULL, 0); @@ -268,6 +321,7 @@ test_cfgfile_global_properties(void) ret = rte_cfgfile_close(cfgfile); TEST_ASSERT_SUCCESS(ret, "Failed to close cfgfile"); + remove(filename); return 0; } @@ -275,9 +329,13 @@ static int test_cfgfile_empty_file(void) { struct rte_cfgfile *cfgfile; + char filename[PATH_MAX]; int ret; - cfgfile = rte_cfgfile_load(CFG_FILES_ETC "/empty.ini", 0); + ret = make_tmp_file(filename, "empty", empty_ini); + TEST_ASSERT_SUCCESS(ret, "Failed to setup temp file"); + + cfgfile = rte_cfgfile_load(filename, 0); TEST_ASSERT_NOT_NULL(cfgfile, "Failed to load config file"); ret = rte_cfgfile_num_sections(cfgfile, NULL, 0); @@ -286,15 +344,13 @@ test_cfgfile_empty_file(void) ret = rte_cfgfile_close(cfgfile); TEST_ASSERT_SUCCESS(ret, "Failed to close cfgfile"); + remove(filename); return 0; } static int test_cfgfile(void) { - if (test_cfgfile_setup()) - return -1; - if (test_cfgfile_sample1()) return -1; @@ -325,10 +381,7 @@ test_cfgfile(void) if (test_cfgfile_empty_file()) return -1; - if (test_cfgfile_cleanup()) - return -1; - return 0; } -REGISTER_TEST_COMMAND(cfgfile_autotest, test_cfgfile); +REGISTER_FAST_TEST(cfgfile_autotest, true, true, test_cfgfile); diff --git a/app/test/test_cfgfiles/meson.build b/app/test/test_cfgfiles/meson.build new file mode 100644 index 0000000000..068b61044a --- /dev/null +++ b/app/test/test_cfgfiles/meson.build @@ -0,0 +1,19 @@ +# SPDX-License-Identifier: BSD-3-Clause + +test_cfgfiles = files( + 'etc/empty.ini', + 'etc/empty_key_value.ini', + 'etc/invalid_section.ini', + 'etc/line_too_long.ini', + 'etc/missing_section.ini', + 'etc/realloc_sections.ini', + 'etc/sample1.ini', + 'etc/sample2.ini', +) + +# generate the header file used in cfgfile test +test_cfgfile_h = custom_target('test_cfgfile', + output: 'test_cfgfiles.h', + input: test_cfgfiles, + capture: true, + command: [ header_gen_cmd, '@INPUT@'])