Remove dynamic exceptions
[anna.git] / include / anna / testing / TestStep.hpp
index 782ce55..8f771cc 100644 (file)
 #include <string>
 #include <vector>
 #include <thread>
+#include <atomic>
 
 // Project
 #include <anna/core/DataBlock.hpp>
-#include <anna/testing/TestCondition.hpp>
+#include <anna/testing/TestDiameterCondition.hpp>
 #include <anna/core/util/Millisecond.hpp>
 
 
@@ -49,31 +50,32 @@ class TestStep {
     anna::Millisecond a_endTimestamp; // unix time
     bool a_executed; // used for interactive mode in order to not repeat a execution step if before completing, the user add interactive amount
 
-    void setBeginTimestamp(const anna::Millisecond &t) throw() { a_beginTimestamp = t; }
-    const anna::Millisecond &getBeginTimestamp() const throw() { return a_beginTimestamp; }
-    void setEndTimestamp(const anna::Millisecond &t) throw() { a_endTimestamp = t; }
-    const anna::Millisecond &getEndTimestamp() const throw() { return a_endTimestamp; }
+    void setBeginTimestamp(const anna::Millisecond &t) { a_beginTimestamp = t; }
+    const anna::Millisecond &getBeginTimestamp() const { return a_beginTimestamp; }
+    void setEndTimestamp(const anna::Millisecond &t) { a_endTimestamp = t; }
+    const anna::Millisecond &getEndTimestamp() const { return a_endTimestamp; }
 
     void initialize(TestCase *testCase);
 
   public:
-    struct Type { enum _v { Unconfigured, Timeout, Sendxml2e, Sendxml2c, Delay, Wait, Cmd }; };
-    static const char* asText(const Type::_v type) throw();
+    struct Type { enum _v { Unconfigured, Timeout, Sendxml2e, Sendxml2c, Delay, Wait, Cmd, IpLimit }; };
+    static const char* asText(const Type::_v type) ;
 
     TestStep(TestCase *testCase) : a_message(true), a_messageCodec(NULL), a_executed(false) { initialize(testCase); }
     virtual ~TestStep() {;}
 
     // setter & getters
-    const Type::_v &getType() const throw() { return a_type; }
-    const int &getNumber() const throw() { return a_number; }
-    bool isCompleted() const throw() { return a_completed; }
-
-    bool execute() throw();
-    void complete() throw();
-    void reset() throw();
-    void next() throw();
-    virtual anna::xml::Node* asXML(anna::xml::Node* parent) throw();
-    std::string asXMLString() throw();
+    const Type::_v &getType() const { return a_type; }
+    const int &getNumber() const { return a_number; }
+    bool isCompleted() const { return a_completed; }
+    anna::Millisecond getLapseMs() const { return a_endTimestamp - a_beginTimestamp; }
+
+    bool execute() ;
+    void complete() ;
+    void reset() ;
+    void next() ;
+    virtual anna::xml::Node* asXML(anna::xml::Node* parent) ;
+    std::string asXMLString() ;
 
   protected:
     TestCase *a_testCase;
@@ -83,14 +85,14 @@ class TestStep {
     // Message (not for all step types)
     anna::DataBlock a_message;
     anna::diameter::codec::Message *a_messageCodec; // used as helper and for traffic logs
-    bool decodeMessage(bool trust = false) throw(); // If trust=true: decoding the previously encoded message (sendxml sentences).
+    bool decodeMessage(bool trust = false) ; // If trust=true: decoding the previously encoded message (sendxml sentences).
                                                     // The only error would be validation ones, and we are going to ignore them here.
 
-    virtual bool do_execute() throw() = 0; // returns true if next step must be executed
-    virtual void do_complete() throw() = 0; // end of transaction (delay/timeout expired, wait condition fulfilled, sending done)
+    virtual bool do_execute()  = 0; // returns true if next step must be executed
+    virtual void do_complete()  = 0; // end of transaction (delay/timeout expired, wait condition fulfilled, sending done)
                                             // In all cases, the next step will be executed except 'timeout' which is asynchronous
                                             //  and will move to the next step just after timer creation (no complete waited)
-    virtual void do_reset() throw() = 0;
+    virtual void do_reset()  = 0;
 };
 
 
@@ -101,20 +103,22 @@ class TestStepTimeout : public TestStep {
 
   public:
     TestStepTimeout(TestCase *testCase) : TestStep(testCase), a_timeout(0), a_timer(NULL) { a_type = Type::Timeout; }
+    ~TestStepTimeout() { do_reset(); }
 
     // setter & getters
-    void setTimeout(const anna::Millisecond &t) throw() { a_timeout = t; }
-    const anna::Millisecond &getTimeout() const throw() { return a_timeout; }
+    void setTimeout(const anna::Millisecond &t) { a_timeout = t; }
+    const anna::Millisecond &getTimeout() const { return a_timeout; }
 
     // virtuals
-    bool do_execute() throw();
-    void do_complete() throw(); // timeout reached, test case failed
-    void do_reset() throw();
-    anna::xml::Node* asXML(anna::xml::Node* parent) throw();
+    bool do_execute() ;
+    void do_complete() ; // timeout reached, test case failed
+    void do_reset() ;
+    void cancelTimer() ;
+    anna::xml::Node* asXML(anna::xml::Node* parent) ;
 };
 
 
-class TestStepSendxml : public TestStep {
+class TestStepSendDiameterXml : public TestStep {
 
   protected:
     // possible end points:
@@ -127,35 +131,35 @@ class TestStepSendxml : public TestStep {
     bool a_expired; // a_endTimestamp will be the expiration reception timestamp
 
   public:
-    TestStepSendxml(TestCase *testCase) : TestStep(testCase),
+    TestStepSendDiameterXml(TestCase *testCase) : TestStep(testCase),
       a_expired(false),
       a_originHost(NULL),
       a_waitForRequestStepNumber(-1) {;}
-    ~TestStepSendxml() {;}
+    ~TestStepSendDiameterXml() { do_reset(); }
 
     // setter & getters
-    void setOriginHost(anna::diameter::comm::OriginHost *host) throw() { a_originHost = host; }
-    anna::diameter::comm::OriginHost *getOriginHost() const throw() { return a_originHost; }
-    void setWaitForRequestStepNumber(int stepNumber) throw() { a_waitForRequestStepNumber = stepNumber; }
-    int getWaitForRequestStepNumber() const throw() { return a_waitForRequestStepNumber; }
-    void setMsgDataBlock(const anna::DataBlock &db) throw() { a_message = db; }
-    const anna::DataBlock &getMsgDataBlock() const throw() { return a_message; }
+    void setOriginHost(anna::diameter::comm::OriginHost *host) { a_originHost = host; }
+    anna::diameter::comm::OriginHost *getOriginHost() const { return a_originHost; }
+    void setWaitForRequestStepNumber(int stepNumber) { a_waitForRequestStepNumber = stepNumber; }
+    int getWaitForRequestStepNumber() const { return a_waitForRequestStepNumber; }
+    void setMsgDataBlock(const anna::DataBlock &db) { a_message = db; }
+    const anna::DataBlock &getMsgDataBlock() const { return a_message; }
 
     // virtuals
-    bool do_execute() throw();
-    void do_complete() throw() {;}
-    void do_reset() throw();
-    anna::xml::Node* asXML(anna::xml::Node* parent) throw();
+    bool do_execute() ;
+    void do_complete() {;}
+    void do_reset() ;
+    anna::xml::Node* asXML(anna::xml::Node* parent) ;
 };
 
-class TestStepSendxml2e : public TestStepSendxml {
+class TestStepSendDiameterXml2e : public TestStepSendDiameterXml {
   public:
-    TestStepSendxml2e(TestCase *testCase) : TestStepSendxml(testCase) { a_type = Type::Sendxml2e; }
+    TestStepSendDiameterXml2e(TestCase *testCase) : TestStepSendDiameterXml(testCase) { a_type = Type::Sendxml2e; }
 };
 
-class TestStepSendxml2c : public TestStepSendxml {
+class TestStepSendDiameterXml2c : public TestStepSendDiameterXml {
   public:
-    TestStepSendxml2c(TestCase *testCase) : TestStepSendxml(testCase) { a_type = Type::Sendxml2c; }
+    TestStepSendDiameterXml2c(TestCase *testCase) : TestStepSendDiameterXml(testCase) { a_type = Type::Sendxml2c; }
 };
 
 
@@ -165,57 +169,59 @@ class TestStepDelay : public TestStep {
 
   public:
     TestStepDelay(TestCase *testCase) : TestStep(testCase), a_delay(0), a_timer(NULL) { a_type = Type::Delay; }
+    ~TestStepDelay() { do_reset(); }
 
     // setter & getters
-    void setDelay(const anna::Millisecond &d) throw() { a_delay = d; }
-    const anna::Millisecond &getDelay() const throw() { return a_delay; }
+    void setDelay(const anna::Millisecond &d) { a_delay = d; }
+    const anna::Millisecond &getDelay() const { return a_delay; }
 
     // virtuals
-    bool do_execute() throw();
-    void do_complete() throw(); // delay reached
-    void do_reset() throw();
-    anna::xml::Node* asXML(anna::xml::Node* parent) throw();
+    bool do_execute() ;
+    void do_complete() ; // delay reached
+    void do_reset() ;
+    void cancelTimer() ;
+    anna::xml::Node* asXML(anna::xml::Node* parent) ;
 };
 
 
-class TestStepWait : public TestStep {
+class TestStepWaitDiameter : public TestStep {
 
-    TestCondition a_condition;
+    TestDiameterCondition a_condition;
     anna::diameter::comm::ClientSession *a_clientSession;
     anna::diameter::comm::ServerSession *a_serverSession;
 
   public:
-    TestStepWait(TestCase *testCase) : TestStep(testCase) {
+    TestStepWaitDiameter(TestCase *testCase) : TestStep(testCase) {
       a_type = Type::Wait;
       a_clientSession = NULL;
       a_serverSession = NULL;
     }
-    ~TestStepWait() {;}
+    ~TestStepWaitDiameter() { do_reset(); }
 
     // setter & getters
     void setCondition(bool fromEntity,
                         const std::string &code, const std::string &bitR, const std::string &hopByHop, const std::string &applicationId,
                         const std::string &sessionId, const std::string &resultCode,
-                        const std::string &msisdn, const std::string &imsi, const std::string &serviceContextId) throw();
-    void setConditionRegexpXml(bool fromEntity, const std::string &regexp) throw();
-    void setConditionRegexpHex(bool fromEntity, const std::string &regexp) throw();
+                        const std::string &msisdn, const std::string &imsi, const std::string &serviceContextId) ;
+    void setConditionRegexpXml(bool fromEntity, const std::string &regexp) ;
+    void setConditionRegexpHex(bool fromEntity, const std::string &regexp) ;
 
-    void setClientSession(anna::diameter::comm::ClientSession *cs) throw() { a_clientSession = cs; }
-    void setServerSession(anna::diameter::comm::ServerSession *ss) throw() { a_serverSession = ss; }
-    anna::diameter::comm::ClientSession *getClientSession() const throw() { return a_clientSession; }
-    anna::diameter::comm::ServerSession *getServerSession() const throw() { return a_serverSession; }
+    void setClientSession(anna::diameter::comm::ClientSession *cs) { a_clientSession = cs; }
+    void setServerSession(anna::diameter::comm::ServerSession *ss) { a_serverSession = ss; }
+    anna::diameter::comm::ClientSession *getClientSession() const { return a_clientSession; }
+    anna::diameter::comm::ServerSession *getServerSession() const { return a_serverSession; }
 
-    const TestCondition &getCondition() const throw() { return a_condition; }
-    //void setMsgDataBlock(const anna::DataBlock &db) throw() { a_message = db; }
-    bool fulfilled(const anna::DataBlock &db/*, bool matchSessionId = true*/) throw();
-    const anna::DataBlock &getMsgDataBlock() const throw() { return a_message; }
+    const TestDiameterCondition &getCondition() const { return a_condition; }
+    //void setMsgDataBlock(const anna::DataBlock &db) { a_message = db; }
+    bool fulfilled(const anna::DataBlock &db/*, bool matchSessionId = true*/) ;
+    const anna::DataBlock &getMsgDataBlock() const { return a_message; }
 
 
     // virtuals
-    bool do_execute() throw(); // this will be executed when test case starts (at least we could measure the time until condition is fulfilled)
-    void do_complete() throw(); // condition fulfilled
-    void do_reset() throw();
-    anna::xml::Node* asXML(anna::xml::Node* parent) throw();
+    bool do_execute() ; // this will be executed when test case starts (at least we could measure the time until condition is fulfilled)
+    void do_complete() ; // condition fulfilled
+    void do_reset() ;
+    anna::xml::Node* asXML(anna::xml::Node* parent) ;
 };
 
 
@@ -223,7 +229,7 @@ class TestStepCmd : public TestStep {
 
   std::string a_script;
   std::thread a_thread;
-  bool a_threadRunning;
+  std::atomic<bool> a_threadRunning;
   bool a_threadDeprecated;
   int a_resultCode;
   std::string a_errorMsg;
@@ -233,27 +239,51 @@ class TestStepCmd : public TestStep {
 
   public:
     TestStepCmd(TestCase *testCase) : TestStep(testCase), a_threadRunning(false), a_threadDeprecated(false), a_resultCode(-2)/*, a_output("")*/, a_errorMsg(""), a_childPid(-1) { a_type = Type::Cmd; }
+    ~TestStepCmd() { do_reset(); }
 
     // setter & getters
-    void setThreadRunning(bool running) throw() { a_threadRunning = running; }
+    void setThreadRunning() { a_threadRunning = true; }
+    void setThreadNotRunning() { a_threadRunning = false; }
+    bool threadRunning() const { return a_threadRunning; }
+    bool threadNotRunning() const { return !a_threadRunning; }
+
+    void setResultCode(int rc) { a_resultCode = rc; }
+    int getResultCode() const { return a_resultCode; }
+    void setErrorMsg(const std::string &em) { a_errorMsg = em; }
+    const std::string &getErrorMsg() const { return a_errorMsg; }
+    //void appendOutput(const std::string &output) { a_output += output; }
+    //const std::string &getOutput() const { return a_output; }
+    void setChildPid(pid_t pid) { a_childPid = pid; }
+    const pid_t &getChildPid() const { return a_childPid; }
+
+    void setScript(const std::string &script) { a_script = script; }
+    const std::string &getScript() const { return a_script; }
+
+    // virtuals
+    bool do_execute() ;
+    void do_complete() ;
+    void do_reset() ;
+    anna::xml::Node* asXML(anna::xml::Node* parent) ;
+};
+
 
-    void setResultCode(int rc) throw() { a_resultCode = rc; }
-    int getResultCode() const throw() { return a_resultCode; }
-    void setErrorMsg(const std::string &em) throw() { a_errorMsg = em; }
-    const std::string &getErrorMsg() const throw() { return a_errorMsg; }
-    //void appendOutput(const std::string &output) throw() { a_output += output; }
-    //const std::string &getOutput() const throw() { return a_output; }
-    void setChildPid(pid_t pid) throw() { a_childPid = pid; }
-    const pid_t &getChildPid() const throw() { return a_childPid; }
+class TestStepIpLimit : public TestStep {
 
-    void setScript(const std::string &script) throw() { a_script = script; }
-    const std::string &getScript() const throw() { return a_script; }
+    unsigned int a_ipLimit;
+
+  public:
+    TestStepIpLimit(TestCase *testCase) : TestStep(testCase), a_ipLimit(1) { a_type = Type::IpLimit; }
+    ~TestStepIpLimit() { do_reset(); }
+
+    // setter & getters
+    void setIpLimit(unsigned int limit) { a_ipLimit = limit; }
+    unsigned int getIpLimit() const { return a_ipLimit; }
 
     // virtuals
-    bool do_execute() throw();
-    void do_complete() throw();
-    void do_reset() throw();
-    anna::xml::Node* asXML(anna::xml::Node* parent) throw();
+    bool do_execute() ;
+    void do_complete() ;
+    void do_reset() {;}
+    anna::xml::Node* asXML(anna::xml::Node* parent) ;
 };
 
 }