From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <dev-bounces@dpdk.org>
Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124])
	by inbox.dpdk.org (Postfix) with ESMTP id E8D4745702;
	Wed, 31 Jul 2024 19:36:45 +0200 (CEST)
Received: from mails.dpdk.org (localhost [127.0.0.1])
	by mails.dpdk.org (Postfix) with ESMTP id EDD7C43250;
	Wed, 31 Jul 2024 19:36:34 +0200 (CEST)
Received: from mail-pf1-f177.google.com (mail-pf1-f177.google.com
 [209.85.210.177])
 by mails.dpdk.org (Postfix) with ESMTP id 033014300D
 for <dev@dpdk.org>; Wed, 31 Jul 2024 19:36:31 +0200 (CEST)
Received: by mail-pf1-f177.google.com with SMTP id
 d2e1a72fcca58-70d1a74a43bso4332177b3a.1
 for <dev@dpdk.org>; Wed, 31 Jul 2024 10:36:30 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=networkplumber-org.20230601.gappssmtp.com; s=20230601; t=1722447390;
 x=1723052190; 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=Hili8b4kXpdYMHVW0RIB2twZQjiuKqzpJ3ryUIrxh7izNV0ZKxsnMPBv+cg0lWiY5T
 hhtL7/XHlMA0dQUWMl6bKB4yS8BmE5LD7Cvx0e/u22H238K3o8nxe6Yh2ata3jn1Z+9B
 v9Nmzi8/8nSsoiaQB6NweXftACUW1rr2jfsnUcaJ4tUy/o+F6tCcFF3Nl49XduW4VEJp
 OZcZ6hndHhgrouNnkJ7CGsXZ875IGr6LYvVAVuNXPuGk5uusaR1nr8n04RSd2uGES4Zo
 wm7jOXEXtr+M1ht9isTZ7eMIIgyi1+jTZuW0GYyepndqjiC9cxs76asTS5P7yxX+ypb0
 WN3Q==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1722447390; x=1723052190;
 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=TZ8AMNgQsZf//nukWvsw6VMz07/ytERE3AlHFl/P2n+5ok/G6XxS5RnKW7LsKsO+ck
 F5vjiteeNAV+rqvwC0EjI6N7/hoohMCb1NCsuyhkuhzat3AHfH7u9XJWKfG0DK2X5+iY
 bWHzVF+1lYAcvTkOvb6rPqSOw2I224vAPjzp5xZE3kvemG9YCXewDtO05FpXVfUleGgc
 uP65Ve0fG7d1yc5Fv18Sh0VKP91mAGk68ED1MRjlLVYsikpfZtJ5SCNqDqSTPMjgioyL
 0FK+IgV+JXvR6MW9Z9P75zdWknJstA4h9f9+vTIgMoZMFpgdiWL9B3l7POPJtGpeUNEY
 XyjQ==
X-Gm-Message-State: AOJu0YzWYlE941fcYbluaCbxytmi6SS7okIxP1W+f266IyoVWZWimgpw
 n8oUviZo9MFtLRxtAmn1xMrJkXjjB5POdNMevMZwv69OrWFLPP74pg1d/A4rpPan/HzMSHj1818
 o
X-Google-Smtp-Source: AGHT+IFxiYlY2aHFmfe0CRUz7VpqLTuP50qzQeg2UVUrBRRyr82ZQ937PJ0o3fLfqsIveZSX7Psf6Q==
X-Received: by 2002:a05:6a20:c890:b0:1c4:87f5:995d with SMTP id
 adf61e73a8af0-1c68d2cef53mr82278637.54.1722447390103; 
 Wed, 31 Jul 2024 10:36:30 -0700 (PDT)
Received: from hermes.local (204-195-96-226.wavecable.com. [204.195.96.226])
 by smtp.gmail.com with ESMTPSA id
 41be03b00d2f7-7a9f7b7b1besm10870484a12.2.2024.07.31.10.36.28
 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
 Wed, 31 Jul 2024 10:36:29 -0700 (PDT)
From: Stephen Hemminger <stephen@networkplumber.org>
To: dev@dpdk.org
Cc: Stephen Hemminger <stephen@networkplumber.org>
Subject: [PATCH v3 3/3] test: restore cfgfile tests
Date: Wed, 31 Jul 2024 10:35:13 -0700
Message-ID: <20240731173616.91081-4-stephen@networkplumber.org>
X-Mailer: git-send-email 2.43.0
In-Reply-To: <20240731173616.91081-1-stephen@networkplumber.org>
References: <20240730225520.83314-1-stephen@networkplumber.org>
 <20240731173616.91081-1-stephen@networkplumber.org>
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: DPDK patches and discussions <dev.dpdk.org>
List-Unsubscribe: <https://mails.dpdk.org/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://mails.dpdk.org/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <https://mails.dpdk.org/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=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 <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

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(&params, 0, sizeof(params));
 	params.comment_character = '#';
 
-	cfgfile = rte_cfgfile_load_with_params(CFG_FILES_ETC "/sample2.ini", 0,
-					       &params);
-	TEST_ASSERT_NOT_NULL(cfgfile, "Failed to parse sample2.ini");
+	cfgfile = rte_cfgfile_load_with_params(filename, 0, &params);
+	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(&params, 0, sizeof(params));
 	params.comment_character = '$';
 
-	cfgfile = rte_cfgfile_load_with_params(CFG_FILES_ETC "/sample2.ini", 0,
-					       &params);
+	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, &params);
 	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