001/** 002 * //////////////////////////////////////////////////////////////////////////////// 003 * // 004 * // D SOFTWARE INCORPORATED 005 * // Copyright 2007-2014 D Software Incorporated 006 * // All Rights Reserved. 007 * // 008 * // NOTICE: D Software permits you to use, modify, and distribute this file 009 * // in accordance with the terms of the license agreement accompanying it. 010 * // 011 * // Unless required by applicable law or agreed to in writing, software 012 * // distributed under the License is distributed on an "AS IS" BASIS, 013 * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * // 015 * //////////////////////////////////////////////////////////////////////////////// 016 */ 017package com.thed.util; 018 019import com.google.gson.Gson; 020import com.thed.model.*; 021import com.thed.parser.ParserUtil; 022import com.thed.util.gson.CustomDateUtil; 023import com.thed.util.gson.GsonUtil; 024import com.thed.zblast.parser.EggplantParser; 025import com.thed.zblast.parser.JUnitResultParser; 026import com.thed.zblast.parser.TestNGXMLResultParserImpl; 027import com.thed.zblast.parser.jaxb.junit.Failure; 028import com.thed.zblast.parser.jaxb.junit.Testcase; 029import com.thed.zblast.parser.jaxb.junit.Testsuite; 030import com.thed.zblast.parser.model.*; 031import com.thed.zblast.util.RestUtil; 032import org.apache.commons.configuration.PropertiesConfiguration; 033import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler; 034import org.apache.commons.httpclient.HttpClient; 035import org.apache.commons.httpclient.HttpException; 036import org.apache.commons.httpclient.HttpStatus; 037import org.apache.commons.httpclient.methods.PostMethod; 038import org.apache.commons.httpclient.params.HttpMethodParams; 039import org.apache.commons.io.FilenameUtils; 040import org.apache.commons.lang.StringUtils; 041import org.apache.commons.lang.SystemUtils; 042import org.apache.commons.logging.Log; 043import org.apache.commons.logging.LogFactory; 044import org.xml.sax.SAXException; 045 046import javax.xml.parsers.ParserConfigurationException; 047import java.io.*; 048import java.math.BigDecimal; 049import java.util.*; 050import java.util.concurrent.TimeUnit; 051import java.util.stream.Collectors; 052 053import static com.thed.util.ZeeConstants.*; 054 055/** 056 * This class contains utility methods to assist in communicating status of testcase to server. 057 * 058 * @author zephyrDev 059 * 060 */ 061public class ScriptUtil { 062 063 private static Log log = LogFactory.getLog(ScriptUtil.class); 064 065 /** 066 * Sends overall batch status along with TestcaseBatchExecution details to server. 067 * 068 * @param client instance of HttpClient object 069 * @param url server url. 070 * @param token Agent.token 071 * @param status overall status of batch, hardcoded to "success". Even though individual testcase may fail, overall batch was executed by zbot successfully. 072 * @param task TestcaseBatchExecution object in JSON format. 073 * 074 * @return response String. Servlet returns STATUS_OK 075 * 076 * @throws HttpException 077 * @throws IOException 078 */ 079 public static String sendResponse(HttpClient client, String url, String token, String status, TestcaseBatchExecution task) throws HttpException, IOException { 080 PostMethod method = new PostMethod(url); 081 try { 082 System.out.println("Sending response ... "); 083 String json = CustomDateUtil.gson.toJson(task); 084 method.setParameter(ZeeConstants.PARAM_ACTION_REQUEST, ZeeConstants.ACTION_SEND_RESPONSE); 085 method.setParameter(ZeeConstants.TESTCASE_BATCH_EXECUTION, json); 086 method.setParameter(ZeeConstants.PARAM_RESULT_REQUEST, ZeeConstants.RESULT_SUCCESS); 087 method.setParameter(ZeeConstants.PARAM_TOKEN_REQUEST, token); 088 089 System.out.println("Sending response ... : " + json); 090 091 // Provide custom retry handler is necessary 092 method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(3, false)); 093 // Execute the method. 094 int statusCode = -1; 095 try { 096 statusCode = client.executeMethod(method); 097 } catch (Exception e) { 098 System.out.println(e.getMessage()); 099 } 100 101 if (statusCode != HttpStatus.SC_OK) { 102 System.err.println("ERROR: Method failed. Could not post batch status.: " + method.getStatusLine()); 103 System.err.println("ERROR: Method failed. batch details: " + json); 104 } 105 106 InputStream inputStream = method.getResponseBodyAsStream(); 107 BufferedReader inputReader = new BufferedReader(new InputStreamReader(inputStream)); 108 String response = inputReader.readLine(); 109 return response ; 110 111 } finally { 112 // Release the connection. 113 method.releaseConnection(); 114 } 115 } 116 117 /** 118 * Webservice call to update testcase execution result. 119 * Values should match to value in preference table where key is testresult.testresultStatus.LOV 120 * Zephyr app uses these values: 10=Change Status;1=Pass;2=Fail;3=WIP;4=Blocked 121 * 122 * This method doesn't validate status value against database values. 123 * If status value is < 1, it is set to 3 (WIP). 124 * 125 * Server url to be invoked is of format: "http://127.0.0.1:80/flex/rpc/zephyrrpcservice?wsdl". 126 * Parameter passed may have url format as "http://127.0.0.1:80/flex/agent", notice "/flex/agent" suffix attached to it. 127 * 128 * @param tce TestcaseExecution, stores parameters to identify testcase 129 * @param executionStatus test case status, refer javadoc above. 130 * @param executionNotes Freeform notes, stack trace etc. 131 */ 132 public static void updateTestcaseExecutionResult(String serverUrl, TestcaseBatchExecution testcaseBatchExecution, TestcaseExecution tce, int executionStatus, String executionNotes){ 133 try { 134 log.info("Going to update execution"); 135 updateTestcaseExecutionResult(testcaseBatchExecution, tce, executionStatus, executionNotes); 136 }catch (Exception ex){ 137 log.error("Error occurred in updating execution."); 138 ex.printStackTrace(); 139 } 140 } 141 142 public static void updateTestcaseExecutionResult(TestcaseBatchExecution testcaseBatchExecution, TestcaseExecution tce, int executionStatus, String executionNotes) throws Exception { 143 AutomationScriptJobDTO automationScriptJobDTO = RestUtil.getScriptJobDetail(testcaseBatchExecution.getJobId()); 144 if(automationScriptJobDTO.getIsParseResultFile()!=null && !automationScriptJobDTO.getIsParseResultFile()){ 145 if (executionStatus < 1) { 146 executionStatus = 3 ; 147 } 148 149 ArrayList<RemoteTestResult> testResults = new ArrayList<RemoteTestResult>(); 150 RemoteTestResult testResult = new RemoteTestResult(); 151 testResult.setReleaseTestScheduleId(tce.getReleaseTestScheduleId().toString()); 152 testResult.setExecutionStatus(String.valueOf(executionStatus)); 153 testResult.setExecutionNotes(executionNotes); 154 testResults.add(testResult); 155 156 log.info(""" 157 Update status of testcase to %d. tc: %s""".formatted(executionStatus, tce)); 158 RestUtil.updateTestResult(testResults); 159 } 160 } 161 162 public static void updateParseTestcaseExecutionResult(TestcaseBatchExecution testcaseBatchExecution, Agent agent){ 163 try { 164 log.info("Going to update execution"); 165 updateParseTestcaseExecutionResultToServer(testcaseBatchExecution, agent); 166 }catch (Exception ex){ 167 log.error("Error occurred in updating execution."); 168 ex.printStackTrace(); 169 } 170 } 171 172 private static void updateParseTestcaseExecutionResultToServer(TestcaseBatchExecution testcaseBatchExecution, Agent agent) throws Exception { 173 AutomationScriptJobDTO automationScriptJobDTO = RestUtil.getScriptJobDetail(testcaseBatchExecution.getJobId()); 174 PropertiesConfiguration props = Utils.getZbotProperties(); 175 String useGenericParser = props.getString("use_generic_parser"); 176 Boolean isGenericParserUsed = Boolean.valueOf((useGenericParser == null) ? "false" : useGenericParser); 177 List<TestcaseModel> testsFromTestSuiteList = null; 178 179 ZblastScriptExecutionResult executionResult = new ZblastScriptExecutionResult(); 180 //get testsuite 181 getTestSuiteFromFile(automationScriptJobDTO, executionResult); 182 if(executionResult.getTestSuite()!=null) { 183 if (isGenericParserUsed) { 184 testsFromTestSuiteList = JUnitResultParser.getTestsFromTestSuiteListFromScriptJobGenericParser(executionResult.getTestSuite(), automationScriptJobDTO); 185 } else { 186 testsFromTestSuiteList = JUnitResultParser.getTestsFromScriptJobTestSuiteList(executionResult.getTestSuite(), automationScriptJobDTO); 187 } 188 189 List<TestCaseResultModel> testCaseResultModels = prepareZephyrTests(testsFromTestSuiteList); 190 191 List<TestcaseExecution> tces = testcaseBatchExecution.getTestcaseExecutionList(); 192 List<Long> rtsIds = new ArrayList<Long>(); 193 for (TestcaseExecution testcaseExecution : tces) { 194 rtsIds.add(Long.valueOf(testcaseExecution.getReleaseTestScheduleId())); 195 } 196 if (rtsIds != null) { 197 List<ReleaseTestSchedule> releaseTestSchedules = RestUtil.getReleaseTestSchedulesById(rtsIds); 198 if (releaseTestSchedules != null) { 199 processTestCaseExecution(testcaseBatchExecution, releaseTestSchedules, testCaseResultModels, agent); 200 } 201 } 202 }else{ 203 log.warn("Not able to parse file"); 204 } 205 206 } 207 208 /** 209 * Refreshes Agent entity's realtime status. 210 * @param client 211 * @param url Zephyr Server machineURL 212 * @param token Zbot's token 213 * @param status Status that need to be updated 214 */ 215 public static void updateAgentRealTimeStatus(HttpClient client, String url, String token, String status) { 216 PostMethod method = new PostMethod(url); 217 try { 218 method.setParameter(ZeeConstants.PARAM_ACTION_REQUEST, ZeeConstants.ACTION_UPDATE_AGENT_REALTIME_STATUS); 219 method.setParameter(ZeeConstants.PARAM_AGENT_STATUS , status); 220 method.setParameter(ZeeConstants.PARAM_TOKEN_REQUEST, token); 221 222 // Provide custom retry handler is necessary 223 // try just once 224 method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(1, false)); 225 // Execute the method. 226 int statusCode = -1; 227 try { 228 statusCode = client.executeMethod(method); 229 } catch (Exception e) { 230 //e.printStackTrace(); 231 System.out.println(e.getMessage()); 232 } 233 234 if (statusCode != HttpStatus.SC_OK) { 235 System.err.println("WARNING: Method failed. Could not update post agent status to: " + status); 236 } 237 238 } finally { 239 // Release the connection. 240 method.releaseConnection(); 241 } 242 243 } 244 245 public static List<ReleaseTestSchedule> processTestCaseExecution(TestcaseBatchExecution testcaseBatchExecution, String statusId, Agent agent) throws IOException { 246 List<Long> rtsIdList = testcaseBatchExecution.getTestcaseExecutionList().stream().map(TestcaseExecution::getReleaseTestScheduleId).collect(Collectors.toList()); 247 List<ReleaseTestSchedule> releaseTestScheduleList = RestUtil.getReleaseTestSchedulesById(rtsIdList); 248 for (ReleaseTestSchedule releaseTestSchedule : releaseTestScheduleList) { 249 releaseTestSchedule.setChangeBy(testcaseBatchExecution.getUserId()); 250 TestResult testResult = new TestResult(); 251 testResult.setTesterId(testcaseBatchExecution.getUserId()); 252 testResult.setExecutionNotes(ZeeConstants.TEST_EXECUTE_COMMENT); 253 testResult.setReleaseTestScheduleId(releaseTestSchedule.getId()); 254 testResult.setExecutionStatus(statusId); 255 releaseTestSchedule.setExecutedBy(testcaseBatchExecution.getUserId()); 256 releaseTestSchedule.setAssignmentDate(new Date()); 257 releaseTestSchedule.setComment("Successfully executed on " + agent.getAgentHostAndIp()); 258 if(releaseTestSchedule.getTcrTreeTestcase().getTestcase().getEstimatedTime() != null) { 259 releaseTestSchedule.setActualTime(releaseTestSchedule.getTcrTreeTestcase().getTestcase().getEstimatedTime()); 260 } 261 releaseTestSchedule.setLastTestResult(testResult); 262 } 263 return RestUtil.updateExecutions(releaseTestScheduleList); 264 } 265 266 public static void processTestCaseExecution(TestcaseBatchExecution testcaseBatchExecution, List<ReleaseTestSchedule> releaseTestSchedules, List<TestCaseResultModel>testCaseResultModels, Agent agent) throws IOException { 267 List<ReleaseTestSchedule> releaseSchedulesList = new ArrayList<>(); 268 Map<Long, List<File>> attachmentMap= new HashMap<Long,List<File>>(); 269 Map<Long,List<File>> testcaseAttachmentFile=new HashMap<Long,List<File>>(); 270 Map<Long, TestStep> testStepResult = new HashMap<Long, TestStep>(); 271 Set<String> activeStatusIdSet = ZephyrSoapClient.getTestExecutionStatusIds(true); 272 Set<String> invalidStatusIdSet = new HashSet<>(); 273 274 for (Iterator<ReleaseTestSchedule> iterator = releaseTestSchedules.iterator(); iterator.hasNext();) { 275 ReleaseTestSchedule releaseTestSchedule = iterator.next(); 276 for(TestCaseResultModel testCaseResultModel : testCaseResultModels) { 277 if (!releaseTestSchedule.getTcrTreeTestcase().getTestcase().getName().equals(testCaseResultModel.getTestcase().getName())) { 278 continue; 279 } 280 281 long testScheduleId = releaseTestSchedule.getId(); 282 283 releaseTestSchedule.setChangeBy(testcaseBatchExecution.getUserId()); 284 TestResult testResult = new TestResult(); 285 testResult.setTesterId(testcaseBatchExecution.getUserId()); 286 287 288 if(testCaseResultModel.getExecutionRequest() != null) { 289 ExecutionRequest executionRequest = testCaseResultModel.getExecutionRequest(); 290 if(!activeStatusIdSet.contains(executionRequest.getStatus())) { 291 invalidStatusIdSet.add(executionRequest.getStatus()); 292 continue; 293 } 294 } 295 296 testResult.setExecutionNotes(ZeeConstants.TEST_EXECUTE_COMMENT); 297 releaseTestSchedule.setExecutedBy(testcaseBatchExecution.getUserId()); 298 testResult.setReleaseTestScheduleId(testScheduleId); 299 releaseTestSchedule.setAssignmentDate(new Date()); 300 releaseTestSchedule.setComment("Successfully executed on " + agent.getAgentHostAndIp()); 301 if(releaseTestSchedule.getTcrTreeTestcase().getTestcase().getEstimatedTime() != null) { 302 releaseTestSchedule.setActualTime(releaseTestSchedule.getTcrTreeTestcase().getTestcase().getEstimatedTime()); 303 } 304 releaseTestSchedule.setLastTestResult(testResult); 305 306 if(testCaseResultModel.getExecutionRequest() != null) { 307 setExecutionInRTS(releaseTestSchedule, testCaseResultModel.getExecutionRequest()); 308 } 309 310 releaseSchedulesList.add(releaseTestSchedule); 311 312 if(testCaseResultModel.getTestcaseAttachement()==null){ 313 continue; 314 } 315 attachmentMap.put(releaseTestSchedule.getTcrTreeTestcase().getTestcase().getId(), testCaseResultModel.getTestcaseAttachement()); 316 317 if(testCaseResultModel.getTestcaseAttachement()==null){ 318 continue; 319 } 320 testcaseAttachmentFile.put(releaseTestSchedule.getTcrTreeTestcase().getTestcase().getId(), testCaseResultModel.getAttachment()); 321 322 if(testCaseResultModel.getTestcase().getTestSteps()==null){ 323 continue; 324 } 325 testStepResult.put(releaseTestSchedule.getTcrTreeTestcase().getTestcase().getId(), testCaseResultModel.getTestcase().getTestSteps()); 326 } 327 } 328 for(String statusId : invalidStatusIdSet) { 329 log.warn("No active testcase execution status found for id: " + statusId); 330 } 331 if(!releaseSchedulesList.isEmpty()){ 332 releaseSchedulesList = RestUtil.updateExecutions(releaseSchedulesList); 333 334 Map<Long,List<File>> releaseAttachmentFile=new HashMap<Long,List<File>>(); 335 Map<Long,List<File>> releaseTestCaseAttachmentFile=new HashMap<Long,List<File>>(); 336 337 if (attachmentMap.size() > 0) { 338 for (ReleaseTestSchedule release : releaseSchedulesList) { 339 List<File> attachment = attachmentMap.get(release.getTcrTreeTestcase().getTestcase().getId()); 340 if (attachment == null) { 341 continue; 342 } 343 releaseAttachmentFile.put(release.getId(), attachmentMap.get(release.getTcrTreeTestcase().getTestcase().getId())); 344 } 345 } 346 RestUtil.addAttachment(releaseAttachmentFile, testcaseBatchExecution.getUserId()); 347 348 if (testcaseAttachmentFile.size() > 0) { 349 for (ReleaseTestSchedule release : releaseSchedulesList) { 350 List<File> attachment = testcaseAttachmentFile.get(release.getTcrTreeTestcase().getTestcase().getId()); 351 if (attachment == null) { 352 continue; 353 } 354 releaseTestCaseAttachmentFile.put(release.getId(), testcaseAttachmentFile.get(release.getTcrTreeTestcase().getTestcase().getId())); 355 } 356 } 357 RestUtil.addTestCaseAttachment(releaseTestCaseAttachmentFile, testcaseBatchExecution.getUserId()); 358 359 List<TestStepResult> releaseStepList = getStepExecutions(releaseSchedulesList, testStepResult); 360 RestUtil.updateStepExecutions(releaseStepList); 361 }else{ 362 log.warn("No execution is mappped with parsed testcase."); 363 } 364 } 365 366 public static ReleaseTestSchedule setExecutionInRTS(ReleaseTestSchedule releaseTestSchedule, ExecutionRequest executionRequest) { 367 releaseTestSchedule.getLastTestResult().setExecutionStatus(executionRequest.getStatus()); 368 if(executionRequest.getTesterId() != null) { 369 releaseTestSchedule.getLastTestResult().setTesterId(executionRequest.getTesterId()); 370 } 371 if(executionRequest.getExecutedOn() != null) { 372 releaseTestSchedule.getLastTestResult().setExecutionDate(executionRequest.getExecutedOn()); 373 } 374 if(executionRequest.getActualTime() != null) { 375 releaseTestSchedule.setActualTime(executionRequest.getActualTime()); 376 } 377 if(executionRequest.getNotes() != null) { 378 releaseTestSchedule.getLastTestResult().setExecutionNotes(executionRequest.getNotes()); 379 } 380 if(executionRequest.getChangeBy() != null) { 381 releaseTestSchedule.setChangeBy(executionRequest.getChangeBy()); 382 } 383 return releaseTestSchedule; 384 } 385 386 private static List<TestStepResult> getStepExecutions(List<ReleaseTestSchedule> releaseSchedulesList, Map<Long, TestStep> testStepExecutionResult) { 387 if(releaseSchedulesList != null && releaseSchedulesList.isEmpty()){ 388 return Collections.emptyList(); 389 } 390 List<TestStepResult> releaseStepList = new ArrayList<TestStepResult>(); 391 for (ReleaseTestSchedule release : releaseSchedulesList) { 392 TestStep step = testStepExecutionResult.get(release.getTcrTreeTestcase().getTestcase().getId()); 393 if (step == null) { 394 continue; 395 } 396 long i = 0; 397 for (TestStepDetail detail : step.getSteps()) { 398 i++; 399 TestStepResult stepResult = new TestStepResult(); 400 stepResult.setCyclePhaseId(release.getCyclePhaseId()); 401 stepResult.setReleaseTestScheduleId(release.getId()); 402 if (detail.getExecutionStatus().equals("true")) { 403 stepResult.setStatus("1"); 404 } else if(detail.getExecutionStatus().equals("false")) { 405 stepResult.setStatus("2"); 406 }else { 407 stepResult.setStatus("10"); 408 } 409 stepResult.setTestStepId(i); 410 releaseStepList.add(stepResult); 411 } 412 } 413 return releaseStepList; 414 } 415 416 417 418 419 private static void getTestSuiteFromFile(AutomationScriptJobDTO automationScriptJobDTO,ZblastScriptExecutionResult executionResult){ 420 String frameworkSelected = automationScriptJobDTO.getAutomationFramework().toLowerCase(); 421 422 PropertiesConfiguration props = Utils.getZbotProperties(); 423 String useGenericParser=props.getString("use_generic_parser"); 424 Boolean isGenericParserUsed = Boolean.valueOf((useGenericParser==null)?"false":useGenericParser); 425 426 if (frameworkSelected.equalsIgnoreCase(ZeeConstants.SELENIUM) || frameworkSelected.equalsIgnoreCase(ZeeConstants.UFT) || frameworkSelected.contains(ZeeConstants.TOSCA) 427 || frameworkSelected.equalsIgnoreCase(ZeeConstants.JUNIT)|| frameworkSelected.equalsIgnoreCase(ZeeConstants.CUCUMBER) 428 || frameworkSelected.equalsIgnoreCase(ZeeConstants.SOAP_UI_PRO) ||frameworkSelected.equalsIgnoreCase(ZeeConstants.SOAPUI_PRO) || frameworkSelected.equalsIgnoreCase(ZeeConstants.TESTCOMPLETE)) { 429 List<Testsuite> testsuites=null; 430 if(isGenericParserUsed){ 431 testsuites=getTestSuitesFromGenericParser(automationScriptJobDTO.getResultPath(),automationScriptJobDTO.getParserTemplate()); 432 }else{ 433 testsuites = JUnitResultParser.parseResults(automationScriptJobDTO.getResultPath()); 434 } 435 executionResult.setTestSuite(testsuites); 436 } else if (frameworkSelected.equalsIgnoreCase(ZeeConstants.EGG_PLANT)) { 437 try { 438 // TODO : sut and image url support implementation if required by customers 439 EggplantParser eggplantParser = new EggplantParser("unknownSUT", "url"); 440 // result path must point to RunHistory.csv (Ex. D:\\eggPlant\\Untitled\\RunHistory.csv) 441 ArrayList<EggPlantResult> eggPlantResults = eggplantParser.invoke(new File(FilenameUtils.separatorsToSystem(automationScriptJobDTO.getResultPath()))); 442 List<Testsuite> testSuite=getTestsSuitsForEggplant(eggPlantResults,automationScriptJobDTO,isGenericParserUsed); 443 executionResult.setTestSuite(testSuite); 444 } catch (Exception e) { 445 log.info("exception parsing eggPlant results: " + e.getMessage()); 446 } 447 } 448 else if( frameworkSelected.equalsIgnoreCase(ZeeConstants.TEST_NG) ) { 449 List<Testsuite> testSuite=getSuiteForTestNg(automationScriptJobDTO,isGenericParserUsed); 450 executionResult.setTestSuite(testSuite); 451 } else if(isGenericParserUsed) { 452 List<Testsuite> testsuites=getTestSuitesFromGenericParser(automationScriptJobDTO.getResultPath(),automationScriptJobDTO.getParserTemplate()); 453 executionResult.setTestSuite(testsuites); 454 } 455 } 456 457 private static List<Testsuite> getSuiteForTestNg(AutomationScriptJobDTO automationScriptJobDTO, Boolean isGenericParserUsed) { 458 List<Testsuite> testsuites=new ArrayList<>(); 459 if(isGenericParserUsed){ 460 testsuites=getTestSuitesFromGenericParser(automationScriptJobDTO.getResultPath(),automationScriptJobDTO.getParserTemplate()); 461 }else{ 462 testsuites=getResultForTestNg(automationScriptJobDTO); 463 } 464 return testsuites; 465 } 466 467 private static List<Testsuite> getResultForTestNg(AutomationScriptJobDTO automationScriptJobDTO) { 468 List<Testsuite> testSuite=new ArrayList<>(); 469 List<com.thed.zblast.parser.model.TestngResults.Testsuite> testNgResults= TestNGXMLResultParserImpl.parseResults(automationScriptJobDTO.getResultPath()); 470 for(com.thed.zblast.parser.model.TestngResults.Testsuite suite: testNgResults) { 471 Testsuite tests=new Testsuite(); 472 List<TestngResults.Testsuite.Test> test1 = suite.getTest(); 473 List<TestngResults.Testsuite.Test.Class> testClass = new ArrayList<>(); 474 test1.stream().forEach(t->testClass.addAll(t.getClazz())); 475 List<TestngResults.Testsuite.Test.Class.TestMethod> testMethods=new ArrayList<>(); 476 List<List<TestngResults.Testsuite.Test.Class.TestMethod>> testMethodsList = testClass.stream().map(s -> s.getTestMethod()).collect(Collectors.toList()); 477 testMethodsList.forEach(su-> {testMethods.addAll(su);}); 478 List<Testcase> testcases=new ArrayList<>(); 479 for (TestngResults.Testsuite.Test.Class.TestMethod testcase : testMethods) { 480 String name = testcase.getName(); 481 Testcase test=new Testcase(); 482 483 if (name.equals(ZeeConstants.BEFORE_CLASS) || name.equals(ZeeConstants.AFTER_CLASS) || name.equals(ZeeConstants.BEFORE_SUITE) 484 || name.equals(ZeeConstants.AFTER_SUITE) || name.equals(ZeeConstants.BEFORE_METHOD) || name.equals(ZeeConstants.AFTER_METHOD)) { 485 continue; 486 } 487 String status = testcase.getStatus(); 488 test.setName(name); 489 test.setStatus(status); 490 Failure failure=new Failure(); 491 if(testcase.getException()!=null) { 492 failure.setContent(testcase.getException().getMessage()+ SystemUtils.LINE_SEPARATOR+testcase.getException().getFullStacktrace()); 493 test.getFailure().add(failure); 494 } 495 testcases.add(test); 496 } 497 tests.getTestcase().addAll(testcases); 498 testSuite.add(tests); 499 } 500 return testSuite; 501 } 502 503 private static List<Testsuite> getTestSuitesFromGenericParser(String resultPath,String parserTemplate) { 504 File result = new File(resultPath); 505 List<Testsuite> testsuites=new ArrayList<>(); 506 List<String> xmlResultFile = new ArrayList<>(); 507 if(result.exists()){ 508 if(result.isDirectory()){ 509 //get all .xml files 510 File[] resultFiles = result.listFiles((file, name) -> name.endsWith(".xml")); 511 List<String> files= Arrays.asList(resultFiles).stream().map(file -> file.getAbsolutePath()).collect(Collectors.toList()); 512 xmlResultFile.addAll(files); 513 }else{ 514 // add the file to the list of files 515 xmlResultFile.add(resultPath); 516 } 517 } 518 519 xmlResultFile.forEach((resultFile)->{ 520 try { 521 List<Map> dataMap = new ParserUtil().parseXmlLang(resultFile, parserTemplate); 522 Testsuite testsuite=getTestSuiteFromDataMap(dataMap); 523 //required for Eggplant, ignoring for other frameworks 524 testsuite.setAttachmentFile(resultFile); 525 testsuites.add(testsuite); 526 } catch (IOException e) { 527 e.printStackTrace(); 528 } catch (SAXException e) { 529 e.printStackTrace(); 530 } catch (ParserConfigurationException e) { 531 e.printStackTrace(); 532 } 533 }); 534 return testsuites; 535 } 536 537 private static Testsuite getTestSuiteFromDataMap(List<Map> dataMapList) { 538 Testsuite testsuite=new Testsuite(); 539 List<Testcase> testcaseList=getTestcaseFromDataMap(dataMapList); 540 Map map = dataMapList.get(0); 541 if(map.containsKey("timestamp")){ 542 String timestamp = (String) map.get("timestamp"); 543 testsuite.setTimestamp(timestamp); 544 } 545 testsuite.setTestcase(testcaseList); 546 return testsuite; 547 } 548 549 private static List<Testcase> getTestcaseFromDataMap(List<Map> dataMapList) { 550 List<Testcase> testcaseList=new ArrayList<>(); 551 for (Map map : dataMapList) { 552 Testcase tc=extractTestcase(map); 553 if(tc!=null){ 554 testcaseList.add(tc); 555 } 556 } 557 return testcaseList; 558 } 559 560 private static Testcase extractTestcase(Map dataMap) { 561 //implement here 562 Testcase tc=new Testcase(); 563 Set<String> requirementIds = new HashSet<>(); 564 Set<String> packageNames = new HashSet<>(); 565 List<String> attachments = new ArrayList<>(); 566 packageNames.add(dataMap.get("packageName").toString()); 567 Map testcaseMap = (Map) dataMap.get("testcase"); 568 569 String testcaseJson = new Gson().toJson(testcaseMap); 570 TestCase testcase = new Gson().fromJson(testcaseJson, TestCase.class); 571 572 573 if(dataMap.containsKey("skipTestcaseNames")) { 574 boolean isSkipTestcase=false; 575 String[] skipTestcaseNames = dataMap.get("skipTestcaseNames").toString().split(","); 576 for (String testcaseName : skipTestcaseNames) { 577 if(testcase.getName().equals(testcaseName)) { 578 //name matches, skip this testcase 579 isSkipTestcase=true; 580 continue; 581 } 582 } 583 if(isSkipTestcase){ 584 return null; 585 } 586 } 587 588 String packageName = dataMap.get("packageName").toString(); 589 590 Map<String, String> statusCondition = new HashMap<>(); 591 if(dataMap.containsKey("statuses") && dataMap.get("statuses") != null) { 592 List<Map> statuses = (List) dataMap.get("statuses"); 593 boolean matched = false; 594 for(Map sc : statuses) { 595 if((sc.get("statusString") == null && sc.get("status") != null && StringUtils.isNotEmpty(sc.get("status").toString())) //status is not empty 596 || (sc.get("statusString") != null && sc.get("statusString").equals(sc.get("status")))) { //status matches statusString 597 statusCondition = sc; 598 matched = true; 599 break; 600 } 601 } 602 if(!matched) { 603 //none of the status condition satisfied, search for default 604 for(Map sc : statuses) { 605 if(sc.get("default") != null && Boolean.valueOf(sc.get("default").toString())) { //default status 606 statusCondition = sc; 607 break; 608 } 609 } 610 } 611 } 612 613 //get requirement from datamap 614 if(dataMap.containsKey("requirements")) { 615 List<Map> requirements = (List) dataMap.get("requirements"); 616 for (Map requirement : requirements) { 617 String id = requirement.get("id").toString(); 618 String[] splitRequirementId = id.split("_"); 619 if(id.startsWith("ID_") || id.startsWith("AltID_")) { 620 requirementIds.add(id); 621 } 622 } 623 } 624 //fetch attachment tags 625 626 if(dataMap.containsKey("attachments")) { 627 List<Map> attachmentFilePaths = (List) dataMap.get("attachments"); 628 for(Map attachment : attachmentFilePaths) { 629 String filePath = attachment.get("filePath").toString(); 630 attachments.add(filePath); 631 } 632 } 633 634 if(statusCondition.containsKey("attachmentText")) { 635 String attachmentText = statusCondition.get("attachmentText"); 636 tc.setStatusAttachment(attachmentText); 637 } 638 639 if(dataMap.containsKey("stepText")) { 640 String stepStr = dataMap.get("stepText").toString(); 641 tc.setSystemOut(Arrays.asList(stepStr)); 642 System.out.println("system-out: "+stepStr); 643 } 644 645 if(dataMap.containsKey("execution")) { 646 Map<String, Object> executionDataMap = (Map<String, Object>) dataMap.get("execution"); 647 Object actualTimeObj = executionDataMap.get("actualTime"); 648 Object actualTimeUnitObj = executionDataMap.get("actualTimeUnit"); 649 executionDataMap.remove("actualTime"); 650 ExecutionRequest executionRequest = GsonUtil.CUSTOM_GSON.fromJson(GsonUtil.CUSTOM_GSON.toJson(executionDataMap), ExecutionRequest.class); 651 if(executionRequest == null) { 652 executionRequest = new ExecutionRequest(); 653 } 654 if(actualTimeObj != null && StringUtils.isNotBlank(actualTimeObj.toString())) { 655 BigDecimal actualTimeSrc = new BigDecimal(actualTimeObj.toString()); 656 TimeUnit actualTimeUnit = null; 657 try { 658 actualTimeUnit = actualTimeUnitObj != null 659 ? TimeUnit.valueOf(actualTimeUnitObj.toString()) 660 : TimeUnit.SECONDS; 661 } catch (Exception e) { 662 log.warn(ZeeConstants.ERROR_MESSAGE_ACTUAL_TIME_UNIT.formatted(actualTimeUnitObj.toString())); 663 actualTimeUnit = TimeUnit.SECONDS; 664 } 665 switch (actualTimeUnit) { 666 case MILLISECONDS: executionRequest.setActualTime(actualTimeSrc.longValue()); 667 break; 668 669 case SECONDS: 670 default: 671 actualTimeSrc = actualTimeSrc.multiply(new BigDecimal("1000")); 672 executionRequest.setActualTime(actualTimeSrc.longValue()); 673 break; 674 675 } 676 } 677 if(statusCondition.containsKey("statusId")) { 678 executionRequest.setStatus(statusCondition.get("statusId")); 679 } 680 tc.setExecutionRequest(executionRequest); 681 } else { 682 ExecutionRequest executionRequest = new ExecutionRequest(); 683 if(statusCondition.containsKey("statusId")) { 684 executionRequest.setStatus(statusCondition.get("statusId")); 685 tc.setExecutionRequest(executionRequest); 686 } 687 } 688 689 tc.setName(testcase.getName()); 690 tc.setTag(testcase.getTag()); 691 tc.setClassname(packageName); 692 tc.setRequirementIds(requirementIds); 693 tc.setAttachmentList(attachments); 694 return tc; 695 } 696 697 698 private static List<Testsuite> getTestsSuitsForEggplant(ArrayList<EggPlantResult> invoke, AutomationScriptJobDTO automationJobDetail, Boolean isGenericParserUsed) { 699 List<Testsuite> testSuits=new ArrayList<>(); 700 Map<String,Testsuite> eggPlantSuite=new HashMap<>(); 701 for(EggPlantResult eggPlant:invoke){ 702 List<Testsuite> suiteList=null; 703 if(isGenericParserUsed){ 704 suiteList=getTestSuitesFromGenericParser(eggPlant.getXmlResultFile(),automationJobDetail.getParserTemplate()); 705 }else{ 706 suiteList=JUnitResultParser.parseResults(eggPlant.getXmlResultFile()); 707 } 708 if(!suiteList.isEmpty()){ 709 Testsuite suite=null; 710 String testCaseName=null; 711 if(isGenericParserUsed){ 712 testCaseName=suiteList.get(0).getTestcase().get(0).getName(); 713 }else{ 714 testCaseName=suiteList.get(0).getName(); 715 } 716 suite=eggPlantSuite.get(testCaseName); 717 718 if(suite==null){ 719 eggPlantSuite.put(testCaseName,suiteList.get(0)); 720 }else{ 721 if(suite.getTimeInDate().before(suiteList.get(0).getTimeInDate())){ 722 eggPlantSuite.put(testCaseName,suiteList.get(0)); 723 } 724 } 725 } 726 } 727 eggPlantSuite.forEach((key,value)->{ 728 testSuits.add(value); 729 }); 730 return testSuits; 731 } 732 733 public static List<TestCaseResultModel> prepareZephyrTests(List<TestcaseModel> testsFromTestSuiteList) { 734 Set<String> packageNames = new HashSet<>(); 735 List<TestCaseResultModel> testcases = new ArrayList<>(); 736 try { 737 for(TestcaseModel testcaseModel:testsFromTestSuiteList) { 738 TCRTestcase testcase = new TCRTestcase(); 739 String testcaseName = testcaseModel.getTestcaseName(); 740 if(testcaseName.length() >= ZeeConstants.CYCLE_NAME_LIMIT) { 741 testcaseName = testcaseName.substring(0, (ZeeConstants.CYCLE_NAME_LIMIT-1)); 742 } 743 packageNames.add(testcaseModel.getPackageName()); 744 testcase.setName(testcaseName); 745 testcase.setComments(TEST_CASE_COMMENT); 746 testcase.setAutomated(AUTOMATED); 747 testcase.setPriority(TEST_CASE_PRIORITY); 748 testcase.setTag(testcaseModel.getTestcaseTag()); 749 testcase.setScriptName(SCRIPT_FILE_FOR_AUTOMATED_TESTCASE); 750 testcase.setScriptPath(SCRIPT_FILE_FOR_AUTOMATED_TESTCASE); 751 testcase.setScriptId(SCRIPT_FILE_FOR_AUTOMATED_TESTCASE); 752 testcase.setMetadataTCName(testcaseModel.getTcName()); 753 testcase.setMetadataTCClassName(testcaseModel.getClassName()); 754 if(testcaseModel.getTestStep() != null) testcase.setTestSteps(testcaseModel.getTestStep()); 755 756 TestCaseResultModel caseWithStatus = new TestCaseResultModel(); 757 caseWithStatus.setExecutionRequest(testcaseModel.getExecutionRequest()); 758 caseWithStatus.setTestcase(testcase); 759 caseWithStatus.setTestStep(testcaseModel.getTestStep()); 760 caseWithStatus.setTestStep(testcaseModel.getTestStep()); 761 caseWithStatus.setAttachment(testcaseModel.getAttachement()); 762 if(testcaseModel.getTestcaseAttachement() != null) caseWithStatus.setTestcaseAttachement(testcaseModel.getTestcaseAttachement()); 763 if(testcaseModel.getRequirements() != null) caseWithStatus.setTestcaseRequirement(testcaseModel.getRequirements()); 764 testcases.add(caseWithStatus); 765 } 766 return testcases; 767 } catch (Exception e) { 768 log.error(e.getMessage()); 769 return testcases; 770 } 771 } 772 773}