/* * 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.security.support; import com.eviware.soapui.impl.wsdl.teststeps.WsdlTestStep; import com.eviware.soapui.model.security.SecurityScan; import com.eviware.soapui.model.testsuite.TestCaseRunner; import com.eviware.soapui.model.testsuite.TestStep; import com.eviware.soapui.model.testsuite.TestStepResult; import com.eviware.soapui.security.SecurityTest; import com.eviware.soapui.security.SecurityTestRunContext; import com.eviware.soapui.security.result.SecurityResult.ResultStatus; import com.eviware.soapui.security.result.SecurityScanRequestResult; import com.eviware.soapui.security.result.SecurityScanResult; import com.eviware.soapui.security.result.SecurityTestStepResult; import com.eviware.soapui.security.scan.AbstractSecurityScanWithProperties; import javax.swing.JLabel; import javax.swing.JProgressBar; import javax.swing.JTree; import javax.swing.SwingConstants; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import java.awt.Color; import java.awt.Dimension; /** * Class that keeps a JProgressBars state in sync with a SecurityTest * <p/> * Progress bar status can be: 1. In Progreess while test is running. 2. Done * when test is done. 3. Canced when is canceled execution 4. Missing * Assertions/Parameters if assertions/parameters are missing in security scan. * <p/> * Importance/power of states: 1. Missing Assertions 2. Missing Parameters 3. * Cancel 4. Done 5. In Progress 6. SKIPPED * <p/> * Progress bar color can be: 1. OK 2. FAILED 3. MISSING_ASSERTION - same color * <p/> * if parameters are missing. * <p/> * Color power: 1. FAILED 2. MISSING_ASSERTION 3. OK */ public class ProgressBarSecurityTestStepAdapter { private JProgressBar progressBar; private TestStep testStep; private SecurityTest securityTest; private InternalTestRunListener internalTestRunListener; private JTree tree; private DefaultMutableTreeNode node; private JLabel counterLabel; private static final Color OK_COLOR = new Color(0, 204, 102); private static final Color FAILED_COLOR = new Color(255, 102, 0); private static final Color MISSING_ASSERTION_COLOR = new Color(204, 153, 255); private static final Color UNKNOWN_COLOR = new Color(240, 240, 240); private static final String STATE_RUN = "In progress"; private static final String STATE_DONE = "Done"; private static final String STATE_CANCEL = "Canceled"; private static final String STATE_MISSING_ASSERTIONS = "Missing Assertions"; private static final String STATE_MISSING_PARAMETERS = "Missing Parameters"; public ProgressBarSecurityTestStepAdapter(JTree tree, DefaultMutableTreeNode node, JProgressBar progressBar, SecurityTest securityTest, WsdlTestStep testStep, JLabel cntLabel) { this.tree = tree; this.node = node; this.progressBar = progressBar; this.testStep = testStep; this.securityTest = securityTest; this.counterLabel = cntLabel; internalTestRunListener = new InternalTestRunListener(); if (progressBar != null && cntLabel != null) { this.counterLabel.setPreferredSize(new Dimension(50, 18)); this.counterLabel.setHorizontalTextPosition(SwingConstants.CENTER); this.counterLabel.setHorizontalAlignment(SwingConstants.CENTER); this.securityTest.addSecurityTestRunListener(internalTestRunListener); } } public void release() { securityTest.removeSecurityTestRunListener(internalTestRunListener); securityTest = null; testStep = null; } public class InternalTestRunListener extends SecurityTestRunListenerAdapter { private int totalAlertsCounter; @Override public void beforeStep(TestCaseRunner testRunner, SecurityTestRunContext runContext, TestStepResult tsr) { if (tsr.getTestStep().getId().equals(testStep.getId())) { int count = securityTest.getStepSecurityApplicableScansCount(tsr); progressBar.getModel().setMaximum(count); if (securityTest.getSecurityScansMap().get(testStep.getId()) != null && securityTest.getSecurityScansMap().get(testStep.getId()).size() > 0) { progressBar.setString(STATE_RUN); progressBar.setForeground(OK_COLOR); } progressBar.setBackground(Color.white); progressBar.setValue(0); counterLabel.setText(""); counterLabel.setOpaque(false); ((DefaultTreeModel) tree.getModel()).nodeChanged(node); } } @Override public void beforeRun(TestCaseRunner testRunner, SecurityTestRunContext runContext) { progressBar.setString(""); progressBar.setValue(0); counterLabel.setText(""); counterLabel.setOpaque(false); totalAlertsCounter = 0; ((DefaultTreeModel) tree.getModel()).nodeChanged(node); if (progressBar != null) { progressBar.setForeground(UNKNOWN_COLOR); progressBar.setBackground(UNKNOWN_COLOR); } } @Override public void afterStep(TestCaseRunner testRunner, SecurityTestRunContext runContext, SecurityTestStepResult result) { if (runContext.getCurrentStep().getId().equals(testStep.getId())) { if (!(progressBar.getString().equals(STATE_CANCEL) || progressBar.getString().equals(STATE_MISSING_ASSERTIONS) || progressBar.getString().equals( STATE_MISSING_PARAMETERS)) && securityTest.getSecurityTestStepResultMap().get(testStep) != null) { SecurityTestStepResult results = securityTest.getSecurityTestStepResultMap().get(testStep); /* * This is hack since SecurityTestStepResult.getStatus() do not * returns real state of execution. * * SKIPPED state overides all except FAILED , which is wrong. */ boolean skipped = results.getSecurityScanResultList().size() > 0; for (SecurityScanResult res : results.getSecurityScanResultList()) { if (res.getStatus() == ResultStatus.SKIPPED) { continue; } else { skipped = false; break; } } if (skipped) { progressBar.setString("SKIPPED"); progressBar.setForeground(UNKNOWN_COLOR); } else { progressBar.setString(STATE_DONE); } } } else { progressBar.setBackground(UNKNOWN_COLOR); } progressBar.setValue(progressBar.getMaximum() == 0 ? 1 : progressBar.getMaximum()); ((DefaultTreeModel) tree.getModel()).nodeChanged(node); } @Override public void beforeSecurityScan(TestCaseRunner testRunner, SecurityTestRunContext runContext, SecurityScan securityScan) { if (securityScan.getTestStep().getId().equals(testStep.getId())) { // set progress bar color/state based on/if there is result if (securityScan.getSecurityScanResult() != null && securityScan.getSecurityScanResult().getStatus() != ResultStatus.CANCELED) { if (progressBar.getString().equals("")) { if (securityTest.getSecurityScansMap().get(testStep.getId()) != null && securityTest.getSecurityScansMap().get(testStep.getId()).size() > 0) { progressBar.setString(STATE_RUN); progressBar.setForeground(OK_COLOR); } } } // report is there is no assertions. if (securityScan.getAssertionCount() == 0) { if (!progressBar.getForeground().equals(FAILED_COLOR)) { progressBar.setForeground(MISSING_ASSERTION_COLOR); } progressBar.setString(STATE_MISSING_ASSERTIONS); } // or if there is no parameters. if (securityScan instanceof AbstractSecurityScanWithProperties && ((AbstractSecurityScanWithProperties) securityScan).getParameterHolder().getParameterList() .size() == 0) { if (!progressBar.getForeground().equals(FAILED_COLOR)) { progressBar.setForeground(MISSING_ASSERTION_COLOR); } if (!progressBar.getString().equals(STATE_MISSING_ASSERTIONS)) { progressBar.setString(STATE_MISSING_PARAMETERS); } } } } public void afterSecurityScan(TestCaseRunner testRunner, SecurityTestRunContext runContext, SecurityScanResult securityCheckResult) { if (securityCheckResult.getSecurityScan().getTestStep().getId().equals(testStep.getId())) { if (securityCheckResult.getStatus() == ResultStatus.CANCELED) { progressBar.setString(STATE_CANCEL); progressBar.setBackground(UNKNOWN_COLOR); } else // progressbar can change its color only if not missing // assertions or parameters if (securityCheckResult.getStatus() == ResultStatus.FAILED) { progressBar.setForeground(FAILED_COLOR); } else if (securityCheckResult.getStatus() == ResultStatus.OK) { SecurityScan securityScan = securityCheckResult.getSecurityScan(); if (securityScan.getAssertionCount() == 0) { if (!progressBar.getForeground().equals(FAILED_COLOR)) { progressBar.setForeground(MISSING_ASSERTION_COLOR); } progressBar.setString(STATE_MISSING_ASSERTIONS); } // or if there is no parameters. if (securityScan instanceof AbstractSecurityScanWithProperties && ((AbstractSecurityScanWithProperties) securityScan).getParameterHolder().getParameterList() .size() == 0) { if (!progressBar.getForeground().equals(FAILED_COLOR)) { progressBar.setForeground(MISSING_ASSERTION_COLOR); } if (!progressBar.getString().equals(STATE_MISSING_ASSERTIONS)) { progressBar.setString(STATE_MISSING_PARAMETERS); } } // can not change to OK color if any of previous scans // failed or missing assertions/parameters if (!progressBar.getForeground().equals(FAILED_COLOR) && !progressBar.getForeground().equals(MISSING_ASSERTION_COLOR)) { progressBar.setForeground(OK_COLOR); } } progressBar.setValue(((SecurityTestRunContext) runContext).getCurrentScanIndex() + 1); ((DefaultTreeModel) tree.getModel()).nodeChanged(node); } } @Override public void afterSecurityScanRequest(TestCaseRunner testRunner, SecurityTestRunContext runContext, SecurityScanRequestResult securityCheckReqResult) { if (securityCheckReqResult.getSecurityScan().getTestStep().getId().equals(testStep.getId())) { if (securityCheckReqResult.getStatus() == ResultStatus.FAILED) { counterLabel.setOpaque(true); counterLabel.setBackground(FAILED_COLOR); totalAlertsCounter++; counterLabel.setText(" " + totalAlertsCounter + " "); ((DefaultTreeModel) tree.getModel()).nodeChanged(node); progressBar.setForeground(FAILED_COLOR); } } } } }