+ else if (opType == "/context") {
+ auto it = j.find("targetFile");
+ std::string targetFile = (it != j.end()) ? *it : "";
+ result = eop.context(response, targetFile);
+ }
+ else if (opType == "/forceCountersRecord") {
+ result = eop.forceCountersRecord(response);
+ }
+ else if (opType == "/log-statistics-samples") {
+ auto it = j.find("list");
+ if (it != j.end())
+ result = eop.log_statistics_samples(response, *it);
+ else
+ response += "missing 'list' string field";
+ }
+
+ // Flow operations
+ else if ((opType == "/sendmsg2e")||(opType == "/sendmsg2c")) {
+ auto it = j.find("diameterJson");
+ if (it != j.end())
+ if (opType == "/sendmsg2e")
+ result = eop.sendmsg2e(response, it->dump(4)); // get the object as string (always indentation = 4)
+ else
+ result = eop.sendmsg2c(response, it->dump(4)); // get the object as string (always indentation = 4)
+ else
+ response += "missing 'diameterJson' object field";
+ }
+ else if ((opType == "/answermsg2e")||(opType == "/answermsg2c")) {
+ auto itJ = j.find("diameterJson");
+ auto itA = j.find("action");
+ bool hasJ = (itJ != j.end());
+ bool hasA = (itA != j.end());
+
+ if (hasJ != hasA) { // XOR
+
+ if (opType == "/answermsg2e") {
+ if (hasJ)
+ result = eop.answermsg2e(response, itJ->dump(4)); // get the object as string (always indentation = 4)
+ else
+ result = eop.answermsg2e_action(response, *itA);
+ }
+ else {
+ if (hasJ)
+ result = eop.answermsg2c(response, itJ->dump(4)); // get the object as string (always indentation = 4)
+ else
+ result = eop.answermsg2c_action(response, *itA);
+ }
+ }
+ else
+ response += "missing 'diameterJson' object or 'action' string field (only one accepted)";
+ }
+ else if ((opType == "/sendhex2e")||(opType == "/sendhex2c")) {
+ auto it = j.find("diameterHex");
+ if (it != j.end())
+ if (opType == "/sendhex2e")
+ result = eop.sendhex2e(response, *it);
+ else
+ result = eop.sendhex2c(response, *it);
+ else
+ response += "missing 'diameterHex' string field";
+ }
+
+ // FSM testing
+ // test_id__<command>
+ else if (opType == "/testid-description") {
+ auto it = j.find("description");
+ if (it != j.end())
+ result = eop.test_id__description(response, atoi(param1.c_str()), *it);
+ else
+ response += "missing 'description' string field";
+ }
+ else if (opType == "/testid-ip-limit") {
+ auto it = j.find("amount");
+ int amount = (it != j.end()) ? it->get<int>() : 1;
+ result = eop.test_id__ip_limit(response, atoi(param1.c_str()), amount);
+ }
+ else if (opType == "/testid-timeout") {
+ auto it = j.find("msecs");
+ if (it != j.end())
+ result = eop.test_id__timeout(response, atoi(param1.c_str()), it->get<int>());
+ else
+ response += "missing 'msecs' integer field";
+ }
+ else if ((opType == "/testid-sendmsg2e")||(opType == "/testid-sendmsg2c")) {
+ auto it = j.find("diameterJson");
+ if (it != j.end()) {
+
+ auto itS = j.find("stepNumber");
+ int stepNumber = (itS != j.end()) ? itS->get<int>() : -1;
+
+ if (opType == "/testid-sendmsg2e")
+ result = eop.test_id__sendmsg2e(response, atoi(param1.c_str()), it->dump(4), stepNumber); // get the object as string (always indentation = 4)
+ else
+ result = eop.test_id__sendmsg2c(response, atoi(param1.c_str()), it->dump(4), stepNumber); // get the object as string (always indentation = 4)
+ }
+ else
+ response += "missing 'diameterJson' object field";
+ }
+ else if (opType == "/testid-delay") {
+ auto it = j.find("msecs");
+ if (it != j.end())
+ result = eop.test_id__delay(response, atoi(param1.c_str()), it->get<int>());
+ else
+ response += "missing 'msecs' integer field";
+ }
+ else if (opType == "/testid-sh-command") {
+ auto it = j.find("script");
+ if (it != j.end())
+ result = eop.test_id__sh_command(response, atoi(param1.c_str()), *it);
+ else
+ response += "missing 'script' string field";
+ }
+ else if ((opType == "/testid-waitfe-hex")||(opType == "/testid-waitfc-hex")) {
+ auto it = j.find("hex");
+ if (it != j.end()) {
+
+ auto itS = j.find("strict");
+ bool strict = (itS != j.end()) ? (*itS == "true") : false;
+
+ if (opType == "/testid-waitfe-hex")
+ result = eop.test_id__waitfe_hex(response, atoi(param1.c_str()), *it, strict);
+ else
+ result = eop.test_id__waitfc_hex(response, atoi(param1.c_str()), *it, strict);
+ }
+ else
+ response += "missing 'hex' string field";
+ }
+ else if ((opType == "/testid-waitfe-msg")||(opType == "/testid-waitfc-msg")) {
+ auto it = j.find("diameterJson");
+ if (it != j.end()) {
+
+ auto itS = j.find("strict");
+ bool strict = (itS != j.end()) ? (*itS == "true") : false;
+
+ if (opType == "/testid-waitfe-msg")
+ result = eop.test_id__waitfe_msg(response, atoi(param1.c_str()), it->dump(4), strict); // get the object as string (always indentation = 4)
+ else
+ result = eop.test_id__waitfc_msg(response, atoi(param1.c_str()), it->dump(4), strict); // get the object as string (always indentation = 4)
+ }
+ else
+ response += "missing 'diameterJson' object field";
+ }
+ else if ((opType == "/testid-waitfe")||(opType == "/testid-waitfc")) {
+ auto it = j.find("condition");
+ if (it != j.end()) {
+ // [code]|[bitR]|[hopByHop]|[applicationId]|[sessionId]|[resultCode]|[msisdn]|[imsi]|[serviceContextId]
+ auto it_code = it->find("code");
+ auto it_bitR = it->find("bitR");
+ auto it_hopByHop = it->find("hopByHop");
+ auto it_applicationId = it->find("applicationId");
+ auto it_sessionId = it->find("sessionId");
+ auto it_resultCode = it->find("resultCode");
+ auto it_msisdn = it->find("msisdn");
+ auto it_imsi = it->find("imsi");
+ auto it_serviceContextId = it->find("serviceContextId");
+
+ std::string condition;
+ condition += (it_code != it->end()) ? *it_code : ""; condition += "|";
+ condition += (it_bitR != it->end()) ? *it_bitR : ""; condition += "|";
+ condition += (it_hopByHop != it->end()) ? *it_hopByHop : ""; condition += "|";
+ condition += (it_applicationId != it->end()) ? *it_applicationId : ""; condition += "|";
+ condition += (it_sessionId != it->end()) ? *it_sessionId : ""; condition += "|";
+ condition += (it_resultCode != it->end()) ? *it_resultCode : ""; condition += "|";
+ condition += (it_msisdn != it->end()) ? *it_msisdn : ""; condition += "|";
+ condition += (it_imsi != it->end()) ? *it_imsi : ""; condition += "|";
+ condition += (it_serviceContextId != it->end()) ? *it_serviceContextId : "";
+
+ if (opType == "/testid-waitfe")
+ result = eop.test_id__waitfe(response, atoi(param1.c_str()), condition);
+ else
+ result = eop.test_id__waitfc(response, atoi(param1.c_str()), condition);
+ }
+ else
+ response += "missing 'condition' object field";
+ }
+
+ // Testcases execution
+ // test__<command>
+ else if (opType == "/test-ttps") {
+ auto it = j.find("amount");
+ if (it != j.end())
+ result = eop.test__ttps(response, it->get<int>());
+ else
+ response += "missing 'amount' integer field";
+ }
+ else if (opType == "/test-next") {
+ auto it = j.find("syncAmount");
+ int syncAmount = (it != j.end()) ? it->get<int>() : 1;
+ result = eop.test__next(response, syncAmount);
+ }
+ else if (opType == "/test-ip-limit") {
+ auto it = j.find("amount");
+ int amount = (it != j.end()) ? it->get<int>() : -2; // default is: show current ip-limit and in-progress test cases amount
+ result = eop.test__ip_limit(response, amount);
+ }
+ else if (opType == "/test-goto") {
+ auto it = j.find("id");
+ if (it != j.end())
+ result = eop.test__goto(response, it->get<int>());
+ else
+ response += "missing 'id' integer field";
+ }
+ else if (opType == "/test-run") {
+ auto it = j.find("id");
+ if (it != j.end())
+ result = eop.test__run(response, it->get<int>());
+ else
+ response += "missing 'id' integer field";
+ }
+ else if (opType == "/test-look") {
+ auto it = j.find("id");
+ int id = (it != j.end()) ? it->get<int>() : -1; // default is: current
+ result = eop.test__look(response, id);
+ }
+ else if (opType == "/test-state") {
+ auto it = j.find("id");
+ int id = (it != j.end()) ? it->get<int>() : -1; // default is: current
+ result = eop.test__state(response, id);
+ }
+ else if (opType == "/test-interact") {
+ auto it = j.find("amount");
+ if (it != j.end()) {
+
+ auto itI = j.find("id");
+ int id = (itI != j.end()) ? itI->get<int>() : -1; // default is: current
+
+ result = eop.test__interact(response, it->get<int>(), id);
+ }
+ else
+ response += "missing 'amount' integer field";
+ }
+ else if (opType == "/test-reset") {
+ auto it = j.find("type");
+ if (it != j.end()) {
+
+ auto itI = j.find("id");
+ int id = (itI != j.end()) ? itI->get<int>() : -2; // default is: apply to all the tests
+
+ if ((*it == "soft") || (*it == "hard")) {
+ result = eop.test__reset(response, (*it == "soft"), id);
+ }
+ else
+ response += "invalid 'type' string field (allowed: soft|hard)";
+ }
+ else
+ response += "missing 'type' string field";
+ }
+ else if (opType == "/test-repeats") {
+ auto it = j.find("amount");
+ if (it != j.end())
+ result = eop.test__repeats(response, it->get<int>());
+ else
+ response += "missing 'amount' integer field";
+ }
+ else if (opType == "/test-auto-reset") {
+ auto it = j.find("type");
+ if (it != j.end()) {
+
+ if ((*it == "soft") || (*it == "hard")) {
+ result = eop.test__auto_reset(response, (*it == "soft"));
+ }
+ else
+ response += "invalid 'type' string field (allowed: soft|hard)";
+ }
+ else
+ response += "missing 'type' string field";
+ }
+ else if (opType == "/test-initialized") {
+ result = eop.test__initialized(response);
+ }
+ else if (opType == "/test-finished") {
+ result = eop.test__finished(response);
+ }
+ else if (opType == "/test-clear") {
+ result = eop.test__clear(response);
+ }
+ else if (opType == "/test-junit") {
+ auto it = j.find("targetFile");
+ std::string targetFile = (it != j.end()) ? *it : ""; // default is: get junit on response instead dumping on file
+ result = eop.test__junit(response, targetFile);
+ }
+ else if (opType == "/test-summary-counts") {
+ result = eop.test__summary_counts(response);
+ }
+ else if (opType == "/test-summary-states") {
+ result = eop.test__summary_states(response);
+ }
+ else if (opType == "/test-summary") {
+ result = eop.test__summary(response);
+ }
+ else if (opType == "/test-report") {
+ auto it = j.find("state");
+ std::string state = (it != j.end()) ? *it : "all"; // initialized|in-progress|failed|success|[all]|none
+
+ auto itA = j.find("action");
+ std::string action = (itA != j.end()) ? *itA : "enable"; // default is: enable
+
+ if ((action == "enable") || (action == "disable")) {
+ result = eop.test__report(response, state, (action == "enable"));
+ }
+ else
+ response += "invalid 'action' string field (allowed: enable|disable)";
+ }
+ else if ((opType == "/test-report-hex")||(opType == "/test-dump_stdout")) {
+
+ auto itA = j.find("action");
+ std::string action = (itA != j.end()) ? *itA : "enable"; // default is: enable
+
+ if ((action == "enable") || (action == "disable")) {
+ bool enable = (action == "enable");
+
+ if (opType == "/test-report-hex")
+ result = eop.test__report_hex(response, enable);
+ else
+ result = eop.test__dump_stdout(response, enable);
+ }
+ else
+ response += "invalid 'action' string field (allowed: enable|disable)";
+ }
+
+
+ return result;