// Process
#include <TestTimer.hpp>
+#include <TestCase.hpp>
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;
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:
+ 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
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.
+ StatSummary a_statSummary; // general statistics
+
TestManager();
TestManager(const TestManager&);
void cancelTimer(TestTimer*) throw();
void release(anna::timex::TimeEvent*) throw();
+
public:
void registerSessionId(const std::string &sessionId, const TestCase *testCase) throw(anna::RuntimeException);
void setReportsDirectory(const std::string &rd) throw() { a_reportsDirectory = rd; }
const std::string &getReportsDirectory() const throw() { return a_reportsDirectory; }
- void setDumpReports(bool dr) throw() { a_dumpReports = dr; }
- bool getDumpReports() const throw() { return a_dumpReports; }
+ void setDumpHex(bool dh) throw() { a_dumpHexMessages = dh; }
+ bool getDumpHex() const throw() { return a_dumpHexMessages; }
+
+
+ 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
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)
// 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);
+ 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