use of org.cerberus.crud.entity.TestCaseExecutionQueue in project cerberus-source by cerberustesting.
the class GetExecutionQueue method processRequest.
/**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code>
* methods.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
* @throws org.json.JSONException
* @throws org.cerberus.exception.CerberusException
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, JSONException, CerberusException {
AnswerItem answer = new AnswerItem(new MessageEvent(MessageEventEnum.DATA_OPERATION_OK));
JSONObject jsonResponse = new JSONObject();
ApplicationContext appContext = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
boolean check = ParameterParserUtil.parseBooleanParam(request.getParameter("check"), false);
boolean push = ParameterParserUtil.parseBooleanParam(request.getParameter("push"), false);
if (check) {
IApplicationService applicationService = appContext.getBean(IApplicationService.class);
IInvariantService invariantService = appContext.getBean(IInvariantService.class);
ITestService testService = appContext.getBean(ITestService.class);
ITestCaseService testCaseService = appContext.getBean(ITestCaseService.class);
ICountryEnvParamService cepService = appContext.getBean(ICountryEnvParamService.class);
IParameterService parameterService = appContext.getBean(IParameterService.class);
testCaseExecutionService = appContext.getBean(ITestCaseExecutionService.class);
List<ExecutionValidator> inQueue = new ArrayList<>();
JSONArray testCaseList = new JSONArray(request.getParameter("testcase"));
JSONArray environmentList = new JSONArray(request.getParameter("environment"));
JSONArray countryList = new JSONArray(request.getParameter("countries"));
/**
* Creating all the list from the JSON to call the services
*/
List<TestCase> TCList = new ArrayList<>();
List<String> envList = new ArrayList<>();
List<String> countries = new ArrayList<>();
for (int index = 0; index < testCaseList.length(); index++) {
JSONObject testCaseJson = testCaseList.getJSONObject(index);
TestCase tc = new TestCase();
tc.setTest(testCaseJson.getString("test"));
tc.setTestCase(testCaseJson.getString("testcase"));
TCList.add(tc);
}
for (int index = 0; index < environmentList.length(); index++) {
String environment = environmentList.getString(index);
envList.add(environment);
}
for (int index = 0; index < countryList.length(); index++) {
String country = countryList.getString(index);
countries.add(country);
}
List<TestCaseExecution> tceList = testCaseExecutionService.createAllTestCaseExecution(TCList, envList, countries);
IExecutionCheckService execCheckService = appContext.getBean(IExecutionCheckService.class);
for (TestCaseExecution execution : tceList) {
boolean exception = false;
ExecutionValidator validator = new ExecutionValidator();
try {
execution.setTestObj(testService.convert(testService.readByKey(execution.getTest())));
} catch (CerberusException ex) {
MessageGeneral mes = new MessageGeneral(MessageGeneralEnum.VALIDATION_FAILED_TEST_NOT_FOUND);
mes.setDescription(mes.getDescription().replace("%TEST%", execution.getTest()));
validator.setValid(false);
validator.setMessage(mes.getDescription());
exception = true;
}
try {
execution.setTestCaseObj(testCaseService.findTestCaseByKey(execution.getTest(), execution.getTestCase()));
} catch (CerberusException ex) {
MessageGeneral mes = new MessageGeneral(MessageGeneralEnum.VALIDATION_FAILED_TESTCASE_NOT_FOUND);
mes.setDescription(mes.getDescription().replace("%TEST%", execution.getTest()));
mes.setDescription(mes.getDescription().replace("%TESTCASE%", execution.getTestCase()));
validator.setValid(false);
validator.setMessage(mes.getDescription());
exception = true;
}
try {
execution.setApplicationObj(applicationService.convert(applicationService.readByKey(execution.getTestCaseObj().getApplication())));
} catch (CerberusException ex) {
MessageGeneral mes = new MessageGeneral(MessageGeneralEnum.VALIDATION_FAILED_APPLICATION_NOT_FOUND);
mes.setDescription(mes.getDescription().replace("%APPLI%", execution.getTestCaseObj().getApplication()));
validator.setValid(false);
validator.setMessage(mes.getDescription());
exception = true;
}
execution.setEnvironmentData(execution.getEnvironment());
try {
execution.setCountryEnvParam(cepService.convert(cepService.readByKey(execution.getApplicationObj().getSystem(), execution.getCountry(), execution.getEnvironment())));
} catch (CerberusException ex) {
MessageGeneral mes = new MessageGeneral(MessageGeneralEnum.VALIDATION_FAILED_COUNTRYENV_NOT_FOUND);
mes.setDescription(mes.getDescription().replace("%SYSTEM%", execution.getApplicationObj().getSystem()));
mes.setDescription(mes.getDescription().replace("%COUNTRY%", execution.getCountry()));
mes.setDescription(mes.getDescription().replace("%ENV%", execution.getEnvironmentData()));
validator.setValid(false);
validator.setMessage(mes.getDescription());
exception = true;
}
try {
execution.setEnvironmentDataObj(invariantService.convert(invariantService.readByKey("ENVIRONMENT", execution.getEnvironmentData())));
} catch (CerberusException ex) {
MessageGeneral mes = new MessageGeneral(MessageGeneralEnum.VALIDATION_FAILED_ENVIRONMENT_DOESNOTEXIST);
mes.setDescription(mes.getDescription().replace("%ENV%", execution.getEnvironmentData()));
validator.setValid(false);
validator.setMessage(mes.getDescription());
exception = true;
}
String browser = ParameterParserUtil.parseStringParam(request.getParameter(PARAMETER_BROWSER), DEFAULT_VALUE_BROWSER);
if (!(StringUtil.isNullOrEmpty(browser))) {
// if application is not GUI, we force browser to empty value.
if (execution.getApplicationObj() != null && execution.getApplicationObj().getType() != null && !(execution.getApplicationObj().getType().equalsIgnoreCase(Application.TYPE_GUI))) {
execution.setBrowser("");
}
} else {
execution.setBrowser(browser);
}
String manualExecution = ParameterParserUtil.parseStringParam(request.getParameter(PARAMETER_MANUAL_EXECUTION), DEFAULT_VALUE_MANUAL_EXECUTION);
execution.setManualExecution(manualExecution);
if (exception == false) {
/**
* Checking the execution as it would be checked in the
* engine
*/
MessageGeneral message = execCheckService.checkTestCaseExecution(execution);
if (!(message.equals(new MessageGeneral(MessageGeneralEnum.EXECUTION_PE_CHECKINGPARAMETERS)))) {
validator.setValid(false);
validator.setMessage(message.getDescription());
} else {
validator.setValid(true);
validator.setMessage("Valid Execution.");
}
}
validator.setExecution(execution);
inQueue.add(validator);
}
JSONArray dataArray = new JSONArray();
for (ExecutionValidator tce : inQueue) {
JSONObject exec = new JSONObject();
exec.put("test", tce.getExecution().getTest());
exec.put("testcase", tce.getExecution().getTestCase());
exec.put("env", tce.getExecution().getEnvironment());
exec.put("country", tce.getExecution().getCountry());
exec.put("appType", tce.getExecution().getApplicationObj().getType());
exec.put("isValid", tce.isValid());
exec.put("message", tce.getMessage());
dataArray.put(exec);
}
jsonResponse.put("contentTable", dataArray);
}
if (push) {
IExecutionThreadPoolService executionThreadService = appContext.getBean(IExecutionThreadPoolService.class);
IParameterService parameterService = appContext.getBean(IParameterService.class);
IFactoryTestCaseExecutionQueue inQueueFactoryService = appContext.getBean(IFactoryTestCaseExecutionQueue.class);
ITestCaseExecutionQueueService inQueueService = appContext.getBean(ITestCaseExecutionQueueService.class);
int addedToQueue = 0;
JSONArray toAddList = new JSONArray(request.getParameter("toAddList"));
JSONArray browsers = new JSONArray(request.getParameter("browsers"));
Date requestDate = new Date();
/**
* RETRIEVING ROBOT SETTINGS *
*/
String robot = ParameterParserUtil.parseStringParam(request.getParameter(PARAMETER_ROBOT), null);
String robotIP = ParameterParserUtil.parseStringParam(request.getParameter(PARAMETER_ROBOT_IP), null);
String robotPort = ParameterParserUtil.parseStringParam(request.getParameter(PARAMETER_ROBOT_PORT), null);
String browserVersion = ParameterParserUtil.parseStringParam(request.getParameter(PARAMETER_BROWSER_VERSION), null);
String platform = ParameterParserUtil.parseStringParam(request.getParameter(PARAMETER_PLATFORM), null);
String screenSize = ParameterParserUtil.parseStringParam(request.getParameter(PARAMETER_SCREENSIZE), null);
/**
* RETRIEVING EXECUTION SETTINGS *
*/
String tag = ParameterParserUtil.parseStringParam(request.getParameter(PARAMETER_TAG), "");
int screenshot = ParameterParserUtil.parseIntegerParam(request.getParameter(PARAMETER_SCREENSHOT), DEFAULT_VALUE_SCREENSHOT);
int verbose = ParameterParserUtil.parseIntegerParam(request.getParameter(PARAMETER_VERBOSE), DEFAULT_VALUE_VERBOSE);
String timeout = request.getParameter(PARAMETER_TIMEOUT);
int pageSource = ParameterParserUtil.parseIntegerParam(request.getParameter(PARAMETER_PAGE_SOURCE), DEFAULT_VALUE_PAGE_SOURCE);
int seleniumLog = ParameterParserUtil.parseIntegerParam(request.getParameter(PARAMETER_SELENIUM_LOG), DEFAULT_VALUE_SELENIUM_LOG);
int retries = ParameterParserUtil.parseIntegerParam(request.getParameter(PARAMETER_RETRIES), DEFAULT_VALUE_RETRIES);
String manualExecution = ParameterParserUtil.parseStringParam(request.getParameter(PARAMETER_MANUAL_EXECUTION), DEFAULT_VALUE_MANUAL_EXECUTION);
/**
* RETRIEVING MANUAL ENVIRONMENT SETTINGS *
*/
String manualHost = ParameterParserUtil.parseStringParam(request.getParameter(PARAMETER_MANUAL_HOST), null);
String manualContextRoot = ParameterParserUtil.parseStringParam(request.getParameter(PARAMETER_MANUAL_CONTEXT_ROOT), null);
String manualLoginRelativeURL = ParameterParserUtil.parseStringParam(request.getParameter(PARAMETER_MANUAL_LOGIN_RELATIVE_URL), null);
String manualEnvData = ParameterParserUtil.parseStringParam(request.getParameter(PARAMETER_MANUAL_ENV_DATA), null);
// Create Tag when exist.
if (!StringUtil.isNullOrEmpty(tag)) {
// We create or update it.
ITagService tagService = appContext.getBean(ITagService.class);
tagService.createAuto(tag, "", request.getRemoteUser());
}
for (int index = 0; index < toAddList.length(); index++) {
JSONObject toAdd = toAddList.getJSONObject(index);
int manualURL = 0;
if (toAdd.getString("env").equals("MANUAL")) {
manualURL = 1;
}
try {
// Create the template
TestCaseExecutionQueue tceiq = inQueueFactoryService.create(toAdd.getString("test"), toAdd.getString("testcase"), toAdd.getString("country"), toAdd.getString("env"), robot, robotIP, robotPort, "", browserVersion, platform, screenSize, manualURL, manualHost, manualContextRoot, manualLoginRelativeURL, manualEnvData, tag, screenshot, verbose, timeout, pageSource, seleniumLog, 0, retries, manualExecution, 1000, request.getRemoteUser(), null, null, null);
// Then fill it with either no browser
if ((browsers.length() == 0) || ((toAdd.getString("appType") != null) && (!toAdd.getString("appType").equalsIgnoreCase(Application.TYPE_GUI)))) {
inQueueService.convert(inQueueService.create(tceiq));
addedToQueue++;
} else // Or with required browsers
{
for (int iterBrowser = 0; iterBrowser < browsers.length(); iterBrowser++) {
tceiq.setBrowser(browsers.getString(iterBrowser));
try {
inQueueService.convert(inQueueService.create(tceiq));
addedToQueue++;
} catch (CerberusException e) {
LOG.warn("Unable to insert execution in queue " + tceiq, e);
}
}
}
} catch (FactoryCreationException e) {
LOG.warn("Unable to create the execution queue template", e);
}
}
// Trigger execution if necessary
if (addedToQueue > 0) {
try {
executionThreadService.executeNextInQueueAsynchroneously(false);
} catch (CerberusException ex) {
String errorMessage = "Unable to feed the execution queue due to " + ex.getMessage();
LOG.warn(errorMessage);
answer.setResultMessage(new MessageEvent(MessageEventEnum.DATA_OPERATION_ERROR_UNEXPECTED));
answer.getResultMessage().setDescription(errorMessage);
}
jsonResponse.put("messageType", answer.getResultMessage().getMessage().getCodeString());
jsonResponse.put("message", answer.getResultMessage().getDescription());
jsonResponse.put("addedToQueue", addedToQueue);
jsonResponse.put("redirect", "ReportingExecutionByTag.jsp?Tag=" + StringUtil.encodeAsJavaScriptURIComponent(tag));
}
}
response.setContentType("application/json");
response.getWriter().print(jsonResponse.toString());
}
use of org.cerberus.crud.entity.TestCaseExecutionQueue in project cerberus-source by cerberustesting.
the class FactoryTestCaseExecutionQueue method create.
@Override
public TestCaseExecutionQueue create(String test, String testCase, String country, String environment, String robot, String robotIP, String robotPort, String browser, String browserVersion, String platform, String screenSize, int manualURL, String manualHost, String manualContextRoot, String manualLoginRelativeURL, String manualEnvData, String tag, int screenshot, int verbose, String timeout, int pageSource, int seleniumLog, long exeId, Integer retries, String manualExecution, int priority, String usrCreated, Timestamp dateCreated, String usrModif, Timestamp dateModif) throws FactoryCreationException {
TestCaseExecutionQueue inQueue = create(NEW_ENTRY_INDEX, test, testCase, country, environment, robot, robotIP, robotPort, browser, browserVersion, platform, screenSize, manualURL, manualHost, manualContextRoot, manualLoginRelativeURL, manualEnvData, tag, screenshot, verbose, timeout, pageSource, seleniumLog, exeId, retries, manualExecution, usrCreated, dateCreated, usrModif, dateModif);
inQueue.setState(TestCaseExecutionQueue.State.QUEUED);
inQueue.setComment("");
inQueue.setDebugFlag("N");
inQueue.setPriority(priority);
return inQueue;
}
use of org.cerberus.crud.entity.TestCaseExecutionQueue in project cerberus-source by cerberustesting.
the class FactoryTestCaseExecutionQueue method create.
@Override
public TestCaseExecutionQueue create(long id, String test, String testCase, String country, String environment, String robot, String robotIP, String robotPort, String browser, String browserVersion, String platform, String screenSize, int manualURL, String manualHost, String manualContextRoot, String manualLoginRelativeURL, String manualEnvData, String tag, int screenshot, int verbose, String timeout, int pageSource, int seleniumLog, long exeId, Integer retries, String manualExecution, String usrCreated, Timestamp dateCreated, String usrModif, Timestamp dateModif) throws FactoryCreationException {
try {
TestCaseExecutionQueue inQueue = new TestCaseExecutionQueue();
inQueue.setId(id);
inQueue.setTest(test);
inQueue.setTestCase(testCase);
inQueue.setCountry(country);
inQueue.setEnvironment(environment);
inQueue.setRobot(robot);
inQueue.setRobotIP(robotIP);
inQueue.setRobotPort(robotPort);
inQueue.setBrowser(browser);
inQueue.setBrowserVersion(browserVersion);
inQueue.setPlatform(platform);
inQueue.setScreenSize(screenSize);
inQueue.setManualURL(manualURL);
inQueue.setManualHost(manualHost);
inQueue.setManualContextRoot(manualContextRoot);
inQueue.setManualLoginRelativeURL(manualLoginRelativeURL);
inQueue.setManualEnvData(manualEnvData);
inQueue.setTag(tag);
inQueue.setScreenshot(screenshot);
inQueue.setVerbose(verbose);
inQueue.setTimeout(timeout);
inQueue.setPageSource(pageSource);
inQueue.setSeleniumLog(seleniumLog);
inQueue.setUsrCreated(usrCreated);
inQueue.setUsrModif(usrModif);
inQueue.setDateCreated(dateCreated);
inQueue.setDateModif(dateModif);
inQueue.setRetries(retries);
inQueue.setManualExecution(manualExecution);
inQueue.setExeId(exeId);
inQueue.setState(TestCaseExecutionQueue.State.QUEUED);
inQueue.setComment("");
inQueue.setDebugFlag("N");
inQueue.setPriority(TestCaseExecutionQueue.PRIORITY_DEFAULT);
return inQueue;
} catch (IllegalArgumentException iae) {
throw new FactoryCreationException("Unable to create a TestCaseExecutionInQueue instance", iae);
} catch (IllegalStateException ise) {
throw new FactoryCreationException("Unable to create a TestCaseExecutionInQueue instance", ise);
}
}
use of org.cerberus.crud.entity.TestCaseExecutionQueue in project cerberus-source by cerberustesting.
the class ExecutionRunService method executeTestCase.
@Override
public TestCaseExecution executeTestCase(TestCaseExecution tCExecution) throws CerberusException {
long runID = tCExecution.getId();
String logPrefix = runID + " - ";
/**
* Feeding Build Rev of main Application system to
* testcaseexecutionsysver table. Only if execution is not manual.
*/
try {
if (!(tCExecution.isManualURL())) {
/**
* Insert SystemVersion in Database
*/
TestCaseExecutionSysVer myExeSysVer = null;
try {
LOG.debug(logPrefix + "Registering Main System Version.");
myExeSysVer = factoryTestCaseExecutionSysVer.create(runID, tCExecution.getApplicationObj().getSystem(), tCExecution.getBuild(), tCExecution.getRevision());
testCaseExecutionSysVerService.insertTestCaseExecutionSysVer(myExeSysVer);
} catch (CerberusException ex) {
LOG.error(logPrefix + ex.getMessage());
}
LOG.debug(logPrefix + "Main System Version Registered.");
/**
* For all Linked environment, we also keep track on the
* build/rev information inside testcaseexecutionsysver table.
*/
LOG.debug(logPrefix + "Registering Linked System Version.");
try {
List<CountryEnvLink> ceLink = null;
ceLink = countryEnvLinkService.convert(countryEnvLinkService.readByVarious(tCExecution.getApplicationObj().getSystem(), tCExecution.getCountry(), tCExecution.getEnvironment()));
for (CountryEnvLink myCeLink : ceLink) {
LOG.debug(logPrefix + "Linked environment found : " + myCeLink.getSystemLink() + myCeLink.getCountryLink() + myCeLink.getEnvironmentLink());
CountryEnvParam mycountEnvParam;
try {
mycountEnvParam = this.countryEnvParamService.convert(this.countryEnvParamService.readByKey(myCeLink.getSystemLink(), myCeLink.getCountryLink(), myCeLink.getEnvironmentLink()));
myExeSysVer = factoryTestCaseExecutionSysVer.create(runID, myCeLink.getSystemLink(), mycountEnvParam.getBuild(), mycountEnvParam.getRevision());
testCaseExecutionSysVerService.insertTestCaseExecutionSysVer(myExeSysVer);
} catch (CerberusException ex) {
// Referencial Integrity link between countryEnvLink and CountryEnvParam table should secure that exception to never happen.
LOG.error(logPrefix + ex.getMessage());
throw new CerberusException(ex.getMessageError());
}
}
} catch (CerberusException ex) {
LOG.debug(logPrefix + "No Linked environment found.");
}
LOG.debug(logPrefix + "Linked System Version Registered.");
}
/**
* Get used SeleniumCapabilities (empty if application is not GUI)
*/
LOG.debug(logPrefix + "Getting Selenium capabitities for GUI applications.");
if (tCExecution.getApplicationObj().getType().equalsIgnoreCase(Application.TYPE_GUI)) {
try {
Capabilities caps = this.seleniumServerService.getUsedCapabilities(tCExecution.getSession());
tCExecution.setBrowserFullVersion(caps.getBrowserName() + " " + caps.getVersion() + " " + caps.getPlatform().toString());
tCExecution.setVersion(caps.getVersion());
tCExecution.setPlatform(caps.getPlatform().toString());
} catch (Exception ex) {
LOG.error(logPrefix + "Exception on selenium getting Used Capabilities :" + ex.toString());
}
LOG.debug(logPrefix + "Selenium capabitities loaded.");
} else {
// If Selenium is not needed, the selenium and browser info is set to empty.
tCExecution.setSeleniumIP("");
tCExecution.setSeleniumPort("");
tCExecution.setBrowser("");
tCExecution.setVersion("");
tCExecution.setPlatform("");
tCExecution.setRobotDecli("");
LOG.debug(logPrefix + "No Selenium capabitities loaded because application not GUI : " + tCExecution.getApplicationObj().getType());
}
tCExecution.setRobotDecli(tCExecution.getRobotDecli().replace("%BROWSER%", tCExecution.getBrowser()));
tCExecution.setRobotDecli(tCExecution.getRobotDecli().replace("%BROWSERVERSION%", tCExecution.getVersion()));
tCExecution.setRobotDecli(tCExecution.getRobotDecli().replace("%PLATFORM%", tCExecution.getPlatform()));
/**
* Load PreTestCase information and set PreTCase to the
* TestCaseExecution object
*/
tCExecution.setResultMessage(new MessageGeneral(MessageGeneralEnum.EXECUTION_PE_LOADINGDETAILEDDATA));
LOG.debug(logPrefix + "Loading Pre-testcases.");
List<TestCase> preTests = testCaseService.findTestCaseActiveByCriteria("Pre Testing", tCExecution.getTestCaseObj().getApplication(), tCExecution.getCountry());
tCExecution.setPreTestCaseList(preTests);
if (!(preTests == null)) {
LOG.debug(logPrefix + "Loaded PreTest List. " + tCExecution.getPreTestCaseList().size() + " found.");
}
LOG.debug(logPrefix + "Pre-testcases Loaded.");
/**
* Load Main TestCase with Step dependencies (Actions/Control)
*/
LOG.debug(logPrefix + "Loading all Steps information of Main testcase.");
List<TestCaseStep> testCaseStepList;
testCaseStepList = this.loadTestCaseService.loadTestCaseStep(tCExecution.getTestCaseObj());
tCExecution.getTestCaseObj().setTestCaseStep(testCaseStepList);
LOG.debug(logPrefix + "Steps information of Main testcase Loaded : " + tCExecution.getTestCaseObj().getTestCaseStep().size() + " Step(s) found.");
/**
* Load Pre TestCase with Step dependencies (Actions/Control)
*/
LOG.debug(logPrefix + "Loading all Steps information (Actions & Controls) of all Pre-testcase.");
List<TestCaseStep> preTestCaseStepList = new ArrayList<TestCaseStep>();
List<TestCase> preTestCase = new ArrayList<TestCase>();
for (TestCase myTCase : tCExecution.getPreTestCaseList()) {
myTCase.setTestCaseStep(this.loadTestCaseService.loadTestCaseStep(myTCase));
preTestCaseStepList.addAll(myTCase.getTestCaseStep());
preTestCase.add(myTCase);
LOG.debug(logPrefix + "Pre testcase : " + myTCase.getTest() + "-" + myTCase.getTestCase() + " Loaded With " + myTCase.getTestCaseStep().size() + " Step(s) found.");
}
tCExecution.setPreTestCaseList(preTestCase);
LOG.debug(logPrefix + "All Steps information (Actions & Controls) of all Pre-testcase Loaded.");
/**
* Load All properties of the testcase
*/
LOG.debug(logPrefix + "Loading all Properties.");
List<TestCaseCountryProperties> tcProperties = new ArrayList();
try {
tcProperties = testCaseCountryPropertiesService.findAllWithDependencies(tCExecution.getTest(), tCExecution.getTestCase(), tCExecution.getCountry());
tCExecution.setTestCaseCountryPropertyList(tcProperties);
} catch (CerberusException ex) {
LOG.warn("Exception getting all the properties : " + ex);
}
if (LOG.isDebugEnabled()) {
LOG.debug(logPrefix + "All Properties Loaded. " + tcProperties.size() + " property(ies) found : " + tcProperties);
}
/**
* Start Execution of the steps/Actions/controls Iterate Steps.
* mainExecutionTestCaseStepList will contain the list of steps to
* execute for both pretest and test. This is where we schedule the
* execution of the steps using mainExecutionTestCaseStepList
* object.
*/
LOG.debug(logPrefix + "Starting the execution with step iteration.");
List<TestCaseStep> mainExecutionTestCaseStepList;
mainExecutionTestCaseStepList = new ArrayList<TestCaseStep>();
mainExecutionTestCaseStepList.addAll(preTestCaseStepList);
mainExecutionTestCaseStepList.addAll(testCaseStepList);
/**
* Initialize the global TestCaseExecution Data List.
*/
//
tCExecution.setResultMessage(new MessageGeneral(MessageGeneralEnum.EXECUTION_PE_TESTEXECUTING));
try {
testCaseExecutionService.updateTCExecution(tCExecution);
} catch (CerberusException ex) {
LOG.warn(ex);
}
// Websocket --> we refresh the corresponding Detail Execution pages attached to this execution.
if (tCExecution.isCerberus_featureflipping_activatewebsocketpush()) {
TestCaseExecutionEndPoint.getInstance().send(tCExecution, true);
}
// Evaluate the condition at the step level.
AnswerItem<Boolean> conditionAnswerTc;
AnswerItem<String> answerDecode = new AnswerItem();
boolean conditionDecodeError = false;
/**
* If execution is not manual, evaluate the condition at the step
* level
*/
if (!tCExecution.getManualExecution().equals("Y")) {
try {
answerDecode = variableService.decodeStringCompletly(tCExecution.getConditionVal1(), tCExecution, null, false);
tCExecution.setConditionVal1((String) answerDecode.getItem());
if (!(answerDecode.isCodeStringEquals("OK"))) {
// If anything wrong with the decode --> we stop here with decode message in the action result.
tCExecution.setResultMessage(new MessageGeneral(MessageGeneralEnum.EXECUTION_FA_CONDITIONDECODE).resolveDescription("MES", answerDecode.getMessageDescription()).resolveDescription("FIELD", "TestCase Condition Value1"));
tCExecution.setEnd(new Date().getTime());
LOG.debug("TestCase interupted due to decode 'TestCase Condition Value1' Error.");
conditionDecodeError = true;
}
} catch (CerberusEventException cex) {
LOG.warn(cex);
}
try {
answerDecode = variableService.decodeStringCompletly(tCExecution.getConditionVal2(), tCExecution, null, false);
tCExecution.setConditionVal2((String) answerDecode.getItem());
if (!(answerDecode.isCodeStringEquals("OK"))) {
// If anything wrong with the decode --> we stop here with decode message in the action result.
tCExecution.setResultMessage(new MessageGeneral(MessageGeneralEnum.EXECUTION_FA_CONDITIONDECODE).resolveDescription("MES", answerDecode.getMessageDescription()).resolveDescription("FIELD", "TestCase Condition Value2"));
tCExecution.setEnd(new Date().getTime());
LOG.debug("TestCase interupted due to decode 'TestCase Condition Value2' Error.");
conditionDecodeError = true;
}
} catch (CerberusEventException cex) {
LOG.warn(cex);
}
}
if (!conditionDecodeError) {
conditionAnswerTc = this.conditionService.evaluateCondition(tCExecution.getConditionOper(), tCExecution.getConditionVal1(), tCExecution.getConditionVal2(), tCExecution);
boolean execute_TestCase = (boolean) conditionAnswerTc.getItem();
if (execute_TestCase || tCExecution.getManualExecution().equals("Y")) {
for (TestCaseStep testCaseStep : mainExecutionTestCaseStepList) {
// init the index of the step in case we loop.
int step_index = 1;
boolean execute_Next_Step = false;
TestCaseStepExecution testCaseStepExecution;
int maxloop = parameterService.getParameterIntegerByKey("cerberus_loopstep_max", tCExecution.getApplicationObj().getSystem(), 20);
do {
/**
* Start Execution of TestCaseStep
*/
LOG.debug("Start execution of testcasestep");
long startStep = new Date().getTime();
/**
* Create and Register TestCaseStepExecution
*/
MessageEvent stepMess = new MessageEvent(MessageEventEnum.STEP_PENDING).resolveDescription("STEP", String.valueOf(testCaseStep.getSort())).resolveDescription("STEPINDEX", String.valueOf(step_index));
testCaseStepExecution = factoryTestCaseStepExecution.create(runID, testCaseStep.getTest(), testCaseStep.getTestCase(), testCaseStep.getStep(), step_index, testCaseStep.getSort(), testCaseStep.getLoop(), testCaseStep.getConditionOper(), testCaseStep.getConditionVal1(), testCaseStep.getConditionVal2(), testCaseStep.getConditionVal1(), testCaseStep.getConditionVal2(), null, startStep, 0, startStep, 0, new BigDecimal("0"), null, stepMess, testCaseStep, tCExecution, testCaseStep.getUseStep(), testCaseStep.getUseStepTest(), testCaseStep.getUseStepTestCase(), testCaseStep.getUseStepStep(), testCaseStep.getDescription());
testCaseStepExecution.setLoop(testCaseStep.getLoop());
testCaseStepExecutionService.insertTestCaseStepExecution(testCaseStepExecution);
testCaseStepExecution.setExecutionResultMessage(new MessageGeneral(MessageGeneralEnum.EXECUTION_PE_TESTSTARTED));
/**
* We populate the TestCaseStep inside the execution
* List
*/
tCExecution.addTestCaseStepExecutionList(testCaseStepExecution);
// determine if step is executed (execute_Step) and if we trigger a new step execution after (execute_Next_Step)
boolean execute_Step = true;
boolean conditionStepDecodeError = false;
boolean conditionStepError = false;
AnswerItem<Boolean> conditionAnswer = new AnswerItem<>(new MessageEvent(MessageEventEnum.CONDITIONEVAL_FAILED_UNKNOWNCONDITION));
if (testCaseStepExecution.getLoop().equals(TestCaseStep.LOOP_ONCEIFCONDITIONFALSE) || testCaseStepExecution.getLoop().equals(TestCaseStep.LOOP_ONCEIFCONDITIONTRUE) || testCaseStepExecution.getLoop().equals(TestCaseStep.LOOP_WHILECONDITIONFALSEDO) || testCaseStepExecution.getLoop().equals(TestCaseStep.LOOP_WHILECONDITIONTRUEDO) || testCaseStepExecution.getLoop().equals("") || step_index > 1) {
// Decode Conditionvalue1 and Conditionvalue2 and Evaluate the condition at the Step level.
try {
answerDecode = variableService.decodeStringCompletly(testCaseStepExecution.getConditionVal1(), tCExecution, null, false);
testCaseStepExecution.setConditionVal1((String) answerDecode.getItem());
if (!(answerDecode.isCodeStringEquals("OK"))) {
testCaseStepExecution.setExecutionResultMessage(new MessageGeneral(answerDecode.getResultMessage().getMessage()));
testCaseStepExecution.setStepResultMessage(answerDecode.getResultMessage().resolveDescription("FIELD", "Step Condition Value1"));
testCaseStepExecution.setReturnMessage(answerDecode.getResultMessage().resolveDescription("FIELD", "Step Condition Value1").getDescription());
testCaseStepExecution.setReturnCode(answerDecode.getResultMessage().getCodeString());
testCaseStepExecution.setStopExecution(answerDecode.getResultMessage().isStopTest());
testCaseStepExecution.setEnd(new Date().getTime());
LOG.debug("Step interupted due to decode 'Step Condition Value1' Error.");
conditionStepDecodeError = true;
}
} catch (CerberusEventException cex) {
LOG.warn(cex);
}
if (!conditionStepDecodeError) {
try {
answerDecode = variableService.decodeStringCompletly(testCaseStepExecution.getConditionVal2(), tCExecution, null, false);
testCaseStepExecution.setConditionVal2((String) answerDecode.getItem());
if (!(answerDecode.isCodeStringEquals("OK"))) {
testCaseStepExecution.setExecutionResultMessage(new MessageGeneral(answerDecode.getResultMessage().getMessage()));
testCaseStepExecution.setStepResultMessage(answerDecode.getResultMessage().resolveDescription("FIELD", "Step Condition Value2"));
testCaseStepExecution.setReturnMessage(answerDecode.getResultMessage().resolveDescription("FIELD", "Step Condition Value2").getDescription());
testCaseStepExecution.setReturnCode(answerDecode.getResultMessage().getCodeString());
testCaseStepExecution.setStopExecution(answerDecode.getResultMessage().isStopTest());
testCaseStepExecution.setEnd(new Date().getTime());
LOG.debug("Step interupted due to decode 'Step Condition Value2' Error.");
conditionStepDecodeError = true;
}
} catch (CerberusEventException cex) {
LOG.warn(cex);
}
}
if (!(conditionStepDecodeError)) {
conditionAnswer = this.conditionService.evaluateCondition(testCaseStepExecution.getConditionOper(), testCaseStepExecution.getConditionVal1(), testCaseStepExecution.getConditionVal2(), tCExecution);
execute_Step = (boolean) conditionAnswer.getItem();
if (conditionAnswer.getResultMessage().getMessage().getCodeString().equals("PE")) {
// There were no error when performing the condition evaluation.
switch(testCaseStepExecution.getLoop()) {
case TestCaseStep.LOOP_ONCEIFCONDITIONFALSE:
execute_Step = !execute_Step;
execute_Next_Step = false;
break;
case TestCaseStep.LOOP_ONCEIFCONDITIONTRUE:
case "":
execute_Next_Step = false;
break;
case TestCaseStep.LOOP_WHILECONDITIONFALSEDO:
case TestCaseStep.LOOP_DOWHILECONDITIONFALSE:
execute_Step = !execute_Step;
execute_Next_Step = execute_Step;
break;
case TestCaseStep.LOOP_WHILECONDITIONTRUEDO:
case TestCaseStep.LOOP_DOWHILECONDITIONTRUE:
execute_Next_Step = execute_Step;
break;
default:
execute_Next_Step = false;
}
} else {
// Error when performing the condition evaluation. We force no execution (false)
MessageGeneral mes = new MessageGeneral(MessageGeneralEnum.EXECUTION_FA_CONDITION);
mes.setDescription(mes.getDescription().replace("%AREA%", "step ").replace("%COND%", testCaseStepExecution.getConditionOper()).replace("%MES%", conditionAnswer.getResultMessage().getDescription()));
tCExecution.setResultMessage(mes);
testCaseStepExecution.setExecutionResultMessage(mes);
testCaseStepExecution.setStepResultMessage(new MessageEvent(MessageEventEnum.CONDITION_TESTCASESTEP_FAILED).resolveDescription("AREA", "").resolveDescription("COND", testCaseStepExecution.getConditionOper()).resolveDescription("MESSAGE", conditionAnswer.getResultMessage().getDescription()));
testCaseStepExecution.setEnd(new Date().getTime());
LOG.debug("Step interupted due to condition error.");
conditionStepError = true;
execute_Next_Step = false;
execute_Step = false;
}
} else {
// If anything wrong with the decode --> we stop here with decode message in the action result.
tCExecution.setResultMessage(new MessageGeneral(MessageGeneralEnum.EXECUTION_FA_CONDITIONDECODE).resolveDescription("AREA", "Step ").resolveDescription("MES", answerDecode.getMessageDescription()));
tCExecution.setEnd(new Date().getTime());
LOG.debug("TestCase interupted due to decode Condition Error.");
// There was an error on decode so we stop everything.
execute_Next_Step = false;
execute_Step = false;
}
} else if (testCaseStepExecution.getLoop().equals(TestCaseStep.LOOP_DOWHILECONDITIONFALSE) || testCaseStepExecution.getLoop().equals(TestCaseStep.LOOP_DOWHILECONDITIONTRUE)) {
// First Step execution for LOOP_DOWHILECONDITIONTRUE and LOOP_DOWHILECONDITIONFALSE --> We force the step execution and activate the next step execution.
execute_Step = true;
execute_Next_Step = true;
} else {
// First Step execution for Unknown Loop --> We force the step execution only once (default behaviour).
execute_Step = true;
execute_Next_Step = false;
conditionAnswer.setResultMessage(new MessageEvent(MessageEventEnum.CONDITIONEVAL_FAILED_UNKNOWNCONDITION));
}
/**
* Execute Step
*/
LOG.debug(logPrefix + "Executing step : " + testCaseStepExecution.getTest() + " - " + testCaseStepExecution.getTestCase() + " - Step " + testCaseStepExecution.getStep() + " - Index " + testCaseStepExecution.getStep());
if (execute_Step) {
/**
* We execute the step
*/
testCaseStepExecution = this.executeStep(testCaseStepExecution, tCExecution);
/**
* Updating Execution Result Message only if
* execution result message of the step is not
* PE or OK.
*/
if ((!(testCaseStepExecution.getExecutionResultMessage().equals(new MessageGeneral(MessageGeneralEnum.EXECUTION_PE_TESTSTARTED)))) && (!(testCaseStepExecution.getExecutionResultMessage().equals(new MessageGeneral(MessageGeneralEnum.EXECUTION_OK))))) {
tCExecution.setResultMessage(testCaseStepExecution.getExecutionResultMessage());
}
if (testCaseStepExecution.getStepResultMessage().equals(new MessageEvent(MessageEventEnum.STEP_PENDING))) {
testCaseStepExecution.setStepResultMessage(new MessageEvent(MessageEventEnum.STEP_SUCCESS));
}
testCaseStepExecutionService.updateTestCaseStepExecution(testCaseStepExecution);
if (testCaseStepExecution.isStopExecution()) {
break;
}
} else // We don't execute the step and record a generic execution.
if ((!conditionStepDecodeError) && (!conditionStepError)) {
/**
* Register Step in database
*/
LOG.debug("Registering Step : " + testCaseStepExecution.getStep());
// We change the Step message only if the Step is not executed due to condition.
MessageEvent stepMes = new MessageEvent(MessageEventEnum.CONDITION_TESTCASESTEP_NOTEXECUTED);
testCaseStepExecution.setStepResultMessage(stepMes);
testCaseStepExecution.setReturnMessage(testCaseStepExecution.getReturnMessage().replace("%COND%", testCaseStepExecution.getConditionOper()).replace("%LOOP%", testCaseStepExecution.getLoop()).replace("%MESSAGE%", conditionAnswer.getResultMessage().getDescription()));
testCaseStepExecution.setEnd(new Date().getTime());
this.testCaseStepExecutionService.updateTestCaseStepExecution(testCaseStepExecution);
LOG.debug("Registered Step");
} else {
// Not executed because decode error or failed condition.
testCaseStepExecution.setEnd(new Date().getTime());
testCaseStepExecution.setStopExecution(true);
this.testCaseStepExecutionService.updateTestCaseStepExecution(testCaseStepExecution);
LOG.debug("Registered Step");
}
/**
* Log TestCaseStepExecution
*/
if (tCExecution.getVerbose() > 0) {
LOG.info(testCaseStepExecution.toJson(false, true));
}
// Websocket --> we refresh the corresponding Detail Execution pages attached to this execution.
if (tCExecution.isCerberus_featureflipping_activatewebsocketpush()) {
TestCaseExecutionEndPoint.getInstance().send(tCExecution, false);
}
step_index++;
} while (execute_Next_Step && step_index <= maxloop);
if (testCaseStepExecution.isStopExecution()) {
break;
}
}
/**
* If at that time the execution is still PE, we move it to
* OK. It means that no issue were met.
*/
if ((tCExecution.getResultMessage() == null) || (tCExecution.getResultMessage().equals(new MessageGeneral(MessageGeneralEnum.EXECUTION_PE_TESTSTARTED)))) {
tCExecution.setResultMessage(new MessageGeneral(MessageGeneralEnum.EXECUTION_OK));
}
/**
* We record Selenium log at the end of the execution.
*/
try {
tCExecution.addFileList(recorderService.recordSeleniumLog(tCExecution));
} catch (Exception ex) {
LOG.error(logPrefix + "Exception Getting Selenium Logs " + tCExecution.getId() + " Exception :" + ex.toString());
}
} else {
// We don't execute the testcase linked with condition.
MessageGeneral mes;
/**
* Update Execution status from condition
*/
if (conditionAnswerTc.getResultMessage().getMessage().getCodeString().equals("PE")) {
mes = new MessageGeneral(MessageGeneralEnum.EXECUTION_NA_CONDITION);
} else {
mes = new MessageGeneral(MessageGeneralEnum.EXECUTION_FA_CONDITION);
}
mes.setDescription(mes.getDescription().replace("%COND%", tCExecution.getConditionOper()).replace("%MES%", conditionAnswerTc.getResultMessage().getDescription()));
tCExecution.setResultMessage(mes);
}
}
} catch (Exception ex) {
/**
* If an exception is found, set the execution to FA and print the
* exception
*/
tCExecution.setResultMessage(new MessageGeneral(MessageGeneralEnum.EXECUTION_FA));
tCExecution.setControlMessage(tCExecution.getControlMessage() + " Exception: " + ex);
LOG.error(logPrefix + "Exception found Executing Test " + tCExecution.getId() + " Exception :" + ex.toString());
} finally {
/**
* We stop the server session here (selenium for ex.).
*/
try {
tCExecution = this.stopTestCase(tCExecution);
} catch (Exception ex) {
LOG.error(logPrefix + "Exception Stopping Test " + tCExecution.getId() + " Exception :" + ex.toString());
}
/**
* Log Execution
*/
LOG.info(tCExecution.toJson(false));
/**
* Clean memory
*/
try {
executionUUID.removeExecutionUUID(tCExecution.getExecutionUUID());
LOG.debug("Clean ExecutionUUID");
} catch (Exception ex) {
LOG.error("Exception cleaning Memory: " + ex.toString());
}
/**
* Log execution is finished
*/
LOG.info("Execution Finished : UUID=" + tCExecution.getExecutionUUID() + "__ID=" + tCExecution.getId() + "__RC=" + tCExecution.getControlStatus() + "__" + "TestName=" + tCExecution.getEnvironment() + "." + tCExecution.getCountry() + "." + tCExecution.getBuild() + "." + tCExecution.getRevision() + "." + tCExecution.getTest() + "_" + tCExecution.getTestCase() + "_" + tCExecution.getTestCaseObj().getDescription().replace(".", ""));
/**
* Updating queue to done status only for execution from queue
*/
if (tCExecution.getQueueID() != 0) {
executionQueueService.updateToDone(tCExecution.getQueueID(), "", runID);
}
/**
* Retry management, in case the result is not (OK or NE), we
* execute the job again reducing the retry to 1.
*/
if (tCExecution.getNumberOfRetries() > 0 && !tCExecution.getResultMessage().getCodeString().equals("OK") && !tCExecution.getResultMessage().getCodeString().equals("NE")) {
TestCaseExecutionQueue newExeQueue = new TestCaseExecutionQueue();
if (tCExecution.getQueueID() > 0) {
// If QueueId exist, we try to get the original execution queue.
try {
newExeQueue = executionQueueService.convert(executionQueueService.readByKey(tCExecution.getQueueID()));
} catch (Exception e) {
// Unfortunatly the execution no longuer exist so we pick initial value.
newExeQueue = tCExecution.getTestCaseExecutionQueue();
}
} else {
// Initial Execution does not come from the queue so we pick the value created at the beginning of the execution.
newExeQueue = tCExecution.getTestCaseExecutionQueue();
}
// Forcing init value for that new queue execution : exeid=0, no debugflag and State = QUEUED
int newRetry = tCExecution.getNumberOfRetries() - 1;
newExeQueue.setId(0);
newExeQueue.setDebugFlag("N");
if (newRetry <= 0) {
newExeQueue.setComment("Added from Retry. Last attempt to go.");
} else {
newExeQueue.setComment("Added from Retry. Still " + newRetry + " attempt(s) to go.");
}
newExeQueue.setState(TestCaseExecutionQueue.State.QUEUED);
newExeQueue.setRetries(newRetry);
// Insert execution to the Queue.
executionQueueService.create(newExeQueue);
}
/**
* After every execution finished, <br>
* if the execution has a tag that has a campaign associated <br>
* and no more executions are in the queue, <br>
* we trigger : <br>
* 1/ The update of the EndExeQueue of the tag <br>
* 2/ We notify the Distribution List with execution report status
*/
try {
if (!StringUtil.isNullOrEmpty(tCExecution.getTag())) {
Tag currentTag = tagService.convert(tagService.readByKey(tCExecution.getTag()));
if ((currentTag != null)) {
if (currentTag.getDateEndQueue().before(Timestamp.valueOf("1980-01-01 01:01:01.000000001"))) {
AnswerList answerListQueue = new AnswerList();
answerListQueue = executionQueueService.readQueueOpen(tCExecution.getTag());
if (answerListQueue.isCodeEquals(MessageEventEnum.DATA_OPERATION_OK.getCode()) && (answerListQueue.getDataList().isEmpty())) {
LOG.debug("No More executions in (queue) on tag : " + tCExecution.getTag() + " - " + answerListQueue.getDataList().size() + " " + answerListQueue.getMessageCodeString() + " - ");
tagService.updateDateEndQueue(tCExecution.getTag(), new Timestamp(new Date().getTime()));
if (!StringUtil.isNullOrEmpty(currentTag.getCampaign())) {
// We get the campaig here and potencially send the notification.
emailService.generateAndSendNotifyEndTagExecution(tCExecution.getTag(), currentTag.getCampaign());
}
} else {
LOG.debug("Still executions in queue on tag : " + tCExecution.getTag() + " - " + answerListQueue.getDataList().size() + " " + answerListQueue.getMessageCodeString());
}
} else {
LOG.debug("Tag is already flaged with recent timstamp. " + currentTag.getDateEndQueue());
}
}
}
} catch (Exception e) {
LOG.error(e);
}
//
// After every execution finished we try to trigger more from the queue;-).
executionThreadPoolService.executeNextInQueueAsynchroneously(false);
}
return tCExecution;
}
use of org.cerberus.crud.entity.TestCaseExecutionQueue in project cerberus-source by cerberustesting.
the class TestCaseExecutionQueueDAO method loadWithDependenciesFromResultSet.
/**
* Uses data of ResultSet to create object {@link TestCaseExecutionQueue}
*
* @param resultSet ResultSet relative to select from table
* TestCaseExecutionInQueue
* @return object {@link TestCaseExecutionQueue} with objects
* {@link ResultSet} and {@link Application}
* @throws SQLException when trying to get value from
* {@link java.sql.ResultSet#getString(String)}
* @see TestCaseExecutionQueue
*/
private TestCaseExecutionQueue loadWithDependenciesFromResultSet(ResultSet resultSet) throws SQLException, FactoryCreationException {
TestCaseExecutionQueue testCaseExecutionInQueue = this.loadFromResultSet(resultSet);
testCaseExecutionInQueue.setTestCaseObj(testCaseDAO.loadFromResultSet(resultSet));
testCaseExecutionInQueue.setApplicationObj(applicationDAO.loadFromResultSet(resultSet));
return testCaseExecutionInQueue;
}
Aggregations