From b6b377ffc0169ac770579ab94082f2cd7a80667a Mon Sep 17 00:00:00 2001 From: Bartosz Podrygajlo Date: Mon, 2 Dec 2024 13:32:19 +0100 Subject: [PATCH 1/2] Align YAML config getlist with libconfig implementation This aligns the behavior of params_yaml with params_config library so that when a mapping is read using getlist it returns the number of elements in the mapping instead of 0. --- common/config/yaml/config_yaml.cpp | 2 +- common/config/yaml/tests/CMakeLists.txt | 1 + .../yaml/tests/test_read_mapping_as_list.yaml | 4 ++++ common/config/yaml/tests/test_yaml_config.cpp | 17 +++++++++++++++++ 4 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 common/config/yaml/tests/test_read_mapping_as_list.yaml diff --git a/common/config/yaml/config_yaml.cpp b/common/config/yaml/config_yaml.cpp index c2af51e2db..419b187ef9 100644 --- a/common/config/yaml/config_yaml.cpp +++ b/common/config/yaml/config_yaml.cpp @@ -286,10 +286,10 @@ extern "C" int config_yaml_getlist(configmodule_interface_t *cfg, return -1; } + ParamList->numelt = node.size(); if (!node.IsSequence()) { return -1; } - ParamList->numelt = node.size(); if (ParamList->numelt > 0 && params != NULL) { ParamList->paramarray = static_cast(config_allocate_new(cfg, ParamList->numelt * sizeof(paramdef_t *), true)); diff --git a/common/config/yaml/tests/CMakeLists.txt b/common/config/yaml/tests/CMakeLists.txt index b28bb8d47f..6290f2fc15 100644 --- a/common/config/yaml/tests/CMakeLists.txt +++ b/common/config/yaml/tests/CMakeLists.txt @@ -9,3 +9,4 @@ configure_file(test_list.yaml test_list.yaml COPYONLY) configure_file(test_string.yaml test_string.yaml COPYONLY) configure_file(test_list_of_mappings.yml test_list_of_mappings.yml COPYONLY) configure_file(test_int_array.yaml test_int_array.yaml COPYONLY) +configure_file(test_read_mapping_as_list.yaml test_read_mapping_as_list.yaml COPYONLY) diff --git a/common/config/yaml/tests/test_read_mapping_as_list.yaml b/common/config/yaml/tests/test_read_mapping_as_list.yaml new file mode 100644 index 0000000000..2e17dcce36 --- /dev/null +++ b/common/config/yaml/tests/test_read_mapping_as_list.yaml @@ -0,0 +1,4 @@ +fhi_72: + element1: value1 + element2: value2 + element3: value3 diff --git a/common/config/yaml/tests/test_yaml_config.cpp b/common/config/yaml/tests/test_yaml_config.cpp index 921a455dfd..1cc260ffb7 100644 --- a/common/config/yaml/tests/test_yaml_config.cpp +++ b/common/config/yaml/tests/test_yaml_config.cpp @@ -364,6 +364,23 @@ TEST(yaml_config, test_int_array) { end_configmodule(cfg); } +TEST(yaml_config, test_read_mapping_as_list) { + configmodule_interface_t *cfg = static_cast(calloc(1, sizeof(*cfg))); + cfg->cfgP[0] = strdup("test_read_mapping_as_list.yaml"); + EXPECT_EQ(config_yaml_init(cfg), 0); + + + paramlist_def_t pl = {0}; + strncpy(pl.listname, "fhi_72", sizeof(pl.listname) - 1); + config_yaml_getlist(cfg, &pl, NULL, 0, /* prefix */ NULL); + EXPECT_NE(pl.numelt, 0); + EXPECT_EQ(pl.numelt, 3); + + config_yaml_end(cfg); + free(cfg->cfgP[0]); + end_configmodule(cfg); +} + int main(int argc, char** argv) { logInit(); From 08279ab9f6c2e9ac393e1481cb82919f31a053b8 Mon Sep 17 00:00:00 2001 From: Bartosz Podrygajlo Date: Mon, 2 Dec 2024 15:26:39 +0100 Subject: [PATCH 2/2] Align return value of config_yaml_get to libconfig implementation Now return value should be equal to number of processed input parameters like in params_libconfig. --- common/config/yaml/config_yaml.cpp | 2 +- common/config/yaml/tests/test_yaml_config.cpp | 36 ++++++++++++------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/common/config/yaml/config_yaml.cpp b/common/config/yaml/config_yaml.cpp index 419b187ef9..eb510c94f5 100644 --- a/common/config/yaml/config_yaml.cpp +++ b/common/config/yaml/config_yaml.cpp @@ -265,7 +265,7 @@ extern "C" int config_yaml_get(configmodule_interface_t *cfg, paramdef_t *cfgopt } } config_yaml::GetParams(cfg, node, cfgoptions, numoptions); - return 0; + return numoptions; } extern "C" int config_yaml_getlist(configmodule_interface_t *cfg, diff --git a/common/config/yaml/tests/test_yaml_config.cpp b/common/config/yaml/tests/test_yaml_config.cpp index 1cc260ffb7..deaa52cd1a 100644 --- a/common/config/yaml/tests/test_yaml_config.cpp +++ b/common/config/yaml/tests/test_yaml_config.cpp @@ -125,7 +125,7 @@ TEST(yaml_config, test_high_recusion) { p.type = TYPE_UINT16; p.u16ptr = &value; char prefix[] = "test.test1.test2.test3.test4"; - EXPECT_EQ(config_yaml_get(cfg, &p, 1, prefix), 0); + EXPECT_EQ(config_yaml_get(cfg, &p, 1, prefix), 1); EXPECT_EQ(value, i); } @@ -175,7 +175,7 @@ TEST(yaml_config, test_string_auto_alloc) { // Test automatic allocation of strings char prefix[] = "test"; - EXPECT_EQ(config_yaml_get(cfg, ¶m, 1, prefix), 0); + EXPECT_EQ(config_yaml_get(cfg, ¶m, 1, prefix), 1); EXPECT_NE(param.strptr, nullptr); EXPECT_EQ(strcmp(*param.strptr, "testvalue"), 0); EXPECT_EQ(cfg->numptrs, 2); @@ -200,7 +200,7 @@ TEST(yaml_config, test_string_no_realloc) { char prefix[] = "test"; char* non_null_pointer_to_pointer = nullptr; param.strptr = &non_null_pointer_to_pointer; - EXPECT_EQ(config_yaml_get(cfg, ¶m, 1, prefix), 0); + EXPECT_EQ(config_yaml_get(cfg, ¶m, 1, prefix), 1); EXPECT_EQ(param.strptr, &non_null_pointer_to_pointer); EXPECT_EQ(strcmp(*param.strptr, "testvalue"), 0); EXPECT_EQ(cfg->numptrs, 1); @@ -225,7 +225,7 @@ TEST(yaml_config, test_string_pointer_available) { char prefix[] = "test"; char *container = (char *)malloc(sizeof(char) * 30); param.strptr = &container; - EXPECT_EQ(config_yaml_get(cfg, ¶m, 1, prefix), 0); + EXPECT_EQ(config_yaml_get(cfg, ¶m, 1, prefix), 1); EXPECT_EQ(param.strptr, &container); EXPECT_EQ(strcmp(*param.strptr, "testvalue"), 0); EXPECT_EQ(cfg->numptrs, 0); @@ -253,7 +253,7 @@ TEST(yaml_config, test_string_default_value) { param.defstrval = default_value; param.strptr = nullptr; sprintf(param.optname, "%s", "stringvalue_missing"); - EXPECT_EQ(config_yaml_get(cfg, ¶m, 1, prefix), 0); + EXPECT_EQ(config_yaml_get(cfg, ¶m, 1, prefix), 1); EXPECT_NE(param.strptr, nullptr); EXPECT_EQ(strcmp(*param.strptr, "default"), 0); EXPECT_EQ(cfg->numptrs, 2) << " 2 pointers required, 1 for the string, one for the pointer-to string"; @@ -276,7 +276,7 @@ TEST(yaml_config, test_stringlist) { // Test automatic allocation of string lists char prefix[] = "test"; - EXPECT_EQ(config_yaml_get(cfg, ¶m, 1, prefix), 0); + EXPECT_EQ(config_yaml_get(cfg, ¶m, 1, prefix), 1); EXPECT_NE(param.strptr, nullptr); for (auto i = 0; i < param.numelt; i++) { std::cout << (param.strlistptr)[i] << std::endl; @@ -302,7 +302,7 @@ TEST(yaml_config, test_list_of_mappings) { // Test automatic allocation of string lists char prefix1[] = "test.list.[0]"; - EXPECT_EQ(config_yaml_get(cfg, ¶m, 1, prefix1), 0); + EXPECT_EQ(config_yaml_get(cfg, ¶m, 1, prefix1), 1); EXPECT_NE(param.strptr, nullptr); EXPECT_STREQ("value1", param.strlistptr[0]); EXPECT_STREQ("value2", param.strlistptr[1]); @@ -310,7 +310,7 @@ TEST(yaml_config, test_list_of_mappings) { char prefix2[] = "test.list.[1]"; param.strlistptr = nullptr; - EXPECT_EQ(config_yaml_get(cfg, ¶m, 1, prefix2), 0); + EXPECT_EQ(config_yaml_get(cfg, ¶m, 1, prefix2), 1); EXPECT_NE(param.strptr, nullptr); EXPECT_STREQ("value4", param.strlistptr[0]); EXPECT_STREQ("value5", param.strlistptr[1]); @@ -334,7 +334,7 @@ TEST(yaml_config, test_int_array) { // Test automatic allocation of int arrays char prefix[] = "test"; - EXPECT_EQ(config_yaml_get(cfg, ¶m, 1, prefix), 0); + EXPECT_EQ(config_yaml_get(cfg, ¶m, 1, prefix), 1); EXPECT_NE(param.iptr, nullptr); ASSERT_EQ(param.numelt, 4); EXPECT_EQ(1, param.iptr[0]); @@ -345,7 +345,7 @@ TEST(yaml_config, test_int_array) { param.uptr = nullptr; param.numelt = 0; sprintf(param.optname, "%s", "array2"); - EXPECT_EQ(config_yaml_get(cfg, ¶m, 1, prefix), 0); + EXPECT_EQ(config_yaml_get(cfg, ¶m, 1, prefix), 1); EXPECT_NE(param.uptr, nullptr); ASSERT_EQ(param.numelt, 3); EXPECT_EQ(1U, param.uptr[0]); @@ -355,7 +355,7 @@ TEST(yaml_config, test_int_array) { param.uptr = nullptr; param.numelt = 0; sprintf(param.optname, "%s", "non-existent-array"); - EXPECT_EQ(config_yaml_get(cfg, ¶m, 1, prefix), 0); + EXPECT_EQ(config_yaml_get(cfg, ¶m, 1, prefix), 1); EXPECT_EQ(param.uptr, nullptr); ASSERT_EQ(param.numelt, 0); @@ -368,14 +368,24 @@ TEST(yaml_config, test_read_mapping_as_list) { configmodule_interface_t *cfg = static_cast(calloc(1, sizeof(*cfg))); cfg->cfgP[0] = strdup("test_read_mapping_as_list.yaml"); EXPECT_EQ(config_yaml_init(cfg), 0); - + char cfgstring[] = "fhi_72"; paramlist_def_t pl = {0}; - strncpy(pl.listname, "fhi_72", sizeof(pl.listname) - 1); + strncpy(pl.listname, cfgstring, sizeof(pl.listname) - 1); config_yaml_getlist(cfg, &pl, NULL, 0, /* prefix */ NULL); EXPECT_NE(pl.numelt, 0); EXPECT_EQ(pl.numelt, 3); + paramdef_t params[4] = {0}; + for (auto i = 0U; i < sizeofArray(params); i++) { + sprintf(params[i].optname, "%s%d", "element_", i+1); + params[i].type = TYPE_STRING; + params[i].paramflags = PARAMFLAG_MANDATORY; + } + params[sizeofArray(params) - 1].paramflags = 0; + int ret = config_yaml_get(cfg, params, sizeofArray(params), cfgstring); + EXPECT_EQ(ret, 4); + config_yaml_end(cfg); free(cfg->cfgP[0]); end_configmodule(cfg);