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 example_diameter_launcher_TestManager_hpp
10 #define example_diameter_launcher_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>
21 #include <TestTimer.hpp>
43 typedef std::map<unsigned int /* test case id */, TestCase*> test_pool_t;
44 typedef std::map<unsigned int /* test case id */, TestCase*>::const_iterator test_pool_it;
45 typedef std::map<unsigned int /* test case id */, TestCase*>::iterator test_pool_nc_it;
49 Timer Manager for testing system
51 class TestManager : public anna::timex::TimeEventObserver, public anna::Singleton <TestManager> {
52 typedef anna::Recycler <TestTimer> timer_container;
54 anna::timex::Engine* a_timeController;
57 std::string a_reportsDirectory;
59 bool a_dumpHexMessages;
62 test_pool_t a_testPool;
63 test_pool_it a_currentTestIt;
64 bool a_poolRepeat; // repeat pool when finish
65 unsigned int a_inProgressCount;
66 unsigned int a_inProgressLimit; // limit load to have this value
69 int a_synchronousAmount;
72 bool nextTestCase() throw();
75 timer_container a_timers;
78 std::map<std::string /* session id's */, TestCase*> a_sessionIdTestCaseMap; // stores used Session-Id values within a test case.
79 // No other can use them, but a test case could use more than one.
83 TestManager(const TestManager&);
85 TestTimer* createTimer(TestCaseStep*, const anna::Millisecond &, const TestTimer::Type::_v type) throw(anna::RuntimeException);
86 void cancelTimer(TestTimer*) throw();
87 void release(anna::timex::TimeEvent*) throw();
91 void registerSessionId(const std::string &sessionId, const TestCase *testCase) throw(anna::RuntimeException);
93 int tests() const throw() { return a_testPool.size(); }
94 void setTimerController(anna::timex::Engine *engine) throw() { a_timeController = engine; }
96 void setReportsDirectory(const std::string &rd) throw() { a_reportsDirectory = rd; }
97 const std::string &getReportsDirectory() const throw() { return a_reportsDirectory; }
99 void setDumpHex(bool dh) throw() { a_dumpHexMessages = dh; }
100 bool getDumpHex() const throw() { return a_dumpHexMessages; }
101 void setDumpReports(bool dr) throw() { a_dumpReports = dr; }
102 bool getDumpReports() const throw() { return a_dumpReports; }
104 // Helper to calculate time interval and synchronous amount of execution tests to guarantee the input rate (tests per second)
105 // through the time manager which has a minimum resolution of ADML minimum resolution. The first call to this method will
106 // start the time trigger system and check for new test cases to be launched.
107 bool configureTTPS(int testTicksPerSecond) throw();
109 bool clearPool() throw();
110 bool resetPool(bool hard /* hard reset includes in-progress test cases */) throw();
111 void setPoolRepeat(bool repeat) throw() { a_poolRepeat = repeat; }
112 bool getPoolRepeat() const throw() { return a_poolRepeat; }
113 unsigned int getInProgressCount() const throw() { return a_inProgressCount; }
114 void setInProgressCountDelta(unsigned int delta) throw() { a_inProgressCount += delta; }
115 unsigned int getInProgressLimit() const throw() { return a_inProgressLimit; }
116 void setInProgressLimit(unsigned int limit) throw() { a_inProgressLimit = limit; } // 0 = UINT_MAX (no limit)
118 bool gotoTestCase(unsigned int id) throw();
119 TestCase *findTestCase(unsigned int id) const throw(); // id = -1 provides current test case triggered
120 TestCase *getTestCase(unsigned int id) throw(); // creates/reuses a test case
123 TestCase *getTestCaseFromSessionId(const anna::DataBlock &message, std::string &sessionId) throw();
124 void receiveMessage(const anna::DataBlock &message, const anna::diameter::comm::ClientSession *clientSession) throw(anna::RuntimeException);
125 void receiveMessage(const anna::DataBlock &message, const anna::diameter::comm::ServerSession *serverSession) throw(anna::RuntimeException);
127 anna::xml::Node* asXML(anna::xml::Node* parent) const throw();
128 std::string asXMLString() const throw();
131 friend class anna::Singleton <TestManager>;
132 friend class TestStepTimeout; // createTimer
133 friend class TestStepDelay; // createTimer
134 friend class TestClock; // tick