xref: /dpdk/app/test/test_cfgfile.c (revision 554e802ee3204a24149f76946c8ad81b2582349c)
1749dc3e1SAllain Legacy /* SPDX-License-Identifier: BSD-3-Clause
2749dc3e1SAllain Legacy  * Copyright(c) 2017 Wind River Systems, Inc.
3a9de470cSBruce Richardson  */
4a9de470cSBruce Richardson 
5a9de470cSBruce Richardson #include <stdio.h>
6a9de470cSBruce Richardson #include <string.h>
7a9de470cSBruce Richardson #include <stdint.h>
8be22019aSStephen Hemminger #include <unistd.h>
9be22019aSStephen Hemminger 
10be22019aSStephen Hemminger #ifdef RTE_EXEC_ENV_WINDOWS
11be22019aSStephen Hemminger #include <io.h>
12be22019aSStephen Hemminger #endif
13a9de470cSBruce Richardson 
14a9de470cSBruce Richardson #include <rte_cfgfile.h>
15a9de470cSBruce Richardson 
16a9de470cSBruce Richardson #include "test.h"
17a9de470cSBruce Richardson 
18be22019aSStephen Hemminger #include "test_cfgfiles.h"
19a9de470cSBruce Richardson 
20a9de470cSBruce Richardson static int
21be22019aSStephen Hemminger make_tmp_file(char *filename, const char *prefix, const char *data)
22a9de470cSBruce Richardson {
23be22019aSStephen Hemminger 	size_t len = strlen(data);
24be22019aSStephen Hemminger 	size_t count;
25be22019aSStephen Hemminger 	FILE *f;
26a9de470cSBruce Richardson 
27be22019aSStephen Hemminger #ifdef RTE_EXEC_ENV_WINDOWS
28be22019aSStephen Hemminger 	char tempDirName[MAX_PATH - 14];
29a9de470cSBruce Richardson 
30be22019aSStephen Hemminger 	if (GetTempPathA(sizeof(tempDirName), tempDirName) == 0)
31be22019aSStephen Hemminger 		return -1;
32a9de470cSBruce Richardson 
33be22019aSStephen Hemminger 	if (GetTempFileNameA(tempDirName, prefix, 0, filename) == 0)
34be22019aSStephen Hemminger 		return -1;
35be22019aSStephen Hemminger 
36be22019aSStephen Hemminger 	f = fopen(filename, "wt");
37be22019aSStephen Hemminger #else
38be22019aSStephen Hemminger 	snprintf(filename, PATH_MAX, "/tmp/%s_XXXXXXX", prefix);
39be22019aSStephen Hemminger 
40be22019aSStephen Hemminger 	int fd = mkstemp(filename);
41be22019aSStephen Hemminger 	if (fd < 0)
42be22019aSStephen Hemminger 		return -1;
43be22019aSStephen Hemminger 
44be22019aSStephen Hemminger 	f = fdopen(fd, "w");
45be22019aSStephen Hemminger #endif
46be22019aSStephen Hemminger 	if (f == NULL)
47be22019aSStephen Hemminger 		return -1;
48be22019aSStephen Hemminger 
49be22019aSStephen Hemminger 	count = fwrite(data, sizeof(char), len, f);
50be22019aSStephen Hemminger 	fclose(f);
51be22019aSStephen Hemminger 
52be22019aSStephen Hemminger 	return (count == len) ? 0 : -1;
53a9de470cSBruce Richardson }
54a9de470cSBruce Richardson 
55a9de470cSBruce Richardson 
56a9de470cSBruce Richardson static int
57a9de470cSBruce Richardson _test_cfgfile_sample(struct rte_cfgfile *cfgfile)
58a9de470cSBruce Richardson {
59a9de470cSBruce Richardson 	const char *value;
60a9de470cSBruce Richardson 	int ret;
61a9de470cSBruce Richardson 
62a9de470cSBruce Richardson 	ret = rte_cfgfile_num_sections(cfgfile, NULL, 0);
63a9de470cSBruce Richardson 	TEST_ASSERT(ret == 2, "Unexpected number of sections: %d", ret);
64a9de470cSBruce Richardson 
65a9de470cSBruce Richardson 	ret = rte_cfgfile_has_section(cfgfile, "section1");
66a9de470cSBruce Richardson 	TEST_ASSERT(ret, "section1 section missing");
67a9de470cSBruce Richardson 
68a9de470cSBruce Richardson 	ret = rte_cfgfile_section_num_entries(cfgfile, "section1");
69a9de470cSBruce Richardson 	TEST_ASSERT(ret == 1, "section1 unexpected number of entries: %d", ret);
70a9de470cSBruce Richardson 
71a9de470cSBruce Richardson 	value = rte_cfgfile_get_entry(cfgfile, "section1", "key1");
72a9de470cSBruce Richardson 	TEST_ASSERT(strcmp("value1", value) == 0,
73a9de470cSBruce Richardson 		    "key1 unexpected value: %s", value);
74a9de470cSBruce Richardson 
75a9de470cSBruce Richardson 	ret = rte_cfgfile_has_section(cfgfile, "section2");
76a9de470cSBruce Richardson 	TEST_ASSERT(ret, "section2 section missing");
77a9de470cSBruce Richardson 
78a9de470cSBruce Richardson 	ret = rte_cfgfile_section_num_entries(cfgfile, "section2");
79a9de470cSBruce Richardson 	TEST_ASSERT(ret == 2, "section2 unexpected number of entries: %d", ret);
80a9de470cSBruce Richardson 
81a9de470cSBruce Richardson 	value = rte_cfgfile_get_entry(cfgfile, "section2", "key2");
82a9de470cSBruce Richardson 	TEST_ASSERT(strcmp("value2", value) == 0,
83a9de470cSBruce Richardson 		    "key2 unexpected value: %s", value);
84a9de470cSBruce Richardson 
85a9de470cSBruce Richardson 	value = rte_cfgfile_get_entry(cfgfile, "section2", "key3");
86a9de470cSBruce Richardson 	TEST_ASSERT(strcmp("value3", value) == 0,
87a9de470cSBruce Richardson 		    "key3 unexpected value: %s", value);
88a9de470cSBruce Richardson 
89a9de470cSBruce Richardson 	return 0;
90a9de470cSBruce Richardson }
91a9de470cSBruce Richardson 
92a9de470cSBruce Richardson static int
93a9de470cSBruce Richardson test_cfgfile_sample1(void)
94a9de470cSBruce Richardson {
95a9de470cSBruce Richardson 	struct rte_cfgfile *cfgfile;
96be22019aSStephen Hemminger 	char filename[PATH_MAX];
97a9de470cSBruce Richardson 	int ret;
98a9de470cSBruce Richardson 
99be22019aSStephen Hemminger 	ret = make_tmp_file(filename, "sample1", sample1_ini);
100be22019aSStephen Hemminger 	TEST_ASSERT_SUCCESS(ret, "Failed to setup temp file");
101be22019aSStephen Hemminger 
102be22019aSStephen Hemminger 	cfgfile = rte_cfgfile_load(filename, 0);
103a9de470cSBruce Richardson 	TEST_ASSERT_NOT_NULL(cfgfile, "Failed to load config file");
104a9de470cSBruce Richardson 
105a9de470cSBruce Richardson 	ret = _test_cfgfile_sample(cfgfile);
106a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(ret, "Failed to validate sample file: %d", ret);
107a9de470cSBruce Richardson 
108a9de470cSBruce Richardson 	ret = rte_cfgfile_close(cfgfile);
109a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(ret, "Failed to close cfgfile");
110a9de470cSBruce Richardson 
111*554e802eSStephen Hemminger 	ret = remove(filename);
112*554e802eSStephen Hemminger 	TEST_ASSERT_SUCCESS(ret, "Failed to remove file");
113be22019aSStephen Hemminger 
114a9de470cSBruce Richardson 	return 0;
115a9de470cSBruce Richardson }
116a9de470cSBruce Richardson 
117a9de470cSBruce Richardson static int
118a9de470cSBruce Richardson test_cfgfile_sample2(void)
119a9de470cSBruce Richardson {
120a9de470cSBruce Richardson 	struct rte_cfgfile_parameters params;
121a9de470cSBruce Richardson 	struct rte_cfgfile *cfgfile;
122be22019aSStephen Hemminger 	char filename[PATH_MAX];
123a9de470cSBruce Richardson 	int ret;
124a9de470cSBruce Richardson 
125be22019aSStephen Hemminger 	ret = make_tmp_file(filename, "sample2", sample2_ini);
126be22019aSStephen Hemminger 	TEST_ASSERT_SUCCESS(ret, "Failed to setup temp file");
127be22019aSStephen Hemminger 
128a9de470cSBruce Richardson 	/* override comment character */
129a9de470cSBruce Richardson 	memset(&params, 0, sizeof(params));
130a9de470cSBruce Richardson 	params.comment_character = '#';
131a9de470cSBruce Richardson 
132be22019aSStephen Hemminger 	cfgfile = rte_cfgfile_load_with_params(filename, 0, &params);
133be22019aSStephen Hemminger 	TEST_ASSERT_NOT_NULL(cfgfile, "Failed to parse sample2");
134a9de470cSBruce Richardson 
135a9de470cSBruce Richardson 	ret = _test_cfgfile_sample(cfgfile);
136a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(ret, "Failed to validate sample file: %d", ret);
137a9de470cSBruce Richardson 
138a9de470cSBruce Richardson 	ret = rte_cfgfile_close(cfgfile);
139a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(ret, "Failed to close cfgfile");
140a9de470cSBruce Richardson 
141*554e802eSStephen Hemminger 	ret = remove(filename);
142*554e802eSStephen Hemminger 	TEST_ASSERT_SUCCESS(ret, "Failed to remove file");
143be22019aSStephen Hemminger 
144a9de470cSBruce Richardson 	return 0;
145a9de470cSBruce Richardson }
146a9de470cSBruce Richardson 
147a9de470cSBruce Richardson static int
148a9de470cSBruce Richardson test_cfgfile_realloc_sections(void)
149a9de470cSBruce Richardson {
150a9de470cSBruce Richardson 	struct rte_cfgfile *cfgfile;
151be22019aSStephen Hemminger 	char filename[PATH_MAX];
152a9de470cSBruce Richardson 	int ret;
153a9de470cSBruce Richardson 	const char *value;
154a9de470cSBruce Richardson 
155be22019aSStephen Hemminger 	ret = make_tmp_file(filename, "realloc", realloc_sections_ini);
156be22019aSStephen Hemminger 	TEST_ASSERT_SUCCESS(ret, "Failed to setup temp file");
157be22019aSStephen Hemminger 
158be22019aSStephen Hemminger 	cfgfile = rte_cfgfile_load(filename, 0);
159a9de470cSBruce Richardson 	TEST_ASSERT_NOT_NULL(cfgfile, "Failed to load config file");
160a9de470cSBruce Richardson 
161a9de470cSBruce Richardson 	ret = rte_cfgfile_num_sections(cfgfile, NULL, 0);
162a9de470cSBruce Richardson 	TEST_ASSERT(ret == 9, "Unexpected number of sections: %d", ret);
163a9de470cSBruce Richardson 
164a9de470cSBruce Richardson 	ret = rte_cfgfile_has_section(cfgfile, "section9");
165a9de470cSBruce Richardson 	TEST_ASSERT(ret, "section9 missing");
166a9de470cSBruce Richardson 
167a9de470cSBruce Richardson 	ret = rte_cfgfile_section_num_entries(cfgfile, "section3");
168a9de470cSBruce Richardson 	TEST_ASSERT(ret == 21,
169a9de470cSBruce Richardson 			"section3 unexpected number of entries: %d", ret);
170a9de470cSBruce Richardson 
171a9de470cSBruce Richardson 	ret = rte_cfgfile_section_num_entries(cfgfile, "section9");
172a9de470cSBruce Richardson 	TEST_ASSERT(ret == 8, "section9 unexpected number of entries: %d", ret);
173a9de470cSBruce Richardson 
174a9de470cSBruce Richardson 	value = rte_cfgfile_get_entry(cfgfile, "section9", "key8");
175a9de470cSBruce Richardson 	TEST_ASSERT(strcmp("value8_section9", value) == 0,
176a9de470cSBruce Richardson 		    "key unexpected value: %s", value);
177a9de470cSBruce Richardson 
178*554e802eSStephen Hemminger 	ret = remove(filename);
179*554e802eSStephen Hemminger 	TEST_ASSERT_SUCCESS(ret, "Failed to remove file");
180be22019aSStephen Hemminger 
181be22019aSStephen Hemminger 	char tmp[PATH_MAX] = "/tmp/";
182be22019aSStephen Hemminger #ifdef RTE_EXEC_ENV_WINDOWS
183be22019aSStephen Hemminger 	ret = GetTempPathA(sizeof(tmp), tmp);
184be22019aSStephen Hemminger 	TEST_ASSERT(ret > 0, "Failed to get tmp directory");
185be22019aSStephen Hemminger #endif
186be22019aSStephen Hemminger 	snprintf(filename, sizeof(filename), "%s%s", tmp, "cfg_save.ini");
187be22019aSStephen Hemminger 
188be22019aSStephen Hemminger 	ret = rte_cfgfile_save(cfgfile, filename);
189be22019aSStephen Hemminger 	TEST_ASSERT_SUCCESS(ret, "Failed to save to %s", filename);
190*554e802eSStephen Hemminger 
191*554e802eSStephen Hemminger 	ret = remove(filename);
192*554e802eSStephen Hemminger 	TEST_ASSERT_SUCCESS(ret, "Failed to remove file");
193a9de470cSBruce Richardson 
194a9de470cSBruce Richardson 	ret = rte_cfgfile_close(cfgfile);
195a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(ret, "Failed to close cfgfile");
196a9de470cSBruce Richardson 
197a9de470cSBruce Richardson 	return 0;
198a9de470cSBruce Richardson }
199a9de470cSBruce Richardson 
200a9de470cSBruce Richardson static int
201a9de470cSBruce Richardson test_cfgfile_invalid_section_header(void)
202a9de470cSBruce Richardson {
203a9de470cSBruce Richardson 	struct rte_cfgfile *cfgfile;
204be22019aSStephen Hemminger 	char filename[PATH_MAX];
205be22019aSStephen Hemminger 	int ret;
206a9de470cSBruce Richardson 
207be22019aSStephen Hemminger 	ret = make_tmp_file(filename, "invalid", invalid_section_ini);
208be22019aSStephen Hemminger 	TEST_ASSERT_SUCCESS(ret, "Failed to setup temp file");
209be22019aSStephen Hemminger 
210be22019aSStephen Hemminger 	cfgfile = rte_cfgfile_load(filename, 0);
211fbca1ad8SHolly Nichols 	TEST_ASSERT_NULL(cfgfile, "Expected failure did not occur");
212a9de470cSBruce Richardson 
213*554e802eSStephen Hemminger 	ret = remove(filename);
214*554e802eSStephen Hemminger 	TEST_ASSERT_SUCCESS(ret, "Failed to remove file");
215*554e802eSStephen Hemminger 
216a9de470cSBruce Richardson 	return 0;
217a9de470cSBruce Richardson }
218a9de470cSBruce Richardson 
219a9de470cSBruce Richardson static int
220a9de470cSBruce Richardson test_cfgfile_invalid_comment(void)
221a9de470cSBruce Richardson {
222a9de470cSBruce Richardson 	struct rte_cfgfile_parameters params;
223a9de470cSBruce Richardson 	struct rte_cfgfile *cfgfile;
224be22019aSStephen Hemminger 	char filename[PATH_MAX];
225be22019aSStephen Hemminger 	int ret;
226a9de470cSBruce Richardson 
227a9de470cSBruce Richardson 	/* override comment character with an invalid one */
228a9de470cSBruce Richardson 	memset(&params, 0, sizeof(params));
229a9de470cSBruce Richardson 	params.comment_character = '$';
230a9de470cSBruce Richardson 
231be22019aSStephen Hemminger 	ret = make_tmp_file(filename, "sample2", sample2_ini);
232be22019aSStephen Hemminger 	TEST_ASSERT_SUCCESS(ret, "Failed to setup temp file");
233be22019aSStephen Hemminger 
234be22019aSStephen Hemminger 	cfgfile = rte_cfgfile_load_with_params(filename, 0, &params);
235fbca1ad8SHolly Nichols 	TEST_ASSERT_NULL(cfgfile, "Expected failure did not occur");
236a9de470cSBruce Richardson 
237*554e802eSStephen Hemminger 	ret = remove(filename);
238*554e802eSStephen Hemminger 	TEST_ASSERT_SUCCESS(ret, "Failed to remove file");
239*554e802eSStephen Hemminger 
240a9de470cSBruce Richardson 	return 0;
241a9de470cSBruce Richardson }
242a9de470cSBruce Richardson 
243a9de470cSBruce Richardson static int
244a9de470cSBruce Richardson test_cfgfile_invalid_key_value_pair(void)
245a9de470cSBruce Richardson {
246a9de470cSBruce Richardson 	struct rte_cfgfile *cfgfile;
247be22019aSStephen Hemminger 	char filename[PATH_MAX];
248be22019aSStephen Hemminger 	int ret;
249a9de470cSBruce Richardson 
250be22019aSStephen Hemminger 	ret = make_tmp_file(filename, "empty_key", empty_key_value_ini);
251be22019aSStephen Hemminger 	TEST_ASSERT_SUCCESS(ret, "Failed to setup temp file");
252be22019aSStephen Hemminger 
253be22019aSStephen Hemminger 	cfgfile = rte_cfgfile_load(filename, 0);
254fbca1ad8SHolly Nichols 	TEST_ASSERT_NULL(cfgfile, "Expected failure did not occur");
255a9de470cSBruce Richardson 
256*554e802eSStephen Hemminger 	ret = remove(filename);
257*554e802eSStephen Hemminger 	TEST_ASSERT_SUCCESS(ret, "Failed to remove file");
258*554e802eSStephen Hemminger 
259a9de470cSBruce Richardson 	return 0;
260a9de470cSBruce Richardson }
261a9de470cSBruce Richardson 
262a9de470cSBruce Richardson static int
263a9de470cSBruce Richardson test_cfgfile_empty_key_value_pair(void)
264a9de470cSBruce Richardson {
265a9de470cSBruce Richardson 	struct rte_cfgfile *cfgfile;
266a9de470cSBruce Richardson 	const char *value;
267be22019aSStephen Hemminger 	char filename[PATH_MAX];
268a9de470cSBruce Richardson 	int ret;
269a9de470cSBruce Richardson 
270be22019aSStephen Hemminger 	ret = make_tmp_file(filename, "empty_key_value", empty_key_value_ini);
271be22019aSStephen Hemminger 	TEST_ASSERT_SUCCESS(ret, "Failed to setup temp file");
272be22019aSStephen Hemminger 
273be22019aSStephen Hemminger 	cfgfile = rte_cfgfile_load(filename, CFG_FLAG_EMPTY_VALUES);
274be22019aSStephen Hemminger 	TEST_ASSERT_NOT_NULL(cfgfile, "Failed to parse empty_key_value");
275a9de470cSBruce Richardson 
276a9de470cSBruce Richardson 	ret = rte_cfgfile_num_sections(cfgfile, NULL, 0);
277a9de470cSBruce Richardson 	TEST_ASSERT(ret == 1, "Unexpected number of sections: %d", ret);
278a9de470cSBruce Richardson 
279a9de470cSBruce Richardson 	ret = rte_cfgfile_has_section(cfgfile, "section1");
280a9de470cSBruce Richardson 	TEST_ASSERT(ret, "section1 missing");
281a9de470cSBruce Richardson 
282a9de470cSBruce Richardson 	ret = rte_cfgfile_section_num_entries(cfgfile, "section1");
283a9de470cSBruce Richardson 	TEST_ASSERT(ret == 1, "section1 unexpected number of entries: %d", ret);
284a9de470cSBruce Richardson 
285a9de470cSBruce Richardson 	value = rte_cfgfile_get_entry(cfgfile, "section1", "key");
286a9de470cSBruce Richardson 	TEST_ASSERT(strlen(value) == 0, "key unexpected value: %s", value);
287a9de470cSBruce Richardson 
288a9de470cSBruce Richardson 	ret = rte_cfgfile_close(cfgfile);
289a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(ret, "Failed to close cfgfile");
290a9de470cSBruce Richardson 
291*554e802eSStephen Hemminger 	ret = remove(filename);
292*554e802eSStephen Hemminger 	TEST_ASSERT_SUCCESS(ret, "Failed to remove file");
293*554e802eSStephen Hemminger 
294a9de470cSBruce Richardson 	return 0;
295a9de470cSBruce Richardson }
296a9de470cSBruce Richardson 
297a9de470cSBruce Richardson static int
298a9de470cSBruce Richardson test_cfgfile_missing_section(void)
299a9de470cSBruce Richardson {
300a9de470cSBruce Richardson 	struct rte_cfgfile *cfgfile;
301be22019aSStephen Hemminger 	char filename[PATH_MAX];
302be22019aSStephen Hemminger 	int ret;
303a9de470cSBruce Richardson 
304be22019aSStephen Hemminger 	ret = make_tmp_file(filename, "missing_section", missing_section_ini);
305be22019aSStephen Hemminger 	TEST_ASSERT_SUCCESS(ret, "Failed to setup temp file");
306be22019aSStephen Hemminger 
307be22019aSStephen Hemminger 	cfgfile = rte_cfgfile_load(filename, 0);
308fbca1ad8SHolly Nichols 	TEST_ASSERT_NULL(cfgfile, "Expected failure did not occur");
309a9de470cSBruce Richardson 
310*554e802eSStephen Hemminger 	ret = remove(filename);
311*554e802eSStephen Hemminger 	TEST_ASSERT_SUCCESS(ret, "Failed to remove file");
312*554e802eSStephen Hemminger 
313a9de470cSBruce Richardson 	return 0;
314a9de470cSBruce Richardson }
315a9de470cSBruce Richardson 
316a9de470cSBruce Richardson static int
317a9de470cSBruce Richardson test_cfgfile_global_properties(void)
318a9de470cSBruce Richardson {
319a9de470cSBruce Richardson 	struct rte_cfgfile *cfgfile;
320a9de470cSBruce Richardson 	const char *value;
321be22019aSStephen Hemminger 	char filename[PATH_MAX];
322a9de470cSBruce Richardson 	int ret;
323a9de470cSBruce Richardson 
324be22019aSStephen Hemminger 	ret = make_tmp_file(filename, "missing_section", missing_section_ini);
325be22019aSStephen Hemminger 	TEST_ASSERT_SUCCESS(ret, "Failed to setup temp file");
326be22019aSStephen Hemminger 
327be22019aSStephen Hemminger 	cfgfile = rte_cfgfile_load(filename, CFG_FLAG_GLOBAL_SECTION);
328a9de470cSBruce Richardson 	TEST_ASSERT_NOT_NULL(cfgfile, "Failed to load config file");
329a9de470cSBruce Richardson 
330a9de470cSBruce Richardson 	ret = rte_cfgfile_num_sections(cfgfile, NULL, 0);
331a9de470cSBruce Richardson 	TEST_ASSERT(ret == 1, "Unexpected number of sections: %d", ret);
332a9de470cSBruce Richardson 
333a9de470cSBruce Richardson 	ret = rte_cfgfile_has_section(cfgfile, "GLOBAL");
334a9de470cSBruce Richardson 	TEST_ASSERT(ret, "global section missing");
335a9de470cSBruce Richardson 
336a9de470cSBruce Richardson 	ret = rte_cfgfile_section_num_entries(cfgfile, "GLOBAL");
337a9de470cSBruce Richardson 	TEST_ASSERT(ret == 1, "GLOBAL unexpected number of entries: %d", ret);
338a9de470cSBruce Richardson 
339a9de470cSBruce Richardson 	value = rte_cfgfile_get_entry(cfgfile, "GLOBAL", "key");
340a9de470cSBruce Richardson 	TEST_ASSERT(strcmp("value", value) == 0,
341a9de470cSBruce Richardson 		    "key unexpected value: %s", value);
342a9de470cSBruce Richardson 
343a9de470cSBruce Richardson 	ret = rte_cfgfile_close(cfgfile);
344a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(ret, "Failed to close cfgfile");
345a9de470cSBruce Richardson 
346*554e802eSStephen Hemminger 	ret = remove(filename);
347*554e802eSStephen Hemminger 	TEST_ASSERT_SUCCESS(ret, "Failed to remove file");
348*554e802eSStephen Hemminger 
349a9de470cSBruce Richardson 	return 0;
350a9de470cSBruce Richardson }
351a9de470cSBruce Richardson 
352a9de470cSBruce Richardson static int
353a9de470cSBruce Richardson test_cfgfile_empty_file(void)
354a9de470cSBruce Richardson {
355a9de470cSBruce Richardson 	struct rte_cfgfile *cfgfile;
356be22019aSStephen Hemminger 	char filename[PATH_MAX];
357a9de470cSBruce Richardson 	int ret;
358a9de470cSBruce Richardson 
359be22019aSStephen Hemminger 	ret = make_tmp_file(filename, "empty", empty_ini);
360be22019aSStephen Hemminger 	TEST_ASSERT_SUCCESS(ret, "Failed to setup temp file");
361be22019aSStephen Hemminger 
362be22019aSStephen Hemminger 	cfgfile = rte_cfgfile_load(filename, 0);
363a9de470cSBruce Richardson 	TEST_ASSERT_NOT_NULL(cfgfile, "Failed to load config file");
364a9de470cSBruce Richardson 
365a9de470cSBruce Richardson 	ret = rte_cfgfile_num_sections(cfgfile, NULL, 0);
366a9de470cSBruce Richardson 	TEST_ASSERT(ret == 0, "Unexpected number of sections: %d", ret);
367a9de470cSBruce Richardson 
368a9de470cSBruce Richardson 	ret = rte_cfgfile_close(cfgfile);
369a9de470cSBruce Richardson 	TEST_ASSERT_SUCCESS(ret, "Failed to close cfgfile");
370a9de470cSBruce Richardson 
371*554e802eSStephen Hemminger 	ret = remove(filename);
372*554e802eSStephen Hemminger 	TEST_ASSERT_SUCCESS(ret, "Failed to remove file");
373*554e802eSStephen Hemminger 
374a9de470cSBruce Richardson 	return 0;
375a9de470cSBruce Richardson }
376a9de470cSBruce Richardson 
377be22019aSStephen Hemminger static struct
378be22019aSStephen Hemminger unit_test_suite test_cfgfile_suite  = {
379be22019aSStephen Hemminger 	.suite_name = "Test Cfgfile Unit Test Suite",
380be22019aSStephen Hemminger 	.unit_test_cases = {
381be22019aSStephen Hemminger 		TEST_CASE(test_cfgfile_sample1),
382be22019aSStephen Hemminger 		TEST_CASE(test_cfgfile_sample2),
383be22019aSStephen Hemminger 		TEST_CASE(test_cfgfile_realloc_sections),
384be22019aSStephen Hemminger 		TEST_CASE(test_cfgfile_invalid_section_header),
385be22019aSStephen Hemminger 		TEST_CASE(test_cfgfile_invalid_comment),
386be22019aSStephen Hemminger 		TEST_CASE(test_cfgfile_invalid_key_value_pair),
387be22019aSStephen Hemminger 		TEST_CASE(test_cfgfile_empty_key_value_pair),
388be22019aSStephen Hemminger 		TEST_CASE(test_cfgfile_missing_section),
389be22019aSStephen Hemminger 		TEST_CASE(test_cfgfile_global_properties),
390be22019aSStephen Hemminger 		TEST_CASE(test_cfgfile_empty_file),
391be22019aSStephen Hemminger 
392be22019aSStephen Hemminger 		TEST_CASES_END()
393be22019aSStephen Hemminger 	}
394be22019aSStephen Hemminger };
395be22019aSStephen Hemminger 
396a9de470cSBruce Richardson static int
397a9de470cSBruce Richardson test_cfgfile(void)
398a9de470cSBruce Richardson {
399be22019aSStephen Hemminger 	return unit_test_suite_runner(&test_cfgfile_suite);
400a9de470cSBruce Richardson }
401a9de470cSBruce Richardson 
402be22019aSStephen Hemminger REGISTER_FAST_TEST(cfgfile_autotest, true, true, test_cfgfile);
403