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