Dynamic lib selection and deployment
[anna.git] / example / diameter / launcher / testing / TestManager.hpp
index 1756315..d1cc1c1 100644 (file)
@@ -19,6 +19,7 @@
 
 // Process
 #include <TestTimer.hpp>
+#include <TestCase.hpp>
 
 
 namespace anna {
@@ -39,6 +40,8 @@ namespace anna {
 class TestClock;
 class TestCase;
 class TestCaseStep;
+class OriginHost;
+
 
 typedef std::map<unsigned int /* test case id */, TestCase*> test_pool_t;
 typedef std::map<unsigned int /* test case id */, TestCase*>::const_iterator test_pool_it;
@@ -49,34 +52,61 @@ typedef std::map<unsigned int /* test case id */, TestCase*>::iterator test_pool
    Timer Manager for testing system
 */
 class TestManager : public anna::timex::TimeEventObserver, public anna::Singleton <TestManager> {
+
+  // Statistics summary:
+  class StatSummary {
+
+    unsigned int a_initializedTcs;
+    unsigned int a_inprogressTcs;
+    unsigned int a_failedTcs;
+    unsigned int a_sucessTcs;
+
+  public:
+    StatSummary() { clear(); }
+    void newTCState(const TestCase::State::_v beginState, const TestCase::State::_v endState) throw();
+    void clear() throw();
+    unsigned int getInProgressCount() const throw() { return a_inprogressTcs; }
+    anna::xml::Node* asXML(anna::xml::Node* parent) const throw();
+  };
+
+
+
   typedef anna::Recycler <TestTimer> timer_container;
 
   anna::timex::Engine* a_timeController;
 
   // reports
   std::string a_reportsDirectory;
-  bool a_dumpReports;
+  bool a_dumpInitializedReports, a_dumpInProgressReports, a_dumpFailedReports, a_dumpSuccessReports;
   bool a_dumpHexMessages;
 
   // Pool of test cases
   test_pool_t a_testPool;
   test_pool_it a_currentTestIt;
-  bool a_poolRepeat; // repeat pool when finish
-  unsigned int a_inProgressCount;
+  int a_poolRepeats; // repeat pool N times
+  int a_poolCycle; // current cycle, from 1 to N
   unsigned int a_inProgressLimit; // limit load to have this value
 
   // Test clock
   int a_synchronousAmount;
   TestClock *a_clock;
   bool tick() throw();
+  bool execTestCases(int sync_amount) throw();
   bool nextTestCase() throw();
 
   // Test timers
   timer_container a_timers;
 
+  // Test case identifiers:
   // Session-Id's
   std::map<std::string /* session id's */, TestCase*> a_sessionIdTestCaseMap; // stores used Session-Id values within a test case.
                                                                               // No other can use them, but a test case could use more than one.
+  // Subscriber's
+  std::map<std::string /* subscriber id's */, TestCase*> a_subscriberIdTestCaseMap; // stores used Subscriber-Id values within a test case.
+
+
+
+  StatSummary a_statSummary; // general statistics
 
 
   TestManager();
@@ -86,9 +116,11 @@ class TestManager : public anna::timex::TimeEventObserver, public anna::Singleto
   void cancelTimer(TestTimer*) throw();
   void release(anna::timex::TimeEvent*) throw();
 
+
   public:
 
     void registerSessionId(const std::string &sessionId, const TestCase *testCase) throw(anna::RuntimeException);
+    void registerSubscriberId(const std::string &subscriberId, const TestCase *testCase) throw(anna::RuntimeException);
 
     int tests() const throw() { return a_testPool.size(); }
     void setTimerController(anna::timex::Engine *engine) throw() {  a_timeController = engine; }
@@ -98,8 +130,23 @@ class TestManager : public anna::timex::TimeEventObserver, public anna::Singleto
 
     void setDumpHex(bool dh) throw() { a_dumpHexMessages = dh; }
     bool getDumpHex() const throw() { return a_dumpHexMessages; }
-    void setDumpReports(bool dr) throw() { a_dumpReports = dr; }
-    bool getDumpReports() const throw() { return a_dumpReports; }
+
+
+    void setDumpInitializedReports(bool enable) throw() { a_dumpInitializedReports = enable; }
+    void setDumpInProgressReports(bool enable) throw() { a_dumpInProgressReports = enable; }
+    void setDumpFailedReports(bool enable) throw() { a_dumpFailedReports = enable; }
+    void setDumpSuccessReports(bool enable) throw() { a_dumpSuccessReports = enable; }
+    void setDumpAllReports(bool enable) throw() {
+      setDumpInitializedReports(enable);
+      setDumpInProgressReports(enable);
+      setDumpFailedReports(enable);
+      setDumpSuccessReports(enable);
+    }
+
+    bool getDumpInitializedReports() const throw() { return a_dumpInitializedReports; }
+    bool getDumpInProgressReports() const throw() { return a_dumpInProgressReports; }
+    bool getDumpFailedReports() const throw() { return a_dumpFailedReports; }
+    bool getDumpSuccessReports() const throw() { return a_dumpSuccessReports; }
 
     // Helper to calculate time interval and synchronous amount of execution tests to guarantee the input rate (tests per second)
     //  through the time manager which has a minimum resolution of ADML minimum resolution. The first call to this method will
@@ -108,10 +155,11 @@ class TestManager : public anna::timex::TimeEventObserver, public anna::Singleto
 
     bool clearPool() throw();
     bool resetPool(bool hard /* hard reset includes in-progress test cases */) throw();
-    void setPoolRepeat(bool repeat) throw() { a_poolRepeat = repeat; }
-    bool getPoolRepeat() const throw() { return a_poolRepeat; }
-    unsigned int getInProgressCount() const throw() { return a_inProgressCount; }
-    void setInProgressCountDelta(unsigned int delta) throw() { a_inProgressCount += delta; }
+    void setPoolRepeats(int repeats) throw() { a_poolRepeats = repeats; }
+    int getPoolRepeats() const throw() { return a_poolRepeats; }
+    int getPoolCycle() const throw() { return a_poolCycle; }
+
+    unsigned int getInProgressCount() const throw() { return a_statSummary.getInProgressCount(); }
     unsigned int getInProgressLimit() const throw() { return a_inProgressLimit; }
     void setInProgressLimit(unsigned int limit) throw() { a_inProgressLimit = limit; } // 0 = UINT_MAX (no limit)
 
@@ -121,17 +169,24 @@ class TestManager : public anna::timex::TimeEventObserver, public anna::Singleto
 
     // Main logic
     TestCase *getTestCaseFromSessionId(const anna::DataBlock &message, std::string &sessionId) throw();
-    void receiveMessage(const anna::DataBlock &message, const anna::diameter::comm::ClientSession *clientSession) throw(anna::RuntimeException);
-    void receiveMessage(const anna::DataBlock &message, const anna::diameter::comm::ServerSession *serverSession) throw(anna::RuntimeException);
+    TestCase *getTestCaseFromSubscriberId(const anna::DataBlock &message, std::string &subscriberId) throw();
+    void receiveMessage(const anna::DataBlock &message, OriginHost *host, const anna::diameter::comm::ClientSession *clientSession) throw(anna::RuntimeException);
+    void receiveMessage(const anna::DataBlock &message, OriginHost *host, const anna::diameter::comm::ServerSession *serverSession) throw(anna::RuntimeException);
 
     anna::xml::Node* asXML(anna::xml::Node* parent) const throw();
     std::string asXMLString() const throw();
 
+    // stats
+    void tcsStateStats(const TestCase::State::_v beginState, const TestCase::State::_v endState) throw() {
+      a_statSummary.newTCState(beginState, endState);
+    }
+
 
   friend class anna::Singleton <TestManager>;
   friend class TestStepTimeout; // createTimer
   friend class TestStepDelay; // createTimer
   friend class TestClock; // tick
+  friend class Launcher; // tick
 };
 
 #endif