1 // ANNA - Anna is Not Nothingness Anymore //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo //
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 //
9 #ifndef anna_testing_TestManager_hpp
10 #define anna_testing_TestManager_hpp
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>
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;
50 Timer Manager for testing system
52 class TestManager : public anna::timex::TimeEventObserver, public anna::Singleton <TestManager> {
54 // Statistics summary:
57 unsigned int a_initializedTcs;
58 unsigned int a_inprogressTcs;
59 unsigned int a_failedTcs;
60 unsigned int a_sucessTcs;
63 StatSummary() { clear(); }
64 void newTCState(const TestCase::State::_v beginState, const TestCase::State::_v endState) throw();
66 unsigned int getInProgressCount() const throw() { return a_inprogressTcs; }
67 anna::xml::Node* asXML(anna::xml::Node* parent) const throw();
72 typedef anna::Recycler <TestTimer> timer_container;
74 anna::timex::Engine* a_timeController;
77 std::string a_reportsDirectory;
78 bool a_dumpInitializedReports, a_dumpInProgressReports, a_dumpFailedReports, a_dumpSuccessReports;
79 bool a_dumpHexMessages;
82 test_pool_t a_testPool;
83 test_pool_it a_currentTestIt;
84 int a_poolRepeats; // repeat pool N times
85 int a_poolCycle; // current cycle, from 1 to N
86 unsigned int a_inProgressLimit; // limit load to have this value
87 bool a_autoResetHard; // automatic reset on next cycle (soft by default, false)
90 int a_synchronousAmount;
93 bool nextTestCase() throw();
96 timer_container a_timers;
98 // Test case identifiers:
100 std::map<std::string /* session id's */, TestCase*> a_sessionIdTestCaseMap; // stores used Session-Id values within a test case.
101 // No other can use them, but a test case could use more than one.
103 std::map<std::string /* subscriber id's */, TestCase*> a_subscriberIdTestCaseMap; // stores used Subscriber-Id values within a test case.
107 StatSummary a_statSummary; // general statistics
111 TestManager(const TestManager&);
112 virtual ~TestManager() {;}
114 TestTimer* createTimer(TestCaseStep*, const anna::Millisecond &, const TestTimer::Type::_v type) throw(anna::RuntimeException);
115 void cancelTimer(TestTimer*) throw();
116 void release(anna::timex::TimeEvent*) throw();
121 void registerSessionId(const std::string &sessionId, const TestCase *testCase) throw(anna::RuntimeException);
122 void registerSubscriberId(const std::string &subscriberId, const TestCase *testCase) throw(anna::RuntimeException);
124 int tests() const throw() { return a_testPool.size(); }
125 void setTimerController(anna::timex::Engine *engine) throw() { a_timeController = engine; }
127 void setReportsDirectory(const std::string &rd) throw() { a_reportsDirectory = rd; }
128 const std::string &getReportsDirectory() const throw() { return a_reportsDirectory; }
130 void setDumpHex(bool dh) throw() { a_dumpHexMessages = dh; }
131 bool getDumpHex() const throw() { return a_dumpHexMessages; }
134 void setDumpInitializedReports(bool enable) throw() { a_dumpInitializedReports = enable; }
135 void setDumpInProgressReports(bool enable) throw() { a_dumpInProgressReports = enable; }
136 void setDumpFailedReports(bool enable) throw() { a_dumpFailedReports = enable; }
137 void setDumpSuccessReports(bool enable) throw() { a_dumpSuccessReports = enable; }
138 void setDumpAllReports(bool enable) throw() {
139 setDumpInitializedReports(enable);
140 setDumpInProgressReports(enable);
141 setDumpFailedReports(enable);
142 setDumpSuccessReports(enable);
145 bool getDumpInitializedReports() const throw() { return a_dumpInitializedReports; }
146 bool getDumpInProgressReports() const throw() { return a_dumpInProgressReports; }
147 bool getDumpFailedReports() const throw() { return a_dumpFailedReports; }
148 bool getDumpSuccessReports() const throw() { return a_dumpSuccessReports; }
150 // Helper to calculate time interval and synchronous amount of execution tests to guarantee the input rate (tests per second)
151 // 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.
152 bool configureTTPS(int testTicksPerSecond) throw();
154 bool clearPool() throw();
155 bool resetPool(bool hard /* hard reset includes in-progress test cases */) throw();
156 void setPoolRepeats(int repeats) throw() { a_poolRepeats = repeats; }
157 int getPoolRepeats() const throw() { return a_poolRepeats; }
158 int getPoolCycle() const throw() { return a_poolCycle; }
160 bool getAutoResetHard() const throw() { return a_autoResetHard; }
161 void setAutoResetHard(bool hard = true) throw() { a_autoResetHard = hard; }
164 unsigned int getInProgressCount() const throw() { return a_statSummary.getInProgressCount(); }
165 unsigned int getInProgressLimit() const throw() { return a_inProgressLimit; }
166 void setInProgressLimit(unsigned int limit) throw() { a_inProgressLimit = limit; } // 0 = UINT_MAX (no limit)
168 bool gotoTestCase(unsigned int id) throw();
169 TestCase *findTestCase(unsigned int id) const throw(); // id = -1 provides current test case triggered
170 TestCase *getTestCase(unsigned int id) throw(); // creates/reuses a test case
173 TestCase *getTestCaseFromSessionId(const anna::DataBlock &message, std::string &sessionId) throw();
174 TestCase *getTestCaseFromSubscriberId(const anna::DataBlock &message, std::string &subscriberId) throw();
175 void receiveMessage(const anna::DataBlock &message, const anna::diameter::comm::ClientSession *clientSession) throw(anna::RuntimeException);
176 void receiveMessage(const anna::DataBlock &message, const anna::diameter::comm::ServerSession *serverSession) throw(anna::RuntimeException);
178 bool execTestCases(int sync_amount) throw();
180 anna::xml::Node* asXML(anna::xml::Node* parent) const throw();
181 std::string asXMLString() const throw();
184 void tcsStateStats(const TestCase::State::_v beginState, const TestCase::State::_v endState) throw() {
185 a_statSummary.newTCState(beginState, endState);
189 friend class anna::Singleton <TestManager>;
190 friend class TestStepTimeout; // createTimer
191 friend class TestStepDelay; // createTimer
192 friend class TestClock; // tick