LCOV - code coverage report
Current view: top level - /opt/artdaq/srcs/artdaq-database/test/CaseStudy/OtsDaqCPPInterface/test001 - DatabaseConfiguration_t.cc (source / functions) Coverage Total Hit
Test: artdaq.info.cleaned Lines: 100.0 % 196 196
Test Date: 2026-10-29 00:35:58 Functions: 100.0 % 36 36

            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()
        

Generated by: LCOV version 2.0-1