LCOV - code coverage report
Current view: top level - test/RoutingPolicies - PreferSameHost_policy_t.cc (source / functions) Coverage Total Hit
Test: artdaq.info.cleaned Lines: 100.0 % 220 220
Test Date: 2025-09-04 00:45:34 Functions: 100.0 % 15 15

            Line data    Source code
       1              : #define BOOST_TEST_MODULE PreferSameHost_policy_t
       2              : #include <boost/test/unit_test.hpp>
       3              : 
       4              : #include "TRACE/tracemf.h"
       5              : 
       6              : #include "artdaq/RoutingPolicies/RoutingManagerPolicy.hh"
       7              : #include "artdaq/RoutingPolicies/makeRoutingManagerPolicy.hh"
       8              : #include "fhiclcpp/ParameterSet.h"
       9              : 
      10              : BOOST_AUTO_TEST_SUITE(PreferSameHost_policy_t)
      11              : 
      12            2 : BOOST_AUTO_TEST_CASE(Simple)
      13              : {
      14            2 :         fhicl::ParameterSet ps = fhicl::ParameterSet::make("");
      15              : 
      16            1 :         auto psh = artdaq::makeRoutingManagerPolicy("PreferSameHost", ps);
      17              : 
      18            1 :         psh->Reset();
      19            1 :         psh->AddReceiverToken(1, 1);
      20            1 :         psh->AddReceiverToken(3, 1);
      21            1 :         psh->AddReceiverToken(2, 1);
      22            1 :         psh->AddReceiverToken(4, 1);
      23            1 :         psh->AddReceiverToken(2, 1);
      24            1 :         BOOST_REQUIRE_EQUAL(psh->GetReceiverCount(), 4);
      25            1 :         auto secondTable = psh->GetCurrentTable();
      26            1 :         BOOST_REQUIRE_EQUAL(secondTable.size(), 4);
      27            1 :         BOOST_REQUIRE_EQUAL(secondTable[0].destination_rank, 1);
      28            1 :         BOOST_REQUIRE_EQUAL(secondTable[1].destination_rank, 2);
      29            1 :         BOOST_REQUIRE_EQUAL(secondTable[2].destination_rank, 3);
      30            1 :         BOOST_REQUIRE_EQUAL(secondTable[3].destination_rank, 4);
      31            1 :         BOOST_REQUIRE_EQUAL(secondTable[0].sequence_id, 1);
      32            1 :         BOOST_REQUIRE_EQUAL(secondTable[1].sequence_id, 2);
      33            1 :         BOOST_REQUIRE_EQUAL(secondTable[2].sequence_id, 3);
      34            1 :         BOOST_REQUIRE_EQUAL(secondTable[3].sequence_id, 4);
      35              : 
      36            1 :         psh->AddReceiverToken(1, 0);
      37              : 
      38            1 :         auto thirdTable = psh->GetCurrentTable();
      39            1 :         BOOST_REQUIRE_EQUAL(thirdTable.size(), 0);
      40              : 
      41            1 :         psh->AddReceiverToken(1, 2);
      42            1 :         psh->AddReceiverToken(2, 1);
      43            1 :         psh->AddReceiverToken(3, 1);
      44            1 :         psh->AddReceiverToken(4, 2);
      45            1 :         auto fourthTable = psh->GetCurrentTable();
      46            1 :         BOOST_REQUIRE_EQUAL(fourthTable.size(), 4);
      47            1 :         BOOST_REQUIRE_EQUAL(fourthTable[0].destination_rank, 1);
      48              : 
      49            1 :         psh->AddReceiverToken(3, 1);
      50            1 :         auto fifthTable = psh->GetCurrentTable();
      51            1 :         BOOST_REQUIRE_EQUAL(fifthTable.size(), 4);
      52            1 :         BOOST_REQUIRE_EQUAL(fifthTable[0].destination_rank, 1);
      53            1 : }
      54              : 
      55            2 : BOOST_AUTO_TEST_CASE(MinimumParticipants)
      56              : {
      57            2 :         fhicl::ParameterSet ps = fhicl::ParameterSet::make("minimum_participants: 2");
      58              : 
      59            1 :         auto psh = artdaq::makeRoutingManagerPolicy("PreferSameHost", ps);
      60              : 
      61            1 :         psh->Reset();
      62            1 :         psh->AddReceiverToken(1, 1);
      63            1 :         psh->AddReceiverToken(3, 1);
      64            1 :         psh->AddReceiverToken(2, 1);
      65            1 :         psh->AddReceiverToken(4, 1);
      66            1 :         psh->AddReceiverToken(2, 1);
      67            1 :         BOOST_REQUIRE_EQUAL(psh->GetReceiverCount(), 4);
      68            1 :         auto secondTable = psh->GetCurrentTable();
      69            1 :         BOOST_REQUIRE_EQUAL(secondTable.size(), 4);
      70            1 :         BOOST_REQUIRE_EQUAL(secondTable[0].destination_rank, 1);
      71            1 :         BOOST_REQUIRE_EQUAL(secondTable[1].destination_rank, 2);
      72            1 :         BOOST_REQUIRE_EQUAL(secondTable[2].destination_rank, 3);
      73            1 :         BOOST_REQUIRE_EQUAL(secondTable[3].destination_rank, 4);
      74            1 :         BOOST_REQUIRE_EQUAL(secondTable[0].sequence_id, 1);
      75            1 :         BOOST_REQUIRE_EQUAL(secondTable[1].sequence_id, 2);
      76            1 :         BOOST_REQUIRE_EQUAL(secondTable[2].sequence_id, 3);
      77            1 :         BOOST_REQUIRE_EQUAL(secondTable[3].sequence_id, 4);
      78              : 
      79            1 :         psh->AddReceiverToken(1, 0);
      80              : 
      81            1 :         auto thirdTable = psh->GetCurrentTable();
      82            1 :         BOOST_REQUIRE_EQUAL(thirdTable.size(), 0);
      83              : 
      84            1 :         psh->AddReceiverToken(1, 1);
      85            1 :         auto fourthTable = psh->GetCurrentTable();
      86            1 :         BOOST_REQUIRE_EQUAL(fourthTable.size(), 2);
      87              : 
      88            1 :         BOOST_REQUIRE_EQUAL(fourthTable[0].destination_rank, 1);
      89            1 :         BOOST_REQUIRE_EQUAL(fourthTable[1].destination_rank, 2);
      90            1 :         BOOST_REQUIRE_EQUAL(fourthTable[0].sequence_id, 5);
      91            1 :         BOOST_REQUIRE_EQUAL(fourthTable[1].sequence_id, 6);
      92              : 
      93            1 :         psh->AddReceiverToken(1, 2);
      94            1 :         psh->AddReceiverToken(2, 2);
      95            1 :         psh->AddReceiverToken(3, 1);
      96            1 :         psh->AddReceiverToken(4, 2);
      97            1 :         auto fifthTable = psh->GetCurrentTable();
      98            1 :         BOOST_REQUIRE_EQUAL(fifthTable.size(), 7);
      99            1 :         BOOST_REQUIRE_EQUAL(fifthTable[0].destination_rank, 1);
     100              : 
     101            1 :         psh->AddReceiverToken(3, 1);
     102            1 :         auto sixthTable = psh->GetCurrentTable();
     103            1 :         BOOST_REQUIRE_EQUAL(sixthTable.size(), 0);
     104            1 : }
     105              : 
     106              : // RECENT CHANGE IN BEHAVIOR! Since the number of receivers is now dynamic as tokens are added, RoundRobin_policy will ALWAYS wait for at least minimum_participants to be available when it is positive!
     107            2 : BOOST_AUTO_TEST_CASE(LargeMinimumParticipants)
     108              : {
     109            3 :         TLOG(TLVL_INFO) << "PreferSameHost_policy_t Test Case LargeMinimumParticipants BEGIN";
     110            2 :         fhicl::ParameterSet ps = fhicl::ParameterSet::make("minimum_participants: 5");
     111              : 
     112            1 :         auto rr = artdaq::makeRoutingManagerPolicy("PreferSameHost", ps);
     113              : 
     114            1 :         rr->Reset();
     115            1 :         rr->AddReceiverToken(1, 1);
     116            1 :         rr->AddReceiverToken(3, 1);
     117            1 :         rr->AddReceiverToken(2, 1);
     118            1 :         rr->AddReceiverToken(3, 1);
     119            1 :         rr->AddReceiverToken(2, 1);
     120            1 :         BOOST_REQUIRE_EQUAL(rr->GetReceiverCount(), 3);
     121            1 :         auto firstTable = rr->GetCurrentTable();
     122            1 :         BOOST_REQUIRE_EQUAL(firstTable.size(), 0);
     123              : 
     124            1 :         rr->AddReceiverToken(5, 1);
     125            1 :         rr->AddReceiverToken(6, 1);
     126              : 
     127            1 :         auto secondTable = rr->GetCurrentTable();
     128            1 :         BOOST_REQUIRE_EQUAL(secondTable.size(), 5);
     129            1 :         BOOST_REQUIRE_EQUAL(secondTable[0].destination_rank, 1);
     130            1 :         BOOST_REQUIRE_EQUAL(secondTable[1].destination_rank, 2);
     131            1 :         BOOST_REQUIRE_EQUAL(secondTable[2].destination_rank, 3);
     132            1 :         BOOST_REQUIRE_EQUAL(secondTable[3].destination_rank, 5);
     133            1 :         BOOST_REQUIRE_EQUAL(secondTable[4].destination_rank, 6);
     134              : 
     135            1 :         rr->AddReceiverToken(1, 1);
     136            1 :         auto thirdTable = rr->GetCurrentTable();
     137            1 :         BOOST_REQUIRE_EQUAL(thirdTable.size(), 0);
     138              : 
     139            3 :         TLOG(TLVL_INFO) << "PreferSameHost_policy_t Test Case LargeMinimumParticipants END";
     140            1 : }
     141              : 
     142            2 : BOOST_AUTO_TEST_CASE(ManyMissingParticipants)
     143              : {
     144            2 :         fhicl::ParameterSet ps = fhicl::ParameterSet::make("minimum_participants: -5");
     145              : 
     146            1 :         auto psh = artdaq::makeRoutingManagerPolicy("PreferSameHost", ps);
     147              : 
     148            1 :         psh->Reset();
     149            1 :         psh->AddReceiverToken(1, 1);
     150            1 :         psh->AddReceiverToken(3, 1);
     151            1 :         psh->AddReceiverToken(2, 1);
     152            1 :         psh->AddReceiverToken(3, 1);
     153            1 :         psh->AddReceiverToken(2, 1);
     154            1 :         BOOST_REQUIRE_EQUAL(psh->GetReceiverCount(), 3);
     155            1 :         auto secondTable = psh->GetCurrentTable();
     156            1 :         BOOST_REQUIRE_EQUAL(secondTable.size(), 5);
     157            1 :         BOOST_REQUIRE_EQUAL(secondTable[0].destination_rank, 1);
     158              : 
     159            1 :         psh->AddReceiverToken(1, 1);
     160            1 :         auto thirdTable = psh->GetCurrentTable();
     161            1 :         BOOST_REQUIRE_EQUAL(thirdTable.size(), 1);
     162            1 : }
     163              : 
     164            2 : BOOST_AUTO_TEST_CASE(DataFlowMode)
     165              : {
     166            1 :         fhicl::ParameterSet ps = fhicl::ParameterSet::make(
     167              :             "routing_manager_mode: DataFlow \
     168              :                               host_map: [{rank: 1 host: \"testHost1\"}, \
     169              :                                          {rank: 2 host: \"testHost1\"}, \
     170              :                                          {rank: 3 host: \"testHost2\"}, \
     171              :                                          {rank: 4 host: \"testHost1\"}, \
     172              :                                          {rank: 5 host: \"testHost2\"}, \
     173            2 :                                          {rank: 6 host: \"testHost3\"}]");
     174              : 
     175            1 :         auto psh = artdaq::makeRoutingManagerPolicy("PreferSameHost", ps);
     176              : 
     177            1 :         psh->Reset();
     178            1 :         psh->AddReceiverToken(1, 1);
     179            1 :         psh->AddReceiverToken(3, 1);
     180            1 :         psh->AddReceiverToken(2, 1);
     181            1 :         psh->AddReceiverToken(3, 1);
     182            1 :         psh->AddReceiverToken(2, 1);
     183            1 :         BOOST_REQUIRE_EQUAL(psh->GetReceiverCount(), 3);
     184            1 :         auto route = psh->GetRouteForSequenceID(1, 4);
     185            1 :         BOOST_REQUIRE_EQUAL(route.destination_rank, 2);
     186            1 :         BOOST_REQUIRE_EQUAL(route.sequence_id, 1);
     187              : 
     188              :         // Multiple hits for the same sequence ID are allowed, and should receive different information
     189            1 :         route = psh->GetRouteForSequenceID(1, 5);
     190            1 :         BOOST_REQUIRE_EQUAL(route.destination_rank, 3);
     191            1 :         BOOST_REQUIRE_EQUAL(route.sequence_id, 1);
     192              : 
     193              :         // Except, that the same sequence ID from the same host should always get the same info
     194            1 :         route = psh->GetRouteForSequenceID(1, 5);
     195            1 :         BOOST_REQUIRE_EQUAL(route.destination_rank, 3);
     196            1 :         BOOST_REQUIRE_EQUAL(route.sequence_id, 1);
     197              : 
     198            1 :         route = psh->GetRouteForSequenceID(2, 4);
     199            1 :         BOOST_REQUIRE_EQUAL(route.destination_rank, 1);
     200            1 :         BOOST_REQUIRE_EQUAL(route.sequence_id, 2);
     201              : 
     202            1 :         psh->AddReceiverToken(1, 1);
     203            1 :         route = psh->GetRouteForSequenceID(2, 5);
     204            1 :         BOOST_REQUIRE_EQUAL(route.destination_rank, 3);
     205            1 :         BOOST_REQUIRE_EQUAL(route.sequence_id, 2);
     206              : 
     207              :         // Out-of-order sequence IDs are allowed
     208            1 :         route = psh->GetRouteForSequenceID(1, 6);
     209            1 :         BOOST_REQUIRE_EQUAL(route.destination_rank, 1);
     210            1 :         BOOST_REQUIRE_EQUAL(route.sequence_id, 1);
     211              : 
     212              :         // Arbitrary sequence IDs are allowed
     213            1 :         route = psh->GetRouteForSequenceID(10343, 4);
     214            1 :         BOOST_REQUIRE_EQUAL(route.destination_rank, 2);
     215            1 :         BOOST_REQUIRE_EQUAL(route.sequence_id, 10343);
     216            1 : }
     217              : 
     218            2 : BOOST_AUTO_TEST_CASE(RequestBasedEventBuilding)
     219              : {
     220            1 :         fhicl::ParameterSet ps = fhicl::ParameterSet::make(
     221              :             "routing_manager_mode: RequestBasedEventBuilding routing_cache_size: 2 \
     222              :                               host_map: [{rank: 1 host: \"testHost1\"}, \
     223              :                                          {rank: 2 host: \"testHost1\"}, \
     224              :                                          {rank: 3 host: \"testHost2\"}, \
     225              :                                          {rank: 4 host: \"testHost1\"}, \
     226              :                                          {rank: 5 host: \"testHost2\"}, \
     227            2 :                                          {rank: 6 host: \"testHost3\"}]");
     228              : 
     229            1 :         auto psh = artdaq::makeRoutingManagerPolicy("PreferSameHost", ps);
     230              : 
     231            1 :         psh->Reset();
     232            1 :         psh->AddReceiverToken(1, 1);
     233            1 :         psh->AddReceiverToken(3, 1);
     234            1 :         psh->AddReceiverToken(2, 1);
     235            1 :         psh->AddReceiverToken(3, 1);
     236            1 :         psh->AddReceiverToken(2, 1);
     237            1 :         BOOST_REQUIRE_EQUAL(psh->GetReceiverCount(), 3);
     238              : 
     239            1 :         auto route = psh->GetRouteForSequenceID(1, 4);
     240            1 :         BOOST_REQUIRE_EQUAL(route.destination_rank, 2);
     241            1 :         BOOST_REQUIRE_EQUAL(route.sequence_id, 1);
     242              : 
     243              :         // Multiple hits for the same sequence ID should receive the same routing
     244            1 :         route = psh->GetRouteForSequenceID(1, 5);
     245            1 :         BOOST_REQUIRE_EQUAL(route.destination_rank, 2);
     246            1 :         BOOST_REQUIRE_EQUAL(route.sequence_id, 1);
     247              : 
     248              :         // Only events which have started routing should be in the table
     249            1 :         auto firstTable = psh->GetCurrentTable();
     250            1 :         BOOST_REQUIRE_EQUAL(firstTable.size(), 1);
     251            1 :         BOOST_REQUIRE_EQUAL(firstTable[0].destination_rank, 2);
     252              : 
     253              :         // Arbitrary Sequence IDs are allowed
     254            1 :         route = psh->GetRouteForSequenceID(12343, 4);
     255            1 :         BOOST_REQUIRE_EQUAL(route.destination_rank, 1);
     256            1 :         BOOST_REQUIRE_EQUAL(route.sequence_id, 12343);
     257              : 
     258              :         // Out-of-order Sequence IDs are allowed
     259            1 :         route = psh->GetRouteForSequenceID(4, 5);
     260            1 :         BOOST_REQUIRE_EQUAL(route.destination_rank, 3);
     261            1 :         BOOST_REQUIRE_EQUAL(route.sequence_id, 4);
     262              : 
     263              :         // Requests that arrive late still get the same info
     264            1 :         route = psh->GetRouteForSequenceID(1, 6);
     265            1 :         BOOST_REQUIRE_EQUAL(route.destination_rank, 2);
     266            1 :         BOOST_REQUIRE_EQUAL(route.sequence_id, 1);
     267              : 
     268              :         // Check that things behave when tokens are exhausted...
     269            1 :         route = psh->GetRouteForSequenceID(10, 6);
     270            1 :         BOOST_REQUIRE_EQUAL(route.destination_rank, 2);
     271            1 :         BOOST_REQUIRE_EQUAL(route.sequence_id, 10);
     272            1 :         route = psh->GetRouteForSequenceID(11, 6);
     273            1 :         BOOST_REQUIRE_EQUAL(route.destination_rank, 3);
     274            1 :         BOOST_REQUIRE_EQUAL(route.sequence_id, 11);
     275              : 
     276            1 :         route = psh->GetRouteForSequenceID(50, 4);
     277            1 :         BOOST_REQUIRE_EQUAL(route.destination_rank, -1);
     278              : 
     279            1 :         psh->AddReceiverToken(1, 1);
     280            1 :         route = psh->GetRouteForSequenceID(50, 4);
     281            1 :         BOOST_REQUIRE_EQUAL(route.destination_rank, 1);
     282            1 :         BOOST_REQUIRE_EQUAL(route.sequence_id, 50);
     283              : 
     284            1 :         route = psh->GetRouteForSequenceID(50, 5);
     285            1 :         BOOST_REQUIRE_EQUAL(route.destination_rank, 1);
     286            1 :         BOOST_REQUIRE_EQUAL(route.sequence_id, 50);
     287              : 
     288              :         // Routing cache is sorted by sequence ID
     289            1 :         auto secondTable = psh->GetCurrentTable();
     290            1 :         BOOST_REQUIRE_EQUAL(secondTable.size(), 5);
     291            1 :         BOOST_REQUIRE_EQUAL(secondTable[0].destination_rank, 3);
     292            1 :         BOOST_REQUIRE_EQUAL(secondTable[0].sequence_id, 4);
     293            1 :         BOOST_REQUIRE_EQUAL(secondTable[1].destination_rank, 2);
     294            1 :         BOOST_REQUIRE_EQUAL(secondTable[1].sequence_id, 10);
     295            1 :         BOOST_REQUIRE_EQUAL(secondTable[2].destination_rank, 3);
     296            1 :         BOOST_REQUIRE_EQUAL(secondTable[2].sequence_id, 11);
     297            1 :         BOOST_REQUIRE_EQUAL(secondTable[3].destination_rank, 1);
     298            1 :         BOOST_REQUIRE_EQUAL(secondTable[3].sequence_id, 50);
     299            1 :         BOOST_REQUIRE_EQUAL(secondTable[4].destination_rank, 1);
     300            1 :         BOOST_REQUIRE_EQUAL(secondTable[4].sequence_id, 12343);
     301              : 
     302              :         // Since the routing cache has been set to 2, only the highest two events routed are here, as the cache is checked when generating tables
     303            1 :         BOOST_REQUIRE_EQUAL(psh->GetCacheSize(), 2);
     304            1 :         auto thirdTable = psh->GetCurrentTable();
     305            1 :         BOOST_REQUIRE_EQUAL(thirdTable.size(), 0);
     306              : 
     307            1 :         BOOST_REQUIRE(psh->CacheHasRoute(50));
     308            1 :         BOOST_REQUIRE(!psh->CacheHasRoute(4));
     309            1 :         route = psh->GetRouteForSequenceID(50, 6);
     310            1 :         BOOST_REQUIRE_EQUAL(route.destination_rank, 1);
     311            1 :         BOOST_REQUIRE_EQUAL(route.sequence_id, 50);
     312              : 
     313            3 :         TLOG(TLVL_INFO) << "RoundRobin_policy_t Test Case RequestBasedEventBuilding END";
     314            1 : }
     315              : 
     316              : BOOST_AUTO_TEST_SUITE_END()
        

Generated by: LCOV version 2.0-1