/* * 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.loadtest.strategy; import com.eviware.soapui.impl.wsdl.loadtest.WsdlLoadTest; import com.eviware.soapui.model.testsuite.LoadTestRunContext; import com.eviware.soapui.model.testsuite.LoadTestRunner; import com.eviware.soapui.model.testsuite.TestRunner.Status; import com.eviware.soapui.support.DocumentListenerAdapter; import com.eviware.soapui.support.UISupport; import com.eviware.soapui.support.xml.XmlObjectConfigurationBuilder; import com.eviware.soapui.support.xml.XmlObjectConfigurationReader; import com.jgoodies.forms.builder.ButtonBarBuilder; import org.apache.xmlbeans.XmlObject; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.text.Document; /** * Burst LoadStrategy that pauses for a certain amount of time * * @author Ole.Matzura */ public class BurstLoadStrategy extends AbstractLoadStrategy { private static final String BURST_DURATION_ELEMENT = "burstDuration"; private static final String BURST_DELAY_ELEMENT = "burstDelay"; private static final int DEFAULT_BURST_DURATION = 10000; private static final int DEFAULT_BURST_DELAY = 60000; public static final String STRATEGY_TYPE = "Burst"; private JPanel configPanel; private int burstDelay = DEFAULT_BURST_DELAY; private int burstDuration = DEFAULT_BURST_DURATION; private long startTime; private JTextField delayField; private JTextField durationField; private JLabel infoLabel; private long threadCount; public BurstLoadStrategy(WsdlLoadTest loadTest) { super(STRATEGY_TYPE, loadTest); burstDelay = DEFAULT_BURST_DELAY; burstDuration = DEFAULT_BURST_DURATION; } public BurstLoadStrategy(XmlObject config, WsdlLoadTest loadTest) { super(STRATEGY_TYPE, loadTest); XmlObjectConfigurationReader reader = new XmlObjectConfigurationReader(config); burstDelay = reader.readInt(BURST_DELAY_ELEMENT, DEFAULT_BURST_DELAY); burstDuration = reader.readInt(BURST_DURATION_ELEMENT, DEFAULT_BURST_DURATION); } public void beforeLoadTest(LoadTestRunner loadTestRunner, LoadTestRunContext context) { super.beforeLoadTest(loadTestRunner, context); startTime = System.currentTimeMillis(); if (infoLabel != null) { infoLabel.setText("starting.."); } WsdlLoadTest wsdlLoadTest = (WsdlLoadTest) loadTestRunner.getLoadTest(); threadCount = wsdlLoadTest.getThreadCount(); wsdlLoadTest.setThreadCount(0); } public void recalculate(LoadTestRunner loadTestRunner, LoadTestRunContext context) { // get time passed since start of test long timePassed = System.currentTimeMillis() - startTime; if (loadTestRunner.getStatus() == Status.RUNNING) { WsdlLoadTest wsdlLoadTest = (WsdlLoadTest) loadTestRunner.getLoadTest(); String label = null; long mod = timePassed % (burstDelay + burstDuration); if (mod < burstDelay) { wsdlLoadTest.setThreadCount(0); label = (burstDelay - mod) / 1000 + "s delay left"; } else { wsdlLoadTest.setThreadCount(threadCount); label = ((burstDelay + burstDuration) - mod) / 1000 + "s burst left"; } if (infoLabel != null && !infoLabel.getText().equals(label)) { infoLabel.setText(label); } } } public void afterLoadTest(LoadTestRunner loadTestRunner, LoadTestRunContext context) { if (infoLabel != null) { infoLabel.setText(""); } // restore threadcount to original WsdlLoadTest wsdlLoadTest = (WsdlLoadTest) loadTestRunner.getLoadTest(); wsdlLoadTest.setThreadCount(threadCount); } public JComponent getConfigurationPanel() { if (configPanel == null) { ButtonBarBuilder builder = new ButtonBarBuilder(); infoLabel = new JLabel(); delayField = new JTextField(4); UISupport.setPreferredHeight(delayField, 18); delayField.setHorizontalAlignment(JTextField.RIGHT); delayField.setText(String.valueOf(burstDelay / 1000)); delayField.setToolTipText("Sets the delay before each burst run in seconds"); delayField.getDocument().addDocumentListener(new DocumentListenerAdapter() { public void update(Document doc) { try { burstDelay = Integer.parseInt(delayField.getText()) * 1000; notifyConfigurationChanged(); } catch (NumberFormatException e) { } } }); builder.addFixed(new JLabel("Burst Delay")); builder.addRelatedGap(); builder.addFixed(delayField); builder.addRelatedGap(); durationField = new JTextField(4); UISupport.setPreferredHeight(durationField, 18); durationField.setHorizontalAlignment(JTextField.RIGHT); durationField.setText(String.valueOf(burstDuration / 1000)); durationField.setToolTipText("Specifies the duration of a burst run in seconds"); durationField.getDocument().addDocumentListener(new DocumentListenerAdapter() { public void update(Document doc) { try { burstDuration = Integer.parseInt(durationField.getText()) * 1000; notifyConfigurationChanged(); } catch (NumberFormatException e) { } } }); builder.addFixed(new JLabel("Burst Duration")); builder.addRelatedGap(); builder.addFixed(durationField); builder.addRelatedGap(); builder.addFixed(infoLabel); configPanel = builder.getPanel(); } return configPanel; } public XmlObject getConfig() { XmlObjectConfigurationBuilder builder = new XmlObjectConfigurationBuilder(); builder.add(BURST_DELAY_ELEMENT, burstDelay); builder.add(BURST_DURATION_ELEMENT, burstDuration); return builder.finish(); } @Override public boolean allowThreadCountChangeDuringRun() { return false; } /** * Factory for BurstLoadStrategy class * * @author Ole.Matzura */ public static class Factory implements LoadStrategyFactory { public String getType() { return STRATEGY_TYPE; } public LoadStrategy build(XmlObject config, WsdlLoadTest loadTest) { return new BurstLoadStrategy(config, loadTest); } public LoadStrategy create(WsdlLoadTest loadTest) { return new BurstLoadStrategy(loadTest); } } }