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

Generated by: LCOV version 2.0-1