GCC Code Coverage Report


Directory: ./
File: src/iguana/services/ConfigFileReader.cc
Date: 2025-09-03 22:39:58
Exec Total Coverage
Lines: 46 53 86.8%
Functions: 7 7 100.0%
Branches: 51 110 46.4%

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