10ca0972e5831204c66506b6e475677083895ab9
[anna.git] / example / diameter / launcher / testing / TestManager.hpp
1 // ANNA - Anna is Not Nothingness Anymore                                                         //
2 //                                                                                                //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo                         //
4 //                                                                                                //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite                           //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
7
8
9 #ifndef example_diameter_launcher_TestManager_hpp
10 #define example_diameter_launcher_TestManager_hpp
11
12 // Project
13 #include <anna/config/defines.hpp>
14 #include <anna/core/util/Recycler.hpp>
15 #include <anna/core/Singleton.hpp>
16 #include <anna/timex/TimeEventObserver.hpp>
17 #include <anna/core/RuntimeException.hpp>
18 #include <anna/core/DataBlock.hpp>
19
20 // Process
21 #include <TestTimer.hpp>
22 #include <TestCase.hpp>
23
24
25 namespace anna {
26   class Millisecond;
27
28   namespace timex {
29     class Engine;
30   }
31   namespace diameter {
32     namespace comm {
33       class ClientSession;
34       class ServerSession;
35     }
36   }
37 }
38
39
40 class TestClock;
41 class TestCase;
42 class TestCaseStep;
43 class OriginHost;
44
45
46 typedef std::map<unsigned int /* test case id */, TestCase*> test_pool_t;
47 typedef std::map<unsigned int /* test case id */, TestCase*>::const_iterator test_pool_it;
48 typedef std::map<unsigned int /* test case id */, TestCase*>::iterator test_pool_nc_it;
49
50
51 /**
52    Timer Manager for testing system
53 */
54 class TestManager : public anna::timex::TimeEventObserver, public anna::Singleton <TestManager> {
55
56   // Statistics summary:
57   class StatSummary {
58
59     unsigned int a_initializedTcs;
60     unsigned int a_inprogressTcs;
61     unsigned int a_failedTcs;
62     unsigned int a_sucessTcs;
63
64   public:
65     StatSummary() { clear(); }
66     void newTCState(const TestCase::State::_v beginState, const TestCase::State::_v endState) throw();
67     void clear() throw();
68     unsigned int getInProgressCount() const throw() { return a_inprogressTcs; }
69     anna::xml::Node* asXML(anna::xml::Node* parent) const throw();
70   };
71
72
73
74   typedef anna::Recycler <TestTimer> timer_container;
75
76   anna::timex::Engine* a_timeController;
77
78   // reports
79   std::string a_reportsDirectory;
80   bool a_dumpInitializedReports, a_dumpInProgressReports, a_dumpFailedReports, a_dumpSuccessReports;
81   bool a_dumpHexMessages;
82
83   // Pool of test cases
84   test_pool_t a_testPool;
85   test_pool_it a_currentTestIt;
86   int a_poolRepeats; // repeat pool N times
87   int a_poolCycle; // current cycle, from 1 to N
88   unsigned int a_inProgressLimit; // limit load to have this value
89
90   // Test clock
91   int a_synchronousAmount;
92   TestClock *a_clock;
93   bool tick() throw();
94   bool execTestCases(int sync_amount) throw();
95   bool nextTestCase() throw();
96
97   // Test timers
98   timer_container a_timers;
99
100   // Session-Id's
101   std::map<std::string /* session id's */, TestCase*> a_sessionIdTestCaseMap; // stores used Session-Id values within a test case.
102                                                                               // No other can use them, but a test case could use more than one.
103
104   StatSummary a_statSummary; // general statistics
105
106
107   TestManager();
108   TestManager(const TestManager&);
109
110   TestTimer* createTimer(TestCaseStep*, const anna::Millisecond &, const TestTimer::Type::_v type) throw(anna::RuntimeException);
111   void cancelTimer(TestTimer*) throw();
112   void release(anna::timex::TimeEvent*) throw();
113
114
115   public:
116
117     void registerSessionId(const std::string &sessionId, const TestCase *testCase) throw(anna::RuntimeException);
118
119     int tests() const throw() { return a_testPool.size(); }
120     void setTimerController(anna::timex::Engine *engine) throw() {  a_timeController = engine; }
121
122     void setReportsDirectory(const std::string &rd) throw() { a_reportsDirectory = rd; }
123     const std::string &getReportsDirectory() const throw() { return a_reportsDirectory; }
124
125     void setDumpHex(bool dh) throw() { a_dumpHexMessages = dh; }
126     bool getDumpHex() const throw() { return a_dumpHexMessages; }
127
128
129     void setDumpInitializedReports(bool enable) throw() { a_dumpInitializedReports = enable; }
130     void setDumpInProgressReports(bool enable) throw() { a_dumpInProgressReports = enable; }
131     void setDumpFailedReports(bool enable) throw() { a_dumpFailedReports = enable; }
132     void setDumpSuccessReports(bool enable) throw() { a_dumpSuccessReports = enable; }
133     void setDumpAllReports(bool enable) throw() {
134       setDumpInitializedReports(enable);
135       setDumpInProgressReports(enable);
136       setDumpFailedReports(enable);
137       setDumpSuccessReports(enable);
138     }
139
140     bool getDumpInitializedReports() const throw() { return a_dumpInitializedReports; }
141     bool getDumpInProgressReports() const throw() { return a_dumpInProgressReports; }
142     bool getDumpFailedReports() const throw() { return a_dumpFailedReports; }
143     bool getDumpSuccessReports() const throw() { return a_dumpSuccessReports; }
144
145     // Helper to calculate time interval and synchronous amount of execution tests to guarantee the input rate (tests per second)
146     //  through the time manager which has a minimum resolution of ADML minimum resolution. The first call to this method will
147     //  start the time trigger system and check for new test cases to be launched.
148     bool configureTTPS(int testTicksPerSecond) throw();
149
150     bool clearPool() throw();
151     bool resetPool(bool hard /* hard reset includes in-progress test cases */) throw();
152     void setPoolRepeats(int repeats) throw() { a_poolRepeats = repeats; }
153     int getPoolRepeats() const throw() { return a_poolRepeats; }
154     int getPoolCycle() const throw() { return a_poolCycle; }
155
156     unsigned int getInProgressCount() const throw() { return a_statSummary.getInProgressCount(); }
157     unsigned int getInProgressLimit() const throw() { return a_inProgressLimit; }
158     void setInProgressLimit(unsigned int limit) throw() { a_inProgressLimit = limit; } // 0 = UINT_MAX (no limit)
159
160     bool gotoTestCase(unsigned int id) throw();
161     TestCase *findTestCase(unsigned int id) const throw(); // id = -1 provides current test case triggered
162     TestCase *getTestCase(unsigned int id) throw(); // creates/reuses a test case
163
164     // Main logic
165     TestCase *getTestCaseFromSessionId(const anna::DataBlock &message, std::string &sessionId) throw();
166     void receiveMessage(const anna::DataBlock &message, OriginHost *host, const anna::diameter::comm::ClientSession *clientSession) throw(anna::RuntimeException);
167     void receiveMessage(const anna::DataBlock &message, OriginHost *host, const anna::diameter::comm::ServerSession *serverSession) throw(anna::RuntimeException);
168
169     anna::xml::Node* asXML(anna::xml::Node* parent) const throw();
170     std::string asXMLString() const throw();
171
172     // stats
173     void tcsStateStats(const TestCase::State::_v beginState, const TestCase::State::_v endState) throw() {
174       a_statSummary.newTCState(beginState, endState);
175     }
176
177
178   friend class anna::Singleton <TestManager>;
179   friend class TestStepTimeout; // createTimer
180   friend class TestStepDelay; // createTimer
181   friend class TestClock; // tick
182   friend class Launcher; // tick
183 };
184
185 #endif