X-Git-Url: https://git.teslayout.com/public/public/public/?a=blobdiff_plain;f=example%2Fdiameter%2Flauncher%2Ftesting%2FTestCase.cpp;h=3d91f329b281c144260b48855b4efbc14409fe3e;hb=13b6f0196c2091f9e88a0778155cdcb733cfdafd;hp=b3d2f2f42e12f909f46f46fde68a44ea2f331d83;hpb=f9534159f3b43cbf74eccf88723ee740c69eb204;p=anna.git diff --git a/example/diameter/launcher/testing/TestCase.cpp b/example/diameter/launcher/testing/TestCase.cpp index b3d2f2f..3d91f32 100644 --- a/example/diameter/launcher/testing/TestCase.cpp +++ b/example/diameter/launcher/testing/TestCase.cpp @@ -9,6 +9,9 @@ // Standard #include #include +#include +#include +#include // Project #include @@ -25,6 +28,7 @@ #include +/////////////////////////////////////////////////////////////////////////////////////////////////// void TestCase::DebugSummary::addHint(const std::string &hint) throw() { event_t event; event.Timestamp = anna::functions::millisecond(); @@ -48,8 +52,20 @@ anna::xml::Node* TestCase::DebugSummary::asXML(anna::xml::Node* parent) const th return result; }; +/////////////////////////////////////////////////////////////////////////////////////////////////// +TestCase::TestCase(unsigned int id) : + a_id(id), + a_state(State::Initialized), + a_startTime(0), + a_interactiveAmount(-1) { + + /*a_stepsIt = a_steps.end()*/; + TestManager &testManager = TestManager::instantiate(); + testManager.tcsStateStats(State::Initialized, State::Initialized); +} + TestCase::~TestCase() { reset(true); // hard reset std::vector::const_iterator it; @@ -82,6 +98,8 @@ throw() { a_debugSummary.asXML(result); } + result->createAttribute("Interactive", (a_interactiveAmount != -1) ? "yes":"no"); + return result; } @@ -108,10 +126,25 @@ void TestCase::setState(const State::_v &state) throw() { if (state == previousState) return; a_state = state; TestManager &testManager = TestManager::instantiate(); + + // stats: + testManager.tcsStateStats(previousState, state); + + if (isFinished()) { if (!testManager.getDumpReports()) return; // report file name: cycle-.testcase-.xml - std::string file = testManager.getReportsDirectory() + anna::functions::asString("/cycle-%d.testcase-%llu.xml", testManager.getPoolCycle(), a_id); + + // FORMAT: We tabulate the cycle and test case in order to ease ordering of files by mean ls: + int cycles = testManager.getPoolRepeats(); + int tests = testManager.tests(); + int cyclesWidth = (cycles<=0) ? 3 /* 1000 cycles !! */: ((int) log10 ((double) cycles) + 1); + int testsWidth = (tests<=0) ? 9 /* subscribers */: ((int) log10 ((double) tests) + 1); + std::stringstream format; + format << "/cycle-%0" << cyclesWidth << "d.testcase-%0" << testsWidth << "llu.xml"; + + // FILE NAME: + std::string file = testManager.getReportsDirectory() + anna::functions::asString(format.str().c_str(), testManager.getPoolCycle(), a_id); std::ofstream out; out.open(file.c_str(), std::ofstream::out | std::ofstream::app); if(out.is_open() == false) { @@ -125,14 +158,6 @@ void TestCase::setState(const State::_v &state) throw() { out.close(); } } - - // Count in-progress test cases: - if (inProgress()) { - testManager.setInProgressCountDelta(1); - } - else if (previousState == State::InProgress){ - testManager.setInProgressCountDelta(-1); - } } bool TestCase::done() throw() { @@ -145,7 +170,7 @@ bool TestCase::done() throw() { } bool TestCase::process() throw() { - if (a_steps.size() == 0) { + if (steps() == 0) { LOGWARNING(anna::Logger::warning(anna::functions::asString("Test case %llu is empty, nothing to execute", a_id), ANNA_FILE_LOCATION)); return false; } @@ -189,6 +214,7 @@ bool TestCase::reset(bool hard) throw() { a_debugSummary.clear(); a_startTime = 0; + a_interactiveAmount = -1; setState(State::Initialized); @@ -223,7 +249,7 @@ void TestCase::addTimeout(const anna::Millisecond &timeout) throw(anna::RuntimeE assertInitialized(); TestStepTimeout *step = new TestStepTimeout(this); step->setTimeout(timeout); - a_steps.push_back(step); + addStep(step); } void TestCase::addSendxml2e(const anna::DataBlock &db, RealmNode *realm, int stepNumber) throw(anna::RuntimeException) { @@ -231,18 +257,16 @@ void TestCase::addSendxml2e(const anna::DataBlock &db, RealmNode *realm, int ste assertMessage(db, true /* to entity */); if (stepNumber != -1) { - int steps = a_steps.size(); - int stepIndx = stepNumber - 1; - if ((stepIndx < 0) || (stepIndx > (a_steps.size()-1))) - throw anna::RuntimeException(anna::functions::asString("Step number out of range (test case %llu)", a_id), ANNA_FILE_LOCATION); + const TestStep *stepReferred = getStep(stepNumber); + if (!stepReferred) + throw anna::RuntimeException(anna::functions::asString("Step number (%d) do not exists (test case %llu)", stepNumber, a_id), ANNA_FILE_LOCATION); - TestStep *stepReferred = a_steps[stepIndx]; if (stepReferred->getType() != TestStep::Type::Wait) - throw anna::RuntimeException(anna::functions::asString("Step number must refer to a 'wait' step (test case %llu)", a_id), ANNA_FILE_LOCATION); + throw anna::RuntimeException(anna::functions::asString("Step number (%d) must refer to a 'wait' step (test case %llu)", stepNumber, a_id), ANNA_FILE_LOCATION); - const TestCondition &tc = (static_cast(stepReferred))->getCondition(); + const TestCondition &tc = (static_cast(stepReferred))->getCondition(); if (tc.getCode() == "0") { // if regexp used, is not possible to detect this kind of errors - throw anna::RuntimeException(anna::functions::asString("Step number must refer to a 'wait for request' step (test case %llu)", a_id), ANNA_FILE_LOCATION); + throw anna::RuntimeException(anna::functions::asString("Step number (%d) must refer to a 'wait for request' step (test case %llu)", stepNumber, a_id), ANNA_FILE_LOCATION); } } @@ -250,7 +274,7 @@ void TestCase::addSendxml2e(const anna::DataBlock &db, RealmNode *realm, int ste step->setMsgDataBlock(db); step->setRealmNode(realm); step->setWaitForRequestStepNumber(stepNumber); // -1 means, no reference - a_steps.push_back(step); + addStep(step); } void TestCase::addSendxml2c(const anna::DataBlock &db, RealmNode *realm, int stepNumber) throw(anna::RuntimeException) { @@ -260,19 +284,20 @@ void TestCase::addSendxml2c(const anna::DataBlock &db, RealmNode *realm, int ste TestStepSendxml2c *step = new TestStepSendxml2c(this); step->setMsgDataBlock(db); step->setRealmNode(realm); - a_steps.push_back(step); + addStep(step); } void TestCase::addDelay(const anna::Millisecond &delay) throw(anna::RuntimeException) { assertInitialized(); TestStepDelay *step = new TestStepDelay(this); step->setDelay(delay); - a_steps.push_back(step); + addStep(step); } void TestCase::addWait(bool fromEntity, - const std::string &code, const std::string &bitR, const std::string &resultCode, const std::string &sessionId, - const std::string &hopByHop, const std::string &msisdn, const std::string &imsi, const std::string &serviceContextId) throw(anna::RuntimeException) { + 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(anna::RuntimeException) { assertInitialized(); std::string usedHopByHop = hopByHop; TestStepWait *step = NULL; @@ -287,20 +312,19 @@ void TestCase::addWait(bool fromEntity, else { if (hopByHop != "") { if (hopByHop[0] == '#') { - int steps = a_steps.size(); - if (steps == 0) + if (steps() == 0) throw anna::RuntimeException(anna::functions::asString("No steps has been programmed, step reference is nonsense (test case %llu)", a_id), ANNA_FILE_LOCATION); int stepNumber = atoi(hopByHop.substr(1).c_str()); - int stepIndx = stepNumber - 1; - if ((stepIndx < 0) || (stepIndx > (steps-1))) - throw anna::RuntimeException(anna::functions::asString("Step reference number %d out of range [1-%d]", stepNumber, steps), ANNA_FILE_LOCATION); - TestStep *stepReferred = a_steps[stepIndx]; + const TestStep *stepReferred = getStep(stepNumber); + if (!stepReferred) + throw anna::RuntimeException(anna::functions::asString("Step reference number (%d) do not exists (test case %llu)", stepNumber, a_id), ANNA_FILE_LOCATION); + if (stepReferred->getType() != TestStep::Type::Sendxml2e && stepReferred->getType() != TestStep::Type::Sendxml2c) throw anna::RuntimeException(anna::functions::asString("Step number must refer to a 'sendxml2e' or 'sendxml2c' step (test case %llu)", a_id), ANNA_FILE_LOCATION); - const anna::DataBlock &db = (static_cast(stepReferred))->getMsgDataBlock(); + const anna::DataBlock &db = (static_cast(stepReferred))->getMsgDataBlock(); bool isAnswer = anna::diameter::codec::functions::isAnswer(db); if (isAnswer) throw anna::RuntimeException(anna::functions::asString("Step number must refer to a request message (test case %llu)", a_id), ANNA_FILE_LOCATION); @@ -315,14 +339,14 @@ void TestCase::addWait(bool fromEntity, } if (!step) step = new TestStepWait(this); - step->setCondition(fromEntity, code, bitR, resultCode, sessionId, usedHopByHop, msisdn, imsi, serviceContextId); + step->setCondition(fromEntity, code, bitR, usedHopByHop, applicationId, sessionId, resultCode, msisdn, imsi, serviceContextId); LOGWARNING( if (hasSameCondition(step->getCondition())) anna::Logger::warning(anna::functions::asString("The same wait condition has already been programmed in this test case (%llu). Are you sure ?", a_id), ANNA_FILE_LOCATION); ); - a_steps.push_back(step); + addStep(step); } void TestCase::addWaitRegexp(bool fromEntity, const std::string ®exp) throw(anna::RuntimeException) { @@ -336,17 +360,16 @@ void TestCase::addWaitRegexp(bool fromEntity, const std::string ®exp) throw(a anna::Logger::warning(anna::functions::asString("The same wait condition has already been programmed in this test case (%llu). Are you sure ?", a_id), ANNA_FILE_LOCATION); ); - a_steps.push_back(step); + addStep(step); } -void TestCase::addCmd(const std::string &script, const std::string ¶meters) throw(anna::RuntimeException) { +void TestCase::addCommand(const std::string &cmd) throw(anna::RuntimeException) { assertInitialized(); TestStepCmd *step = new TestStepCmd(this); - step->setScript(script); - step->setParameters(parameters); + step->setScript(cmd); - a_steps.push_back(step); + addStep(step); } TestStepWait *TestCase::searchNextWaitConditionFulfilled(const anna::DataBlock &message, bool waitFromEntity) throw() { @@ -364,8 +387,7 @@ TestStepWait *TestCase::searchNextWaitConditionFulfilled(const anna::DataBlock & } const TestStep *TestCase::getStep(int stepNumber) const throw() { - int stepIndx = stepNumber - 1; - if ((stepIndx < 0) || (stepIndx > (a_steps.size()-1))) return NULL; - std::vector::const_iterator it = (a_steps.begin() + stepNumber); - return (*it); + if (stepNumber < 1 || stepNumber > steps()) return NULL; +// return a_steps.at(stepNumber-1); // http://stackoverflow.com/questions/3269809/stdvectorat-vs-operator-surprising-results-5-to-10-times-slower-f + return a_steps[stepNumber-1]; }