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 <step...@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.richard...@intel.com> Acked-by: Bruce Richardson <bruce.richard...@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 >