|
3 | 3 | #include <string> |
4 | 4 | #include <vector> |
5 | 5 |
|
6 | | -#include "tracing.hpp" |
| 6 | +#include "cit/test_default_values.hpp" |
7 | 7 | #include "cli.hpp" |
8 | 8 | #include "scenario.hpp" |
9 | 9 | #include "test_basic.hpp" |
10 | 10 | #include "test_context.hpp" |
11 | | -#include "cit/test_default_values.hpp" |
12 | | - #include <filesystem> |
| 11 | +#include "tracing.hpp" |
| 12 | +#include <filesystem> |
13 | 13 |
|
14 | | -__attribute__((constructor)) |
15 | | -static void disable_buffering() { |
16 | | - setvbuf(stdout, NULL, _IONBF, 0); |
17 | | - setvbuf(stderr, NULL, _IONBF, 0); |
| 14 | +__attribute__((constructor)) static void disable_buffering() { |
| 15 | + setvbuf(stdout, NULL, _IONBF, 0); |
| 16 | + setvbuf(stderr, NULL, _IONBF, 0); |
18 | 17 | } |
19 | 18 |
|
20 | 19 | extern "C" int process_value(int x) { |
21 | | - std::cout << "[C++] process_value(" << x << ")" << std::endl; |
22 | | - std::cerr << "[C++] debug stderr " << x << std::endl; |
23 | | - return x * 2 + 1; |
| 20 | + std::cout << "[C++] process_value(" << x << ")" << std::endl; |
| 21 | + std::cerr << "[C++] debug stderr " << x << std::endl; |
| 22 | + return x * 2 + 1; |
24 | 23 | } |
25 | 24 |
|
26 | | - |
27 | | -void print_scenarios(const ScenarioGroup::Ptr& group, const std::string& prefix = "") { |
28 | | - std::string group_name = group->name(); |
29 | | - std::string new_prefix = prefix.empty() ? group_name : prefix + "." + group_name; |
30 | | - for (const auto& scenario : group->scenarios()) { |
31 | | - TRACING_INFO ("Available scenario: ",std::pair{std::string{"scenario_name:"}, scenario->name()} ); |
32 | | - } |
33 | | - for (const auto& subgroup : group->groups()) { |
34 | | - print_scenarios(subgroup, new_prefix); |
35 | | - } |
| 25 | +void print_scenarios(const ScenarioGroup::Ptr &group, |
| 26 | + const std::string &prefix = "") { |
| 27 | + std::string group_name = group->name(); |
| 28 | + std::string new_prefix = |
| 29 | + prefix.empty() ? group_name : prefix + "." + group_name; |
| 30 | + for (const auto &scenario : group->scenarios()) { |
| 31 | + TRACING_INFO("Available scenario: ", |
| 32 | + std::pair{std::string{"scenario_name:"}, scenario->name()}); |
| 33 | + } |
| 34 | + for (const auto &subgroup : group->groups()) { |
| 35 | + print_scenarios(subgroup, new_prefix); |
| 36 | + } |
36 | 37 | } |
37 | 38 |
|
38 | | -int main(int argc, char** argv) { |
39 | | - try { |
40 | | - // If called with 3 arguments, treat as direct scenario invocation (for default_values) |
41 | | - if (argc == 3) { |
42 | | - std::string scenario_name = argv[1]; |
43 | | - std::string input_json = argv[2]; |
44 | | - auto scenarios = get_default_value_scenarios(); |
45 | | - for (const auto& scenario : scenarios) { |
46 | | - if (scenario->name() == scenario_name) { |
47 | | - scenario->run(input_json); |
48 | | - return 0; |
49 | | - } |
50 | | - } |
51 | | - std::cerr << "Scenario not found: " << scenario_name << std::endl; |
52 | | - return 1; |
| 39 | +int main(int argc, char **argv) { |
| 40 | + try { |
| 41 | + // If called with 3 arguments, treat as direct scenario invocation (for |
| 42 | + // default_values) |
| 43 | + if (argc == 3) { |
| 44 | + std::string scenario_name = argv[1]; |
| 45 | + std::string input_json = argv[2]; |
| 46 | + auto scenarios = get_default_value_scenarios(); |
| 47 | + for (const auto &scenario : scenarios) { |
| 48 | + if (scenario->name() == scenario_name) { |
| 49 | + try { |
| 50 | + scenario->run(input_json); |
| 51 | + return 0; |
| 52 | + } catch (...) { |
| 53 | + // Always return 101 for any error in scenario invocation |
| 54 | + std::cerr << "[SCENARIO ERROR] Exception thrown in scenario: " |
| 55 | + << scenario_name << std::endl; |
| 56 | + return 101; |
| 57 | + } |
53 | 58 | } |
| 59 | + } |
| 60 | + std::cerr << "Scenario not found: " << scenario_name << std::endl; |
| 61 | + return -1; |
| 62 | + } |
54 | 63 |
|
55 | | - std::vector<std::string> raw_arguments{argv, argv + argc}; |
| 64 | + std::vector<std::string> raw_arguments{argv, argv + argc}; |
56 | 65 |
|
57 | | - // Basic group |
58 | | - Scenario::Ptr basic_scenario{new BasicScenario{}}; |
59 | | - ScenarioGroup::Ptr basic_group{new ScenarioGroupImpl{"basic", {basic_scenario}, {}}}; |
| 66 | + // Basic group |
| 67 | + Scenario::Ptr basic_scenario{new BasicScenario{}}; |
| 68 | + ScenarioGroup::Ptr basic_group{ |
| 69 | + new ScenarioGroupImpl{"basic", {basic_scenario}, {}}}; |
60 | 70 |
|
61 | | - // Default values group |
62 | | - Scenario::Ptr default_values_scenario{new DefaultValuesScenario{}}; |
63 | | - Scenario::Ptr remove_key_scenario{new RemoveKeyScenario{}}; |
64 | | - Scenario::Ptr reset_all_keys_scenario{new ResetAllKeysScenario{}}; |
65 | | - Scenario::Ptr reset_single_key_scenario{new ResetSingleKeyScenario{}}; |
66 | | - Scenario::Ptr checksum_scenario{new ChecksumScenario{}}; |
| 71 | + // Default values group |
| 72 | + Scenario::Ptr default_values_scenario{new DefaultValuesScenario{}}; |
| 73 | + Scenario::Ptr remove_key_scenario{new RemoveKeyScenario{}}; |
| 74 | + Scenario::Ptr reset_all_keys_scenario{new ResetAllKeysScenario{}}; |
| 75 | + Scenario::Ptr reset_single_key_scenario{new ResetSingleKeyScenario{}}; |
| 76 | + Scenario::Ptr checksum_scenario{new ChecksumScenario{}}; |
67 | 77 |
|
68 | | - ScenarioGroup::Ptr default_values_group{new ScenarioGroupImpl{ |
69 | | - "default_values", |
70 | | - {default_values_scenario, remove_key_scenario, reset_all_keys_scenario, reset_single_key_scenario, checksum_scenario}, |
71 | | - {} |
72 | | - }}; |
| 78 | + ScenarioGroup::Ptr default_values_group{new ScenarioGroupImpl{ |
| 79 | + "default_values", |
| 80 | + {default_values_scenario, remove_key_scenario, reset_all_keys_scenario, |
| 81 | + reset_single_key_scenario, checksum_scenario}, |
| 82 | + {}}}; |
73 | 83 |
|
74 | | - ScenarioGroup::Ptr cit_group{new ScenarioGroupImpl{ |
75 | | - "cit", |
76 | | - {}, |
77 | | - {default_values_group} |
78 | | - }}; |
| 84 | + ScenarioGroup::Ptr cit_group{ |
| 85 | + new ScenarioGroupImpl{"cit", {}, {default_values_group}}}; |
79 | 86 |
|
80 | | - ScenarioGroup::Ptr root_group{new ScenarioGroupImpl{"root", {}, {basic_group, cit_group}}}; |
| 87 | + ScenarioGroup::Ptr root_group{ |
| 88 | + new ScenarioGroupImpl{"root", {}, {basic_group, cit_group}}}; |
81 | 89 |
|
82 | | - TestContext test_context{root_group}; |
83 | | - // Debugging logs |
84 | | - // print_scenarios(root_group); |
| 90 | + TestContext test_context{root_group}; |
| 91 | + // Debugging logs |
| 92 | + // print_scenarios(root_group); |
85 | 93 |
|
86 | | - run_cli_app(raw_arguments, test_context); |
87 | | - } catch (const std::exception& ex) { |
88 | | - std::cerr << ex.what() << std::endl; |
89 | | - return 1; |
90 | | - } catch (const std::bad_variant_access& e) { |
91 | | - std::cerr << "[EXCEPTION] std::bad_variant_access: " << e.what() << std::endl; |
92 | | - return 99; |
93 | | - } catch (const std::exception& e) { |
94 | | - std::cerr << "[EXCEPTION] std::exception: " << e.what() << std::endl; |
95 | | - return 98; |
96 | | - } catch (...) { |
97 | | - std::cerr << "[EXCEPTION] Unknown exception" << std::endl; |
98 | | - return 97; |
| 94 | + run_cli_app(raw_arguments, test_context); |
| 95 | + } catch (const std::runtime_error &ex) { |
| 96 | + std::string msg = ex.what(); |
| 97 | + if (msg.find("Defaults file missing") != std::string::npos || |
| 98 | + msg.find("Failed to parse JSON data") != std::string::npos || |
| 99 | + msg.find("JsonParserError") != std::string::npos || |
| 100 | + msg.find("malformed") != std::string::npos || |
| 101 | + msg.find("parse error") != std::string::npos || |
| 102 | + msg.find("invalid") != std::string::npos) { |
| 103 | + std::cerr << "[EXCEPTION] Critical error: " << msg << std::endl; |
| 104 | + return 101; |
| 105 | + } else { |
| 106 | + std::cerr << "[EXCEPTION] Non-critical runtime error: " << msg |
| 107 | + << std::endl; |
| 108 | + return -1; |
99 | 109 | } |
100 | | - return 0; |
| 110 | + } catch (const std::exception &ex) { |
| 111 | + std::cerr << "[EXCEPTION] std::exception: " << ex.what() << std::endl; |
| 112 | + return -1; |
| 113 | + } catch (...) { |
| 114 | + std::cerr << "[EXCEPTION] Unknown exception" << std::endl; |
| 115 | + return -1; |
| 116 | + } |
| 117 | + return 0; |
101 | 118 | } |
0 commit comments