LCOV - code coverage report
Current view: top level - listrev/unittest - ReversedListValidator_test.cxx (source / functions) Coverage Total Hit
Test: code.result Lines: 100.0 % 155 155
Test Date: 2026-10-11 15:05:20 Functions: 100.0 % 22 22

            Line data    Source code
       1              : /**
       2              :  * @file ReversedListValidator_test.cxx ReversedListValidator plugin Unit Tests
       3              :  *
       4              :  * This is part of the DUNE DAQ Application Framework, copyright 2020.
       5              :  * Licensing/copyright details are in the COPYING file that you should have
       6              :  * received with this code.
       7              :  */
       8              : 
       9              : #include "ReversedListValidator.hpp"
      10              : 
      11              : #include "appfwk/ConfigurationManager.hpp"
      12              : #include "opmonlib/TestOpMonManager.hpp"
      13              : #include "serialization/Serialization.hpp"
      14              : 
      15              : #define BOOST_TEST_MODULE ReversedListValidator_test // NOLINT
      16              : 
      17              : #include "boost/test/unit_test.hpp"
      18              : 
      19              : #include <string>
      20              : #include <vector>
      21              : 
      22              : using namespace dunedaq::listrev;
      23              : 
      24              : BOOST_AUTO_TEST_SUITE(ReversedListValidator_test)
      25              : 
      26              : struct ConfigurationTestFixture
      27              : {
      28            4 :   ConfigurationTestFixture()
      29           12 :   {
      30            4 :     std::string sessionName = "lr-session";
      31            4 :     std::string appName = "listrev";
      32            4 :     std::string TEST_OKS_DB = "oksconflibs:config/lrSession-singleapp.data.xml";
      33            4 :     cfgmgr = std::make_shared<dunedaq::appfwk::ConfigurationManager>(TEST_OKS_DB, appName, sessionName);
      34            4 :     dunedaq::get_iomanager()->configure(
      35              :       sessionName, cfgmgr->get_queues(), cfgmgr->get_networkconnections(), nullptr, opmgr);
      36            4 :   }
      37            4 :   ~ConfigurationTestFixture()
      38              :   {
      39            4 :     dunedaq::get_iomanager()->reset();
      40            4 :     cfgmgr = nullptr;
      41            4 :   }
      42              : 
      43              :   ConfigurationTestFixture(ConfigurationTestFixture const&) = default;
      44              :   ConfigurationTestFixture(ConfigurationTestFixture&&) = default;
      45              :   ConfigurationTestFixture& operator=(ConfigurationTestFixture const&) = default;
      46              :   ConfigurationTestFixture& operator=(ConfigurationTestFixture&&) = default;
      47              : 
      48              :   dunedaq::opmonlib::TestOpMonManager opmgr;
      49              :   std::shared_ptr<dunedaq::appfwk::ConfigurationManager> cfgmgr;
      50              : };
      51              : 
      52            2 : BOOST_FIXTURE_TEST_CASE(Commands, ConfigurationTestFixture)
      53              : {
      54            1 :   std::shared_ptr<dunedaq::appfwk::DAQModule> mod = dunedaq::appfwk::make_module("ReversedListValidator", "lrv");
      55            1 :   opmgr.register_node("lrv", mod);
      56            1 :   BOOST_REQUIRE(mod->has_command("start"));
      57            1 :   BOOST_REQUIRE(mod->has_command("stop"));
      58              : 
      59            1 :   mod->init(cfgmgr);
      60            1 :   mod->execute_command("start");
      61              : 
      62            1 :   auto metrics = opmgr.collect();
      63              : 
      64            1 :   mod->execute_command("stop");
      65              : 
      66            1 :   auto facility = opmgr.get_backend_facility();
      67            1 :   auto entries = facility->get_entries(std::regex("dunedaq.listrev.opmon.ReversedListValidatorInfo"));
      68            1 :   BOOST_REQUIRE_EQUAL(entries.size(), 1);
      69            1 :   BOOST_CHECK_EQUAL(entries.front().data().at("valid_list_pairs").uint8_value(), 0);
      70            1 :   BOOST_CHECK_EQUAL(entries.front().data().at("invalid_list_pairs").uint8_value(), 0);
      71            1 :   BOOST_CHECK_EQUAL(entries.front().data().at("total_lists").uint8_value(), 0);
      72            3 : }
      73              : 
      74            2 : BOOST_FIXTURE_TEST_CASE(ProcessList, ConfigurationTestFixture)
      75              : {
      76            1 :   std::shared_ptr<dunedaq::appfwk::DAQModule> mod = dunedaq::appfwk::make_module("ReversedListValidator", "lrv");
      77            1 :   opmgr.register_node("lrv", mod);
      78              : 
      79            1 :   std::vector<CreateList> creates_received;
      80           13 :   auto create_callback = [&](CreateList c) { creates_received.push_back(c); };
      81            1 :   dunedaq::get_iomanager()->get_receiver<CreateList>("creates_queue")->add_callback(create_callback);
      82              : 
      83            1 :   std::vector<RequestList> requests_received;
      84           13 :   auto request_callback = [&](RequestList r) { requests_received.push_back(r); };
      85            1 :   dunedaq::get_iomanager()->get_receiver<RequestList>("lr0_request_queue")->add_callback(request_callback);
      86              : 
      87            1 :   auto list_sender = dunedaq::get_iomanager()->get_sender<ReversedList>("validator_list_queue");
      88              : 
      89            1 :   mod->init(cfgmgr);
      90            1 :   mod->execute_command("start");
      91              : 
      92            1 :   usleep(100000);
      93              : 
      94            1 :   BOOST_REQUIRE(creates_received.size() > 0);
      95            1 :   BOOST_REQUIRE(requests_received.size() > 0);
      96            1 :   BOOST_REQUIRE_EQUAL(creates_received[0].list_id, 1);
      97            1 :   BOOST_REQUIRE_EQUAL(requests_received[0].list_id, 1);
      98              : 
      99            1 :   size_t ii = 0;
     100            8 :   auto g = [&]() { return ++ii; };
     101            8 :   auto r = [&]() { return ii--; };
     102              : 
     103            1 :   ReversedList testList(1, 0, {});
     104            1 :   IntList original(1, 0, {});
     105            1 :   IntList reversed(1, 0, {});
     106            1 :   std::generate_n(std::back_inserter(original.list), creates_received[0].list_size, g);
     107            1 :   std::generate_n(std::back_inserter(reversed.list), creates_received[0].list_size, r);
     108            1 :   ReversedList::Data data;
     109            1 :   data.original = original;
     110            1 :   data.reversed = reversed;
     111            1 :   testList.lists.push_back(data);
     112            1 :   list_sender->send(std::move(testList), std::chrono::milliseconds(1000));
     113              : 
     114            1 :   usleep(10000);
     115              : 
     116            1 :   auto metrics = opmgr.collect();
     117            1 :   mod->execute_command("stop");
     118            1 :   dunedaq::get_iomanager()->get_receiver<CreateList>("creates_queue")->remove_callback();
     119            1 :   dunedaq::get_iomanager()->get_receiver<RequestList>("lr0_request_queue")->remove_callback();
     120              : 
     121            1 :   auto facility = opmgr.get_backend_facility();
     122            1 :   auto entries = facility->get_entries(std::regex("dunedaq.listrev.opmon.ReversedListValidatorInfo"));
     123            1 :   BOOST_REQUIRE_EQUAL(entries.size(), 1);
     124            1 :   BOOST_CHECK_EQUAL(entries.front().data().at("valid_list_pairs").uint8_value(), 1);
     125            1 :   BOOST_CHECK_EQUAL(entries.front().data().at("invalid_list_pairs").uint8_value(), 0);
     126            1 :   BOOST_CHECK_EQUAL(entries.front().data().at("total_lists").uint8_value(), 1);
     127            3 : }
     128              : 
     129            2 : BOOST_FIXTURE_TEST_CASE(InvalidList, ConfigurationTestFixture)
     130              : {
     131            1 :   std::shared_ptr<dunedaq::appfwk::DAQModule> mod = dunedaq::appfwk::make_module("ReversedListValidator", "lrv");
     132            1 :   opmgr.register_node("lrv", mod);
     133              : 
     134            1 :   std::vector<CreateList> creates_received;
     135           13 :   auto create_callback = [&](CreateList c) { creates_received.push_back(c); };
     136            1 :   dunedaq::get_iomanager()->get_receiver<CreateList>("creates_queue")->add_callback(create_callback);
     137              : 
     138            1 :   std::vector<RequestList> requests_received;
     139           13 :   auto request_callback = [&](RequestList r) { requests_received.push_back(r); };
     140            1 :   dunedaq::get_iomanager()->get_receiver<RequestList>("lr0_request_queue")->add_callback(request_callback);
     141              : 
     142            1 :   auto list_sender = dunedaq::get_iomanager()->get_sender<ReversedList>("validator_list_queue");
     143              : 
     144            1 :   mod->init(cfgmgr);
     145            1 :   mod->execute_command("start");
     146              : 
     147            1 :   usleep(100000);
     148              : 
     149            1 :   BOOST_REQUIRE(creates_received.size() > 0);
     150            1 :   BOOST_REQUIRE(requests_received.size() > 0);
     151            1 :   BOOST_REQUIRE_EQUAL(creates_received[0].list_id, 1);
     152            1 :   BOOST_REQUIRE_EQUAL(requests_received[0].list_id, 1);
     153              : 
     154            1 :   size_t ii = 0;
     155           14 :   auto g = [&]() { return ++ii; };
     156           14 :   auto r = [&]() { return ii--; };
     157              : 
     158            1 :   ReversedList testList(1, 0, {});
     159            1 :   IntList original(1, 0, {});
     160            1 :   IntList reversed(1, 0, {});
     161            1 :   std::generate_n(std::back_inserter(original.list), creates_received[0].list_size, g);
     162            1 :   std::generate_n(std::back_inserter(reversed.list), creates_received[0].list_size, r);
     163            1 :   reversed.list[0]++; // Invalidate the list
     164            1 :   ReversedList::Data data;
     165            1 :   data.original = original;
     166            1 :   data.reversed = reversed;
     167            1 :   testList.lists.push_back(data);
     168            1 :   list_sender->send(std::move(testList), std::chrono::milliseconds(1000));
     169              : 
     170            1 :   usleep(10000);
     171              : 
     172            1 :   auto metrics = opmgr.collect();
     173            1 :   mod->execute_command("stop");
     174            1 :   dunedaq::get_iomanager()->get_receiver<CreateList>("creates_queue")->remove_callback();
     175            1 :   dunedaq::get_iomanager()->get_receiver<RequestList>("lr0_request_queue")->remove_callback();
     176              : 
     177            1 :   auto facility = opmgr.get_backend_facility();
     178            1 :   auto entries = facility->get_entries(std::regex("dunedaq.listrev.opmon.ReversedListValidatorInfo"));
     179              : 
     180            1 :   BOOST_REQUIRE_EQUAL(entries.size(), 1);
     181            1 :   BOOST_CHECK_EQUAL(entries.front().data().at("valid_list_pairs").uint8_value(), 0);
     182            1 :   BOOST_CHECK_EQUAL(entries.front().data().at("invalid_list_pairs").uint8_value(), 1);
     183            1 :   BOOST_CHECK_EQUAL(entries.front().data().at("total_lists").uint8_value(), 1);
     184            3 : }
     185              : 
     186            2 : BOOST_FIXTURE_TEST_CASE(WrongSizeList, ConfigurationTestFixture)
     187              : {
     188            1 :   std::shared_ptr<dunedaq::appfwk::DAQModule> mod = dunedaq::appfwk::make_module("ReversedListValidator", "lrv");
     189            1 :   opmgr.register_node("lrv", mod);
     190              : 
     191            1 :   std::vector<CreateList> creates_received;
     192           13 :   auto create_callback = [&](CreateList c) { creates_received.push_back(c); };
     193            1 :   dunedaq::get_iomanager()->get_receiver<CreateList>("creates_queue")->add_callback(create_callback);
     194              : 
     195            1 :   std::vector<RequestList> requests_received;
     196           13 :   auto request_callback = [&](RequestList r) { requests_received.push_back(r); };
     197            1 :   dunedaq::get_iomanager()->get_receiver<RequestList>("lr0_request_queue")->add_callback(request_callback);
     198              : 
     199            1 :   auto list_sender = dunedaq::get_iomanager()->get_sender<ReversedList>("validator_list_queue");
     200              : 
     201            1 :   mod->init(cfgmgr);
     202            1 :   mod->execute_command("start");
     203              : 
     204            1 :   usleep(100000);
     205              : 
     206            1 :   BOOST_REQUIRE(creates_received.size() > 0);
     207            1 :   BOOST_REQUIRE(requests_received.size() > 0);
     208            1 :   BOOST_REQUIRE_EQUAL(creates_received[0].list_id, 1);
     209            1 :   BOOST_REQUIRE_EQUAL(requests_received[0].list_id, 1);
     210              : 
     211            1 :   size_t ii = 0;
     212           12 :   auto g = [&]() { return ++ii; };
     213           12 :   auto r = [&]() { return ii--; };
     214              : 
     215            1 :   ReversedList testList(1, 0, {});
     216            1 :   IntList original(1, 0, {});
     217            1 :   IntList reversed(1, 0, {});
     218            1 :   std::generate_n(std::back_inserter(original.list), creates_received[0].list_size + 1, g);
     219            1 :   std::generate_n(std::back_inserter(reversed.list), creates_received[0].list_size + 1, r);
     220            1 :   ReversedList::Data data;
     221            1 :   data.original = original;
     222            1 :   data.reversed = reversed;
     223            1 :   testList.lists.push_back(data);
     224            1 :   list_sender->send(std::move(testList), std::chrono::milliseconds(1000));
     225              : 
     226            1 :   usleep(10000);
     227              : 
     228            1 :   auto metrics = opmgr.collect();
     229            1 :   mod->execute_command("stop");
     230            1 :   dunedaq::get_iomanager()->get_receiver<CreateList>("creates_queue")->remove_callback();
     231            1 :   dunedaq::get_iomanager()->get_receiver<RequestList>("lr0_request_queue")->remove_callback();
     232              : 
     233            1 :   auto facility = opmgr.get_backend_facility();
     234            1 :   auto entries = facility->get_entries(std::regex("dunedaq.listrev.opmon.ReversedListValidatorInfo"));
     235              : 
     236            1 :   BOOST_REQUIRE_EQUAL(entries.size(), 1);
     237            1 :   BOOST_CHECK_EQUAL(entries.front().data().at("valid_list_pairs").uint8_value(), 0);
     238            1 :   BOOST_CHECK_EQUAL(entries.front().data().at("invalid_list_pairs").uint8_value(), 1);
     239            1 :   BOOST_CHECK_EQUAL(entries.front().data().at("total_lists").uint8_value(), 1);
     240            3 : }
     241              : BOOST_AUTO_TEST_SUITE_END()
        

Generated by: LCOV version 2.0-1