LCOV - code coverage report
Current view: top level - /opt/artdaq/srcs/artdaq-database/test/CaseStudy/ArtdaqDemo - ArtdaqDemo_t.cc (source / functions) Coverage Total Hit
Test: artdaq.info.cleaned Lines: 59.0 % 105 62
Test Date: 2026-10-29 00:35:58 Functions: 100.0 % 1 1

            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 : }
        

Generated by: LCOV version 2.0-1