001package com.thed.util; 002 003import com.google.gson.reflect.TypeToken; 004import com.thed.model.*; 005import com.thed.util.gson.GsonUtil; 006import com.thed.zblast.parser.model.TCRCatalogTreeTestcase; 007import com.thed.zblast.parser.model.TCRTestcase; 008import com.thed.zblast.parser.model.TreeSelectionInfo; 009import com.thed.zblast.util.RestUtil; 010import org.apache.commons.lang.StringUtils; 011 012import java.io.File; 013import java.io.IOException; 014import java.lang.reflect.Type; 015import java.text.ParseException; 016import java.text.SimpleDateFormat; 017import java.util.*; 018import java.util.logging.Level; 019import java.util.logging.Logger; 020import java.util.stream.Collectors; 021 022public class ZephyrSoapClient { 023 private static Logger logger = Logger.getLogger(ZephyrSoapClient.class.getName()); 024 025 /** 026 * @param zephyrData 027 * @param cyclePhaseDto 028 * @param testCaseIdResultMap 029 * @param attachmentMap 030 * @param testStepResult 031 * @return 032 * @throws IOException 033 */ 034 private static List<ReleaseTestSchedule> fetchTestSchedules(ZephyrConfigModel zephyrData, 035 CyclePhaseDTO cyclePhaseDto, Map<Long, ExecutionRequest> testCaseIdResultMap, 036 Map<Long, List<File>> attachmentMap, Map<Long, TestStep> testStepResult, Map<Long, List<File>> testcaseAttachmentFile) throws IOException { 037 long userId = zephyrData.getUserId(); 038 boolean status = false; 039 SearchResult searchResults = RestUtil.getReleaseTestSchedules(cyclePhaseDto, zephyrData.getReleaseId()); 040 List<ReleaseTestSchedule> testSchedulesByCriteria = (List<ReleaseTestSchedule>) ((searchResults!=null && searchResults.getResults().size() > 0) 041 ? searchResults.getResults() 042 : new ArrayList()); 043 044 Set<String> activeStatusIdSet = getTestExecutionStatusIds(true); 045 Set<String> invalidStatusIdSet = new HashSet<>(); 046 // prepare list to be posted. 047 List<ReleaseTestSchedule> releaseSchedulesList = new ArrayList<>(); 048 for (Iterator<ReleaseTestSchedule> iterator = testSchedulesByCriteria.iterator(); iterator.hasNext();) { 049 ReleaseTestSchedule releaseTestSchedule = iterator.next(); 050 long testcaseId = releaseTestSchedule.getTcrTreeTestcase().getTestcase().getId(); 051 if(!testCaseIdResultMap.containsKey(testcaseId)) { 052 continue; 053 } 054 long testScheduleId = releaseTestSchedule.getId(); 055 056 releaseTestSchedule.setTesterId(zephyrData.getAssignResultsTo()); 057 releaseTestSchedule.setChangeBy(userId); 058 TestResult testResult = new TestResult(); 059 testResult.setTesterId(userId); 060 testResult.setExecutionNotes(ZeeConstants.TEST_EXECUTE_COMMENT); 061 releaseTestSchedule.setExecutedBy(userId); 062 testResult.setReleaseTestScheduleId(testScheduleId); 063 releaseTestSchedule.setAssignmentDate(new Date()); 064 releaseTestSchedule.setComment(ZeeConstants.TEST_EXECUTE_COMMENT); 065 if(releaseTestSchedule.getTcrTreeTestcase().getTestcase().getEstimatedTime() != null) { 066 releaseTestSchedule.setActualTime(releaseTestSchedule.getTcrTreeTestcase().getTestcase().getEstimatedTime()); 067 } 068 releaseTestSchedule.setLastTestResult(testResult); 069 if(testCaseIdResultMap.get(testcaseId) != null) { 070 ExecutionRequest executionRequest = testCaseIdResultMap.get(testcaseId); 071 if(activeStatusIdSet.contains(executionRequest.getStatus())) { 072 ScriptUtil.setExecutionInRTS(releaseTestSchedule, testCaseIdResultMap.get(testcaseId)); 073 } else { 074 invalidStatusIdSet.add(executionRequest.getStatus()); 075 continue; 076 } 077 } 078 releaseSchedulesList.add(releaseTestSchedule); 079 } 080 081 for(String statusId : invalidStatusIdSet) { 082 logger.warning("No active testcase execution status found for id: " + statusId); 083 } 084 085 Map<Long,List<File>> releaseAttachmentFile=new HashMap<Long,List<File>>(); 086 Map<Long,List<File>> releaseTestCaseAttachmentFile=new HashMap<Long,List<File>>(); 087 088 if (releaseSchedulesList==null || releaseSchedulesList.isEmpty()) { 089 return Collections.emptyList(); 090 } 091 092 releaseSchedulesList = RestUtil.updateExecutions(releaseSchedulesList); 093 if (attachmentMap.size() > 0) { 094 for (ReleaseTestSchedule release : testSchedulesByCriteria) { 095 List<File> attachment = attachmentMap.get(release.getTcrTreeTestcase().getTestcase().getId()); 096 if (attachment == null) { 097 continue; 098 } 099 releaseAttachmentFile.put(release.getId(), attachmentMap.get(release.getTcrTreeTestcase().getTestcase().getId())); 100 } 101 } 102 RestUtil.addAttachment(releaseAttachmentFile, zephyrData.getAssignResultsTo()); 103 104 if (testcaseAttachmentFile.size() > 0) { 105 for (ReleaseTestSchedule release : testSchedulesByCriteria) { 106 List<File> attachment = testcaseAttachmentFile.get(release.getTcrTreeTestcase().getTestcase().getId()); 107 if (attachment == null) { 108 continue; 109 } 110 releaseTestCaseAttachmentFile.put(release.getId(), testcaseAttachmentFile.get(release.getTcrTreeTestcase().getTestcase().getId())); 111 } 112 } 113 RestUtil.addTestCaseAttachment(releaseTestCaseAttachmentFile, zephyrData.getAssignResultsTo()); 114 115 if (releaseSchedulesList == null) return Collections.emptyList(); 116 List<TestStepResult> releaseStepList = getStepExecutions(testSchedulesByCriteria, testStepResult); 117 RestUtil.updateStepExecutions(releaseStepList); 118 119 return releaseSchedulesList; 120 } 121 122 private static List<TestStepResult> getStepExecutions(List<ReleaseTestSchedule> releaseSchedulesList, 123 Map<Long, TestStep> testStepExecutionResult) { 124 if(releaseSchedulesList != null && releaseSchedulesList.isEmpty()){ 125 return Collections.emptyList(); 126 } 127 List<TestStepResult> releaseStepList = new ArrayList<TestStepResult>(); 128 for (ReleaseTestSchedule release : releaseSchedulesList) { 129 TestStep step = testStepExecutionResult.get(release.getTcrTreeTestcase().getTestcase().getId()); 130 if (step == null) { 131 continue; 132 } 133 long i = 0; 134 for (TestStepDetail detail : step.getSteps()) { 135 i++; 136 TestStepResult stepResult = new TestStepResult(); 137 stepResult.setCyclePhaseId(release.getCyclePhaseId()); 138 stepResult.setReleaseTestScheduleId(release.getId()); 139 if (detail.getExecutionStatus().equals("true")) { 140 stepResult.setStatus("1"); 141 } else if(detail.getExecutionStatus().equals("false")) { 142 stepResult.setStatus("2"); 143 }else { 144 stepResult.setStatus("10"); 145 } 146 stepResult.setTestStepId(i); 147 releaseStepList.add(stepResult); 148 } 149 } 150 return releaseStepList; 151 } 152 153 public static String findPackageName(String testCaseNameWithPackage) { 154 String packageName = ""; 155 if (StringUtils.isBlank(testCaseNameWithPackage)) { 156 return packageName; 157 } 158 String[] split = testCaseNameWithPackage.split("\\."); 159 int splitCount = split.length; 160 for (int i = 0; i < split.length; i++) { 161 if (splitCount > 1) { 162 if (i == splitCount - 1) 163 break; 164 packageName += split[i]; 165 packageName += "."; 166 } 167 } 168 String removeEnd = StringUtils.removeEnd(packageName, "."); 169 return removeEnd; 170 } 171 172 public void uploadTestResults(ZephyrConfigModel zephyrData, List<TCRCatalogTreeTestcase> testcasesList, AutomationJobDetail automationJobDetail) throws Exception { 173 Map<Long, ExecutionRequest> testCaseIdResultMap = new HashMap<Long, ExecutionRequest>(); 174 Map<Long, TestStep> testStepResult = new HashMap<Long, TestStep>(); 175 Map<Long, List<File>> attachmentMap = new HashMap<>(); 176 Map<Long,List<File>> testcaseAttachmentFile=new HashMap<Long,List<File>>(); 177 List<TestCaseResultModel> testcases = zephyrData.getTestcases(); 178 try { 179 UserDTO user = RestUtil.getCurrentLoggedinUser(); 180 zephyrData.setUserId(user.getId()); 181 List<TCRTestcase> tcrList = testcasesList.stream().map(tc -> tc.getTestcase()).collect(Collectors.toList()); 182 if(testCaseIdResultMap.isEmpty()) { 183 tcrList.forEach(tcrTestcase -> testCaseIdResultMap.put(tcrTestcase.getId(), tcrTestcase.getExecutionRequest())); 184 } 185 186 for(TestCaseResultModel test: testcases ) { 187 if(test.getAttachment()==null){ 188 continue; 189 } 190 TCRCatalogTreeTestcase testCase=testcasesList.parallelStream().filter(t->t.getTestcase().getName().equals(test.getTestcase().getName())).findAny().orElse(null); 191 attachmentMap.put(testCase.getTestcase().getId(), test.getAttachment()); 192 } 193 for(TestCaseResultModel test: testcases ) { 194 if(test.getTestcaseAttachement()==null){ 195 continue; 196 } 197 TCRCatalogTreeTestcase testCase=testcasesList.parallelStream().filter(t->t.getTestcase().getName().equals(test.getTestcase().getName())).findAny().orElse(null); 198 testcaseAttachmentFile.put(testCase.getTestcase().getId(), test.getTestcaseAttachement()); 199 } 200 for(TCRTestcase tcase:tcrList){ 201 if(tcase.getTestSteps()==null){ 202 continue; 203 } 204 testStepResult.put(tcase.getId(),tcase.getTestSteps()); 205 } 206 207 CycleDTO cycle = fetchCycle(automationJobDetail,zephyrData); 208 CyclePhaseDTO cyclePhase = fetchCyclePhase(cycle,automationJobDetail,zephyrData); 209 for(int i=0;i<testcasesList.size();i+=ZeeConstants.BATCH_SIZE) { 210 List<TCRCatalogTreeTestcase> tcrCatalogTreeTestcases = testcasesList.stream().skip(i).limit(ZeeConstants.BATCH_SIZE).collect(Collectors.toList()); 211 List<TreeSelectionInfo> selectionTree = getTreeInfo(tcrCatalogTreeTestcases); 212 browseTestcasesIntoFFform(cyclePhase, selectionTree, zephyrData, automationJobDetail); 213 //set createPackage false so that it will not create package for each loop 214 zephyrData.setCreatePackage(Boolean.FALSE); 215 } 216 RestUtil.assignExecutions(cyclePhase,zephyrData); 217 //Introduces sleep to let elastic search to index RTS. 218 Thread.sleep(5000); 219 220 if(updateVersionOfTCRTestCases(automationJobDetail.getCycleName(), testcasesList) == null){ 221 logger.info("No cloned tcrTestCases are updated with latest version in current cycle"); 222 } 223 224 List<ReleaseTestSchedule> releaseList = fetchTestSchedules(zephyrData, cyclePhase,testCaseIdResultMap, attachmentMap, testStepResult, testcaseAttachmentFile); 225 zephyrData.setCycleId(cycle.getId()); 226 automationJobDetail.setCycleId(cycle.getId()); 227 automationJobDetail.setCyclePhaseId(cyclePhase.getId()); 228 } catch (Exception e) { 229 logger.log(Level.SEVERE, e.getMessage(),e); 230 throw new Exception(e.getMessage()); 231 } 232 } 233 234 String updateVersionOfTCRTestCases(String cycleName, List<TCRCatalogTreeTestcase> tcrCatalogTreeTestcaseList) throws IOException { 235 return RestUtil.updateTCRTestCasesForCycleName(cycleName, tcrCatalogTreeTestcaseList.stream() 236 .map(TCRCatalogTreeTestcase::getId).collect(Collectors.toList())) ; 237 } 238 239 private void browseTestcasesIntoFFform(CyclePhaseDTO cyclePhase, List<TreeSelectionInfo> selectionTree, ZephyrConfigModel zephyrData, AutomationJobDetail automationJobDetail) throws IOException { 240 RestUtil.browseTestcases(cyclePhase,selectionTree,zephyrData.isCreatePackage()); 241 } 242 243 private CyclePhaseDTO fetchCyclePhase(CycleDTO cycle, AutomationJobDetail automationJobDetail, ZephyrConfigModel zephyrData) throws IOException, ParseException { 244 CyclePhaseDTO cyclePhase = null; 245 if(automationJobDetail.getCyclePhaseId()!=null) { 246 cyclePhase = cycle.getCyclePhases().stream().filter(phase -> phase.getId().longValue() == automationJobDetail.getCyclePhaseId().longValue()).findAny().orElse(null); 247// Fix for ZEPHYR-27056 248 if(cyclePhase!=null &&!cyclePhase.getName().equals(automationJobDetail.getPhaseName())){ 249 cyclePhase.setName(automationJobDetail.getPhaseName()); 250 } 251 } 252 if (cyclePhase==null) { 253 cyclePhase = cycle.getCyclePhases().stream().filter(phase -> phase.getName().equals(automationJobDetail.getPhaseName())).findAny().orElse(null); 254 if (cyclePhase == null) { 255 cyclePhase = createCyclePhase(cycle, zephyrData, automationJobDetail); 256 } 257 } 258 return cyclePhase; 259 } 260 261 private CycleDTO fetchCycle(AutomationJobDetail automationJobDetail, ZephyrConfigModel zephyrData) throws Exception { 262 CycleDTO cycle=null; 263// Fix for ZEPHYR-27019,ZEPHYR-27020 ,ZEPHYR-27056-Divija 264 if(automationJobDetail.getIsReuse()) { 265 if (automationJobDetail.getCycleId() != null) { 266 cycle = RestUtil.getCycle(automationJobDetail.getCycleId()); 267 268 } 269 if (cycle == null && automationJobDetail.getCycleName() != null) { 270 cycle = RestUtil.getCycleNames((long) automationJobDetail.getReleaseId(), "createdOn", automationJobDetail.getCycleName()); 271 } 272 } 273 if(cycle== null){ 274 cycle=createNewCycle(zephyrData); 275 } 276 Date cycleStratDate=new SimpleDateFormat("dd/MM/yyyy").parse(cycle.getCycleStartDate()); 277 Date cycleEndDate=new SimpleDateFormat("dd/MM/yyyy").parse(cycle.getCycleEndDate()); 278 if(cycleStratDate.compareTo(automationJobDetail.getCycleStartDate())!=0 || cycleEndDate.compareTo(automationJobDetail.getCycleEndDate())!=0){ 279 cycle=updateCycleAndPhaseDates(cycle,zephyrData); 280 } 281 if(cycle.getStatus()==1){ 282 logger.severe("cycle is hidden. Please un-hide the cycle"); 283 } 284 return cycle; 285 } 286 287 CycleDTO updateCycleAndPhaseDates(CycleDTO cycle, ZephyrConfigModel zephyrData) throws ParseException, IOException { 288 CycleDTO cycleChange=cycle; 289 cycleChange.setCycleStartDate(Utils.convertStringToDate("MM/dd/yyyy",zephyrData.getCycleStartDate())); 290 cycleChange.setCycleEndDate(Utils.convertStringToDate("MM/dd/yyyy", zephyrData.getCycleEndDate())); 291 Set<CyclePhaseDTO> cyclePhases = cycleChange.getCyclePhases(); 292 CycleDTO finalCycleChange = cycleChange; 293 cyclePhases.stream().forEach(phase->{ 294 if (phase.getPhaseStartDate() == null || phase.getPhaseStartDate().isEmpty() || !phase.getPhaseStartDate().equals(finalCycleChange.getCycleStartDate())) { 295 if (phase.getPhaseStartDate().compareTo(finalCycleChange.getCycleStartDate()) < 0) { 296 phase.setPhaseStartDate(cycle.getCycleStartDate()); 297 } 298 299 } 300 if (phase.getPhaseEndDate() == null || phase.getPhaseEndDate().isEmpty() || !phase.getPhaseEndDate().equals(finalCycleChange.getCycleEndDate())) { 301 if (phase.getPhaseEndDate().compareTo(finalCycleChange.getCycleEndDate()) > 0) { 302 phase.setPhaseEndDate(cycle.getCycleEndDate()); 303 } 304 } 305 }); 306 cycleChange.setCyclePhases(cyclePhases); 307 cycleChange=RestUtil.updateCycle(cycleChange); 308 return cycleChange; 309 } 310 311 private List<TreeSelectionInfo> getTreeInfo(List<TCRCatalogTreeTestcase> testcasesList) { 312 HashMap<Long, List<TCRCatalogTreeTestcase>> treeTctMap = testcasesList.stream().collect(Collectors.groupingBy(TCRCatalogTreeTestcase::getTcrCatalogTreeId, HashMap::new, Collectors.toCollection(ArrayList::new))); 313 List<TreeSelectionInfo> infoTreeList=new ArrayList<>(); 314 treeTctMap.forEach((treeid,tctList)->{ 315 TreeSelectionInfo info=new TreeSelectionInfo(treeid,tctList.stream().map(t->t.getTestcase().getId()).collect(Collectors.toList()), true); 316 infoTreeList.add(info); 317 }); 318 return infoTreeList; 319 } 320 321 private CycleDTO createNewCycle(ZephyrConfigModel zephyrData) throws Exception { 322 CycleDTO cycle = null; 323 if (zephyrData.getCycleId() == ZeeConstants.NEW_CYCLE_KEY_IDENTIFIER) { 324 ProjectDTO projectById = RestUtil.getMethodForProject(zephyrData.getZephyrProjectId()); 325 CycleDTO rCycle = new CycleDTO(); 326 try { 327 rCycle.setCycleStartDate(Utils.convertStringToDate("MM/dd/yyyy",zephyrData.getCycleStartDate())); 328 rCycle.setCycleEndDate(Utils.convertStringToDate("MM/dd/yyyy", zephyrData.getCycleEndDate())); 329 rCycle.setName(zephyrData.getCycleName()); 330 rCycle.setReleaseId(zephyrData.getReleaseId()); 331 rCycle.setEnvironment(""); 332 rCycle.setBuild(""); 333 cycle = RestUtil.CreateCycle(rCycle); 334 zephyrData.setCycleId(cycle.getId()); 335 } catch (Exception e) { 336 logger.log(Level.SEVERE, e.getMessage(),e); 337 throw new Exception(e.getMessage()); 338 } 339 } 340 return cycle; 341 } 342 343 private CyclePhaseDTO createCyclePhase(CycleDTO cycle, ZephyrConfigModel zephyrData, AutomationJobDetail automationJobDetail) 344 throws ParseException, IOException { 345 CyclePhaseDTO cyclePhase = new CyclePhaseDTO(); 346 cyclePhase.setName(zephyrData.getPhaseName()); 347 cyclePhase.setCycleId(cycle.getId()); 348 cyclePhase.setFreeForm(true); 349 cyclePhase.setPhaseStartDate(cycle.getCycleStartDate()); 350 cyclePhase.setPhaseEndDate(cycle.getCycleEndDate()); 351 cyclePhase=RestUtil.addPhaseToCycle(cyclePhase,automationJobDetail); 352 return cyclePhase; 353 } 354 355 public static Set<String> getTestExecutionStatusIds(Boolean searchActive) throws IOException { 356 PreferenceDTO preferenceDTO = RestUtil.getTestExecutionStatuses(); 357 Set<String> statusIds = new HashSet<>(); 358 359 if(preferenceDTO != null) { 360 Type mapListType = new TypeToken<List<Map>>(){}.getType(); 361 List<Map> mapList = GsonUtil.CUSTOM_GSON.fromJson(preferenceDTO.getValue(), mapListType); 362 363 for(Map map : mapList) { 364 if(map.containsKey("id")) { 365 String id = map.get("id").toString(); 366 if(searchActive != null && map.containsKey("active")) { 367 Boolean active = Boolean.valueOf(map.get("active").toString()); 368 if(searchActive == active) { 369 statusIds.add(id); 370 } 371 } else { 372 statusIds.add(id); 373 } 374 } 375 } 376 377 } 378 return statusIds; 379 } 380}