/* * 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.impl.wsdl.panels.project; import com.eviware.soapui.analytics.Analytics; import com.eviware.soapui.analytics.SoapUIActions; import com.eviware.soapui.impl.support.actions.ShowOnlineHelpAction; import com.eviware.soapui.impl.wsdl.WsdlProject; import com.eviware.soapui.impl.wsdl.actions.project.AddNewTestSuiteAction; import com.eviware.soapui.impl.wsdl.panels.support.MockProjectRunner; import com.eviware.soapui.impl.wsdl.panels.testcase.JTestRunLog; import com.eviware.soapui.impl.wsdl.panels.teststeps.support.AbstractGroovyEditorModel; import com.eviware.soapui.impl.wsdl.support.HelpUrls; import com.eviware.soapui.impl.wsdl.testcase.WsdlProjectRunner; import com.eviware.soapui.model.support.ProjectListenerAdapter; import com.eviware.soapui.model.testsuite.ProjectRunContext; import com.eviware.soapui.model.testsuite.ProjectRunListener; import com.eviware.soapui.model.testsuite.ProjectRunner; import com.eviware.soapui.model.testsuite.TestSuite; import com.eviware.soapui.model.testsuite.TestSuite.TestSuiteRunType; import com.eviware.soapui.model.testsuite.TestSuiteRunner; import com.eviware.soapui.support.UISupport; import com.eviware.soapui.support.action.swing.SwingActionDelegate; import com.eviware.soapui.support.components.GroovyEditorComponent; import com.eviware.soapui.support.components.GroovyEditorInspector; import com.eviware.soapui.support.components.JComponentInspector; import com.eviware.soapui.support.components.JInspectorPanel; import com.eviware.soapui.support.components.JInspectorPanelFactory; import com.eviware.soapui.support.components.JXToolBar; import com.eviware.soapui.support.types.StringToObjectMap; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.ButtonGroup; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JToggleButton; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class WsdlProjectTestSuitesTabPanel extends JPanel { private final WsdlProject project; private JProgressBar progressBar; private JProjectTestSuiteList testSuiteList; private RunAction runAction = new RunAction(); private CancelAction cancelAction = new CancelAction(); private JToggleButton sequentialButton; private JToggleButton parallellButton; private final InternalProjectListener testSuiteListener = new InternalProjectListener(); private final InternalTestSuiteRunListener testSuiteRunListener = new InternalTestSuiteRunListener(); private JTestRunLog testRunLog; private GroovyEditorComponent tearDownGroovyEditor; private GroovyEditorComponent setupGroovyEditor; private JInspectorPanel testSuiteListInspectorPanel; private JInspectorPanel inspectorPanel; private WsdlProjectRunner projectRunner; public WsdlProjectTestSuitesTabPanel(WsdlProject project) { super(new BorderLayout()); this.project = project; buildUI(); project.addProjectRunListener(testSuiteRunListener); project.addProjectListener(testSuiteListener); } public WsdlProject getProject() { return project; } private void buildUI() { add(buildToolbar(), BorderLayout.NORTH); add(buildContent(), BorderLayout.CENTER); setPreferredSize(new Dimension(500, 500)); } private JComponent buildContent() { inspectorPanel = JInspectorPanelFactory.build(buildTabs()); addInspectors(inspectorPanel); return inspectorPanel.getComponent(); } protected void addInspectors(JInspectorPanel inspectorPanel) { inspectorPanel.addInspector(new JComponentInspector<JComponent>(buildRunLog(), "TestSuite Log", "Log of executed TestSuites, TestCases and TestSteps", true)); } private JComponent buildRunLog() { testRunLog = new JTestRunLog(project.getSettings()); return testRunLog; } protected JProjectTestSuiteList getTestSuiteList() { return testSuiteList; } private JComponent buildToolbar() { cancelAction.setEnabled(false); runAction.setEnabled(project.getTestSuiteCount() > 0); JXToolBar toolbar = UISupport.createToolbar(); addToolbarActions(toolbar); toolbar.addGlue(); toolbar.add(UISupport.createToolbarButton(new ShowOnlineHelpAction(HelpUrls.TESTSUITE_HELP_URL))); progressBar = new JProgressBar(0, project.getTestSuiteCount()); JPanel progressPanel = UISupport.createProgressBarPanel(progressBar, 10, false); JPanel panel = new JPanel(new BorderLayout()); panel.add(toolbar, BorderLayout.PAGE_START); panel.add(progressPanel, BorderLayout.CENTER); return panel; } protected void addToolbarActions(JXToolBar toolbar) { toolbar.add(UISupport.createToolbarButton(runAction)); toolbar.add(UISupport.createToolbarButton(cancelAction)); toolbar.addRelatedGap(); ButtonGroup buttonGroup = new ButtonGroup(); sequentialButton = new JToggleButton(UISupport.createImageIcon("/sequential.gif"), true); sequentialButton.setToolTipText("The selected TestSuites are run in sequence"); sequentialButton.setPreferredSize(UISupport.getPreferredButtonSize()); sequentialButton.setSelected(project.getRunType() == TestSuiteRunType.SEQUENTIAL); sequentialButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { project.setRunType(TestSuiteRunType.SEQUENTIAL); } }); buttonGroup.add(sequentialButton); parallellButton = new JToggleButton(UISupport.createImageIcon("/parallell.gif")); parallellButton.setToolTipText("The selected TestSuites are run in parallel"); parallellButton.setPreferredSize(UISupport.getPreferredButtonSize()); parallellButton.setSelected(project.getRunType() == TestSuiteRunType.PARALLEL); parallellButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { project.setRunType(TestSuiteRunType.PARALLEL); } }); buttonGroup.add(parallellButton); toolbar.addUnrelatedGap(); toolbar.add(sequentialButton); toolbar.addRelatedGap(); toolbar.add(parallellButton); } private JComponent buildTabs() { JTabbedPane tabs = new JTabbedPane(JTabbedPane.TOP); testSuiteListInspectorPanel = JInspectorPanelFactory.build(buildTestSuiteList(project)); tabs.addTab("TestSuites", testSuiteListInspectorPanel.getComponent()); addTabs(tabs, testSuiteListInspectorPanel); tabs.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); return UISupport.createTabPanel(tabs, true); } protected void addTabs(JTabbedPane tabs, JInspectorPanel inspectorPanel) { inspectorPanel.addInspector(new GroovyEditorInspector(buildSetupScriptPanel(), "Setup Script", "Script to run before running TestSuites")); inspectorPanel.addInspector(new GroovyEditorInspector(buildTearDownScriptPanel(), "TearDown Script", "Script to run after running TestSuites")); } protected GroovyEditorComponent buildTearDownScriptPanel() { tearDownGroovyEditor = new GroovyEditorComponent(new TearDownScriptGroovyEditorModel(), HelpUrls.FUNCTIONAL_TESTING_TEARDOWN_SCRIPT); return tearDownGroovyEditor; } protected GroovyEditorComponent buildSetupScriptPanel() { setupGroovyEditor = new GroovyEditorComponent(new SetupScriptGroovyEditorModel(), HelpUrls.FUNCTIONAL_TESTING_SETUP_SCRIPT); return setupGroovyEditor; } protected JComponent buildTestSuiteList(WsdlProject testSuite) { testSuiteList = new JProjectTestSuiteList(testSuite); JPanel p = new JPanel(new BorderLayout()); p.add(buildTestCaseListToolbar(), BorderLayout.NORTH); p.add(new JScrollPane(testSuiteList), BorderLayout.CENTER); return p; } private Component buildTestCaseListToolbar() { JXToolBar toolbar = UISupport.createToolbar(); toolbar.add(UISupport.createToolbarButton(SwingActionDelegate.createDelegate( AddNewTestSuiteAction.SOAPUI_ACTION_ID, project, null, "/test_suite.png"))); toolbar.addGlue(); toolbar.add(UISupport.createToolbarButton(new ShowOnlineHelpAction(HelpUrls.TESTSUITELIST_HELP_URL))); return toolbar; } public void release() { inspectorPanel.release(); testSuiteListInspectorPanel.release(); setupGroovyEditor.release(); tearDownGroovyEditor.release(); testRunLog.release(); project.removeProjectRunListener(testSuiteRunListener); project.removeProjectListener(testSuiteListener); } protected void runProject() { projectRunner = project.run(new StringToObjectMap(), true); } protected void beforeRun() { runAction.setEnabled(false); cancelAction.setEnabled(true); testSuiteList.setEnabled(false); progressBar.setForeground(Color.GREEN.darker()); } protected void afterRun() { runAction.setEnabled(true); cancelAction.setEnabled(false); testSuiteList.setEnabled(true); progressBar.setString(projectRunner.getStatus().toString()); progressBar.setForeground(projectRunner.isFailed() ? Color.RED : Color.GREEN.darker()); } private final class InternalProjectListener extends ProjectListenerAdapter { public void testSuiteAdded(TestSuite testSuite) { runAction.setEnabled(project.getTestSuiteCount() > 0); } public void testSuiteRemoved(TestSuite testSuite) { runAction.setEnabled(project.getTestSuiteCount() > 0); } } private class RunAction extends AbstractAction { public RunAction() { putValue(Action.SMALL_ICON, UISupport.createImageIcon("/run.png")); putValue(Action.SHORT_DESCRIPTION, "Runs the selected TestSuites"); } public void actionPerformed(ActionEvent e) { runProject(); Analytics.trackAction(SoapUIActions.RUN_PROJECT.getActionName()); } } private class CancelAction extends AbstractAction { public CancelAction() { putValue(Action.SMALL_ICON, UISupport.createImageIcon("/stop.png")); putValue(Action.SHORT_DESCRIPTION, "Cancels ongoing TestSuite runs"); } public void actionPerformed(ActionEvent e) { projectRunner.cancel("Cancelled from UI"); } } private class SetupScriptGroovyEditorModel extends AbstractGroovyEditorModel { public SetupScriptGroovyEditorModel() { super(new String[]{"log", "runner", "context", "project"}, project, "Setup"); } public String getScript() { return project.getBeforeRunScript(); } public void setScript(String text) { project.setBeforeRunScript(text); } @Override public Action createRunAction() { return new AbstractAction() { public void actionPerformed(ActionEvent e) { try { MockProjectRunner runner = new MockProjectRunner(project); project.runBeforeRunScript((ProjectRunContext) runner.getRunContext(), runner); } catch (Exception e1) { UISupport.showErrorMessage(e1); } } }; } } private class TearDownScriptGroovyEditorModel extends AbstractGroovyEditorModel { public TearDownScriptGroovyEditorModel() { super(new String[]{"log", "runner", "context", "project"}, project, "TearDown"); } public String getScript() { return project.getAfterRunScript(); } public void setScript(String text) { project.setAfterRunScript(text); } @Override public Action createRunAction() { return new AbstractAction() { public void actionPerformed(ActionEvent e) { try { MockProjectRunner runner = new MockProjectRunner(project); project.runAfterRunScript((ProjectRunContext) runner.getRunContext(), runner); } catch (Exception e1) { UISupport.showErrorMessage(e1); } } }; } } private class InternalTestSuiteRunListener implements ProjectRunListener { private TestRunLogTestSuiteRunListener runLogListener; private int finishCount; public void afterRun(ProjectRunner testScenarioRunner, ProjectRunContext runContext) { if (testScenarioRunner != projectRunner) { return; } WsdlProjectTestSuitesTabPanel.this.afterRun(); } public void afterTestSuite(ProjectRunner testScenarioRunner, ProjectRunContext runContext, TestSuiteRunner testRunner) { if (testScenarioRunner != projectRunner) { return; } progressBar.setValue(++finishCount); if (project.getRunType() == TestSuiteRunType.SEQUENTIAL) { testRunner.getTestSuite().removeTestSuiteRunListener(runLogListener); } } public void beforeRun(ProjectRunner testScenarioRunner, ProjectRunContext runContext) { if (testScenarioRunner != projectRunner) { return; } WsdlProjectTestSuitesTabPanel.this.beforeRun(); testSuiteList.reset(); progressBar.setMaximum(project.getTestSuiteCount()); progressBar.setValue(0); progressBar.setString(""); finishCount = 0; if (runLogListener == null) { runLogListener = new TestRunLogTestSuiteRunListener(testRunLog, false); } testRunLog.clear(); if (project.getRunType() == TestSuiteRunType.PARALLEL) { testRunLog.addText("<log disabled during parallel execution>"); } } public void beforeTestSuite(ProjectRunner testScenarioRunner, ProjectRunContext runContext, TestSuite testRunnable) { if (testScenarioRunner != projectRunner) { return; } progressBar.setString("Running " + testRunnable.getName()); if (project.getRunType() == TestSuiteRunType.SEQUENTIAL) { testRunnable.addTestSuiteRunListener(runLogListener); } } } public WsdlProjectRunner getProjectRunner() { return projectRunner; } }