artdaq  v3_12_02
NoOp_policy_t.cc
1 #define BOOST_TEST_MODULE NoOp_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(NoOp_policy_t)
11 
12 BOOST_AUTO_TEST_CASE(Simple)
13 {
14  TLOG(TLVL_INFO) << "NoOp_policy_t Test Case Simple BEGIN";
15  fhicl::ParameterSet ps = fhicl::ParameterSet::make("");
16 
17  auto noop = artdaq::makeRoutingManagerPolicy("NoOp", ps);
18 
19  noop->Reset();
20  noop->AddReceiverToken(1, 1);
21  noop->AddReceiverToken(3, 1);
22  noop->AddReceiverToken(2, 1);
23  noop->AddReceiverToken(4, 1);
24  noop->AddReceiverToken(2, 1);
25  BOOST_REQUIRE_EQUAL(noop->GetReceiverCount(), 4);
26  auto secondTable = noop->GetCurrentTable();
27  BOOST_REQUIRE_EQUAL(secondTable.size(), 5);
28  BOOST_REQUIRE_EQUAL(secondTable[0].destination_rank, 1);
29  BOOST_REQUIRE_EQUAL(secondTable[1].destination_rank, 3);
30  BOOST_REQUIRE_EQUAL(secondTable[2].destination_rank, 2);
31  BOOST_REQUIRE_EQUAL(secondTable[3].destination_rank, 4);
32  BOOST_REQUIRE_EQUAL(secondTable[4].destination_rank, 2);
33  BOOST_REQUIRE_EQUAL(secondTable[0].sequence_id, 1);
34  BOOST_REQUIRE_EQUAL(secondTable[1].sequence_id, 2);
35  BOOST_REQUIRE_EQUAL(secondTable[2].sequence_id, 3);
36  BOOST_REQUIRE_EQUAL(secondTable[3].sequence_id, 4);
37  BOOST_REQUIRE_EQUAL(secondTable[4].sequence_id, 5);
38 
39  noop->AddReceiverToken(1, 0);
40 
41  auto thirdTable = noop->GetCurrentTable();
42  BOOST_REQUIRE_EQUAL(thirdTable.size(), 0);
43  TLOG(TLVL_INFO) << "NoOp_policy_t Test Case Simple END";
44 }
45 
46 BOOST_AUTO_TEST_CASE(DataFlowMode)
47 {
48  TLOG(TLVL_INFO) << "NoOp_policy_t Test Case DataFlowMode BEGIN";
49  fhicl::ParameterSet ps = fhicl::ParameterSet::make("routing_manager_mode: DataFlow");
50 
51  auto noop = artdaq::makeRoutingManagerPolicy("NoOp", ps);
52 
53  noop->Reset();
54  noop->AddReceiverToken(1, 1);
55  noop->AddReceiverToken(3, 1);
56  noop->AddReceiverToken(2, 1);
57  noop->AddReceiverToken(3, 1);
58  noop->AddReceiverToken(2, 1);
59  BOOST_REQUIRE_EQUAL(noop->GetReceiverCount(), 3);
60  auto route = noop->GetRouteForSequenceID(1, 4);
61  BOOST_REQUIRE_EQUAL(route.destination_rank, 1);
62  BOOST_REQUIRE_EQUAL(route.sequence_id, 1);
63 
64  // Multiple hits for the same sequence ID are allowed, and should receive different information
65  route = noop->GetRouteForSequenceID(1, 5);
66  BOOST_REQUIRE_EQUAL(route.destination_rank, 3);
67  BOOST_REQUIRE_EQUAL(route.sequence_id, 1);
68 
69  // Except, that the same sequence ID from the same host should always get the same info
70  route = noop->GetRouteForSequenceID(1, 5);
71  BOOST_REQUIRE_EQUAL(route.destination_rank, 3);
72  BOOST_REQUIRE_EQUAL(route.sequence_id, 1);
73 
74  route = noop->GetRouteForSequenceID(2, 4);
75  BOOST_REQUIRE_EQUAL(route.destination_rank, 2);
76  BOOST_REQUIRE_EQUAL(route.sequence_id, 2);
77 
78  noop->AddReceiverToken(1, 1);
79  route = noop->GetRouteForSequenceID(2, 5);
80  BOOST_REQUIRE_EQUAL(route.destination_rank, 3);
81  BOOST_REQUIRE_EQUAL(route.sequence_id, 2);
82 
83  // Out-of-order sequence IDs are allowed
84  route = noop->GetRouteForSequenceID(1, 6);
85  BOOST_REQUIRE_EQUAL(route.destination_rank, 2);
86  BOOST_REQUIRE_EQUAL(route.sequence_id, 1);
87 
88  // Arbitrary sequence IDs are allowed
89  route = noop->GetRouteForSequenceID(10343, 4);
90  BOOST_REQUIRE_EQUAL(route.destination_rank, 1);
91  BOOST_REQUIRE_EQUAL(route.sequence_id, 10343);
92  TLOG(TLVL_INFO) << "NoOp_policy_t Test Case DataFlowMode END";
93 }
94 
95 BOOST_AUTO_TEST_CASE(RequestBasedEventBuilding)
96 {
97  TLOG(TLVL_INFO) << "NoOp_policy_t Test Case RequestBasedEventBuilding BEGIN";
98  fhicl::ParameterSet ps = fhicl::ParameterSet::make("routing_manager_mode: RequestBasedEventBuilding routing_cache_size: 2");
99 
100  auto noop = artdaq::makeRoutingManagerPolicy("NoOp", ps);
101 
102  noop->Reset();
103  noop->AddReceiverToken(1, 1);
104  noop->AddReceiverToken(3, 1);
105  noop->AddReceiverToken(2, 1);
106  noop->AddReceiverToken(3, 1);
107  noop->AddReceiverToken(2, 1);
108  BOOST_REQUIRE_EQUAL(noop->GetReceiverCount(), 3);
109 
110  auto route = noop->GetRouteForSequenceID(1, 4);
111  BOOST_REQUIRE_EQUAL(route.destination_rank, 1);
112  BOOST_REQUIRE_EQUAL(route.sequence_id, 1);
113 
114  // Multiple hits for the same sequence ID should receive the same routing
115  route = noop->GetRouteForSequenceID(1, 5);
116  BOOST_REQUIRE_EQUAL(route.destination_rank, 1);
117  BOOST_REQUIRE_EQUAL(route.sequence_id, 1);
118 
119  // Only events which have started routing should be in the table
120  auto firstTable = noop->GetCurrentTable();
121  BOOST_REQUIRE_EQUAL(firstTable.size(), 1);
122  BOOST_REQUIRE_EQUAL(firstTable[0].destination_rank, 1);
123 
124  // Arbitrary Sequence IDs are allowed
125  route = noop->GetRouteForSequenceID(12343, 4);
126  BOOST_REQUIRE_EQUAL(route.destination_rank, 3);
127  BOOST_REQUIRE_EQUAL(route.sequence_id, 12343);
128 
129  // Out-of-order Sequence IDs are allowed
130  route = noop->GetRouteForSequenceID(4, 5);
131  BOOST_REQUIRE_EQUAL(route.destination_rank, 2);
132  BOOST_REQUIRE_EQUAL(route.sequence_id, 4);
133 
134  // Requests that arrive late still get the same info
135  route = noop->GetRouteForSequenceID(1, 6);
136  BOOST_REQUIRE_EQUAL(route.destination_rank, 1);
137  BOOST_REQUIRE_EQUAL(route.sequence_id, 1);
138 
139  // Check that things behave when tokens are exhausted...
140  route = noop->GetRouteForSequenceID(10, 4);
141  BOOST_REQUIRE_EQUAL(route.destination_rank, 3);
142  BOOST_REQUIRE_EQUAL(route.sequence_id, 10);
143  route = noop->GetRouteForSequenceID(11, 4);
144  BOOST_REQUIRE_EQUAL(route.destination_rank, 2);
145  BOOST_REQUIRE_EQUAL(route.sequence_id, 11);
146 
147  route = noop->GetRouteForSequenceID(50, 4);
148  BOOST_REQUIRE_EQUAL(route.destination_rank, -1);
149 
150  noop->AddReceiverToken(1, 1);
151  route = noop->GetRouteForSequenceID(50, 4);
152  BOOST_REQUIRE_EQUAL(route.destination_rank, 1);
153  BOOST_REQUIRE_EQUAL(route.sequence_id, 50);
154 
155  route = noop->GetRouteForSequenceID(50, 5);
156  BOOST_REQUIRE_EQUAL(route.destination_rank, 1);
157  BOOST_REQUIRE_EQUAL(route.sequence_id, 50);
158 
159  // Routing cache is sorted by sequence ID
160  auto secondTable = noop->GetCurrentTable();
161  BOOST_REQUIRE_EQUAL(secondTable.size(), 5);
162  BOOST_REQUIRE_EQUAL(secondTable[0].destination_rank, 2);
163  BOOST_REQUIRE_EQUAL(secondTable[0].sequence_id, 4);
164  BOOST_REQUIRE_EQUAL(secondTable[1].destination_rank, 3);
165  BOOST_REQUIRE_EQUAL(secondTable[1].sequence_id, 10);
166  BOOST_REQUIRE_EQUAL(secondTable[2].destination_rank, 2);
167  BOOST_REQUIRE_EQUAL(secondTable[2].sequence_id, 11);
168  BOOST_REQUIRE_EQUAL(secondTable[3].destination_rank, 1);
169  BOOST_REQUIRE_EQUAL(secondTable[3].sequence_id, 50);
170  BOOST_REQUIRE_EQUAL(secondTable[4].destination_rank, 3);
171  BOOST_REQUIRE_EQUAL(secondTable[4].sequence_id, 12343);
172 
173  // 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
174  BOOST_REQUIRE_EQUAL(noop->GetCacheSize(), 2);
175  auto thirdTable = noop->GetCurrentTable();
176  BOOST_REQUIRE_EQUAL(thirdTable.size(), 0);
177 
178  BOOST_REQUIRE(noop->CacheHasRoute(50));
179  BOOST_REQUIRE(!noop->CacheHasRoute(4));
180  route = noop->GetRouteForSequenceID(50, 6);
181  BOOST_REQUIRE_EQUAL(route.destination_rank, 1);
182  BOOST_REQUIRE_EQUAL(route.sequence_id, 50);
183 
184  TLOG(TLVL_INFO) << "NoOp_policy_t Test Case RequestBasedEventBuilding END";
185 }
186 
187 BOOST_AUTO_TEST_SUITE_END()
std::shared_ptr< RoutingManagerPolicy > makeRoutingManagerPolicy(std::string const &policy_plugin_spec, fhicl::ParameterSet const &ps)
Load a RoutingManagerPolicy plugin.