Virtualize Dictionary::load, implements launcher management operation: forceCountersR...
[anna.git] / example / diameter / launcher / main.cpp
index 49612e9..44d2c06 100644 (file)
@@ -436,6 +436,7 @@ public:
   void writeBurstLogFile(const std::string &buffer) throw();
   bool burstLogEnabled() const throw() { return (((a_burstLogFile == "") || (a_burstLogFile == "null")) ? false : true); }
   void startDiameterServer(int) throw(anna::RuntimeException);
+  void forceCountersRecord() throw(anna::RuntimeException) { if (a_counterRecorderClock) a_counterRecorderClock->tick(); }
 
   anna::xml::Node* asXML(anna::xml::Node* parent) const throw();
   void resetStatistics() throw() { a_myDiameterEngine->resetStatistics(); }
@@ -846,6 +847,7 @@ std::string Launcher::help() const throw() {
   result += "\ncollect                              Reset statistics and counters to start a new test stage of";
   result += "\n                                      performance measurement. Context data is written at";
   result += "\n                                      '/var/tmp/anna.context.<pid>' by mean 'kill -10 <pid>'.";
+  result += "\nforceCountersRecord                  Forces dump to file the current counters of the process.";
   result += "\n";
   result += "\n<visibility action>|[<address>:<port>]|[socket id]";
   result += "\n";
@@ -1067,27 +1069,11 @@ int main(int argc, const char** argv) {
   try {
     CommandLine& commandLine(anna::CommandLine::instantiate());
     // General
-    commandLine.add(NULL, anna::CommandLine::Argument::Optional, "XXXXXXXXXXXXXXXXXXXXX");
-    commandLine.add("juan,pepe,maria", anna::CommandLine::Argument::Optional, "XXXXXXXXXXXXXXXXXXXXX");
-    commandLine.add("dos,palabras", anna::CommandLine::Argument::Optional, "XXXXXXXXXXXXXXXXXXXXX");
-    commandLine.add("x,y", anna::CommandLine::Argument::Optional, "XXXXXXXXXXXXXXXXXXXXX");
-    commandLine.add("-x", anna::CommandLine::Argument::Optional, "XXXXXXXXXXXXXXXXXXXXX");
-    commandLine.add("-ooox", anna::CommandLine::Argument::Optional, "XXXXXXXXXXXXXXXXXXXXX");
-    commandLine.add("--ooox", anna::CommandLine::Argument::Optional, "XXXXXXXXXXXXXXXXXXXXX");
-    commandLine.add("--x", anna::CommandLine::Argument::Optional, "XXXXXXXXXXXXXXXXXXXXX");
-    commandLine.add("x,-y", anna::CommandLine::Argument::Optional, "XXXXXXXXXXXXXXXXXXXXX");
-    commandLine.add("x,-lly", anna::CommandLine::Argument::Optional, "XXXXXXXXXXXXXXXXXXXXX");
-    commandLine.add("bueno,a-medias", anna::CommandLine::Argument::Optional, "XXXXXXXXXXXXXXXXXXXXX");
-    commandLine.add("bueno,en-te-ro", anna::CommandLine::Argument::Optional, "XXXXXXXXXXXXXXXXXXXXX");
-    commandLine.add("b,a-ho-ra-si", anna::CommandLine::Argument::Optional, "XXXXXXXXXXXXXXXXXXXXX");
-
-
-
     commandLine.add("trace", anna::CommandLine::Argument::Optional, "Trace level (emergency, alert, critical, error, warning, notice, information, debug, local0..local7)");
     commandLine.add("log", anna::CommandLine::Argument::Optional, "Process log file (operations result, traffic log, etc.). By default 'launcher.log'. Empty string or \"null\" name, to disable. Warning: there is no rotation for log files (use logrotate or whatever)");
     commandLine.add("splitLog", anna::CommandLine::Argument::Optional, "Splits log file (appends to log filename, extensions with the type of event: see help on startup information-level traces). No log files for code/decode and load operations are created", false);
     commandLine.add("detailedLog", anna::CommandLine::Argument::Optional, "Insert detailed information at log files. Should be disabled on automatic tests. Useful on '-balance' mode to know messages flow along the sockets", false);
-    commandLine.add("dumpLog", anna::CommandLine::Argument::Optional, "Write to disk every incoming/outcoming message named as '<hop by hop>.<end to end>.<message code>.<request|answer>.xml'", false);
+    commandLine.add("dumpLog", anna::CommandLine::Argument::Optional, "Write to disk every incoming/outcoming message named as '<hop by hop>.<end to end>.<message code>.<request|answer>.<type of event>.xml'", false);
     commandLine.add("logStatisticSamples", anna::CommandLine::Argument::Optional, "Log statistics samples for the provided concept id list, over './sample.<concept id>.csv' files. For example: \"1,2\" will log concepts 1 and 2. Reserved word \"all\" activates all registered statistics concept identifiers. That ids are shown at context dump (see help to get it).");
     commandLine.add("burstLog", anna::CommandLine::Argument::Optional, "Burst operations log file. By default 'launcher.burst'. Empty string or \"null\" name, to disable. Warning: there is no rotation for log files (use logrotate or whatever). Output: dot (.) for each burst message sent/pushed, cross (x) for popped ones, and order number when multiple of 1% of burst list size, plus OTA requests when changed.");
     commandLine.add("cntDir", anna::CommandLine::Argument::Optional, "Counters directory. By default is the current execution directory. Warning: a counter file will be dump per record period; take care about the possible accumulation of files");
@@ -1115,7 +1101,8 @@ int main(int argc, const char** argv) {
     commandLine.add("originHost", anna::CommandLine::Argument::Optional, "Diameter application host name (system name). If missing, process sets o.s. hostname");
     commandLine.add("originRealm", anna::CommandLine::Argument::Optional, "Diameter application node realm name. If missing, process sets domain name");
     commandLine.add("integrationAndDebugging", anna::CommandLine::Argument::Optional, "Sets validation mode to 'Always' (default validates only after decoding), and validation depth to 'Complete' (default validates until 'FirstError')", false);
-//      commandLine.add("clone", anna::CommandLine::Argument::Optional, "Enables fork mode for request processing", false);
+    commandLine.add("fixMode", anna::CommandLine::Argument::Optional, "Sets message fix mode (unreconized values will assume default 'BeforeEncoding'). Allowed: 'BeforeEncoding', 'AfterDecoding', 'Always', 'Never'");
+
     commandLine.initialize(argv, argc);
     commandLine.verify();
     std::cout << commandLine.asString() << std::endl;
@@ -1341,7 +1328,9 @@ void Launcher::writeLogFile(const anna::diameter::codec::Message & decodedMessag
     name += ".";
     name += anna::functions::asString(decodedMessage.getId().first);
     name += ".";
-    name += ((decodedMessage.getId().second) ? "request.xml":"answer.xml");
+    name += ((decodedMessage.getId().second) ? "request.":"answer.");
+    name += logExtension;
+    name += ".xml";
     ofstream outMsg(name.c_str(), ifstream::out | ifstream::app);
     outMsg.write(xml.c_str(), xml.size());
     outMsg.close();
@@ -1642,6 +1631,18 @@ throw(anna::RuntimeException) {
     codecEngine->setValidationDepth(anna::diameter::codec::Engine::ValidationDepth::Complete);
   }
 
+  // Fix mode
+  if(cl.exists("fixMode")) { // BeforeEncoding(default), AfterDecoding, Always, Never
+    std::string fixMode = cl.getValue("fixMode");
+    anna::diameter::codec::Engine::FixMode::_v fm;
+    if (fixMode == "BeforeEncoding") fm = anna::diameter::codec::Engine::FixMode::BeforeEncoding;
+    else if (fixMode == "AfterDecoding") fm = anna::diameter::codec::Engine::FixMode::AfterDecoding;
+    else if (fixMode == "Always") fm = anna::diameter::codec::Engine::FixMode::Always;
+    else if (fixMode == "Never") fm = anna::diameter::codec::Engine::FixMode::Never;
+    else LOGINFORMATION(anna::Logger::information("Unreconized command-line fix mode. Assumed default 'BeforeEncoding'", ANNA_FILE_LOCATION));
+    codecEngine->setFixMode(fm);
+  }
+
   codecEngine->ignoreFlagsOnValidation(cl.exists("ignoreFlags"));
 
   // Diameter Server:
@@ -1836,6 +1837,13 @@ void Launcher::eventOperation(const std::string &operation, std::string &respons
     return;
   }
 
+  // Counters dump on demand:
+  if(operation == "forceCountersRecord") {
+    forceCountersRecord();
+    response_content = "Current counters have been dump to disk\n";
+    return;
+  }
+
   ///////////////////////////////////////////////////////////////////
   // Tokenize operation
   Tokenizer params;
@@ -2229,14 +2237,14 @@ void Launcher::eventOperation(const std::string &operation, std::string &respons
     response_content += "' loaded.";
     response_content += "\n";
   } else if((opType == "answerxml") || (opType == "answerxml2c")) {
-    response_content += "Answer to client '";
+    response_content += "'";
     response_content += param1;
-    response_content += "' programmed.";
+    response_content += "' applied on server FIFO queue";
     response_content += "\n";
   } else if(opType == "answerxml2e") {
-    response_content += "Answer to entity '";
+    response_content += "'";
     response_content += param1;
-    response_content += "' programmed.";
+    response_content += "' applied on client FIFO queue";
     response_content += "\n";
   } else if(opType == "diameterServerSessions") {
     response_content += "Maximum server socket connections updated to '";