Line data Source code
1 : #define BOOST_TEST_DYN_LINK
2 : #define BOOST_TEST_MODULE (DatabaseConfigurationInterface test)
3 :
4 : #include <boost/test/unit_test.hpp>
5 :
6 : #include <cassert>
7 : #include <cstdlib>
8 : #include <ctime> /* time */
9 : #include <iostream>
10 : #include <memory>
11 : #include <string>
12 :
13 : #include "../DatabaseConfigurationInterface.h"
14 : #include "artdaq-database/JsonDocument/JSONDocument.h"
15 :
16 : #include "artdaq-database/ConfigurationDB/Multitasker.h"
17 : #include "artdaq-database/ConfigurationDB/configuration_common.h"
18 : #include "artdaq-database/ConfigurationDB/dispatch_common.h"
19 :
20 : #include "artdaq-database/JsonDocument/JSONDocument.h"
21 : #include "artdaq-database/JsonDocument/JSONDocumentBuilder.h"
22 : #include "artdaq-database/StorageProviders/FileSystemDB/provider_filedb.h"
23 : #include "artdaq-database/StorageProviders/MongoDB/provider_mongodb.h"
24 :
25 : #include "artdaq-database/DataFormats/Json/json_reader.h"
26 : #include "artdaq-database/DataFormats/shared_literals.h"
27 :
28 : struct TestData {
29 2 : TestData() {
30 : #if 0
31 : artdaq::database::configuration::debug::ExportImport();
32 : artdaq::database::configuration::debug::ManageAliases();
33 : artdaq::database::configuration::debug::ManageConfigs();
34 : artdaq::database::configuration::debug::ManageDocuments();
35 : artdaq::database::configuration::debug::Metadata();
36 :
37 : artdaq::database::configuration::debug::detail::ExportImport();
38 : artdaq::database::configuration::debug::detail::ManageAliases();
39 : artdaq::database::configuration::debug::detail::ManageConfigs();
40 : artdaq::database::configuration::debug::detail::ManageDocuments();
41 : artdaq::database::configuration::debug::detail::Metadata();
42 :
43 : artdaq::database::configuration::debug::options::OperationBase();
44 : artdaq::database::configuration::debug::options::BulkOperations();
45 : artdaq::database::configuration::debug::options::ManageDocuments();
46 : artdaq::database::configuration::debug::options::ManageConfigs();
47 : artdaq::database::configuration::debug::options::ManageAliases();
48 :
49 : artdaq::database::configuration::debug::MongoDB();
50 : artdaq::database::configuration::debug::UconDB();
51 : artdaq::database::configuration::debug::FileSystemDB();
52 : artdaq::database::configuration::debug::Multitasker();
53 :
54 : artdaq::database::filesystem::debug::enable();
55 : artdaq::database::mongo::debug::enable();
56 :
57 : // artdaq::database::docrecord::debug::JSONDocumentBuilder();
58 : // artdaq::database::docrecord::debug::JSONDocument();
59 :
60 : debug::registerUngracefullExitHandlers();
61 : artdaq::database::useFakeTime(true);
62 : #endif
63 2 : artdaq::database::configuration::debug::Multitasker();
64 2 : std::cout << "setup fixture\n";
65 2 : }
66 :
67 2 : ~TestData() { std::cout << "setup fixture\n"; }
68 :
69 4 : void updateConfigCount(int count) { _oldConfigCount = count; }
70 :
71 40 : int version() { return _version; }
72 6 : int oldConfigCount() { return _oldConfigCount; }
73 :
74 : const int _version = (srand(time(nullptr)), rand() % 99999 + 100000);
75 :
76 : int _oldConfigCount = 0;
77 :
78 2 : int rand_version() { return (srand(time(nullptr)), rand() % 88888 + 211111); }
79 : };
80 :
81 : using namespace ots;
82 :
83 : TestData fixture;
84 :
85 : BOOST_AUTO_TEST_SUITE(databaseconfiguration_test)
86 :
87 4 : BOOST_AUTO_TEST_CASE(configure_tests) {
88 2 : std::cout << "TestData::version=" << fixture.version() << "\n";
89 6 : std::cout << "ARTDAQ_DATABASE_URI=" << (getenv("ARTDAQ_DATABASE_URI") != nullptr ? getenv("ARTDAQ_DATABASE_URI") : std::string("notprovided"))
90 4 : << "\n";
91 2 : }
92 :
93 4 : BOOST_AUTO_TEST_CASE(write_document) {
94 2 : std::shared_ptr<ConfigurationBase> cfg1 = std::make_shared<TestConfiguration001>();
95 2 : auto ifc = DatabaseConfigurationInterface();
96 :
97 2 : cfg1->getView().version = fixture.version();
98 2 : auto result = ifc.saveActiveVersion(cfg1.get());
99 :
100 2 : BOOST_CHECK_EQUAL(result, 0);
101 2 : }
102 :
103 4 : BOOST_AUTO_TEST_CASE(read_document) {
104 2 : std::shared_ptr<ConfigurationBase> cfg1 = std::make_shared<TestConfiguration001>();
105 2 : auto ifc = DatabaseConfigurationInterface();
106 :
107 2 : auto result = ifc.fill(cfg1.get(), fixture.version());
108 :
109 2 : BOOST_CHECK_EQUAL(result, 0);
110 2 : }
111 :
112 4 : BOOST_AUTO_TEST_CASE(store_configuration) {
113 2 : std::shared_ptr<ConfigurationBase> cfg1 = std::make_shared<TestConfiguration001>();
114 2 : std::shared_ptr<ConfigurationBase> cfg2 = std::make_shared<TestConfiguration002>();
115 :
116 2 : auto ifc = DatabaseConfigurationInterface();
117 :
118 2 : cfg1->getView().version = fixture.version() + 1;
119 2 : cfg2->getView().version = fixture.version() + 2;
120 :
121 2 : auto result1 = ifc.saveActiveVersion(cfg1.get());
122 2 : BOOST_CHECK_EQUAL(result1, 0);
123 :
124 2 : auto result2 = ifc.saveActiveVersion(cfg2.get());
125 2 : BOOST_CHECK_EQUAL(result2, 0);
126 :
127 2 : auto map = DatabaseConfigurationInterface::config_version_map_t{};
128 2 : map[cfg1->getConfigurationName()] = cfg1->getView().version;
129 2 : map[cfg2->getConfigurationName()] = cfg2->getView().version;
130 :
131 6 : auto configName = std::string{"config"} + std::to_string(fixture.version());
132 :
133 2 : auto configs = ifc.findAllGlobalConfigurations();
134 :
135 2 : fixture.updateConfigCount(configs.size());
136 :
137 2 : std::cout << "Found configs (store_configuration): ";
138 2 : for (auto config : configs) std::cout << config << ",";
139 2 : std::cout << "\n";
140 :
141 2 : ifc.storeGlobalConfiguration(map, configName);
142 2 : }
143 :
144 4 : BOOST_AUTO_TEST_CASE(store_configuration_mt) {
145 2 : std::shared_ptr<ConfigurationBase> cfg1 = std::make_shared<TestConfiguration001>();
146 2 : std::shared_ptr<ConfigurationBase> cfg2 = std::make_shared<TestConfiguration002>();
147 :
148 2 : auto ifc = DatabaseConfigurationInterface();
149 :
150 2 : cfg1->getView().version = fixture.version() + 10;
151 2 : cfg2->getView().version = fixture.version() + 20;
152 :
153 2 : auto result1 = ifc.saveActiveVersion(cfg1.get());
154 2 : BOOST_CHECK_EQUAL(result1, 0);
155 :
156 2 : auto result2 = ifc.saveActiveVersion(cfg2.get());
157 2 : BOOST_CHECK_EQUAL(result2, 0);
158 :
159 2 : auto map = DatabaseConfigurationInterface::config_version_map_t{};
160 2 : map[cfg1->getConfigurationName()] = cfg1->getView().version;
161 2 : map[cfg2->getConfigurationName()] = cfg2->getView().version;
162 :
163 6 : auto configName = std::string{"config_mt"} + std::to_string(fixture.version());
164 :
165 2 : auto configs = ifc.findAllGlobalConfigurations();
166 :
167 2 : fixture.updateConfigCount(configs.size());
168 :
169 2 : std::cout << "Found configs (store_configuration_mt): ";
170 4 : for (auto config : configs) std::cout << config << ",";
171 2 : std::cout << "\n";
172 :
173 2 : ifc.storeGlobalConfiguration_mt(map, configName);
174 2 : configs = ifc.findAllGlobalConfigurations(configName);
175 2 : BOOST_CHECK_EQUAL(configs.size(), 1);
176 2 : auto map1 = ifc.loadGlobalConfiguration(configName);
177 2 : BOOST_CHECK_EQUAL(map1.size(), 2);
178 2 : }
179 :
180 4 : BOOST_AUTO_TEST_CASE(load_configuration) {
181 2 : auto ifc = DatabaseConfigurationInterface();
182 :
183 6 : auto configName = std::string{"config"} + std::to_string(fixture.version());
184 :
185 2 : auto map = ifc.loadGlobalConfiguration(configName);
186 :
187 2 : BOOST_CHECK_EQUAL(map.size(), 2);
188 :
189 2 : std::shared_ptr<ConfigurationBase> cfg1 = std::make_shared<TestConfiguration001>();
190 2 : std::shared_ptr<ConfigurationBase> cfg2 = std::make_shared<TestConfiguration002>();
191 :
192 2 : BOOST_CHECK_EQUAL(map.at(cfg1->getConfigurationName()), fixture.version() + 1);
193 2 : BOOST_CHECK_EQUAL(map.at(cfg2->getConfigurationName()), fixture.version() + 2);
194 2 : }
195 :
196 4 : BOOST_AUTO_TEST_CASE(find_all_configurations_all) {
197 2 : auto ifc = DatabaseConfigurationInterface();
198 :
199 2 : auto configs = ifc.findAllGlobalConfigurations();
200 :
201 2 : std::cout << "Found configs (find_all_configurations_all): ";
202 6 : for (auto config : configs) std::cout << config << ",";
203 2 : std::cout << "\n";
204 :
205 2 : BOOST_CHECK_EQUAL(configs.size(), fixture.oldConfigCount() + 1);
206 :
207 6 : auto configName = std::string{"config"} + std::to_string(fixture.version());
208 :
209 2 : auto found = (std::find(configs.begin(), configs.end(), configName) != configs.end());
210 :
211 2 : BOOST_CHECK_EQUAL(found, true);
212 2 : }
213 :
214 4 : BOOST_AUTO_TEST_CASE(find_all_configurations_wildcard) {
215 2 : auto ifc = DatabaseConfigurationInterface();
216 :
217 2 : auto configs = ifc.findAllGlobalConfigurations("*");
218 :
219 2 : std::cout << "Found configs (find_all_configurations_wildcard): ";
220 6 : for (auto config : configs) std::cout << config << ",";
221 2 : std::cout << "\n";
222 :
223 2 : BOOST_CHECK_EQUAL(configs.size(), fixture.oldConfigCount() + 1);
224 :
225 6 : auto configName = std::string{"config"} + std::to_string(fixture.version());
226 :
227 2 : auto found = (std::find(configs.begin(), configs.end(), configName) != configs.end());
228 :
229 2 : BOOST_CHECK_EQUAL(found, true);
230 2 : }
231 :
232 4 : BOOST_AUTO_TEST_CASE(find_all_configurations_fullname) {
233 2 : auto ifc = DatabaseConfigurationInterface();
234 :
235 6 : auto configName = std::string{"config"} + std::to_string(fixture.version());
236 :
237 2 : auto configs = ifc.findAllGlobalConfigurations(configName);
238 :
239 2 : std::cout << "Found configs (find_all_configurations_fullname): ";
240 4 : for (auto config : configs) std::cout << config << ",";
241 2 : std::cout << "\n";
242 :
243 2 : auto found = (std::find(configs.begin(), configs.end(), configName) != configs.end());
244 :
245 2 : BOOST_CHECK_EQUAL(found, true);
246 2 : }
247 :
248 4 : BOOST_AUTO_TEST_CASE(find_all_configurations_prefix) {
249 2 : auto ifc = DatabaseConfigurationInterface();
250 :
251 2 : auto configs = ifc.findAllGlobalConfigurations("config*");
252 :
253 2 : std::cout << "Found configs (find_all_configurations_prefix): ";
254 6 : for (auto config : configs) std::cout << config << ",";
255 2 : std::cout << "\n";
256 :
257 2 : BOOST_CHECK_EQUAL(configs.size(), fixture.oldConfigCount() + 1);
258 :
259 6 : auto configName = std::string{"config"} + std::to_string(fixture.version());
260 :
261 2 : auto found = (std::find(configs.begin(), configs.end(), configName) != configs.end());
262 :
263 2 : BOOST_CHECK_EQUAL(found, true);
264 2 : }
265 :
266 4 : BOOST_AUTO_TEST_CASE(list_configuration_types) {
267 2 : auto ifc = DatabaseConfigurationInterface();
268 :
269 2 : auto list = ifc.listConfigurationsTypes();
270 :
271 2 : BOOST_CHECK_EQUAL(list.size(), 2);
272 :
273 2 : std::shared_ptr<ConfigurationBase> cfg1 = std::make_shared<TestConfiguration001>();
274 2 : std::shared_ptr<ConfigurationBase> cfg2 = std::make_shared<TestConfiguration002>();
275 :
276 2 : auto found1 = (std::find(list.begin(), list.end(), cfg1->getConfigurationName()) != list.end());
277 :
278 2 : BOOST_CHECK_EQUAL(found1, true);
279 :
280 2 : auto found2 = (std::find(list.begin(), list.end(), cfg2->getConfigurationName()) != list.end());
281 :
282 2 : BOOST_CHECK_EQUAL(found2, true);
283 2 : }
284 :
285 4 : BOOST_AUTO_TEST_CASE(find_configuration_version) {
286 2 : auto ifc = DatabaseConfigurationInterface();
287 :
288 2 : std::shared_ptr<ConfigurationBase> cfg1 = std::make_shared<TestConfiguration001>();
289 :
290 2 : auto list = ifc.getVersions(cfg1.get());
291 :
292 2 : auto found1 = (std::find(list.begin(), list.end(), fixture.version()) != list.end());
293 :
294 2 : BOOST_CHECK_EQUAL(found1, true);
295 :
296 2 : auto found2 = (std::find(list.begin(), list.end(), fixture.version() + 1) != list.end());
297 :
298 2 : BOOST_CHECK_EQUAL(found2, true);
299 2 : }
300 :
301 4 : BOOST_AUTO_TEST_CASE(find_configuration_version_loop) {
302 2 : auto ifc = DatabaseConfigurationInterface();
303 :
304 2 : std::shared_ptr<ConfigurationBase> cfg1 = std::make_shared<TestConfiguration001>();
305 :
306 2 : auto list = ifc.getVersions(cfg1.get());
307 :
308 2002 : for (auto n = 0u; n < 1000u; n++) {
309 2000 : list = ifc.getVersions(cfg1.get());
310 : }
311 :
312 2 : auto found1 = (std::find(list.begin(), list.end(), fixture.version()) != list.end());
313 :
314 2 : BOOST_CHECK_EQUAL(found1, true);
315 :
316 2 : auto found2 = (std::find(list.begin(), list.end(), fixture.version() + 1) != list.end());
317 :
318 2 : BOOST_CHECK_EQUAL(found2, true);
319 2 : }
320 :
321 4 : BOOST_AUTO_TEST_CASE(find_latest_configuration_version) {
322 2 : auto ifc = DatabaseConfigurationInterface();
323 :
324 2 : std::shared_ptr<ConfigurationBase> cfg1 = std::make_shared<TestConfiguration001>();
325 :
326 2 : auto version = ifc.findLatestVersion(cfg1.get());
327 :
328 2 : auto list = ifc.getVersions(cfg1.get());
329 :
330 2 : std::cout << "Found versions:";
331 8 : for (auto version : list) {
332 6 : std::cout << std::to_string(version) << ", ";
333 : }
334 2 : std::cout << "\n";
335 :
336 2 : std::cout << "Got latest version" << std::to_string(version) << "\n";
337 2 : }
338 :
339 4 : BOOST_AUTO_TEST_CASE(overwrite_document) {
340 2 : auto ifc = DatabaseConfigurationInterface();
341 :
342 2 : auto oldJson = std::string{"{\n\"oldJson\" : 321\n}"};
343 2 : auto version = fixture.rand_version();
344 2 : std::shared_ptr<ConfigurationBase> w1 = std::make_shared<TestConfiguration001>();
345 2 : w1->getView().fillFromJSON(oldJson);
346 2 : w1->getView().version = version;
347 2 : auto result = ifc.saveActiveVersion(w1.get());
348 2 : BOOST_CHECK_EQUAL(result, 0);
349 :
350 2 : std::shared_ptr<ConfigurationBase> r1 = std::make_shared<TestConfiguration001>();
351 2 : result = ifc.fill(r1.get(), version);
352 2 : BOOST_CHECK_EQUAL(result, 0);
353 2 : BOOST_CHECK_EQUAL(r1->getView()._json, oldJson);
354 :
355 2 : std::shared_ptr<ConfigurationBase> w2 = std::make_shared<TestConfiguration001>();
356 2 : w2->getView().version = version;
357 2 : result = ifc.saveActiveVersion(w2.get(), true);
358 2 : BOOST_CHECK_EQUAL(result, 0);
359 :
360 2 : r1 = std::make_shared<TestConfiguration001>();
361 2 : result = ifc.fill(r1.get(), version);
362 2 : BOOST_CHECK_EQUAL(result, 0);
363 2 : BOOST_CHECK_EQUAL(r1->getView()._json, w2->getView()._json);
364 :
365 2 : std::shared_ptr<ConfigurationBase> r2 = std::make_shared<TestConfiguration001>();
366 2 : result = ifc.fill(r2.get(), version);
367 2 : BOOST_CHECK_EQUAL(result, 0);
368 2 : BOOST_CHECK_EQUAL(r2->getView()._json, w2->getView()._json);
369 :
370 2 : std::shared_ptr<ConfigurationBase> cfg = std::make_shared<TestConfiguration001>();
371 2 : BOOST_CHECK_EQUAL(r2->getView()._json, cfg->getView()._json);
372 2 : }
373 :
374 : BOOST_AUTO_TEST_SUITE_END()
|