Line data Source code
1 : #include "test/common.h"
2 :
3 : #include "artdaq-database/BasicTypes/basictypes.h"
4 : #include "artdaq-database/ConfigurationDB/configuration_common.h"
5 : #include "artdaq-database/ConfigurationDB/dispatch_common.h"
6 :
7 : #include "artdaq-database/JsonDocument/JSONDocument.h"
8 : #include "artdaq-database/JsonDocument/JSONDocumentBuilder.h"
9 : #include "artdaq-database/StorageProviders/FileSystemDB/provider_filedb.h"
10 : #include "artdaq-database/StorageProviders/MongoDB/provider_mongodb.h"
11 :
12 : #include "artdaq-database/DataFormats/Json/json_reader.h"
13 :
14 : namespace db = artdaq::database;
15 : namespace cf = db::configuration;
16 : namespace cfo = cf::options;
17 :
18 : namespace bpo = boost::program_options;
19 :
20 : using Options = cf::ManageDocumentOperation;
21 :
22 24 : int main(int argc, char* argv[]) try {
23 24 : artdaq::database::filesystem::debug::enable();
24 24 : artdaq::database::mongo::debug::enable();
25 : // artdaq::database::docrecord::debug::JSONDocument();
26 : // artdaq::database::docrecord::debug::JSONDocumentBuilder();
27 :
28 24 : artdaq::database::configuration::debug::ManageConfigs();
29 24 : artdaq::database::configuration::debug::ManageAliases();
30 24 : artdaq::database::configuration::debug::ManageDocuments();
31 :
32 24 : artdaq::database::configuration::debug::options::OperationBase();
33 24 : artdaq::database::configuration::debug::options::ManageDocuments();
34 24 : artdaq::database::configuration::debug::options::ManageConfigs();
35 24 : artdaq::database::configuration::debug::options::ManageAliases();
36 :
37 24 : artdaq::database::configuration::debug::detail::ManageConfigs();
38 24 : artdaq::database::configuration::debug::detail::ManageAliases();
39 24 : artdaq::database::configuration::debug::detail::ManageDocuments();
40 :
41 24 : artdaq::database::configuration::debug::MongoDB();
42 24 : artdaq::database::configuration::debug::UconDB();
43 :
44 24 : debug::registerUngracefullExitHandlers();
45 24 : artdaq::database::useFakeTime(true);
46 :
47 24 : auto options = Options{argv[0]};
48 24 : auto desc = options.makeProgramOptions();
49 :
50 24 : bpo::variables_map vm;
51 :
52 : try {
53 24 : bpo::store(bpo::command_line_parser(argc, argv).options(desc).run(), vm);
54 24 : bpo::notify(vm);
55 0 : } catch (bpo::error const& e) {
56 0 : std::cerr << "Exception from command line processing in " << argv[0] << ": " << e.what() << "\n";
57 0 : return process_exit_code::INVALID_ARGUMENT;
58 0 : }
59 :
60 48 : if (vm.count("help") != 0u) {
61 0 : std::cerr << desc << std::endl;
62 0 : return process_exit_code::HELP;
63 : }
64 :
65 24 : auto exit_code = options.readProgramOptions(vm);
66 24 : if (exit_code != process_exit_code::SUCCESS) {
67 0 : std::cerr << desc << std::endl;
68 0 : return exit_code;
69 : }
70 :
71 48 : if (vm.count(apiliteral::option::result) == 0u) {
72 : std::cerr << "Exception from command line processing in " << argv[0] << ": no result file name given.\n"
73 : << "For usage and an options list, please do '" << argv[0] << " --help"
74 0 : << "'.\n";
75 :
76 0 : return process_exit_code::INVALID_ARGUMENT | 1;
77 : }
78 :
79 24 : auto file_res_name = vm[apiliteral::option::result].as<std::string>();
80 :
81 24 : auto file_src_name = file_res_name;
82 :
83 48 : if (vm.count(apiliteral::option::source) != 0u) {
84 48 : file_src_name = vm[apiliteral::option::source].as<std::string>();
85 : }
86 :
87 24 : auto options_string = options.to_string();
88 24 : auto test_document = std::string{};
89 :
90 24 : std::cout << "Parsed options:\n" << options_string << "\n";
91 :
92 : using namespace artdaq::database::configuration::json;
93 :
94 24 : cf::registerOperation<cf::opsig_str_rstr_t, cf::opsig_str_rstr_t::FP, std::string const&, std::string&>(
95 24 : apiliteral::operation::readdocument, read_document, options_string, test_document);
96 :
97 48 : cf::registerOperation<cf::opsig_str_t, cf::opsig_str_t::FP, std::string const&>(apiliteral::operation::findconfigs, find_configurations,
98 : options_string);
99 48 : cf::registerOperation<cf::opsig_str_t, cf::opsig_str_t::FP, std::string const&>(apiliteral::operation::confcomposition, configuration_composition,
100 : options_string);
101 48 : cf::registerOperation<cf::opsig_str_t, cf::opsig_str_t::FP, std::string const&>(apiliteral::operation::assignconfig, assign_configuration,
102 : options_string);
103 48 : cf::registerOperation<cf::opsig_str_t, cf::opsig_str_t::FP, std::string const&>(apiliteral::operation::findversions, find_versions, options_string);
104 48 : cf::registerOperation<cf::opsig_str_t, cf::opsig_str_t::FP, std::string const&>(apiliteral::operation::findentities, find_entities, options_string);
105 48 : cf::registerOperation<cf::opsig_str_t, cf::opsig_str_t::FP, std::string const&>(apiliteral::operation::addversionalias, add_version_alias,
106 : options_string);
107 48 : cf::registerOperation<cf::opsig_str_t, cf::opsig_str_t::FP, std::string const&>(apiliteral::operation::rmversionalias, remove_version_alias,
108 : options_string);
109 48 : cf::registerOperation<cf::opsig_str_t, cf::opsig_str_t::FP, std::string const&>(apiliteral::operation::findversionalias, find_version_aliases,
110 : options_string);
111 : try {
112 24 : db::read_buffer_from_file(test_document, file_src_name);
113 24 : cf::registerOperation<cf::opsig_strstr_t, cf::opsig_strstr_t::FP, std::string const&, std::string const&>(
114 48 : apiliteral::operation::writedocument, write_document, options_string, test_document);
115 0 : } catch (...) {
116 0 : }
117 :
118 24 : std::cout << "Running test:<" << options.operation() << ">\n";
119 :
120 24 : auto result = cf::getOperations().at(options.operation())->invoke();
121 :
122 24 : if (!result.first) {
123 0 : std::cout << "Test failed; error message: " << result.second << "\n";
124 0 : std::cout << ::debug::current_exception_diagnostic_information();
125 0 : return process_exit_code::FAILURE;
126 : }
127 :
128 24 : if (result.second.empty()) {
129 : std::cout << "Test failed; error message: result is empty."
130 0 : << "\n";
131 0 : return process_exit_code::FAILURE;
132 : }
133 :
134 24 : auto returned = std::string{result.second};
135 :
136 24 : auto expected = std::string{};
137 24 : db::read_buffer_from_file(expected, file_res_name);
138 :
139 : using cfo::data_format_t;
140 :
141 24 : if (options.format() == data_format_t::gui || options.format() == data_format_t::db || options.format() == data_format_t::json) {
142 24 : auto compare_result = artdaq::database::json::compare_json_objects(returned, expected);
143 24 : if (compare_result.first) {
144 24 : std::cout << "returned:\n" << returned << "\n";
145 :
146 24 : return process_exit_code::SUCCESS;
147 : }
148 0 : std::cout << "Test failed (expected!=returned); error message: " << compare_result.second << "\n";
149 24 : } else if (expected == returned) {
150 0 : std::cout << "returned:\n" << returned << "\n";
151 :
152 0 : return process_exit_code::SUCCESS;
153 0 : } else if (expected.pop_back(), expected == returned) {
154 0 : std::cout << "returned:\n" << returned << "\n";
155 :
156 0 : return process_exit_code::SUCCESS;
157 : }
158 :
159 0 : std::cout << "Test failed (expected!=returned)\n";
160 :
161 0 : std::cout << "returned:\n" << returned << "\n";
162 0 : std::cout << "expected:\n" << expected << "\n";
163 :
164 0 : auto mismatch = std::mismatch(expected.begin(), expected.end(), returned.begin());
165 0 : std::cout << "File sizes (exp,ret)=(" << std::distance(expected.begin(), expected.end()) << "," << std::distance(returned.begin(), returned.end())
166 0 : << ")\n";
167 :
168 0 : std::cout << "First mismatch at position " << std::distance(expected.begin(), mismatch.first) << ", (exp,ret)=(0x" << std::hex
169 0 : << static_cast<unsigned int>(*mismatch.first) << ",0x" << static_cast<unsigned int>(*mismatch.second) << ")\n";
170 :
171 0 : auto file_out_name = std::string(db::filesystem::mkdir(tmpdir))
172 0 : .append("/")
173 0 : .append(argv[0])
174 0 : .append("-")
175 0 : .append(options.operation())
176 0 : .append("-")
177 0 : .append(basename(const_cast<char*>(file_src_name.c_str())))
178 0 : .append(".txt");
179 :
180 0 : db::write_buffer_to_file(returned, file_out_name);
181 :
182 0 : std::cout << "Wrote file:" << file_out_name << "\n";
183 :
184 0 : return process_exit_code::FAILURE;
185 24 : } catch (...) {
186 0 : std::cout << "Process exited with error: " << ::debug::current_exception_diagnostic_information();
187 0 : return process_exit_code::UNCAUGHT_EXCEPTION;
188 0 : }
|