// Process
#include <EventOperation.hpp>
#include <Launcher.hpp>
+#include <Procedure.hpp>
+#include <MyDiameterEngine.hpp>
+#include <MyLocalServer.hpp>
+#include <anna/testing/TestManager.hpp>
+
+// Standard
+#include <fstream>
+#include <unistd.h> // chdir
// Project
#include <anna/diameter.comm/OriginHost.hpp>
-
-
-//// Standard
-//#include <sstream> // std::istringstream
-//#include <iostream> // std::cout
-//#include <math.h> // ceil
-//#include <climits>
-#include <unistd.h> // chdir
-//#include <stdio.h>
-//
-//// Project
#include <anna/json/functions.hpp>
#include <anna/diameter/codec/Message.hpp>
-//#include <anna/timex/Engine.hpp>
-//#include <anna/statistics/Engine.hpp>
-//#include <anna/diameter/codec/functions.hpp>
-//#include <anna/diameter/codec/Engine.hpp>
-//#include <anna/diameter/codec/EngineManager.hpp>
-//#include <anna/http/Transport.hpp>
-//#include <anna/diameter/stack/Engine.hpp>
#include <anna/diameter/helpers/base/functions.hpp>
#include <anna/time/functions.hpp>
#include <anna/core/functions.hpp>
-//#include <anna/diameter.comm/ApplicationMessageOamModule.hpp>
-//#include <anna/testing/defines.hpp>
#include <anna/xml/xml.hpp>
-//#include <anna/diameter.comm/OriginHost.hpp>
-//#include <anna/diameter.comm/OriginHostManager.hpp>
#include <anna/diameter.comm/Message.hpp>
-//
-//// Process
-//#include <Launcher.hpp>
-//#include <Procedure.hpp>
-//#include <EventOperation.hpp>
-#include <MyDiameterEngine.hpp>
-#include <MyLocalServer.hpp>
-#include <anna/testing/TestManager.hpp>
-//#include <anna/testing/TestCase.hpp>
/////////////////////
if(my_app.getOperatedHost()->logEnabled()) {
anna::diameter::comm::Server *usedServer = my_app.getOperatedEntity()->getLastUsedResource();
anna::diameter::comm::ClientSession *usedClientSession = usedServer ? usedServer->getLastUsedResource() : NULL;
- std::string detail = usedClientSession ? usedClientSession->asString() : "<null client session>"; // shouldn't happen
+ std::string detail = usedClientSession ? usedClientSession->asString() : "[null client session]"; // shouldn't happen
my_app.getOperatedHost()->writeLogFile(codecMsg, (success ? "sent2e" : "send2eError"), detail);
}
// Detailed log:
if(my_app.getOperatedHost()->logEnabled()) {
anna::diameter::comm::ServerSession *usedServerSession = my_app.getOperatedServer()->getLastUsedResource();
- std::string detail = usedServerSession ? usedServerSession->asString() : "<null server session>"; // shouldn't happen
+ std::string detail = usedServerSession ? usedServerSession->asString() : "[null server session]"; // shouldn't happen
my_app.getOperatedHost()->writeLogFile(codecMsg, (success ? "sent2c" : "send2cError"), detail);
}
std::string::size_type pos, pos_1, pos_2;
pos = regexp.find("end-to-end-id=", 0u);
- pos = regexp.find("\"", pos);
- pos_1 = pos;
- pos = regexp.find("\"", pos+1);
- pos_2 = pos;
- regexp.replace(pos_1 + 1, pos_2 - pos_1 - 1, "[0-9]+");
+ if (pos != std::string::npos) {
+ pos = regexp.find("\"", pos);
+ pos_1 = pos;
+ pos = regexp.find("\"", pos+1);
+ pos_2 = pos;
+ regexp.replace(pos_1 + 1, pos_2 - pos_1 - 1, "[0-9]+");
+ }
pos = regexp.find("hop-by-hop-id=", 0u);
- pos = regexp.find("\"", pos);
- pos_1 = pos;
- pos = regexp.find("\"", pos+1);
- pos_2 = pos;
- regexp.replace(pos_1 + 1, pos_2 - pos_1 - 1, "[0-9]+");
+ if (pos != std::string::npos) {
+ pos = regexp.find("\"", pos);
+ pos_1 = pos;
+ pos = regexp.find("\"", pos+1);
+ pos_2 = pos;
+ regexp.replace(pos_1 + 1, pos_2 - pos_1 - 1, "[0-9]+");
+ }
// For this representation: <avp name="Origin-State-Id" data="1428633668"/>
//pos = regexp.find("Origin-State-Id", 0u);
//regexp.replace(pos_1 + 1, pos_2 - pos_1 - 1, "[0-9]+");
// But we have this one: <avp data="1428633668" name="Origin-State-Id"/>
pos = regexp.find("Origin-State-Id", 0u);
- pos = regexp.rfind("\"", pos);
- pos = regexp.rfind("\"", pos-1);
- pos = regexp.rfind("\"", pos-1);
- pos_1 = pos;
- pos = regexp.find("\"", pos+1);
- pos_2 = pos;
- regexp.replace(pos_1 + 1, pos_2 - pos_1 - 1, "[0-9]+");
+ if (pos != std::string::npos) {
+ pos = regexp.rfind("\"", pos);
+ pos = regexp.rfind("\"", pos-1);
+ pos = regexp.rfind("\"", pos-1);
+ pos_1 = pos;
+ pos = regexp.find("\"", pos+1);
+ pos_2 = pos;
+ regexp.replace(pos_1 + 1, pos_2 - pos_1 - 1, "[0-9]+");
+ }
//regexp.insert(0, "^");
//regexp += "$";
bool EventOperation::test__ttps(std::string &response, int amount) {
Launcher& my_app = static_cast <Launcher&>(anna::app::functions::getApp());
+ anna::testing::TestManager &testManager = anna::testing::TestManager::instantiate();
+ bool success = testManager.configureTTPS(amount);
+ if (success) {
+ response = "Assigned new test launch rate to ";
+ response += anna::functions::asString(amount);
+ response += " events per second";
+ }
+ else {
+ response += "unable to configure the test rate provided";
+ }
-
- return true; // OK
+ return success; // OK
}
bool EventOperation::test__next(std::string &response, int syncAmount) {
Launcher& my_app = static_cast <Launcher&>(anna::app::functions::getApp());
+ anna::testing::TestManager &testManager = anna::testing::TestManager::instantiate();
+ if (syncAmount < 1) {
+ response += "the parameter 'sync-amount' must be a positive integer value";
+ return false;
+ }
+ bool success = testManager.execTestCases(syncAmount);
- return true; // OK
+ response = (success ? "P" : "Not completely p" /* completed cycle and no repeats, rare case */);
+ response += "rocessed ";
+ response += anna::functions::asString(syncAmount);
+ response += ((syncAmount > 1) ? " test cases synchronously" : " test case");
+
+ return success;
}
bool EventOperation::test__ip_limit(std::string &response, int amount) {
Launcher& my_app = static_cast <Launcher&>(anna::app::functions::getApp());
+ anna::testing::TestManager &testManager = anna::testing::TestManager::instantiate();
-
+ if (amount > -2) {
+ testManager.setInProgressLimit(amount);
+ response = "New in-progress limit: ";
+ response += (amount != -1) ? anna::functions::asString(amount) : "[no limit]";
+ }
+ else {
+ response = "In-progress limit amount: ";
+ int limit = testManager.getInProgressLimit();
+ response += (limit != -1) ? anna::functions::asString(limit) : "[no limit]";
+ response += "; currently there are ";
+ response += anna::functions::asString(testManager.getInProgressCount());
+ response += " test cases running";
+ }
return true; // OK
}
bool EventOperation::test__goto(std::string &response, int id) {
Launcher& my_app = static_cast <Launcher&>(anna::app::functions::getApp());
+ anna::testing::TestManager &testManager = anna::testing::TestManager::instantiate();
+ bool success = testManager.gotoTestCase(id);
+ if (success) {
+ response = "Position updated for id provided (";
+ }
+ else {
+ response += "cannot found test id (";
+ }
+ response += anna::functions::asString(id);
+ response += ")";
- return true; // OK
+ return success;
}
bool EventOperation::test__run(std::string &response, int id) {
Launcher& my_app = static_cast <Launcher&>(anna::app::functions::getApp());
+ anna::testing::TestManager &testManager = anna::testing::TestManager::instantiate();
+ bool success = testManager.runTestCase(id);
+ if (success) {
+ response = "Test executed for id provided (";
+ }
+ else {
+ response += "cannot found test id (";
+ }
+ response += anna::functions::asString(id);
+ response += ")";
- return true; // OK
+ return success;
}
bool EventOperation::test__look(std::string &response, int id) {
Launcher& my_app = static_cast <Launcher&>(anna::app::functions::getApp());
+ anna::testing::TestManager &testManager = anna::testing::TestManager::instantiate();
+ anna::testing::TestCase *testCase = testManager.findTestCase(id);
+ if (!testCase) {
+ if (id == -1) {
+ response += "no current test case detected (testing started ?)";
+ }
+ else {
+ response += "cannot found test id (";
+ response += anna::functions::asString(id);
+ response += ")";
+ }
+ return false;
+ }
+
+ if (a_http)
+ response = anna::functions::encodeBase64(testCase->asXMLString());
+ else
+ response = testCase->asXMLString();
return true; // OK
}
bool EventOperation::test__state(std::string &response, int id) {
Launcher& my_app = static_cast <Launcher&>(anna::app::functions::getApp());
+ anna::testing::TestManager &testManager = anna::testing::TestManager::instantiate();
+ anna::testing::TestCase *testCase = testManager.findTestCase(id);
+ if (!testCase) {
+ if (id == -1) {
+ response += "no current test case detected (testing started ?)";
+ }
+ else {
+ response += "cannot found test id (";
+ response += anna::functions::asString(id);
+ response += ")";
+ }
+ return false;
+ }
- return true; // OK
+ response = anna::testing::TestCase::asText(testCase->getState());
+ return testCase->isSuccess();
}
bool EventOperation::test__interact(std::string &response, int amount, unsigned int id) {
Launcher& my_app = static_cast <Launcher&>(anna::app::functions::getApp());
+ anna::testing::TestManager &testManager = anna::testing::TestManager::instantiate();
+ if (amount < -1) {
+ response += "interactive amount must be -1 (to disable interactive mode) or a positive number.";
+ return false;
+ }
+ anna::testing::TestCase *testCase = testManager.findTestCase(id);
+ if (testCase) {
+ if (amount == -1) {
+ testCase->makeInteractive(false);
+ response = "Interactive mode disabled";
+ }
+ else {
+ testCase->addInteractiveAmount(amount);
+ response = "Added interactive amount of ";
+ response += anna::functions::asString(amount);
+ response += " units";
+ if (amount == 0) response += " (0: freezing a non-interactive testcase, no effect on already interactive)";
+ }
+ response += " for test case id ";
+ response += anna::functions::asString(id);
+ }
+ else {
+ response += "cannot found test id (";
+ response += anna::functions::asString(id);
+ response += ")";
+ return false;
+ }
return true; // OK
}
-bool EventOperation::test__reset(std::string &response, bool soft_hard, unsigned int id) {
+bool EventOperation::test__reset(std::string &response, bool soft_hard, int id) {
Launcher& my_app = static_cast <Launcher&>(anna::app::functions::getApp());
+ anna::testing::TestManager &testManager = anna::testing::TestManager::instantiate();
-
+ anna::testing::TestCase *testCase = ((id != -1) ? testManager.findTestCase(id) : NULL);
+ if (testCase) {
+ bool done = testCase->reset(!soft_hard);
+ response = "Test ";
+ response += (soft_hard ? "soft":"hard");
+ response += " reset for id ";
+ response += anna::functions::asString(id);
+ response += done ? ": done": ": not done";
+ }
+ else {
+ if (id == -1) {
+ bool anyReset = testManager.resetPool(!soft_hard);
+ response = (soft_hard ? "Soft":"Hard");
+ response += " reset have been sent to all programmed tests: "; response += anyReset ? "some/all have been reset" : "nothing was reset";
+ }
+ else {
+ response += "cannot found test id (";
+ response += anna::functions::asString(id);
+ response += ")";
+ return false;
+ }
+ }
return true; // OK
}
bool EventOperation::test__repeats(std::string &response, int amount) {
Launcher& my_app = static_cast <Launcher&>(anna::app::functions::getApp());
+ anna::testing::TestManager &testManager = anna::testing::TestManager::instantiate();
-
+ if (amount < 0) amount = -1;
+ testManager.setPoolRepeats(amount);
+ std::string nolimit = (amount != -1) ? "":" [no limit]";
+ response = anna::functions::asString("Pool repeats: %d%s (current cycle: %d)", amount, nolimit.c_str(), testManager.getPoolCycle());
return true; // OK
}
bool EventOperation::test__auto_reset(std::string &response, bool soft_hard) {
Launcher& my_app = static_cast <Launcher&>(anna::app::functions::getApp());
+ anna::testing::TestManager &testManager = anna::testing::TestManager::instantiate();
-
+ testManager.setAutoResetHard(!soft_hard);
+ response = anna::functions::asString("Auto-reset configured to '%s'", (soft_hard ? "soft":"hard"));
return true; // OK
}
bool EventOperation::test__initialized(std::string &response) {
Launcher& my_app = static_cast <Launcher&>(anna::app::functions::getApp());
+ anna::testing::TestManager &testManager = anna::testing::TestManager::instantiate();
-
+ response = anna::functions::asString("%lu", testManager.getInitializedCount());
return true; // OK
}
bool EventOperation::test__finished(std::string &response) {
Launcher& my_app = static_cast <Launcher&>(anna::app::functions::getApp());
+ anna::testing::TestManager &testManager = anna::testing::TestManager::instantiate();
-
+ response = anna::functions::asString("%lu", testManager.getFinishedCount());
return true; // OK
}
Launcher& my_app = static_cast <Launcher&>(anna::app::functions::getApp());
anna::testing::TestManager &testManager = anna::testing::TestManager::instantiate();
- try {
- if (testManager.clearPool()) {
- response = "All the programmed test cases have been dropped";
- }
- else {
- response = "There are not programmed test cases to be removed";
- }
- }
- catch(anna::RuntimeException &ex) {
- ex.trace();
- response += "failed";
- return false;
- }
-
- return true; // OK
+ return testManager.clearPool(response);
}
bool EventOperation::test__junit(std::string &response, const std::string & targetFile) {
Launcher& my_app = static_cast <Launcher&>(anna::app::functions::getApp());
+ anna::testing::TestManager &testManager = anna::testing::TestManager::instantiate();
+
+ std::ofstream out;
+ out.open(targetFile.c_str());
+
+ if(out.is_open() == false) {
+ response += "error opening '";
+ response += targetFile;
+ response += "'";
+ return false;
+ }
+ out << testManager.junitAsXMLString() << std::endl;
+ out.close();
+ response = "Junit report written on '";
+ response += targetFile;
+ response += "'";
return true; // OK
}
bool EventOperation::test__summary_counts(std::string &response) {
Launcher& my_app = static_cast <Launcher&>(anna::app::functions::getApp());
+ anna::testing::TestManager &testManager = anna::testing::TestManager::instantiate();
-
+ response = anna::functions::encodeBase64(testManager.summaryCounts());
return true; // OK
}
bool EventOperation::test__summary_states(std::string &response) {
Launcher& my_app = static_cast <Launcher&>(anna::app::functions::getApp());
+ anna::testing::TestManager &testManager = anna::testing::TestManager::instantiate();
-
+ response = anna::functions::encodeBase64(testManager.summaryStates());
return true; // OK
}
bool EventOperation::test__summary(std::string &response) {
Launcher& my_app = static_cast <Launcher&>(anna::app::functions::getApp());
+ anna::testing::TestManager &testManager = anna::testing::TestManager::instantiate();
-
+ response = anna::functions::encodeBase64(testManager.asXMLString());
return true; // OK
}
bool EventOperation::test__report(std::string &response, const std::string & state, bool enable) {
Launcher& my_app = static_cast <Launcher&>(anna::app::functions::getApp());
+ anna::testing::TestManager &testManager = anna::testing::TestManager::instantiate();
+ std::string _state = state;
+
+ if(_state == "initialized")
+ testManager.setDumpInitializedReports(enable);
+ else if(_state == "in-progress")
+ testManager.setDumpInProgressReports(enable);
+ else if(_state == "failed")
+ testManager.setDumpFailedReports(enable);
+ else if(_state == "success")
+ testManager.setDumpSuccessReports(enable);
+ else if(_state == "all") {
+ _state = "any";
+ testManager.setDumpAllReports(enable);
+ }
+ else if(_state == "none") {
+ enable = !enable;
+ _state = "any";
+ testManager.setDumpAllReports(enable);
+ }
+ else {
+ response += "invalid state (allowed: initialized|in-progress|failed|success|[all]|none)";
+ return false;
+ }
+ response = (enable ? "Report enabled " : "Report disabled ");
+ response += "for tests in '";
+ response += _state;
+ response += "' state";
return true; // OK
}
bool EventOperation::test__report_hex(std::string &response, bool enable) {
Launcher& my_app = static_cast <Launcher&>(anna::app::functions::getApp());
+ anna::testing::TestManager &testManager = anna::testing::TestManager::instantiate();
-
+ testManager.setDumpHex(enable);
+ response = (testManager.getDumpHex() ? "Report includes hexadecimal messages" : "Report excludes hexadecimal messages");
return true; // OK
}
bool EventOperation::test__dump_stdout(std::string &response, bool enable) {
Launcher& my_app = static_cast <Launcher&>(anna::app::functions::getApp());
+ anna::testing::TestManager &testManager = anna::testing::TestManager::instantiate();
+
+ testManager.setDumpStdout(enable);
+ response = (testManager.getDumpStdout() ? "Test manager dumps progress into stdout" : "Test manager does not dump progress into stdout");
+
+ return true; // OK
+}
+bool EventOperation::test__dynamic(std::string &response, const nlohmann::json &arguments) {
+ Launcher& my_app = static_cast <Launcher&>(anna::app::functions::getApp());
+
+ Procedure p(&my_app);
+ try {
+ p.execute(arguments, response);
+ }
+ catch(anna::RuntimeException &ex) {
+ ex.trace();
+ response += ex.asString();
+ return false;
+ }
return true; // OK
}