From: Bruce Richardson <bruce.richardson@intel.com>
To: Stephen Hemminger <stephen@networkplumber.org>
Cc: <dev@dpdk.org>
Subject: Re: [PATCH v4 3/3] test: restore cfgfile tests
Date: Fri, 2 Aug 2024 16:21:25 +0100 [thread overview]
Message-ID: <Zqz5dY2AtGBQc9BY@bricha3-mobl1.ger.corp.intel.com> (raw)
In-Reply-To: <20240801173029.65710-4-stephen@networkplumber.org>
On Thu, Aug 01, 2024 at 10:29:10AM -0700, Stephen Hemminger wrote:
> 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 <stephen@networkplumber.org>
> ---
> 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
>
Tested-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
A further cleanup that could be done with the test files is to remove the
unnecessary "etc" subdirectory.
> 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 = '<unknown 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 <stdio.h>
> #include <string.h>
> #include <stdint.h>
> -#include <sys/queue.h>
> +#include <unistd.h>
> +
> +#ifdef RTE_EXEC_ENV_WINDOWS
> +#include <io.h>
> +#endif
>
> #include <rte_cfgfile.h>
>
> #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@'])
> --
> 2.43.0
>
next prev parent reply other threads:[~2024-08-02 15:21 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-30 22:51 [PATCH 0/3] restore cfgfile library tests Stephen Hemminger
2024-07-30 22:51 ` [PATCH 1/3] buildtools: add helper to convert text file to header Stephen Hemminger
2024-07-30 22:51 ` [PATCH 2/3] test: restore cfgfile tests Stephen Hemminger
2024-07-30 22:51 ` [PATCH 3/3] test: remove unused resource API Stephen Hemminger
2024-07-31 4:20 ` [PATCH v2 0/3] restore cfgfile library tests Stephen Hemminger
2024-07-31 4:20 ` [PATCH v2 1/3] buildtools: add helper to convert text file to header Stephen Hemminger
2024-07-31 4:20 ` [PATCH v2 2/3] test: restore cfgfile tests Stephen Hemminger
2024-07-31 4:20 ` [PATCH v2 3/3] test: remove unused resource API Stephen Hemminger
2024-07-31 17:35 ` [PATCH v3 0/3] restore lost tests for rte_cfgfile Stephen Hemminger
2024-07-31 17:35 ` [PATCH v3 1/3] buildtools: add helper to convert text file to header Stephen Hemminger
2024-07-31 17:35 ` [PATCH v3 2/3] test: remove unused resource API Stephen Hemminger
2024-07-31 17:35 ` [PATCH v3 3/3] test: restore cfgfile tests Stephen Hemminger
2024-08-01 17:29 ` [PATCH v4 0/3] restore lost " Stephen Hemminger
2024-08-01 17:29 ` [PATCH v4 1/3] buildtools: add helper to convert text file to header Stephen Hemminger
2024-08-02 15:15 ` Bruce Richardson
2024-08-01 17:29 ` [PATCH v4 2/3] test: remove unused resource API Stephen Hemminger
2024-08-02 15:16 ` Bruce Richardson
2024-08-01 17:29 ` [PATCH v4 3/3] test: restore cfgfile tests Stephen Hemminger
2024-08-02 15:21 ` Bruce Richardson [this message]
2024-08-02 16:44 ` [PATCH v5 0/4] restore unused " Stephen Hemminger
2024-08-02 16:45 ` [PATCH v5 1/4] buildtools: add helper to convert text file to header Stephen Hemminger
2024-08-02 16:45 ` [PATCH v5 2/4] test: remove unused resource API Stephen Hemminger
2024-08-02 16:45 ` [PATCH v5 3/4] test: restore cfgfile tests Stephen Hemminger
2024-08-02 16:52 ` Bruce Richardson
2024-08-02 16:45 ` [PATCH v5 4/4] test: rearrange test_cfgfiles cases Stephen Hemminger
2024-08-02 16:51 ` Bruce Richardson
2024-08-02 17:06 ` Stephen Hemminger
2024-08-06 8:37 ` Bruce Richardson
2024-08-13 15:57 ` [PATCH v6 0/4] test: restore cfgfile lib tests Stephen Hemminger
2024-08-13 15:57 ` [PATCH v6 1/4] buildtools: add helper to convert text file to header Stephen Hemminger
2024-08-13 15:57 ` [PATCH v6 2/4] test: remove unused resource API Stephen Hemminger
2024-08-13 15:57 ` [PATCH v6 3/4] test: rearrange test_cfgfiles cases Stephen Hemminger
2024-08-13 15:57 ` [PATCH v6 4/4] test: restore cfgfile tests Stephen Hemminger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Zqz5dY2AtGBQc9BY@bricha3-mobl1.ger.corp.intel.com \
--to=bruce.richardson@intel.com \
--cc=dev@dpdk.org \
--cc=stephen@networkplumber.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).