artdaq  v3_10_03
RoundRobin_policy_t.cc
1 #define BOOST_TEST_MODULE RoundRobin_policy_t
2 #include <boost/test/unit_test.hpp>
3 
4 #include "artdaq-utilities/Plugins/MakeParameterSet.hh"
5 #include "artdaq/RoutingPolicies/makeRoutingManagerPolicy.hh"
6 #include "fhiclcpp/ParameterSet.h"
7 
8 BOOST_AUTO_TEST_SUITE(RoundRobin_policy_t)
9 
10 BOOST_AUTO_TEST_CASE(VerifyRMPSharedPtr)
11 {
12  auto ps4 = artdaq::make_pset("receiver_ranks: [1,2,3,4]");
13  auto ps3 = artdaq::make_pset("receiver_ranks: [7,8,9]");
14  auto ps2 = artdaq::make_pset("receiver_ranks: [5,6]");
15 
16  auto rrA = artdaq::makeRoutingManagerPolicy("RoundRobin", ps4);
17  BOOST_REQUIRE_EQUAL(rrA->GetReceiverCount(), 4);
18 
19  auto rrB = rrA;
20  BOOST_REQUIRE_EQUAL(rrA->GetReceiverCount(), 4);
21  BOOST_REQUIRE_EQUAL(rrB->GetReceiverCount(), 4);
22 
23  rrA = artdaq::makeRoutingManagerPolicy("RoundRobin", ps3);
24  BOOST_REQUIRE_EQUAL(rrA->GetReceiverCount(), 3);
25  BOOST_REQUIRE_EQUAL(rrB->GetReceiverCount(), 4);
26 
27  // force destructors to be run on first set of policies
28  rrA = artdaq::makeRoutingManagerPolicy("RoundRobin", ps2);
29  rrB = artdaq::makeRoutingManagerPolicy("RoundRobin", ps2);
30 }
31 
32 BOOST_AUTO_TEST_CASE(Simple)
33 {
34  fhicl::ParameterSet ps = artdaq::make_pset("receiver_ranks: [1,2,3,4]");
35 
36  auto rr = artdaq::makeRoutingManagerPolicy("RoundRobin", ps);
37 
38  BOOST_REQUIRE_EQUAL(rr->GetReceiverCount(), 4);
39 
40  rr->Reset();
41  rr->AddReceiverToken(1, 1);
42  rr->AddReceiverToken(3, 1);
43  rr->AddReceiverToken(2, 1);
44  rr->AddReceiverToken(4, 1);
45  rr->AddReceiverToken(2, 1);
46  auto secondTable = rr->GetCurrentTable();
47  BOOST_REQUIRE_EQUAL(secondTable.size(), 4);
48  BOOST_REQUIRE_EQUAL(secondTable[0].destination_rank, 1);
49  BOOST_REQUIRE_EQUAL(secondTable[1].destination_rank, 2);
50  BOOST_REQUIRE_EQUAL(secondTable[2].destination_rank, 3);
51  BOOST_REQUIRE_EQUAL(secondTable[3].destination_rank, 4);
52  BOOST_REQUIRE_EQUAL(secondTable[0].sequence_id, 1);
53  BOOST_REQUIRE_EQUAL(secondTable[1].sequence_id, 2);
54  BOOST_REQUIRE_EQUAL(secondTable[2].sequence_id, 3);
55  BOOST_REQUIRE_EQUAL(secondTable[3].sequence_id, 4);
56 
57  rr->AddReceiverToken(1, 0);
58 
59  auto thirdTable = rr->GetCurrentTable();
60  BOOST_REQUIRE_EQUAL(thirdTable.size(), 0);
61 
62  rr->AddReceiverToken(1, 2);
63  rr->AddReceiverToken(2, 1);
64  rr->AddReceiverToken(3, 1);
65  rr->AddReceiverToken(4, 2);
66  auto fourthTable = rr->GetCurrentTable();
67  BOOST_REQUIRE_EQUAL(fourthTable.size(), 4);
68  BOOST_REQUIRE_EQUAL(fourthTable[0].destination_rank, 1);
69 
70  rr->AddReceiverToken(3, 1);
71  auto fifthTable = rr->GetCurrentTable();
72  BOOST_REQUIRE_EQUAL(fifthTable.size(), 4);
73  BOOST_REQUIRE_EQUAL(fifthTable[0].destination_rank, 1);
74 }
75 
76 BOOST_AUTO_TEST_CASE(MinimumParticipants)
77 {
78  fhicl::ParameterSet ps = artdaq::make_pset("receiver_ranks: [1,2,3,4] minimum_participants: 2");
79 
80  auto rr = artdaq::makeRoutingManagerPolicy("RoundRobin", ps);
81 
82  BOOST_REQUIRE_EQUAL(rr->GetReceiverCount(), 4);
83 
84  rr->Reset();
85  rr->AddReceiverToken(1, 1);
86  rr->AddReceiverToken(3, 1);
87  rr->AddReceiverToken(2, 1);
88  rr->AddReceiverToken(4, 1);
89  rr->AddReceiverToken(2, 1);
90  auto secondTable = rr->GetCurrentTable();
91  BOOST_REQUIRE_EQUAL(secondTable.size(), 4);
92  BOOST_REQUIRE_EQUAL(secondTable[0].destination_rank, 1);
93  BOOST_REQUIRE_EQUAL(secondTable[1].destination_rank, 2);
94  BOOST_REQUIRE_EQUAL(secondTable[2].destination_rank, 3);
95  BOOST_REQUIRE_EQUAL(secondTable[3].destination_rank, 4);
96  BOOST_REQUIRE_EQUAL(secondTable[0].sequence_id, 1);
97  BOOST_REQUIRE_EQUAL(secondTable[1].sequence_id, 2);
98  BOOST_REQUIRE_EQUAL(secondTable[2].sequence_id, 3);
99  BOOST_REQUIRE_EQUAL(secondTable[3].sequence_id, 4);
100 
101  rr->AddReceiverToken(1, 0);
102 
103  auto thirdTable = rr->GetCurrentTable();
104  BOOST_REQUIRE_EQUAL(thirdTable.size(), 0);
105 
106  rr->AddReceiverToken(1, 1);
107  auto fourthTable = rr->GetCurrentTable();
108  BOOST_REQUIRE_EQUAL(fourthTable.size(), 2);
109 
110  BOOST_REQUIRE_EQUAL(fourthTable[0].destination_rank, 1);
111  BOOST_REQUIRE_EQUAL(fourthTable[1].destination_rank, 2);
112  BOOST_REQUIRE_EQUAL(fourthTable[0].sequence_id, 5);
113  BOOST_REQUIRE_EQUAL(fourthTable[1].sequence_id, 6);
114 
115  rr->AddReceiverToken(1, 2);
116  rr->AddReceiverToken(2, 2);
117  rr->AddReceiverToken(3, 1);
118  rr->AddReceiverToken(4, 2);
119  auto fifthTable = rr->GetCurrentTable();
120  BOOST_REQUIRE_EQUAL(fifthTable.size(), 7);
121  BOOST_REQUIRE_EQUAL(fifthTable[0].destination_rank, 1);
122 
123  rr->AddReceiverToken(3, 1);
124  auto sixthTable = rr->GetCurrentTable();
125  BOOST_REQUIRE_EQUAL(sixthTable.size(), 0);
126 }
127 
128 BOOST_AUTO_TEST_CASE(LargeMinimumParticipants)
129 {
130  fhicl::ParameterSet ps = artdaq::make_pset("receiver_ranks: [1,2,3] minimum_participants: 5");
131 
132  auto rr = artdaq::makeRoutingManagerPolicy("RoundRobin", ps);
133 
134  BOOST_REQUIRE_EQUAL(rr->GetReceiverCount(), 3);
135 
136  rr->Reset();
137  rr->AddReceiverToken(1, 1);
138  rr->AddReceiverToken(3, 1);
139  rr->AddReceiverToken(2, 1);
140  rr->AddReceiverToken(3, 1);
141  rr->AddReceiverToken(2, 1);
142  auto secondTable = rr->GetCurrentTable();
143  BOOST_REQUIRE_EQUAL(secondTable.size(), 3);
144  BOOST_REQUIRE_EQUAL(secondTable[0].destination_rank, 1);
145  BOOST_REQUIRE_EQUAL(secondTable[1].destination_rank, 2);
146  BOOST_REQUIRE_EQUAL(secondTable[2].destination_rank, 3);
147 
148  rr->AddReceiverToken(1, 1);
149  auto thirdTable = rr->GetCurrentTable();
150  BOOST_REQUIRE_EQUAL(thirdTable.size(), 3);
151  BOOST_REQUIRE_EQUAL(thirdTable[0].destination_rank, 1);
152  BOOST_REQUIRE_EQUAL(thirdTable[1].destination_rank, 2);
153  BOOST_REQUIRE_EQUAL(thirdTable[2].destination_rank, 3);
154 }
155 
156 BOOST_AUTO_TEST_CASE(ManyMissingParticipants)
157 {
158  fhicl::ParameterSet ps = artdaq::make_pset("receiver_ranks: [1,2,3] minimum_participants: -5");
159 
160  auto rr = artdaq::makeRoutingManagerPolicy("RoundRobin", ps);
161 
162  BOOST_REQUIRE_EQUAL(rr->GetReceiverCount(), 3);
163 
164  rr->Reset();
165  rr->AddReceiverToken(1, 1);
166  rr->AddReceiverToken(3, 1);
167  rr->AddReceiverToken(2, 1);
168  rr->AddReceiverToken(3, 1);
169  rr->AddReceiverToken(2, 1);
170  auto secondTable = rr->GetCurrentTable();
171  BOOST_REQUIRE_EQUAL(secondTable.size(), 5);
172  BOOST_REQUIRE_EQUAL(secondTable[0].destination_rank, 1);
173 
174  rr->AddReceiverToken(1, 1);
175  auto thirdTable = rr->GetCurrentTable();
176  BOOST_REQUIRE_EQUAL(thirdTable.size(), 1);
177 }
178 
179 BOOST_AUTO_TEST_SUITE_END()
std::shared_ptr< RoutingManagerPolicy > makeRoutingManagerPolicy(std::string const &policy_plugin_spec, fhicl::ParameterSet const &ps)
Load a RoutingManagerPolicy plugin.