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}