LCOV - code coverage report
Current view: top level - dfmessages/unittest - TriggerRecordHeader_serialization_test.cxx (source / functions) Coverage Total Hit
Test: code.result Lines: 100.0 % 131 131
Test Date: 2025-12-21 13:07:08 Functions: 100.0 % 8 8

            Line data    Source code
       1              : /**
       2              :  * @file TriggerRecordHeader_test.cxx TriggerRecordHeader class 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 "dfmessages/TriggerRecordHeader_serialization.hpp"
      10              : 
      11              : /**
      12              :  * @brief Name of this test module
      13              :  */
      14              : #define BOOST_TEST_MODULE TriggerRecordHeader_test // NOLINT
      15              : 
      16              : #include "boost/test/unit_test.hpp"
      17              : 
      18              : #include <string>
      19              : #include <vector>
      20              : 
      21              : using namespace dunedaq::daqdataformats;
      22              : 
      23              : BOOST_AUTO_TEST_SUITE(TriggerRecordHeader_test)
      24              : 
      25              : /**
      26              :  * @brief Check that TriggerRecords have appropriate Copy/Move semantics
      27              :  */
      28            2 : BOOST_AUTO_TEST_CASE(CopyAndMoveSemantics)
      29              : {
      30            1 :   BOOST_REQUIRE(std::is_copy_constructible_v<TriggerRecordHeader>);
      31            1 :   BOOST_REQUIRE(std::is_copy_assignable_v<TriggerRecordHeader>);
      32            1 :   BOOST_REQUIRE(std::is_move_constructible_v<TriggerRecordHeader>);
      33            1 :   BOOST_REQUIRE(std::is_move_assignable_v<TriggerRecordHeader>);
      34            1 : }
      35              : 
      36              : /**
      37              :  * @brief Check that TriggerRecordHeader constructors function correctly
      38              :  */
      39            2 : BOOST_AUTO_TEST_CASE(ExistingHeader)
      40              : {
      41            1 :   std::vector<ComponentRequest> components;
      42            1 :   components.emplace_back();
      43            1 :   components.back().component.subsystem = SourceID::Subsystem::kDetectorReadout;
      44            1 :   components.back().component.id = 2;
      45            1 :   components.back().window_begin = 3;
      46            1 :   components.back().window_end = 4;
      47            1 :   components.emplace_back();
      48            1 :   components.back().component.subsystem = SourceID::Subsystem::kDetectorReadout;
      49            1 :   components.back().component.id = 6;
      50            1 :   components.back().window_begin = 7;
      51            1 :   components.back().window_end = 8;
      52              : 
      53            1 :   auto header = new TriggerRecordHeader(components);
      54            1 :   header->set_run_number(9);
      55            1 :   header->set_trigger_number(10);
      56            1 :   header->set_trigger_timestamp(11);
      57            1 :   header->set_trigger_type(12);
      58            1 :   header->set_error_bit(TriggerRecordErrorBits::kMismatch, true);
      59            1 :   header->set_error_bit(TriggerRecordErrorBits::kUnassigned3, true);
      60              : 
      61            2 :   BOOST_REQUIRE_THROW(header->at(header->get_header().num_requested_components), std::range_error);
      62            2 :   BOOST_REQUIRE_THROW((*header)[header->get_header().num_requested_components], std::range_error);
      63              : 
      64            1 :   void* buff = malloc(header->get_total_size_bytes());
      65            1 :   memcpy(buff, header->get_storage_location(), header->get_total_size_bytes());
      66              : 
      67              :   // Constructor should copy header
      68            1 :   TriggerRecordHeader copy_header(const_cast<void*>(header->get_storage_location()), true);
      69            1 :   delete header; // NOLINT(build/raw_ownership)
      70              : 
      71            1 :   BOOST_REQUIRE_EQUAL(copy_header.get_run_number(), 9);
      72            1 :   BOOST_REQUIRE_EQUAL(copy_header.get_error_bit(static_cast<TriggerRecordErrorBits>(0)), false);
      73            1 :   BOOST_REQUIRE_EQUAL(copy_header.get_error_bit(static_cast<TriggerRecordErrorBits>(1)), true);
      74            1 :   BOOST_REQUIRE_EQUAL(copy_header.get_header().error_bits, 10);
      75            1 :   BOOST_REQUIRE_EQUAL(copy_header.at(0).window_begin, 3);
      76            1 :   BOOST_REQUIRE_EQUAL(copy_header[1].window_begin, 7);
      77              : 
      78            1 :   {
      79              :     // Test copy constructor
      80            1 :     TriggerRecordHeader copy_copy_header(copy_header);
      81            1 :     BOOST_REQUIRE_EQUAL(copy_copy_header.get_run_number(), 9);
      82            1 :     BOOST_REQUIRE_EQUAL(copy_copy_header.get_error_bit(static_cast<TriggerRecordErrorBits>(0)), false);
      83            1 :     BOOST_REQUIRE_EQUAL(copy_copy_header.get_error_bit(static_cast<TriggerRecordErrorBits>(1)), true);
      84            1 :     BOOST_REQUIRE_EQUAL(copy_copy_header.get_header().error_bits, 10);
      85            1 :     BOOST_REQUIRE_EQUAL(copy_copy_header.at(0).window_begin, 3);
      86            1 :     BOOST_REQUIRE_EQUAL(copy_copy_header[1].window_begin, 7);
      87            1 :   }
      88            1 :   {
      89              :     // Test copy assignment
      90            1 :     TriggerRecordHeader copy_assign_header = copy_header;
      91            1 :     BOOST_REQUIRE_EQUAL(copy_assign_header.get_run_number(), 9);
      92            1 :     BOOST_REQUIRE_EQUAL(copy_assign_header.get_error_bit(static_cast<TriggerRecordErrorBits>(0)), false);
      93            1 :     BOOST_REQUIRE_EQUAL(copy_assign_header.get_error_bit(static_cast<TriggerRecordErrorBits>(1)), true);
      94            1 :     BOOST_REQUIRE_EQUAL(copy_assign_header.get_header().error_bits, 10);
      95            1 :     BOOST_REQUIRE_EQUAL(copy_assign_header.at(0).window_begin, 3);
      96            1 :     BOOST_REQUIRE_EQUAL(copy_assign_header[1].window_begin, 7);
      97            1 :   }
      98              : 
      99            1 :   {
     100              :     // Test Buffer adoption constructor
     101            1 :     TriggerRecordHeader buffer_header(buff, false);
     102              : 
     103            1 :     BOOST_REQUIRE_EQUAL(buffer_header.get_run_number(), 9);
     104            1 :     BOOST_REQUIRE_EQUAL(buffer_header.get_error_bit(static_cast<TriggerRecordErrorBits>(0)), false);
     105            1 :     BOOST_REQUIRE_EQUAL(buffer_header.get_error_bit(static_cast<TriggerRecordErrorBits>(1)), true);
     106            1 :     BOOST_REQUIRE_EQUAL(buffer_header.get_header().error_bits, 10);
     107            1 :     BOOST_REQUIRE_EQUAL(buffer_header.at(0).window_begin, 3);
     108            1 :     BOOST_REQUIRE_EQUAL(buffer_header[1].window_begin, 7);
     109            1 :   }
     110              : 
     111            1 :   BOOST_REQUIRE_EQUAL(*reinterpret_cast<uint32_t*>(buff), // NOLINT
     112              :                       TriggerRecordHeaderData::s_trigger_record_header_magic);
     113              : 
     114            1 :   free(buff);
     115            1 : }
     116              : 
     117              : /**
     118              :  * @brief Test header field manipulation methods
     119              :  */
     120            2 : BOOST_AUTO_TEST_CASE(HeaderFields)
     121              : {
     122            1 :   std::vector<ComponentRequest> components;
     123            1 :   components.emplace_back();
     124            1 :   components.back().component.subsystem = SourceID::Subsystem::kDetectorReadout;
     125            1 :   components.back().component.id = 2;
     126            1 :   components.back().window_begin = 3;
     127            1 :   components.back().window_end = 4;
     128            1 :   components.emplace_back();
     129            1 :   components.back().component.subsystem = SourceID::Subsystem::kDetectorReadout;
     130            1 :   components.back().component.id = 6;
     131            1 :   components.back().window_begin = 7;
     132            1 :   components.back().window_end = 8;
     133              : 
     134            1 :   auto header = new TriggerRecordHeader(components);
     135            1 :   header->set_run_number(9);
     136            1 :   header->set_trigger_number(10);
     137            1 :   header->set_trigger_timestamp(11);
     138            1 :   header->set_trigger_type(12);
     139            1 :   header->set_error_bit(TriggerRecordErrorBits::kMismatch, true);
     140            1 :   header->set_error_bit(TriggerRecordErrorBits::kUnassigned3, true);
     141              : 
     142            1 :   auto header_data = header->get_header();
     143            1 :   BOOST_REQUIRE_EQUAL(header->get_run_number(), header_data.run_number);
     144            1 :   BOOST_REQUIRE_EQUAL(header->get_trigger_number(), header_data.trigger_number);
     145            1 :   BOOST_REQUIRE_EQUAL(header->get_trigger_timestamp(), header_data.trigger_timestamp);
     146            1 :   BOOST_REQUIRE_EQUAL(header->get_trigger_type(), header_data.trigger_type);
     147            1 :   BOOST_REQUIRE_EQUAL(header->get_num_requested_components(), 2);
     148            1 :   BOOST_REQUIRE_EQUAL(header->get_num_requested_components(), header_data.num_requested_components);
     149              : 
     150            1 :   auto header_ptr = static_cast<const TriggerRecordHeaderData*>(header->get_storage_location());
     151            1 :   BOOST_REQUIRE_EQUAL(header_ptr->run_number, header_data.run_number);
     152            1 :   header->set_run_number(10);
     153            1 :   BOOST_REQUIRE(header_ptr->run_number != header_data.run_number);
     154            1 :   BOOST_REQUIRE_EQUAL(header_ptr->run_number, 10);
     155            1 : }
     156              : 
     157              : /**
     158              :  * @brief Check that TriggerRecordHeader serialization via MsgPack works
     159              :  */
     160            2 : BOOST_AUTO_TEST_CASE(Header_SerDes_MsgPack)
     161              : {
     162            1 :   std::vector<ComponentRequest> components;
     163            1 :   components.emplace_back();
     164            1 :   components.back().component.subsystem = SourceID::Subsystem::kDetectorReadout;
     165            1 :   components.back().component.id = 2;
     166            1 :   components.back().window_begin = 3;
     167            1 :   components.back().window_end = 4;
     168            1 :   components.emplace_back();
     169            1 :   components.back().component.subsystem = SourceID::Subsystem::kDetectorReadout;
     170            1 :   components.back().component.id = 6;
     171            1 :   components.back().window_begin = 7;
     172            1 :   components.back().window_end = 8;
     173              : 
     174            1 :   auto header = new TriggerRecordHeader(components);
     175            1 :   header->set_run_number(9);
     176            1 :   header->set_trigger_number(10);
     177            1 :   header->set_trigger_timestamp(11);
     178            1 :   header->set_trigger_type(12);
     179            1 :   header->set_error_bit(TriggerRecordErrorBits::kMismatch, true);
     180            1 :   header->set_error_bit(TriggerRecordErrorBits::kUnassigned3, true);
     181              : 
     182            1 :   auto bytes = dunedaq::serialization::serialize(*header, dunedaq::serialization::kMsgPack);
     183            1 :   TriggerRecordHeader& header_orig = *header;
     184            1 :   TriggerRecordHeader header_deserialized = dunedaq::serialization::deserialize<TriggerRecordHeader>(bytes);
     185              : 
     186            1 :   BOOST_REQUIRE_EQUAL(header_orig.get_trigger_number(), header_deserialized.get_trigger_number());
     187            1 :   BOOST_REQUIRE_EQUAL(header_orig.get_trigger_timestamp(), header_deserialized.get_trigger_timestamp());
     188            1 :   BOOST_REQUIRE_EQUAL(header_orig.get_num_requested_components(), header_deserialized.get_num_requested_components());
     189            1 :   BOOST_REQUIRE_EQUAL(header_orig.get_run_number(), header_deserialized.get_run_number());
     190            1 :   BOOST_REQUIRE_EQUAL(header_orig.get_error_bits(), header_deserialized.get_error_bits());
     191            1 :   BOOST_REQUIRE_EQUAL(header_orig.get_trigger_type(), header_deserialized.get_trigger_type());
     192            1 :   BOOST_REQUIRE_EQUAL(header_orig.get_total_size_bytes(), header_deserialized.get_total_size_bytes());
     193            1 :   BOOST_REQUIRE_EQUAL(header_orig.at(0).window_begin, header_deserialized.at(0).window_begin);
     194            1 :   BOOST_REQUIRE_EQUAL(header_orig.at(1).window_begin, header_deserialized.at(1).window_begin);
     195            1 : }
     196              : 
     197              : BOOST_AUTO_TEST_SUITE_END()
        

Generated by: LCOV version 2.0-1