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 % 126 126
Test Date: 2026-05-24 15:29:04 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_status_bit(TriggerRecordStatusBits::kMismatch, true);
      59            1 :   header->set_status_bit(TriggerRecordStatusBits::kUnassigned3, true);
      60              : 
      61            1 :   BOOST_REQUIRE_THROW(header->at(header->get_header().num_requested_components), std::range_error);
      62              : 
      63            1 :   void* buff = malloc(header->get_total_size_bytes());
      64            1 :   memcpy(buff, header->get_storage_location(), header->get_total_size_bytes());
      65              : 
      66              :   // Constructor should copy header
      67            1 :   TriggerRecordHeader copy_header(const_cast<void*>(header->get_storage_location()), true);
      68            1 :   delete header; // NOLINT(build/raw_ownership)
      69              : 
      70            1 :   BOOST_REQUIRE_EQUAL(copy_header.get_run_number(), 9);
      71            1 :   BOOST_REQUIRE_EQUAL(copy_header.get_status_bit(static_cast<TriggerRecordStatusBits>(0)), false);
      72            1 :   BOOST_REQUIRE_EQUAL(copy_header.get_status_bit(static_cast<TriggerRecordStatusBits>(1)), true);
      73            1 :   BOOST_REQUIRE_EQUAL(copy_header.get_header().status_bits, 10);
      74            1 :   BOOST_REQUIRE_EQUAL(copy_header.at(0).window_begin, 3);
      75              : 
      76            1 :   {
      77              :     // Test copy constructor
      78            1 :     TriggerRecordHeader copy_copy_header(copy_header); // NOLINT // performance-unnecessary-copy-initialization
      79            1 :     BOOST_REQUIRE_EQUAL(copy_copy_header.get_run_number(), 9);
      80            1 :     BOOST_REQUIRE_EQUAL(copy_copy_header.get_status_bit(static_cast<TriggerRecordStatusBits>(0)), false);
      81            1 :     BOOST_REQUIRE_EQUAL(copy_copy_header.get_status_bit(static_cast<TriggerRecordStatusBits>(1)), true);
      82            1 :     BOOST_REQUIRE_EQUAL(copy_copy_header.get_header().status_bits, 10);
      83            1 :     BOOST_REQUIRE_EQUAL(copy_copy_header.at(0).window_begin, 3);
      84            1 :   }
      85            1 :   {
      86              :     // Test copy assignment
      87            1 :     TriggerRecordHeader copy_assign_header = copy_header; // NOLINT // performance-unnecessary-copy-initialization
      88            1 :     BOOST_REQUIRE_EQUAL(copy_assign_header.get_run_number(), 9);
      89            1 :     BOOST_REQUIRE_EQUAL(copy_assign_header.get_status_bit(static_cast<TriggerRecordStatusBits>(0)), false);
      90            1 :     BOOST_REQUIRE_EQUAL(copy_assign_header.get_status_bit(static_cast<TriggerRecordStatusBits>(1)), true);
      91            1 :     BOOST_REQUIRE_EQUAL(copy_assign_header.get_header().status_bits, 10);
      92            1 :     BOOST_REQUIRE_EQUAL(copy_assign_header.at(0).window_begin, 3);
      93            1 :   }
      94              : 
      95            1 :   {
      96              :     // Test Buffer adoption constructor
      97            1 :     TriggerRecordHeader buffer_header(buff, false);
      98              : 
      99            1 :     BOOST_REQUIRE_EQUAL(buffer_header.get_run_number(), 9);
     100            1 :     BOOST_REQUIRE_EQUAL(buffer_header.get_status_bit(static_cast<TriggerRecordStatusBits>(0)), false);
     101            1 :     BOOST_REQUIRE_EQUAL(buffer_header.get_status_bit(static_cast<TriggerRecordStatusBits>(1)), true);
     102            1 :     BOOST_REQUIRE_EQUAL(buffer_header.get_header().status_bits, 10);
     103            1 :     BOOST_REQUIRE_EQUAL(buffer_header.at(0).window_begin, 3);
     104            1 :   }
     105              : 
     106            1 :   BOOST_REQUIRE_EQUAL(*reinterpret_cast<uint32_t*>(buff), // NOLINT
     107              :                       TriggerRecordHeaderData::s_trigger_record_header_magic);
     108              : 
     109            1 :   free(buff);
     110            1 : }
     111              : 
     112              : /**
     113              :  * @brief Test header field manipulation methods
     114              :  */
     115            2 : BOOST_AUTO_TEST_CASE(HeaderFields)
     116              : {
     117            1 :   std::vector<ComponentRequest> components;
     118            1 :   components.emplace_back();
     119            1 :   components.back().component.subsystem = SourceID::Subsystem::kDetectorReadout;
     120            1 :   components.back().component.id = 2;
     121            1 :   components.back().window_begin = 3;
     122            1 :   components.back().window_end = 4;
     123            1 :   components.emplace_back();
     124            1 :   components.back().component.subsystem = SourceID::Subsystem::kDetectorReadout;
     125            1 :   components.back().component.id = 6;
     126            1 :   components.back().window_begin = 7;
     127            1 :   components.back().window_end = 8;
     128              : 
     129            1 :   auto header = new TriggerRecordHeader(components);
     130            1 :   header->set_run_number(9);
     131            1 :   header->set_trigger_number(10);
     132            1 :   header->set_trigger_timestamp(11);
     133            1 :   header->set_trigger_type(12);
     134            1 :   header->set_status_bit(TriggerRecordStatusBits::kMismatch, true);
     135            1 :   header->set_status_bit(TriggerRecordStatusBits::kUnassigned3, true);
     136              : 
     137            1 :   auto header_data = header->get_header();
     138            1 :   BOOST_REQUIRE_EQUAL(header->get_run_number(), header_data.run_number);
     139            1 :   BOOST_REQUIRE_EQUAL(header->get_trigger_number(), header_data.trigger_number);
     140            1 :   BOOST_REQUIRE_EQUAL(header->get_trigger_timestamp(), header_data.trigger_timestamp);
     141            1 :   BOOST_REQUIRE_EQUAL(header->get_trigger_type(), header_data.trigger_type);
     142            1 :   BOOST_REQUIRE_EQUAL(header->get_num_requested_components(), 2);
     143            1 :   BOOST_REQUIRE_EQUAL(header->get_num_requested_components(), header_data.num_requested_components);
     144              : 
     145            1 :   auto header_ptr = static_cast<const TriggerRecordHeaderData*>(header->get_storage_location());
     146            1 :   BOOST_REQUIRE_EQUAL(header_ptr->run_number, header_data.run_number);
     147            1 :   header->set_run_number(10);
     148            1 :   BOOST_REQUIRE(header_ptr->run_number != header_data.run_number);
     149            1 :   BOOST_REQUIRE_EQUAL(header_ptr->run_number, 10);
     150            1 : }
     151              : 
     152              : /**
     153              :  * @brief Check that TriggerRecordHeader serialization via MsgPack works
     154              :  */
     155            2 : BOOST_AUTO_TEST_CASE(Header_SerDes_MsgPack)
     156              : {
     157            1 :   std::vector<ComponentRequest> components;
     158            1 :   components.emplace_back();
     159            1 :   components.back().component.subsystem = SourceID::Subsystem::kDetectorReadout;
     160            1 :   components.back().component.id = 2;
     161            1 :   components.back().window_begin = 3;
     162            1 :   components.back().window_end = 4;
     163            1 :   components.emplace_back();
     164            1 :   components.back().component.subsystem = SourceID::Subsystem::kDetectorReadout;
     165            1 :   components.back().component.id = 6;
     166            1 :   components.back().window_begin = 7;
     167            1 :   components.back().window_end = 8;
     168              : 
     169            1 :   auto header = new TriggerRecordHeader(components);
     170            1 :   header->set_run_number(9);
     171            1 :   header->set_trigger_number(10);
     172            1 :   header->set_trigger_timestamp(11);
     173            1 :   header->set_trigger_type(12);
     174            1 :   header->set_status_bit(TriggerRecordStatusBits::kMismatch, true);
     175            1 :   header->set_status_bit(TriggerRecordStatusBits::kUnassigned3, true);
     176              : 
     177            1 :   auto bytes = dunedaq::serialization::serialize(*header, dunedaq::serialization::kMsgPack);
     178            1 :   TriggerRecordHeader& header_orig = *header;
     179            1 :   TriggerRecordHeader header_deserialized = dunedaq::serialization::deserialize<TriggerRecordHeader>(bytes);
     180              : 
     181            1 :   BOOST_REQUIRE_EQUAL(header_orig.get_trigger_number(), header_deserialized.get_trigger_number());
     182            1 :   BOOST_REQUIRE_EQUAL(header_orig.get_trigger_timestamp(), header_deserialized.get_trigger_timestamp());
     183            1 :   BOOST_REQUIRE_EQUAL(header_orig.get_num_requested_components(), header_deserialized.get_num_requested_components());
     184            1 :   BOOST_REQUIRE_EQUAL(header_orig.get_run_number(), header_deserialized.get_run_number());
     185            1 :   BOOST_REQUIRE_EQUAL(header_orig.get_status_bits(), header_deserialized.get_status_bits());
     186            1 :   BOOST_REQUIRE_EQUAL(header_orig.get_trigger_type(), header_deserialized.get_trigger_type());
     187            1 :   BOOST_REQUIRE_EQUAL(header_orig.get_total_size_bytes(), header_deserialized.get_total_size_bytes());
     188            1 :   BOOST_REQUIRE_EQUAL(header_orig.at(0).window_begin, header_deserialized.at(0).window_begin);
     189            1 :   BOOST_REQUIRE_EQUAL(header_orig.at(1).window_begin, header_deserialized.at(1).window_begin);
     190            1 : }
     191              : 
     192              : BOOST_AUTO_TEST_SUITE_END()
        

Generated by: LCOV version 2.0-1