/* * SoapUI, Copyright (C) 2004-2016 SmartBear Software * * Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent * versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the Licence. * You may obtain a copy of the Licence at: * * http://ec.europa.eu/idabc/eupl * * Unless required by applicable law or agreed to in writing, software distributed under the Licence is * distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the Licence for the specific language governing permissions and limitations * under the Licence. */ package com.eviware.soapui.integration.loadui; import com.eviware.soapui.SoapUI; import com.eviware.soapui.impl.wsdl.WsdlProject; import com.eviware.soapui.impl.wsdl.WsdlTestSuite; import com.eviware.soapui.impl.wsdl.loadtest.WsdlLoadTest; import com.eviware.soapui.impl.wsdl.testcase.WsdlTestCase; import com.eviware.soapui.integration.impl.CajoClient; import com.eviware.soapui.model.project.SaveStatus; import com.eviware.soapui.support.StringUtils; import com.eviware.soapui.support.UISupport; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; public class IntegrationUtils { private static final String NOT_SELECTED = "-"; public static final String CREATE_NEW_OPTION = "<Create New>"; public static final String CREATE_ON_PROJECT_LEVEL = "<Project Level>"; public static final int ADD_TO_PROJECT_LEVEL = 0; public static final int ADD_TO_SINGLE_TESTCASE = 1; public static final int ADD_TO_SEPARATE_TESTCASES = 2; public static final String LOADU_INFO_DIALOG_TITLE = "Target loadUI items info"; public static String getIntegrationPort(String appName, String whichAppPort, String defaultPort) { String cajoPort = SoapUI.getSettings().getString(whichAppPort, defaultPort); try { Integer.parseInt(cajoPort); } catch (NumberFormatException nfe) { cajoPort = defaultPort; SoapUI.getSettings().setString(whichAppPort, cajoPort); SoapUI.log(appName + " integration port was reset to default value " + defaultPort + ", because its value was not correct!"); } return cajoPort; } public static List<String> getProjectsNames() { return invokeRemoteGettingStringList("getProjects", null); } public static List<String> getTestCasesNames() { return invokeRemoteGettingStringList("getTestCases", null); } public static List<String> getSoapUISamplersNames(String projectName, String testCaseName) { return invokeRemoteGettingStringList("getSoapUIRunners", new String[]{projectName, testCaseName}); } public static List<String> getMockServiceRunnersNames(String projectName, String testCaseName) { return invokeRemoteGettingStringList("getMockServiceRunners", new String[]{projectName, testCaseName}); } @SuppressWarnings("unchecked") private static List<String> invokeRemoteGettingStringList(String methodName, Object args) { try { return (List<String>) CajoClient.getInstance().invoke(methodName, args); } catch (Exception e) { SoapUI.log.error("Error while invoking cajo server in loadui ", e); return Collections.emptyList(); } } public static boolean isProjectOpened(String projectName) { boolean isOpened = false; try { isOpened = (Boolean) CajoClient.getInstance().invoke("isProjectOpened", new String[]{projectName}); } catch (Exception e) { SoapUI.log.error("Error while invoking cajo server in loadui ", e); } return isOpened; } public static String getOpenedProjectName() { String projectName = ""; try { projectName = ((String) CajoClient.getInstance().invoke("getOpenedProjectName", null)); } catch (Exception e) { SoapUI.log.error("Error while invoking cajo server in loadui ", e); } return projectName; } public static void bringLoadUIToFront() { try { CajoClient.getInstance().invoke("bringToFront", null); } catch (Exception e) { SoapUI.log.error("Error while invoking cajo server in loadui ", e); } } public static void removeLoadUILoadedProject(File projectFile) { try { CajoClient.getInstance().invoke("removeLoadedSoapUIProject", projectFile); } catch (Exception e) { SoapUI.log.error("Error while invoking cajo server in loadui ", e); } } public static HashMap<String, String> createSoapUIRunner(String soapUIProjectPath, String soapUITestSuite, String soapUITestCase, String loadUIProject, String loadUITestCase, String loadUISoapUISampler, String generatorType, String analisysType) throws IOException { HashMap<String, String> samplerSettings = new HashMap<String, String>(); try { SoapUI.log("createSoapUISampler for soapUIProjectPath=\"" + soapUIProjectPath + "\", soapUITestSuite=\"" + soapUITestSuite + "\", soapUITestCase=\"" + soapUITestCase + "\", loadUIProject=\"" + loadUIProject + "\", loadUITestCase=\"" + loadUITestCase + ", \"loadUISoapUISampler=\"" + loadUISoapUISampler + "\""); HashMap<String, Object> context = new ContextMapping(soapUIProjectPath, soapUITestSuite, soapUITestCase, loadUIProject, loadUITestCase, loadUISoapUISampler).setCreateSoapUIRunnerContext(generatorType, analisysType); samplerSettings = (HashMap<String, String>) CajoClient.getInstance().invoke("createSoapUIRunner", context); bringLoadUIToFront(); } catch (IOException e) { throw e; } catch (Exception e) { SoapUI.log.error("Error while invoking cajo server in loadui ", e); } return samplerSettings; } public static HashMap<String, String> createMockServiceRunner(String soapUIProjectPath, String soapUIMockService, String path, String port, String loadUIProject, String loadUITestCase, String mockServiceRunner) throws IOException { HashMap<String, String> mockServiceSettings = new HashMap<String, String>(); try { SoapUI.log("createMockRunner for soapUIProjectPath=\"" + soapUIProjectPath + "\", soapUIMockService=\"" + soapUIMockService + "\", path=\"" + path + "\", port=\"" + port + "\", loadUIProject=\"" + loadUIProject + "\", loadUITestCase=\"" + loadUITestCase + ", \"loadUIMockRunner=\"" + mockServiceRunner + "\""); HashMap<String, Object> context = new ContextMapping(soapUIProjectPath, soapUIMockService, "", "", loadUIProject, loadUITestCase, mockServiceRunner).setCreateMockServiceRunnerContext(); mockServiceSettings = (HashMap<String, String>) CajoClient.getInstance().invoke("createMockServiceRunner", context); bringLoadUIToFront(); } catch (IOException e) { throw e; } catch (Exception e) { SoapUI.log.error("Error while invoking cajo server in loadui ", e); } return mockServiceSettings; } public static HashMap<String, Object> exportLoadTestToLoadUI(WsdlLoadTest loadTest, String loadUIProject, String loadUITestCase, String loadUISoapUISampler) throws IOException { HashMap<String, Object> contextSettings = new HashMap<String, Object>(); try { ContextMapping contextMapping = new ContextMapping(loadTest, loadUIProject, loadUITestCase, loadUISoapUISampler); HashMap<String, Object> context = contextMapping.setInitExportLoadTestToLoadUIContext(); contextSettings = (HashMap<String, Object>) CajoClient.getInstance().invoke("exportSoapUILoadTestToLoadUI", context); if (contextMapping.isFinalTriggerMappingNeeded()) { // export once more to set final values whose setting use // previously // set default values CajoClient.getInstance().invoke("exportSoapUILoadTestToLoadUI", contextMapping.setFinalExportLoadTestToLoadUIContext(contextSettings)); } bringLoadUIToFront(); } catch (IOException e) { throw e; } catch (Exception e) { SoapUI.log.error("Error while invoking cajo server in loadui ", e); } return contextSettings; } public static HashMap<String, String> exportMultipleLoadTestToLoadUI(WsdlTestCase testCase, String[] loadTests, String loadUIProject) throws IOException { HashMap<String, String> samplerSettings = new HashMap<String, String>(); try { String loadTestName = loadTests[0]; WsdlLoadTest loadTest = (WsdlLoadTest) testCase.getLoadTestByName(loadTestName); HashMap<String, Object> firstSamplerSettings = exportLoadTestToLoadUI(loadTest, loadUIProject, CREATE_NEW_OPTION, CREATE_NEW_OPTION); // String loadUITestCaseAddedTo = ( String )firstSamplerSettings.get( // ContextMapping.LOADUI_TEST_CASE_NAME ); String loadUIProjectAddedTo = (String) firstSamplerSettings.get(ContextMapping.LOADUI_PROJECT_NAME); for (int i = 1; i < loadTests.length; i++) { loadTestName = loadTests[i]; loadTest = (WsdlLoadTest) testCase.getLoadTestByName(loadTestName); exportLoadTestToLoadUI(loadTest, loadUIProjectAddedTo, CREATE_NEW_OPTION, CREATE_NEW_OPTION); } bringLoadUIToFront(); } catch (IOException e) { throw e; } catch (Exception e) { SoapUI.log.error("Error while invoking cajo server in loadui ", e); } return samplerSettings; } public static HashMap<String, String> exportMultipleLoadTestToLoadUI(WsdlTestSuite testSuite, String[] loadTests, String loadUIProject) throws IOException { HashMap<String, String> samplerSettings = new HashMap<String, String>(); try { String compositeLoadTestName = loadTests[0]; String[] names = compositeLoadTestName.split(" - "); String testCaseName = names[0]; String loadTestName = names[1]; WsdlTestCase testCase = testSuite.getTestCaseByName(testCaseName); HashMap<String, Object> firstSamplerSettings; // String loadUITestCaseAddedTo = ""; String loadUIProjectAddedTo = ""; if (testCase != null) { WsdlLoadTest loadTest = (WsdlLoadTest) testCase.getLoadTestByName(loadTestName); if (loadTest != null) { firstSamplerSettings = exportLoadTestToLoadUI(loadTest, loadUIProject, CREATE_NEW_OPTION, CREATE_NEW_OPTION); // loadUITestCaseAddedTo = ( String )firstSamplerSettings.get( // ContextMapping.LOADUI_TEST_CASE_NAME ); loadUIProjectAddedTo = (String) firstSamplerSettings.get(ContextMapping.LOADUI_PROJECT_NAME); } } for (int i = 1; i < loadTests.length; i++) { compositeLoadTestName = loadTests[i]; loadTestName = loadTests[i]; WsdlLoadTest loadTest = (WsdlLoadTest) testCase.getLoadTestByName(loadTestName); testCaseName = names[0]; loadTestName = names[1]; testCase = testSuite.getTestCaseByName(testCaseName); if (testCase != null) { loadTest = (WsdlLoadTest) testCase.getLoadTestByName(loadTestName); if (loadTest != null) { exportLoadTestToLoadUI(loadTest, loadUIProjectAddedTo, CREATE_NEW_OPTION, CREATE_NEW_OPTION); } } } bringLoadUIToFront(); } catch (IOException e) { throw e; } catch (Exception e) { SoapUI.log.error("Error while invoking cajo server in loadui ", e); } return samplerSettings; } public static void generateTestSuiteLoadTests(String soapUIProjectPath, String soapUITestSuite, String[] soapUITestCases, String loadUIProject, int levelToAdd) throws IOException { String firstTestCase = soapUITestCases[0]; HashMap<String, String> firstSamplerSettings; String loadUITestCaseAddedTo; String loadUIProjectAddedTo; switch (levelToAdd) { case ADD_TO_PROJECT_LEVEL: firstSamplerSettings = createSoapUIRunner(soapUIProjectPath, soapUITestSuite, firstTestCase, loadUIProject, null, CREATE_NEW_OPTION, NOT_SELECTED, NOT_SELECTED); loadUIProjectAddedTo = firstSamplerSettings.get(ContextMapping.LOADUI_PROJECT_NAME); for (int i = 1; i < soapUITestCases.length; i++) { String testCase = soapUITestCases[i]; createSoapUIRunner(soapUIProjectPath, soapUITestSuite, testCase, loadUIProjectAddedTo, null, CREATE_NEW_OPTION, NOT_SELECTED, NOT_SELECTED); } break; case ADD_TO_SINGLE_TESTCASE: firstSamplerSettings = createSoapUIRunner(soapUIProjectPath, soapUITestSuite, firstTestCase, loadUIProject, CREATE_NEW_OPTION, CREATE_NEW_OPTION, NOT_SELECTED, NOT_SELECTED); loadUITestCaseAddedTo = firstSamplerSettings.get(ContextMapping.LOADUI_TEST_CASE_NAME); loadUIProjectAddedTo = firstSamplerSettings.get(ContextMapping.LOADUI_PROJECT_NAME); for (int i = 1; i < soapUITestCases.length; i++) { String testCase = soapUITestCases[i]; createSoapUIRunner(soapUIProjectPath, soapUITestSuite, testCase, loadUIProjectAddedTo, loadUITestCaseAddedTo, CREATE_NEW_OPTION, NOT_SELECTED, NOT_SELECTED); } break; case ADD_TO_SEPARATE_TESTCASES: firstSamplerSettings = createSoapUIRunner(soapUIProjectPath, soapUITestSuite, firstTestCase, loadUIProject, CREATE_NEW_OPTION, CREATE_NEW_OPTION, NOT_SELECTED, NOT_SELECTED); loadUIProjectAddedTo = firstSamplerSettings.get(ContextMapping.LOADUI_PROJECT_NAME); for (int i = 1; i < soapUITestCases.length; i++) { String testCase = soapUITestCases[i]; createSoapUIRunner(soapUIProjectPath, soapUITestSuite, testCase, loadUIProjectAddedTo, CREATE_NEW_OPTION, CREATE_NEW_OPTION, NOT_SELECTED, NOT_SELECTED); } break; } } /** * Closes currently opened project in loadUI. * * @param saveProject If true project will be saved before closing. If false project * will be closed without saving. */ public static void closeOpenedLoadUIProject(boolean saveProject) { try { if (saveProject) { CajoClient.getInstance().invoke("saveOpenedProject", null); } CajoClient.getInstance().invoke("closeOpenedProject", null); } catch (Exception e) { SoapUI.log.error("Error while invoking cajo server in loadui ", e); } } /** * Checks if currently opened project in loadUI is dirty. * * @return true if project is dirty, false if it is not, null if there is no * opened project. */ public static Boolean isOpenedProjectDirty() { Boolean result = null; try { result = (Boolean) CajoClient.getInstance().invoke("isOpenedProjectDirty", null); } catch (Exception e) { SoapUI.log.error("Error while invoking cajo server in loadui ", e); } return result; } /** * Checks the state of currently opened loadUI project and asks user what to * do with it. When project is dirty user is prompted with the following * options: Yes - save and close, No - close without saving, Cancel - don't * close project. When project is not dirty available options are: Yes - * close project, No - don't close. If there is no opened project user is not * prompted since there is no project to close. * * @return true if operation is canceled, false if not. */ public static boolean checkOpenedLoadUIProjectForClose() { String openedProjectName = getOpenedProjectName(); if (StringUtils.isNullOrEmpty(openedProjectName)) { // there is no opened project, so return false (don't cancel operation) return false; } // holds user decision if project should be closed (true) or not // (false or null) Boolean close; // holds user decision if project should be saved before close (true) or // not (false or null). This makes sense only if close is true. Boolean saveProject = null; Boolean isDirty = isOpenedProjectDirty(); if (isDirty != null && isDirty) { // display Yes-No-Cancel dialog. Yes = true (save and close), No = // false (close without saving), Cancel = null (dont't close at all) saveProject = UISupport.confirmOrCancel("Save currently open [" + openedProjectName + "] loadUI project before closing?", "Save loadUI project"); // when saveProject is not null user decided to close project (with or // without saving). when it is null user clicked cancel so don't close. close = saveProject != null; } else { // project is not dirty so display Yes-No dialog. Yes = true (close), // No = false (don't close) close = UISupport.confirm("Currently open [" + openedProjectName + "] loadUI project will be closed. Continue?", "Close loadUI project"); } // method result. Set to true if user canceled operation and to false if // project was closed. boolean quit = true; if (close) { closeOpenedLoadUIProject(saveProject != null && saveProject); quit = false; } return quit; } public static String[] getAvailableProjects() { List<String> availableProjects = getProjectsNames(); availableProjects.add(CREATE_NEW_OPTION); String[] names = new String[availableProjects.size()]; for (int c = 0; c < availableProjects.size(); c++) { names[c] = availableProjects.get(c); } return names; } /* * if project with projectName is opened adds all its testcases to list in * any case adds {CREATE_ON_PROJECT_LEVEL, CREATE_NEW_OPTION} */ public static String[] getAvailableTestCases(String projectName) { List<String> availableTestCases = new ArrayList<String>(); if (!projectName.equals(CREATE_NEW_OPTION) && isProjectOpened(projectName)) { availableTestCases.addAll(getTestCasesNames()); } availableTestCases.add(CREATE_ON_PROJECT_LEVEL); availableTestCases.add(CREATE_NEW_OPTION); String[] names = new String[availableTestCases.size()]; for (int c = 0; c < availableTestCases.size(); c++) { names[c] = availableTestCases.get(c); } return names; } public static String[] getAvailableRunners(String projectName, String testCaseName) { List<String> availableSamplers = new ArrayList<String>(); if (!projectName.equals(CREATE_NEW_OPTION) && isProjectOpened(projectName)) { availableSamplers.addAll(getSoapUISamplersNames(projectName, testCaseName)); } availableSamplers.add(CREATE_NEW_OPTION); String[] names = new String[availableSamplers.size()]; for (int c = 0; c < availableSamplers.size(); c++) { names[c] = availableSamplers.get(c); } return names; } public static String[] getAvailableMockServiceRunners(String projectName, String testCaseName) { List<String> availableMockServiceRunners = new ArrayList<String>(); if (!projectName.equals(CREATE_NEW_OPTION) && isProjectOpened(projectName)) { availableMockServiceRunners.addAll(getMockServiceRunnersNames(projectName, testCaseName)); } availableMockServiceRunners.add(CREATE_NEW_OPTION); String[] names = new String[availableMockServiceRunners.size()]; for (int c = 0; c < availableMockServiceRunners.size(); c++) { names[c] = availableMockServiceRunners.get(c); } return names; } /** * When exporting SoapUI project to loadUI, loadUI uses project file to get * resources so SoapUI project need to be saved for loadUI be able to pick * all changes if there is any. * * @param project * @return */ public static boolean forceSaveProject(WsdlProject project) { if (UISupport.confirm("Project needs to be saved before it gets exported! Save it?", "Save Project")) { try { if (project.save() == SaveStatus.SUCCESS) { return true; } else { UISupport.showInfoMessage("Export Operation Aborted!"); return false; } } catch (IOException e) { SoapUI.logError(e); UISupport.showErrorMessage("Error saving project file!. Export Operation Aborted!"); return false; } } else { UISupport.showInfoMessage("Export Operation Aborted!"); return false; } } }