GCC Code Coverage Report


Directory: ./
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 87.5% 49 / 0 / 56
Functions: 100.0% 7 / 0 / 7
Branches: 48.3% 58 / 0 / 120

src/iguana/services/ConfigFileReader.cc
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 107 ConfigFileReader::ConfigFileReader(std::string_view name)
10 107 : 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 107 times.
✗ Branch 7 → 65 not taken.
✓ Branch 8 → 9 taken 107 times.
✗ Branch 8 → 43 not taken.
107 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 107 auto user_paths_env_var = std::getenv("IGUANA_CONFIG_PATH");
22
1/2
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 42 taken 107 times.
107 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 107 }
34
35 107 std::string ConfigFileReader::GetConfigInstallationPrefix()
36 {
37 107 return IGUANA_ETCDIR;
38 }
39
40 214 void ConfigFileReader::AddDirectory(std::string const& dir)
41 {
42
2/2
✓ Branch 2 → 3 taken 116 times.
✓ Branch 2 → 13 taken 98 times.
214 if(dir == "")
43 return; // handle unset directory name
44
2/6
✓ Branch 6 → 7 taken 116 times.
✗ Branch 6 → 14 not taken.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 10 taken 116 times.
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 17 not taken.
116 m_log->Trace("Add directory {}", dir);
45 116 m_directories.push_front(dir);
46 }
47
48 211 void ConfigFileReader::AddFile(std::string const& name, bool verbose_errors)
49 {
50
2/2
✓ Branch 2 → 3 taken 89 times.
✓ Branch 2 → 4 taken 122 times.
211 if(name == "")
51 89 return; // handle unset file name
52
4/6
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 6 taken 122 times.
✓ Branch 7 → 8 taken 64 times.
✓ Branch 7 → 31 taken 58 times.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 15 taken 64 times.
308 auto full_name = FindFile(name, verbose_errors);
53
2/8
✓ Branch 17 → 18 taken 64 times.
✗ Branch 17 → 37 not taken.
✗ Branch 18 → 19 not taken.
✓ Branch 18 → 21 taken 64 times.
✗ Branch 37 → 38 not taken.
✗ Branch 37 → 40 not taken.
✗ Branch 43 → 44 not taken.
✗ Branch 43 → 46 not taken.
64 m_log->Trace(" ===> Add file {}", full_name);
54
1/2
✓ Branch 23 → 24 taken 64 times.
✗ Branch 23 → 43 not taken.
64 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 122 std::string ConfigFileReader::FindFile(std::string name, bool verbose_errors)
69 {
70
1/2
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 5 taken 122 times.
122 if(name == "")
71 return ""; // handle unset file name
72
1/2
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 14 taken 122 times.
244 name = tools::ExpandTilde(name); // expand `~` -> `$HOME`
73
3/6
✓ Branch 15 → 16 taken 122 times.
✗ Branch 15 → 93 not taken.
✓ Branch 16 → 17 taken 3 times.
✓ Branch 16 → 19 taken 119 times.
✗ Branch 93 → 94 not taken.
✗ Branch 93 → 96 not taken.
122 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 121 times.
✓ Branch 27 → 29 taken 1 time.
244 auto found_local = std::filesystem::exists(name);
76
2/2
✓ Branch 27 → 28 taken 121 times.
✓ Branch 27 → 29 taken 1 time.
122 m_log->Trace(" - ./{}", found_local ? " - FOUND" : "");
77
2/2
✓ Branch 30 → 31 taken 1 time.
✓ Branch 30 → 32 taken 121 times.
122 if(found_local)
78 1 return name;
79 // then search each entry of `m_directories`
80
2/2
✓ Branch 77 → 33 taken 129 times.
✓ Branch 77 → 78 taken 58 times.
187 for(auto const& dir : m_directories) {
81 129 std::string filename = dir + "/" + name;
82
3/4
✓ Branch 43 → 44 taken 129 times.
✗ Branch 43 → 115 not taken.
✓ Branch 49 → 50 taken 66 times.
✓ Branch 49 → 51 taken 63 times.
258 auto found = std::filesystem::exists(filename);
83
4/10
✓ Branch 49 → 50 taken 66 times.
✓ Branch 49 → 51 taken 63 times.
✓ Branch 55 → 56 taken 129 times.
✗ Branch 55 → 109 not taken.
✗ Branch 56 → 57 not taken.
✓ Branch 56 → 59 taken 129 times.
✗ Branch 109 → 110 not taken.
✗ Branch 109 → 112 not taken.
✗ Branch 115 → 116 not taken.
✗ Branch 115 → 118 not taken.
258 m_log->Trace(" - {}{}", dir, found ? " - FOUND" : "");
84
2/2
✓ Branch 61 → 62 taken 63 times.
✓ Branch 61 → 69 taken 66 times.
129 if(found)
85 63 return filename;
86 }
87 // throw exception if not found anywhere
88
2/2
✓ Branch 78 → 79 taken 3 times.
✓ Branch 78 → 89 taken 55 times.
58 if(verbose_errors) {
89
2/6
✓ Branch 82 → 83 taken 3 times.
✗ Branch 82 → 121 not taken.
✗ Branch 83 → 84 not taken.
✓ Branch 83 → 86 taken 3 times.
✗ Branch 121 → 122 not taken.
✗ Branch 121 → 124 not taken.
3 m_log->Error("Cannot find configuration file named '{}'", name);
90 3 PrintDirectories(Logger::error);
91 }
92
1/2
✓ Branch 90 → 91 taken 58 times.
✗ Branch 90 → 127 not taken.
58 throw std::runtime_error("configuration file not found");
93 }
94
95 105 std::string ConfigFileReader::ConvertAlgoNameToConfigName(std::string_view algo_name, std::string_view ext)
96 {
97 105 std::string result = std::string(algo_name);
98 std::string::size_type it = 0;
99
2/2
✓ Branch 5 → 4 taken 91 times.
✓ Branch 5 → 6 taken 105 times.
196 while((it = result.find("::", it)) != std::string::npos)
100
1/2
✓ Branch 4 → 5 taken 91 times.
✗ Branch 4 → 51 not taken.
91 result.replace(it, 2, "/");
101
5/12
✓ Branch 8 → 9 taken 105 times.
✗ Branch 8 → 45 not taken.
✓ Branch 11 → 12 taken 105 times.
✗ Branch 11 → 33 not taken.
✓ Branch 22 → 23 taken 105 times.
✗ Branch 22 → 25 not taken.
✓ Branch 27 → 28 taken 28 times.
✓ Branch 27 → 30 taken 77 times.
✗ Branch 45 → 46 not taken.
✗ Branch 45 → 48 not taken.
✗ Branch 51 → 52 not taken.
✗ Branch 51 → 54 not taken.
525 return "algorithms/" + result + "/Config." + std::string(ext);
102 }
103
104 }
105