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