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 40 : int main(int argc, char* argv[]) try {
23 40 : artdaq::database::filesystem::debug::enable();
24 40 : artdaq::database::mongo::debug::enable();
25 : // artdaq::database::docrecord::debug::JSONDocument();
26 : // artdaq::database::docrecord::debug::JSONDocumentBuilder();
27 :
28 40 : artdaq::database::configuration::debug::ManageConfigs();
29 40 : artdaq::database::configuration::debug::ManageAliases();
30 40 : artdaq::database::configuration::debug::ManageDocuments();
31 :
32 40 : artdaq::database::configuration::debug::options::OperationBase();
33 40 : artdaq::database::configuration::debug::options::ManageDocuments();
34 40 : artdaq::database::configuration::debug::options::ManageConfigs();
35 40 : artdaq::database::configuration::debug::options::ManageAliases();
36 :
37 40 : artdaq::database::configuration::debug::detail::ManageConfigs();
38 40 : artdaq::database::configuration::debug::detail::ManageAliases();
39 40 : artdaq::database::configuration::debug::detail::ManageDocuments();
40 :
41 40 : artdaq::database::configuration::debug::MongoDB();
42 40 : artdaq::database::configuration::debug::UconDB();
43 :
44 40 : debug::registerUngracefullExitHandlers();
45 40 : artdaq::database::useFakeTime(true);
46 :
47 40 : auto options = Options{argv[0]};
48 40 : auto desc = options.makeProgramOptions();
49 :
50 40 : bpo::variables_map vm;
51 :
52 : try {
53 40 : bpo::store(bpo::command_line_parser(argc, argv).options(desc).run(), vm);
54 40 : 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 80 : if (vm.count("help") != 0u) {
61 0 : std::cerr << desc << std::endl;
62 0 : return process_exit_code::HELP;
63 : }
64 :
65 40 : auto exit_code = options.readProgramOptions(vm);
66 40 : if (exit_code != process_exit_code::SUCCESS) {
67 0 : std::cerr << desc << std::endl;
68 0 : return exit_code;
69 : }
70 :
71 80 : 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 40 : auto file_res_name = vm[apiliteral::option::result].as<std::string>();
80 :
81 40 : auto file_src_name = file_res_name;
82 :
83 80 : if (vm.count(apiliteral::option::source) != 0u) {
84 44 : file_src_name = vm[apiliteral::option::source].as<std::string>();
85 : }
86 :
87 40 : auto options_string = options.to_string();
88 40 : auto test_document = std::string{};
89 :
90 40 : std::cout << "Parsed options:\n" << options_string << "\n";
91 :
92 : using namespace artdaq::database::configuration::json;
93 :
94 40 : cf::registerOperation<cf::opsig_str_rstr_t, cf::opsig_str_rstr_t::FP, std::string const&, std::string&>(
95 40 : apiliteral::operation::readdocument, read_document, options_string, test_document);
96 :
97 80 : cf::registerOperation<cf::opsig_str_t, cf::opsig_str_t::FP, std::string const&>(apiliteral::operation::findconfigs, find_configurations,
98 : options_string);
99 80 : cf::registerOperation<cf::opsig_str_t, cf::opsig_str_t::FP, std::string const&>(apiliteral::operation::confcomposition, configuration_composition,
100 : options_string);
101 80 : cf::registerOperation<cf::opsig_str_t, cf::opsig_str_t::FP, std::string const&>(apiliteral::operation::assignconfig, assign_configuration,
102 : options_string);
103 80 : cf::registerOperation<cf::opsig_str_t, cf::opsig_str_t::FP, std::string const&>(apiliteral::operation::findversions, find_versions, options_string);
104 80 : cf::registerOperation<cf::opsig_str_t, cf::opsig_str_t::FP, std::string const&>(apiliteral::operation::findentities, find_entities, options_string);
105 80 : cf::registerOperation<cf::opsig_str_t, cf::opsig_str_t::FP, std::string const&>(apiliteral::operation::addversionalias, add_version_alias,
106 : options_string);
107 80 : cf::registerOperation<cf::opsig_str_t, cf::opsig_str_t::FP, std::string const&>(apiliteral::operation::rmversionalias, remove_version_alias,
108 : options_string);
109 80 : 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 40 : db::read_buffer_from_file(test_document, file_src_name);
113 :
114 40 : cf::registerOperation<cf::opsig_strstr_t, cf::opsig_strstr_t::FP, std::string const&, std::string const&>(
115 80 : apiliteral::operation::writedocument, write_document, options_string, test_document);
116 0 : } catch (...) {
117 0 : }
118 :
119 40 : std::cout << "Running test:<" << options.operation() << ">\n";
120 :
121 40 : auto result = cf::getOperations().at(options.operation())->invoke();
122 :
123 40 : if (!result.first) {
124 0 : std::cout << "Test failed; error message: " << result.second << "\n";
125 0 : std::cout << ::debug::current_exception_diagnostic_information();
126 0 : return process_exit_code::FAILURE;
127 : }
128 :
129 40 : if (result.second.empty()) {
130 : std::cout << "Test failed; error message: result is empty."
131 0 : << "\n";
132 0 : return process_exit_code::FAILURE;
133 : }
134 :
135 40 : auto returned = std::string{result.second};
136 :
137 40 : auto expected = std::string{};
138 40 : db::read_buffer_from_file(expected, file_res_name);
139 :
140 : using cfo::data_format_t;
141 :
142 40 : if (options.format() == data_format_t::gui || options.format() == data_format_t::db || options.format() == data_format_t::json) {
143 10 : auto compare_result = artdaq::database::json::compare_json_objects(returned, expected);
144 10 : if (compare_result.first) {
145 10 : std::cout << "returned:\n" << returned << "\n";
146 :
147 10 : return process_exit_code::SUCCESS;
148 : }
149 0 : std::cout << "Test failed (expected!=returned); error message: " << compare_result.second << "\n";
150 40 : } else if (expected == returned) {
151 30 : std::cout << "returned:\n" << returned << "\n";
152 :
153 30 : return process_exit_code::SUCCESS;
154 0 : } else if (expected.pop_back(), expected == returned) {
155 0 : std::cout << "returned:\n" << returned << "\n";
156 :
157 0 : return process_exit_code::SUCCESS;
158 : }
159 :
160 0 : std::cout << "Test failed (expected!=returned)\n";
161 :
162 0 : std::cout << "returned:\n" << returned << "\n";
163 0 : std::cout << "expected:\n" << expected << "\n";
164 :
165 0 : auto mismatch = std::mismatch(expected.begin(), expected.end(), returned.begin());
166 0 : std::cout << "File sizes (exp,ret)=(" << std::distance(expected.begin(), expected.end()) << "," << std::distance(returned.begin(), returned.end())
167 0 : << ")\n";
168 :
169 0 : std::cout << "First mismatch at position " << std::distance(expected.begin(), mismatch.first) << ", (exp,ret)=(0x" << std::hex
170 0 : << static_cast<unsigned int>(*mismatch.first) << ",0x" << static_cast<unsigned int>(*mismatch.second) << ")\n";
171 :
172 0 : auto file_out_name = std::string(db::filesystem::mkdir(tmpdir))
173 0 : .append("/")
174 0 : .append(argv[0])
175 0 : .append("-")
176 0 : .append(options.operation())
177 0 : .append("-")
178 0 : .append(basename(const_cast<char*>(file_src_name.c_str())))
179 0 : .append(".txt");
180 :
181 0 : db::write_buffer_to_file(returned, file_out_name);
182 :
183 0 : std::cout << "Wrote file:" << file_out_name << "\n";
184 :
185 0 : return process_exit_code::FAILURE;
186 40 : } catch (...) {
187 0 : std::cout << "Process exited with error: " << ::debug::current_exception_diagnostic_information();
188 0 : return process_exit_code::UNCAUGHT_EXCEPTION;
189 0 : }
|