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(¶ms, 0, sizeof(params)); 130a9de470cSBruce Richardson params.comment_character = '#'; 131a9de470cSBruce Richardson 132be22019aSStephen Hemminger cfgfile = rte_cfgfile_load_with_params(filename, 0, ¶ms); 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(¶ms, 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, ¶ms); 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