17#include "../src/DeviceSpecHelpers.h"
18#include <catch_amalgamated.hpp>
25#include "../src/SimpleResourceManager.h"
26#include "../src/ComputingResourceHelpers.h"
31using CheckMatrix = std::map<std::string, std::vector<std::pair<std::string, std::string>>>;
36 bool foundOption =
false;
37 for (
auto const& execArg : execution.
args) {
38 if (execArg ==
nullptr) {
42 foundOption = option == execArg;
43 }
else if (argument == execArg) {
56 const std::vector<ConfigParamSpec>& workflowOptions,
57 const std::vector<DeviceSpec>& deviceSpecs,
65 std::vector<DeviceExecution> deviceExecutions(deviceSpecs.size());
66 std::vector<DeviceControl> deviceControls(deviceSpecs.size());
67 std::vector<DataProcessorInfo> dataProcessorInfos;
68 for (
auto& [
name, _] : matrix) {
86 const auto& deviceSpec = deviceSpecs[
index];
87 const auto& deviceExecution = deviceExecutions[
index];
88 std::stringstream execArgs;
89 for (
const auto& arg : deviceExecution.args) {
94 execArgs <<
" " << arg;
96 for (
auto const& testCase : matrix[deviceSpec.name]) {
97 INFO(std::string(
"can not find option: ") + testCase.first +
" " + testCase.second);
98 REQUIRE(
search(deviceExecution, testCase.first, testCase.second));
105 std::vector<ConfigParamSpec> workflowOptions{
115 {
OutputSpec{{
"output"},
"TST",
"DUMMYDATA", 0, Lifetime::Timeframe}},
121 {
InputSpec{
"input",
"TST",
"DUMMYDATA", 0, Lifetime::Timeframe}},
129 std::vector<DeviceSpec> deviceSpecs;
132 auto rm = std::make_unique<SimpleResourceManager>(resources);
143 *rm,
"workflow-id", *configContext);
150 matrix[
"processor0"] = {{
"--depth",
"1"}, {
"--foo",
"bar"}, {
"--mode",
"default"}};
151 matrix[
"processor1"] = matrix[
"processor0"];
152 check({}, workflowOptions, deviceSpecs, matrix);
155 check({
"--unknown",
"option"}, workflowOptions, deviceSpecs, matrix);
158 matrix[
"processor0"] = {{
"--depth",
"1"}, {
"--foo",
"bar"}, {
"--mode",
"silly"}};
159 matrix[
"processor1"] = matrix[
"processor0"];
160 check({
"--mode",
"silly"}, workflowOptions, deviceSpecs, matrix);
163 matrix[
"processor0"] = {{
"--depth",
"1"}, {
"--foo",
"bar"}, {
"--mode",
"silly"}};
164 matrix[
"processor1"] = {{
"--depth",
"1"}, {
"--foo",
"bar"}, {
"--mode",
"default"}};
165 check({
"--processor0",
"--mode silly"}, workflowOptions, deviceSpecs, matrix);
168 matrix[
"processor0"] = {{
"--depth",
"1"}, {
"--foo",
"bar"}, {
"--mode",
"silly"}};
169 matrix[
"processor1"] = {{
"--depth",
"1"}, {
"--foo",
"bar"}, {
"--mode",
"advanced"}};
170 check({
"--mode",
"advanced",
"--processor0",
"--mode silly"}, workflowOptions, deviceSpecs, matrix);
173 matrix[
"processor0"] = {{
"--depth",
"2"}, {
"--foo",
"bar"}, {
"--mode",
"default"}};
174 matrix[
"processor1"] = matrix[
"processor0"];
175 check({
"--depth",
"2"}, workflowOptions, deviceSpecs, matrix);
178 matrix[
"processor0"] = {{
"--depth",
"2"}, {
"--foo",
"bar"}, {
"--mode",
"silly"}};
179 matrix[
"processor1"] = {{
"--depth",
"2"}, {
"--foo",
"bar"}, {
"--mode",
"default"}};
180 check({
"--depth",
"2",
"--processor0",
"--mode silly"}, workflowOptions, deviceSpecs, matrix);
186 std::vector<DataProcessorInfo> infos = {
187 {{}, {}, {
"--driver-client-backend",
"foo"}},
190 REQUIRE(infos[0].cmdLineArgs[1] ==
"foo");
191 REQUIRE(infos[1].cmdLineArgs[1] ==
"foo");
194 std::vector<DataProcessorInfo> infos = {
195 {{}, {}, {
"--driver-client-backend",
"foo"}},
196 {{}, {}, {
"--driver-client-backend",
"bar"}}};
200 std::vector<DataProcessorInfo> infos = {
201 {{}, {}, {
"--driver-client-backend",
"foo"}},
202 {{}, {}, {
"--driver-client-backend",
"foo"}}};
204 REQUIRE(infos[0].cmdLineArgs[1] ==
"foo");
205 REQUIRE(infos[1].cmdLineArgs[1] ==
"foo");
208 std::vector<DataProcessorInfo> infos = {
209 {{}, {}, {
"foo",
"bar"}},
210 {{}, {}, {
"fnjcnak",
"foo"}}};
212 REQUIRE(infos[0].cmdLineArgs[3] ==
"stdout://");
213 REQUIRE(infos[1].cmdLineArgs[3] ==
"stdout://");
216 std::vector<DataProcessorInfo> infos = {
217 {{}, {}, {
"foo",
"bar",
"--driver-client-backend",
"bar"}},
218 {{}, {}, {
"fnjcnak",
"foo"}}};
220 REQUIRE(infos[0].cmdLineArgs[3] ==
"bar");
221 REQUIRE(infos[1].cmdLineArgs[3] ==
"bar");
228 std::vector<DataProcessorInfo> infos = {
229 {{}, {}, {
"--readers",
"2"}},
232 infos,
"--readers",
nullptr, 1, [](
long long x,
long long y) {
return x >
y ?
x :
y; });
233 REQUIRE(infos[0].cmdLineArgs[1] ==
"2");
234 REQUIRE(infos[1].cmdLineArgs[1] ==
"2");
237 std::vector<DataProcessorInfo> infos = {
241 infos,
"--readers",
nullptr, 1, [](
long long x,
long long y) {
return x >
y ?
x :
y; });
242 REQUIRE(infos[0].cmdLineArgs.size() == 0);
243 REQUIRE(infos[1].cmdLineArgs.size() == 0);
246 std::vector<DataProcessorInfo> infos = {
250 infos,
"--readers", []() {
return 1; }, 3, [](
long long x,
long long y) {
return x >
y ?
x :
y; });
251 REQUIRE(infos[0].cmdLineArgs.size() == 2);
252 REQUIRE(infos[1].cmdLineArgs.size() == 2);
253 REQUIRE(infos[0].cmdLineArgs[1] ==
"1");
254 REQUIRE(infos[1].cmdLineArgs[1] ==
"1");
257 std::vector<DataProcessorInfo> infos = {
258 {{}, {}, {
"--readers",
"2"}},
259 {{}, {}, {
"--readers",
"3"}}};
261 infos,
"--readers", []() {
return 1; }, 1, [](
long long x,
long long y) {
return x >
y ?
x :
y; });
262 REQUIRE(infos[0].cmdLineArgs.size() == 2);
263 REQUIRE(infos[1].cmdLineArgs.size() == 2);
264 REQUIRE(infos[0].cmdLineArgs[1] ==
"3");
265 REQUIRE(infos[1].cmdLineArgs[1] ==
"3");
268 std::vector<DataProcessorInfo> infos = {
269 {{}, {}, {
"--readers",
"3"}},
270 {{}, {}, {
"--readers",
"2"}}};
272 infos,
"--readers", []() {
return 1; }, 1, [](
long long x,
long long y) {
return x >
y ?
x :
y; });
273 REQUIRE(infos[0].cmdLineArgs.size() == 2);
274 REQUIRE(infos[1].cmdLineArgs.size() == 2);
275 REQUIRE(infos[0].cmdLineArgs[1] ==
"3");
276 REQUIRE(infos[1].cmdLineArgs[1] ==
"3");
279 std::vector<DataProcessorInfo> infos = {
280 {{}, {}, {
"foo",
"bar",
"--readers",
"3"}},
281 {{}, {}, {
"--readers",
"2"}}};
283 infos,
"--readers", []() {
return 1; }, 1, [](
long long x,
long long y) {
return x >
y ?
x :
y; });
284 REQUIRE(infos[0].cmdLineArgs.size() == 4);
285 REQUIRE(infos[1].cmdLineArgs.size() == 2);
286 REQUIRE(infos[0].cmdLineArgs[3] ==
"3");
287 REQUIRE(infos[1].cmdLineArgs[1] ==
"3");
295 .name =
"processor0",
296 .outputs = {
OutputSpec{{
"output"},
"TST",
"DUMMYDATA", 0, Lifetime::Timeframe}},
299 .name =
"processor1",
300 .inputs = {
InputSpec{
"input",
"TST",
"DUMMYDATA", 0, Lifetime::Timeframe}},
307 .name =
"processor0",
308 .outputs = {
OutputSpec{{
"output"},
"TST",
"DUMMYDATA", 0, Lifetime::Timeframe},
309 OutputSpec{{
"output2"},
"TST",
"DUMMYDATA", 0, Lifetime::Timeframe}},
312 .name =
"processor1",
313 .inputs = {
InputSpec{
"input",
"TST",
"DUMMYDATA", 0, Lifetime::Timeframe}},
320 .name =
"processor0",
321 .outputs = {
OutputSpec{{
"output"},
"TST",
"DUMMYDATA", 0, Lifetime::Timeframe},
322 OutputSpec{{
"output2"},
"TST",
"DUMMYDATA", 2, Lifetime::Sporadic}},
325 .name =
"processor1",
326 .outputs = {
OutputSpec{{
"output"},
"TST",
"DUMMYDATA", 1, Lifetime::Timeframe},
327 OutputSpec{{
"output2"},
"TST",
"DUMMYDATA", 2, Lifetime::Sporadic}},
330 .name =
"processor2",
331 .inputs = {
InputSpec{
"input",
"TST",
"DUMMYDATA", 2, Lifetime::Timeframe}},
338 .name =
"processor0",
339 .outputs = {
OutputSpec{{
"output"},
"TST",
"DUMMYDATA", 0, Lifetime::Timeframe},
340 OutputSpec{{
"output2"},
"TST",
"DUMMYDATA", 2, Lifetime::Sporadic}},
343 .name =
"processor1",
344 .outputs = {
OutputSpec{{
"output"},
"TST",
"DUMMYDATA", 0, Lifetime::Timeframe},
345 OutputSpec{{
"output2"},
"TST",
"DUMMYDATA", 2, Lifetime::Sporadic}},
348 .name =
"processor2",
349 .inputs = {
InputSpec{
"input",
"TST",
"DUMMYDATA", 2, Lifetime::Timeframe}},
358 std::string env =
"FOO={timeslice0}";
360 env =
"FOO={timeslice0} BAR={timeslice4}";
362 env =
"FOO={timeslice0} BAR={timeslice4} BAZ={timeslice5}";
370 env =
"{timeslicepluto";
std::unique_ptr< ConfigContext > makeEmptyConfigContext()
GLuint const GLchar * name
bpo::variables_map arguments
Defining PrimaryVertex explicitly as messageable.
void check(const std::vector< std::string > &arguments, const std::vector< ConfigParamSpec > &workflowOptions, const std::vector< DeviceSpec > &deviceSpecs, CheckMatrix &matrix)
TEST_CASE("test_prepareArguments")
bool search(DeviceExecution const &execution, std::string const &option, std::string const &argument)
std::vector< DataProcessorSpec > WorkflowSpec
std::vector< ConfigParamSpec > Options
std::map< std::string, std::vector< std::pair< std::string, std::string > > > CheckMatrix
static std::vector< CallbacksPolicy > createDefaultPolicies()
static std::vector< ChannelConfigurationPolicy > createDefaultPolicies(ConfigContext const &configContext)
Default policies to use, based on the contents of the @configContex content.
static std::vector< CompletionPolicy > createDefaultPolicies()
Helper to create the default configuration.
static ComputingResource getLocalhostResource()
std::vector< char * > args
The options passed to a given device.
static void validate(WorkflowSpec const &workflow)
static std::string reworkTimeslicePlaceholder(std::string const &str, DeviceSpec const &spec)
static void prepareArguments(bool defaultQuiet, bool defaultStopped, bool intereactive, unsigned short driverPort, DriverConfig const &driverConfig, std::vector< DataProcessorInfo > const &processorInfos, std::vector< DeviceSpec > const &deviceSpecs, std::vector< DeviceExecution > &deviceExecutions, std::vector< DeviceControl > &deviceControls, std::vector< ConfigParamSpec > const &detectedOptions, std::string const &uniqueWorkflowId)
static void reworkHomogeneousOption(std::vector< DataProcessorInfo > &infos, char const *name, char const *defaultValue)
static void reworkIntegerOption(std::vector< DataProcessorInfo > &infos, char const *name, std::function< long long()> defaultValueCallback, long long startValue, std::function< long long(long long, long long)> bestValue)
static void dataProcessorSpecs2DeviceSpecs(const WorkflowSpec &workflow, std::vector< ChannelConfigurationPolicy > const &channelPolicies, std::vector< CompletionPolicy > const &completionPolicies, std::vector< DispatchPolicy > const &dispatchPolicies, std::vector< ResourcePolicy > const &resourcePolicies, std::vector< CallbacksPolicy > const &callbacksPolicies, std::vector< SendingPolicy > const &sendingPolicy, std::vector< ForwardingPolicy > const &forwardingPolicies, std::vector< DeviceSpec > &devices, ResourceManager &resourceManager, std::string const &uniqueWorkflowId, ConfigContext const &configContext, bool optimizeTopology=false, unsigned short resourcesMonitoringInterval=0, std::string const &channelPrefix="", OverrideServiceSpecs const &overrideServices={})
size_t inputTimesliceId
The time pipelining id of this particular device.