GCC Code Coverage Report


Directory: ./
File: src/iguana/services/ConfigFileReader.cc
Date: 2025-12-23 16:10:08
Coverage Exec Excl Total
Lines: 87.3% 48 0 55
Functions: 100.0% 7 0 7
Branches: 47.4% 55 0 116

Line Branch Exec Source
1 #include "ConfigFileReader.h"
2 #include "Tools.h"
3 #include <cstdlib>
4 #include <filesystem>
5 #include <sstream>
6
7 namespace iguana {
8
9 51 ConfigFileReader::ConfigFileReader(std::string_view name)
10 51 : Object(name)
11 {
12 // the algorithms need to know where the config files are;
13 // first, add config files from installation prefix; since this
14 // is added first, it's the lowest priority in the configuration
15 // search path
16
2/4
✓ Branch 7 → 8 taken 51 times.
✗ Branch 7 → 65 not taken.
✓ Branch 8 → 9 taken 51 times.
✗ Branch 8 → 43 not taken.
51 AddDirectory(GetConfigInstallationPrefix());
17 // next, add `IGUANA_CONFIG_PATH` paths, which provides:
18 // - user override of the configuration path(s)
19 // - a fallback, if `GetConfigInstallationPrefix` is wrong, which happens
20 // if the Iguana installation is relocated
21 51 auto user_paths_env_var = std::getenv("IGUANA_CONFIG_PATH");
22
1/2
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 42 taken 51 times.
51 if(user_paths_env_var != nullptr) {
23 std::istringstream user_paths_stream(user_paths_env_var);
24 std::string user_path_token;
25 decltype(m_directories) user_paths;
26 while(getline(user_paths_stream, user_path_token, ':')) // tokenize `IGUANA_CONFIG_PATH`
27 user_paths.push_front(user_path_token);
28 for(auto const& user_path : user_paths) // add the paths in the correct order
29 AddDirectory(user_path);
30 // after these default paths have been added, the user
31 // may still override by calling `AddDirectory` etc. themselves
32 }
33 51 }
34
35 51 std::string ConfigFileReader::GetConfigInstallationPrefix()
36 {
37 51 return IGUANA_ETCDIR;
38 }
39
40 102 void ConfigFileReader::AddDirectory(std::string const& dir)
41 {
42
2/2
✓ Branch 2 → 3 taken 60 times.
✓ Branch 2 → 13 taken 42 times.
102 if(dir == "")
43 return; // handle unset directory name
44
2/6
✓ Branch 6 → 7 taken 60 times.
✗ Branch 6 → 14 not taken.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 10 taken 60 times.
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 17 not taken.
60 m_log->Trace("Add directory {}", dir);
45 60 m_directories.push_front(dir);
46 }
47
48 99 void ConfigFileReader::AddFile(std::string const& name)
49 {
50
2/2
✓ Branch 2 → 3 taken 42 times.
✓ Branch 2 → 4 taken 57 times.
99 if(name == "")
51 42 return; // handle unset file name
52
3/4
✓ Branch 7 → 8 taken 54 times.
✓ Branch 7 → 31 taken 3 times.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 15 taken 54 times.
111 auto full_name = FindFile(name);
53
2/8
✓ Branch 17 → 18 taken 54 times.
✗ Branch 17 → 37 not taken.
✗ Branch 18 → 19 not taken.
✓ Branch 18 → 21 taken 54 times.
✗ Branch 37 → 38 not taken.
✗ Branch 37 → 40 not taken.
✗ Branch 43 → 44 not taken.
✗ Branch 43 → 46 not taken.
54 m_log->Trace(" ===> Add file {}", full_name);
54
1/2
✓ Branch 23 → 24 taken 54 times.
✗ Branch 23 → 43 not taken.
54 m_files.push_front(full_name);
55 }
56
57 6 void ConfigFileReader::PrintDirectories(Logger::Level const level)
58 {
59
1/2
✓ Branch 3 → 4 taken 6 times.
✗ Branch 3 → 22 not taken.
6 if(m_log->GetLevel() <= level) {
60 6 m_log->Print(level, "{:=^60}", " Configuration file search path order: ");
61 6 m_log->Print(level, " - ./");
62
2/2
✓ Branch 19 → 7 taken 12 times.
✓ Branch 19 → 20 taken 6 times.
18 for(auto const& dir : m_directories)
63
4/8
✓ Branch 10 → 11 taken 12 times.
✗ Branch 10 → 23 not taken.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 14 taken 12 times.
✓ Branch 16 → 17 taken 6 times.
✓ Branch 16 → 18 taken 6 times.
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 26 not taken.
24 m_log->Print(level, " - {}", dir);
64 6 m_log->Print(level, "{:=^60}", "");
65 }
66 6 }
67
68 57 std::string ConfigFileReader::FindFile(std::string name)
69 {
70
1/2
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 5 taken 57 times.
57 if(name == "")
71 return ""; // handle unset file name
72
1/2
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 14 taken 57 times.
114 name = tools::ExpandTilde(name); // expand `~` -> `$HOME`
73
3/6
✓ Branch 15 → 16 taken 57 times.
✗ Branch 15 → 92 not taken.
✓ Branch 16 → 17 taken 3 times.
✓ Branch 16 → 19 taken 54 times.
✗ Branch 92 → 93 not taken.
✗ Branch 92 → 95 not taken.
57 m_log->Trace("Searching for file '{}' in:", name);
74 // first try `./` or assume `name` is a relative or absolute path + filename
75
2/2
✓ Branch 27 → 28 taken 56 times.
✓ Branch 27 → 29 taken 1 time.
114 auto found_local = std::filesystem::exists(name);
76
2/2
✓ Branch 27 → 28 taken 56 times.
✓ Branch 27 → 29 taken 1 time.
57 m_log->Trace(" - ./{}", found_local ? " - FOUND" : "");
77
2/2
✓ Branch 30 → 31 taken 1 time.
✓ Branch 30 → 32 taken 56 times.
57 if(found_local)
78 1 return name;
79 // then search each entry of `m_directories`
80
2/2
✓ Branch 77 → 33 taken 64 times.
✓ Branch 77 → 78 taken 3 times.
67 for(auto const& dir : m_directories) {
81 64 std::string filename = dir + "/" + name;
82
3/4
✓ Branch 43 → 44 taken 64 times.
✗ Branch 43 → 114 not taken.
✓ Branch 49 → 50 taken 11 times.
✓ Branch 49 → 51 taken 53 times.
128 auto found = std::filesystem::exists(filename);
83
4/10
✓ Branch 49 → 50 taken 11 times.
✓ Branch 49 → 51 taken 53 times.
✓ Branch 55 → 56 taken 64 times.
✗ Branch 55 → 108 not taken.
✗ Branch 56 → 57 not taken.
✓ Branch 56 → 59 taken 64 times.
✗ Branch 108 → 109 not taken.
✗ Branch 108 → 111 not taken.
✗ Branch 114 → 115 not taken.
✗ Branch 114 → 117 not taken.
128 m_log->Trace(" - {}{}", dir, found ? " - FOUND" : "");
84
2/2
✓ Branch 61 → 62 taken 53 times.
✓ Branch 61 → 69 taken 11 times.
64 if(found)
85 53 return filename;
86 }
87 // throw exception if not found anywhere
88
2/6
✓ Branch 81 → 82 taken 3 times.
✗ Branch 81 → 120 not taken.
✗ Branch 82 → 83 not taken.
✓ Branch 82 → 85 taken 3 times.
✗ Branch 120 → 121 not taken.
✗ Branch 120 → 123 not taken.
3 m_log->Error("Cannot find configuration file named '{}'", name);
89 3 PrintDirectories(Logger::error);
90
1/2
✓ Branch 89 → 90 taken 3 times.
✗ Branch 89 → 126 not taken.
3 throw std::runtime_error("configuration file not found");
91 }
92
93 100 std::string ConfigFileReader::ConvertAlgoNameToConfigName(std::string_view algo_name, std::string_view ext)
94 {
95 100 std::string result = std::string(algo_name);
96 std::string::size_type it = 0;
97
2/2
✓ Branch 5 → 4 taken 86 times.
✓ Branch 5 → 6 taken 100 times.
186 while((it = result.find("::", it)) != std::string::npos)
98
1/2
✓ Branch 4 → 5 taken 86 times.
✗ Branch 4 → 51 not taken.
86 result.replace(it, 2, "/");
99
5/12
✓ Branch 8 → 9 taken 100 times.
✗ Branch 8 → 45 not taken.
✓ Branch 11 → 12 taken 100 times.
✗ Branch 11 → 33 not taken.
✓ Branch 22 → 23 taken 100 times.
✗ Branch 22 → 25 not taken.
✓ Branch 27 → 28 taken 27 times.
✓ Branch 27 → 30 taken 73 times.
✗ Branch 45 → 46 not taken.
✗ Branch 45 → 48 not taken.
✗ Branch 51 → 52 not taken.
✗ Branch 51 → 54 not taken.
500 return "algorithms/" + result + "/Config." + std::string(ext);
100 }
101
102 }
103