diff --git a/lib/runtime.cpp b/lib/runtime.cpp index 2a4d2013..75794299 100644 --- a/lib/runtime.cpp +++ b/lib/runtime.cpp @@ -116,11 +116,13 @@ void ManagerSettings::init_settings(const everest::config::Settings& settings) { fs::path etc_dir; { // etc directory - const auto default_etc_dir = fs::path(defaults::SYSCONF_DIR) / defaults::NAMESPACE; - if (prefix.string() != "/usr") { - etc_dir = prefix / default_etc_dir; - } else { + const auto default_etc_dir = (fs::path(defaults::SYSCONF_DIR) / defaults::NAMESPACE).relative_path(); + if (prefix.string() == "/usr") { etc_dir = fs::path("/") / default_etc_dir; + } else if (prefix.filename() == "usr") { + etc_dir = prefix.parent_path() / default_etc_dir; + } else { + etc_dir = prefix / default_etc_dir; } etc_dir = assert_dir(etc_dir.string(), "Default etc directory"); } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index e7e65610..6881067c 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -36,6 +36,11 @@ include(test_utilities.cmake) setup_test_directory(empty_config) setup_test_directory(valid_config) +setup_test_directory(valid_config_custom_prefix) +file(RENAME ${CMAKE_CURRENT_BINARY_DIR}/valid_config_custom_prefix ${CMAKE_CURRENT_BINARY_DIR}/valid_config_custom_prefix_tmp) +file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/valid_config_custom_prefix) +file(RENAME ${CMAKE_CURRENT_BINARY_DIR}/valid_config_custom_prefix_tmp ${CMAKE_CURRENT_BINARY_DIR}/valid_config_custom_prefix/usr) +file(RENAME ${CMAKE_CURRENT_BINARY_DIR}/valid_config_custom_prefix/usr/etc ${CMAKE_CURRENT_BINARY_DIR}/valid_config_custom_prefix/etc) setup_test_directory(valid_module_config TESTValidManifest test_interface) setup_test_directory(valid_module_config_userconfig TESTValidManifest test_interface CONFIG valid_module_config_config.yaml diff --git a/tests/test_config.cpp b/tests/test_config.cpp index 9ebc23ac..5c1d7c0f 100644 --- a/tests/test_config.cpp +++ b/tests/test_config.cpp @@ -28,6 +28,13 @@ SCENARIO("Check ManagerSettings Constructor", "[!throws]") { CHECK_NOTHROW(Everest::ManagerSettings(bin_dir + "valid_config/", bin_dir + "valid_config/config.yaml")); } } + GIVEN("A valid prefix and a valid config file with a custom prefix") { + THEN("It should not throw") { + auto ms = Everest::ManagerSettings(bin_dir + "valid_config_custom_prefix/usr", + bin_dir + "valid_config_custom_prefix/usr/config.yaml"); + CHECK(ms.runtime_settings.etc_dir == bin_dir + "valid_config_custom_prefix/etc/everest"); + } + } GIVEN("A broken yaml file") { // FIXME (aw): this also throws, if the folder doesn't even exists or some other things fail THEN("It should throw") { diff --git a/tests/test_configs/valid_config_custom_prefix_config.yaml b/tests/test_configs/valid_config_custom_prefix_config.yaml new file mode 100644 index 00000000..97a28291 --- /dev/null +++ b/tests/test_configs/valid_config_custom_prefix_config.yaml @@ -0,0 +1,9 @@ +active_modules: {} +settings: + interfaces_dir: "interfaces" + modules_dir: "modules" + types_dir: "types" + errors_dir: "errors" + schemas_dir: "schemas" + www_dir: "www" + logging_config_file: "logging.ini"