Remove dynamic exceptions
[anna.git] / include / anna / 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 anna_testing_TestManager_hpp
10 #define anna_testing_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 #include <anna/testing/TestTimer.hpp>
20 #include <anna/testing/TestCase.hpp>
21
22
23 namespace anna {
24   class Millisecond;
25
26   namespace timex {
27     class Engine;
28   }
29   namespace diameter {
30     namespace comm {
31       class ClientSession;
32       class ServerSession;
33     }
34   }
35
36 namespace testing {
37
38
39 class TestClock;
40 class TestCase;
41 class TestCaseStep;
42
43
44 typedef std::map<unsigned int /* test case id */, TestCase*> test_pool_t;
45 typedef std::map<unsigned int /* test case id */, TestCase*>::const_iterator test_pool_it;
46 typedef std::map<unsigned int /* test case id */, TestCase*>::iterator test_pool_nc_it;
47
48
49 /**
50    Timer Manager for testing system
51 */
52 class TestManager : public anna::timex::TimeEventObserver, public anna::Singleton <TestManager> {
53
54   // Statistics summary:
55   class StatSummary {
56
57     unsigned int a_initializedTcs;
58     unsigned int a_inprogressTcs;
59     unsigned int a_failedTcs;
60     unsigned int a_sucessTcs;
61
62   public:
63     StatSummary() { clear(); }
64     void newTCState(const TestCase::State::_v beginState, const TestCase::State::_v endState) ;
65     void clear() ;
66     unsigned int getInitializedCount() const { return a_initializedTcs; }
67     unsigned int getInProgressCount() const { return a_inprogressTcs; }
68     unsigned int getFailedCount() const { return a_failedTcs; }
69     unsigned int getSuccessCount() const { return a_sucessTcs; }
70     unsigned int getFinishedCount() const { return a_sucessTcs + a_failedTcs; }
71     unsigned int getTotal() const { return (a_initializedTcs + a_inprogressTcs + a_failedTcs + a_sucessTcs); }
72
73     anna::xml::Node* asXML(anna::xml::Node* parent) const ;
74   };
75
76
77
78   typedef anna::Recycler <TestTimer> timer_container;
79
80   anna::timex::Engine* a_timeController;
81
82   // reports
83   std::string a_reportsDirectory;
84   bool a_dumpInitializedReports, a_dumpInProgressReports, a_dumpFailedReports, a_dumpSuccessReports;
85   bool a_dumpHexMessages;
86   bool a_dumpStdout;
87
88   // Pool of test cases
89   test_pool_t a_testPool;
90   test_pool_it a_currentTestIt;
91   int a_poolRepeats; // repeat pool N times
92   int a_poolCycle; // current cycle, from 1 to N
93   unsigned int a_inProgressLimit; // limit load to have this value
94   bool a_autoResetHard; // automatic reset on next cycle (soft by default, false)
95
96   // Test clock
97   int a_synchronousAmount;
98   TestClock *a_clock;
99   bool tick() ;
100   bool nextTestCase() ;
101
102   // Test timers
103   timer_container a_timers;
104
105   // Test case identifiers: key1 (strong); key2 (alternative)
106   std::map<std::string /* key */, TestCase*> a_key1TestCaseMap;
107   std::map<std::string /* key */, TestCase*> a_key2TestCaseMap;
108
109   // Diameter shall use: key1 -> sessionId, key2 -> subscriberId
110   //
111
112   StatSummary a_statSummary; // general statistics
113
114
115   TestManager();
116   TestManager(const TestManager&);
117   virtual ~TestManager() {;}
118
119   TestTimer* createTimer(TestCaseStep*, const anna::Millisecond &, const TestTimer::Type::_v type) noexcept(false);
120   void cancelTimer(TestTimer*) ;
121   void release(anna::timex::TimeEvent*) ;
122
123
124   public:
125
126     void registerKey1(const std::string &key, const TestCase *testCase) noexcept(false);
127     void registerKey2(const std::string &key, const TestCase *testCase) noexcept(false);
128
129     int tests() const { return a_testPool.size(); }
130     void setTimerController(anna::timex::Engine *engine) {  a_timeController = engine; }
131
132     void setReportsDirectory(const std::string &rd) { a_reportsDirectory = rd; }
133     const std::string &getReportsDirectory() const { return a_reportsDirectory; }
134
135     void setDumpHex(bool dh) { a_dumpHexMessages = dh; }
136     bool getDumpHex() const { return a_dumpHexMessages; }
137
138     void setDumpStdout(bool ds) { a_dumpStdout = ds; }
139     bool getDumpStdout() const { return a_dumpStdout; }
140
141     void setDumpInitializedReports(bool enable) { a_dumpInitializedReports = enable; }
142     void setDumpInProgressReports(bool enable) { a_dumpInProgressReports = enable; }
143     void setDumpFailedReports(bool enable) { a_dumpFailedReports = enable; }
144     void setDumpSuccessReports(bool enable) { a_dumpSuccessReports = enable; }
145     void setDumpAllReports(bool enable) {
146       setDumpInitializedReports(enable);
147       setDumpInProgressReports(enable);
148       setDumpFailedReports(enable);
149       setDumpSuccessReports(enable);
150     }
151
152     bool getDumpInitializedReports() const { return a_dumpInitializedReports; }
153     bool getDumpInProgressReports() const { return a_dumpInProgressReports; }
154     bool getDumpFailedReports() const { return a_dumpFailedReports; }
155     bool getDumpSuccessReports() const { return a_dumpSuccessReports; }
156
157     // Helper to calculate time interval and synchronous amount of execution tests to guarantee the input rate (tests per second)
158     //  through the time manager. The first call to this method will start the time trigger system and check for new test cases to be launched.
159     bool configureTTPS(int testTicksPerSecond) ;
160
161     bool clearPool(std::string &result) ;
162     bool resetPool(bool hard /* hard reset includes in-progress test cases */) ;
163     void setPoolRepeats(int repeats) { a_poolRepeats = repeats; }
164     int getPoolRepeats() const { return a_poolRepeats; }
165     int getPoolCycle() const { return a_poolCycle; }
166
167     bool getAutoResetHard() const { return a_autoResetHard; }
168     void setAutoResetHard(bool hard = true) { a_autoResetHard = hard; }
169
170
171     unsigned int getInProgressCount() const { return a_statSummary.getInProgressCount(); }
172     unsigned int getInitializedCount() const { return a_statSummary.getInitializedCount(); }
173     unsigned int getFinishedCount() const { return a_statSummary.getFinishedCount(); }
174     unsigned int getInProgressLimit() const { return a_inProgressLimit; }
175     void setInProgressLimit(unsigned int limit) { a_inProgressLimit = limit; } // -1 = UINT_MAX (no limit)
176
177     bool gotoTestCase(unsigned int id) ;
178     bool runTestCase(unsigned int id) ;
179     TestCase *findTestCase(unsigned int id) const ; // id = -1 provides current test case triggered
180     TestCase *getTestCase(unsigned int id, const std::string &description = "") ; // creates/reuses a test case
181
182     // Diameter-specific
183     TestCase *getDiameterTestCaseFromSessionId(const anna::DataBlock &message, std::string &sessionId) ;
184     TestCase *getDiameterTestCaseFromSubscriberId(const anna::DataBlock &message, std::string &subscriberId) ;
185     void receiveDiameterMessage(const anna::DataBlock &message, const anna::diameter::comm::ClientSession *clientSession) noexcept(false);
186     void receiveDiameterMessage(const anna::DataBlock &message, const anna::diameter::comm::ServerSession *serverSession) noexcept(false);
187
188     // Non-trasactional (kafka)
189     //
190     //
191
192     bool execTestCases(int sync_amount) ;
193
194     anna::xml::Node* asXML(anna::xml::Node* parent) const ;
195     anna::xml::Node* junitAsXML(anna::xml::Node* parent) const ;
196     std::string asXMLString() const ;
197     std::string junitAsXMLString() const ;
198     std::string summaryCounts() const ;
199     std::string summaryStates() const ;
200
201     // stats
202     void tcsStateStats(const TestCase::State::_v beginState, const TestCase::State::_v endState) {
203       a_statSummary.newTCState(beginState, endState);
204     }
205
206
207   friend class anna::Singleton <TestManager>;
208   friend class TestStepTimeout; // createTimer
209   friend class TestStepDelay; // createTimer
210   friend class TestClock; // tick
211 };
212
213 }
214 }
215
216 #endif
217