You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jmeter.apache.org by pm...@apache.org on 2018/04/01 20:39:43 UTC
svn commit: r1828153 - in /jmeter/trunk: ./ bin/testfiles/
src/components/org/apache/jmeter/control/
src/core/org/apache/jmeter/control/ xdocs/
Author: pmouawad
Date: Sun Apr 1 20:39:42 2018
New Revision: 1828153
URL: http://svn.apache.org/viewvc?rev=1828153&view=rev
Log:
Bug 62239 - Add ability to Break Current Loop
Bugzilla Id: 62239
Added:
jmeter/trunk/bin/testfiles/ Bug62239.jmx (with props)
jmeter/trunk/bin/testfiles/Bug62239.csv
jmeter/trunk/bin/testfiles/Bug62239.xml (with props)
Modified:
jmeter/trunk/build.xml
jmeter/trunk/src/components/org/apache/jmeter/control/ForeachController.java
jmeter/trunk/src/core/org/apache/jmeter/control/LoopController.java
jmeter/trunk/src/core/org/apache/jmeter/control/WhileController.java
jmeter/trunk/xdocs/changes.xml
Added: jmeter/trunk/bin/testfiles/ Bug62239.jmx
URL: http://svn.apache.org/viewvc/jmeter/trunk/bin/testfiles/%20Bug62239.jmx?rev=1828153&view=auto
==============================================================================
--- jmeter/trunk/bin/testfiles/ Bug62239.jmx (added)
+++ jmeter/trunk/bin/testfiles/ Bug62239.jmx Sun Apr 1 20:39:42 2018
@@ -0,0 +1,507 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<jmeterTestPlan version="1.2" properties="4.0" jmeter="4.1-SNAPSHOT.20180401">
+ <hashTree>
+ <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true">
+ <stringProp name="TestPlan.comments"></stringProp>
+ <boolProp name="TestPlan.functional_mode">false</boolProp>
+ <boolProp name="TestPlan.tearDown_on_shutdown">true</boolProp>
+ <boolProp name="TestPlan.serialize_threadgroups">true</boolProp>
+ <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments"/>
+ </elementProp>
+ <stringProp name="TestPlan.user_define_classpath"></stringProp>
+ </TestPlan>
+ <hashTree>
+ <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true">
+ <boolProp name="ResultCollector.error_logging">false</boolProp>
+ <objProp>
+ <name>saveConfig</name>
+ <value class="SampleSaveConfiguration">
+ <time>false</time>
+ <latency>false</latency>
+ <timestamp>false</timestamp>
+ <success>true</success>
+ <label>true</label>
+ <code>true</code>
+ <message>true</message>
+ <threadName>true</threadName>
+ <dataType>true</dataType>
+ <encoding>false</encoding>
+ <assertions>true</assertions>
+ <subresults>true</subresults>
+ <responseData>false</responseData>
+ <samplerData>false</samplerData>
+ <xml>false</xml>
+ <fieldNames>false</fieldNames>
+ <responseHeaders>false</responseHeaders>
+ <requestHeaders>false</requestHeaders>
+ <responseDataOnError>false</responseDataOnError>
+ <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
+ <assertionsResultsToSave>0</assertionsResultsToSave>
+ </value>
+ </objProp>
+ <stringProp name="filename">Bug62239.csv</stringProp>
+ </ResultCollector>
+ <hashTree/>
+ <ResultCollector guiclass="SimpleDataWriter" testclass="ResultCollector" testname="Simple Data Writer" enabled="true">
+ <boolProp name="ResultCollector.error_logging">false</boolProp>
+ <objProp>
+ <name>saveConfig</name>
+ <value class="SampleSaveConfiguration">
+ <time>false</time>
+ <latency>false</latency>
+ <timestamp>false</timestamp>
+ <success>true</success>
+ <label>true</label>
+ <code>true</code>
+ <message>true</message>
+ <threadName>false</threadName>
+ <dataType>true</dataType>
+ <encoding>false</encoding>
+ <assertions>true</assertions>
+ <subresults>true</subresults>
+ <responseData>false</responseData>
+ <samplerData>false</samplerData>
+ <xml>true</xml>
+ <fieldNames>false</fieldNames>
+ <responseHeaders>false</responseHeaders>
+ <requestHeaders>false</requestHeaders>
+ <responseDataOnError>false</responseDataOnError>
+ <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
+ <assertionsResultsToSave>0</assertionsResultsToSave>
+ </value>
+ </objProp>
+ <stringProp name="filename">Bug62239.xml</stringProp>
+ </ResultCollector>
+ <hashTree/>
+ <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="TG-BL-LC" enabled="true">
+ <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
+ <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
+ <boolProp name="LoopController.continue_forever">false</boolProp>
+ <stringProp name="LoopController.loops">2</stringProp>
+ </elementProp>
+ <stringProp name="ThreadGroup.num_threads">1</stringProp>
+ <stringProp name="ThreadGroup.ramp_time">1</stringProp>
+ <boolProp name="ThreadGroup.scheduler">false</boolProp>
+ <stringProp name="ThreadGroup.duration"></stringProp>
+ <stringProp name="ThreadGroup.delay"></stringProp>
+ <stringProp name="TestPlan.comments">Break Loop on Loop Controller</stringProp>
+ </ThreadGroup>
+ <hashTree>
+ <DebugSampler guiclass="TestBeanGUI" testclass="DebugSampler" testname="LCDS-Before-${__jm__LC__idx}" enabled="true">
+ <boolProp name="displayJMeterProperties">false</boolProp>
+ <boolProp name="displayJMeterVariables">true</boolProp>
+ <boolProp name="displaySystemProperties">false</boolProp>
+ </DebugSampler>
+ <hashTree/>
+ <LoopController guiclass="LoopControlPanel" testclass="LoopController" testname="LC" enabled="true">
+ <boolProp name="LoopController.continue_forever">true</boolProp>
+ <stringProp name="LoopController.loops">5</stringProp>
+ </LoopController>
+ <hashTree>
+ <DebugSampler guiclass="TestBeanGUI" testclass="DebugSampler" testname="LCDS-${__jm__LC__idx}" enabled="true">
+ <boolProp name="displayJMeterProperties">false</boolProp>
+ <boolProp name="displayJMeterVariables">true</boolProp>
+ <boolProp name="displaySystemProperties">false</boolProp>
+ </DebugSampler>
+ <hashTree/>
+ <IfController guiclass="IfControllerPanel" testclass="IfController" testname="If_idx_equal_5" enabled="true">
+ <stringProp name="IfController.condition">${__jexl3(${__jm__LC__idx} == 3,)}</stringProp>
+ <boolProp name="IfController.evaluateAll">false</boolProp>
+ <boolProp name="IfController.useExpression">true</boolProp>
+ </IfController>
+ <hashTree>
+ <TestAction guiclass="TestActionGui" testclass="TestAction" testname="Flow Control Action" enabled="true">
+ <intProp name="ActionProcessor.action">5</intProp>
+ <intProp name="ActionProcessor.target">0</intProp>
+ <stringProp name="ActionProcessor.duration">0</stringProp>
+ </TestAction>
+ <hashTree/>
+ </hashTree>
+ <DebugSampler guiclass="TestBeanGUI" testclass="DebugSampler" testname="LCDS_After_Condition-${__jm__LC__idx}" enabled="true">
+ <boolProp name="displayJMeterProperties">false</boolProp>
+ <boolProp name="displayJMeterVariables">true</boolProp>
+ <boolProp name="displaySystemProperties">false</boolProp>
+ </DebugSampler>
+ <hashTree/>
+ </hashTree>
+ </hashTree>
+ <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="TG-BL-WC" enabled="true">
+ <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
+ <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
+ <boolProp name="LoopController.continue_forever">false</boolProp>
+ <stringProp name="LoopController.loops">2</stringProp>
+ </elementProp>
+ <stringProp name="ThreadGroup.num_threads">1</stringProp>
+ <stringProp name="ThreadGroup.ramp_time">1</stringProp>
+ <boolProp name="ThreadGroup.scheduler">false</boolProp>
+ <stringProp name="ThreadGroup.duration"></stringProp>
+ <stringProp name="ThreadGroup.delay"></stringProp>
+ <stringProp name="TestPlan.comments">Break Loop on While Controller</stringProp>
+ </ThreadGroup>
+ <hashTree>
+ <TestAction guiclass="TestActionGui" testclass="TestAction" testname="Flow Control Action" enabled="true">
+ <intProp name="ActionProcessor.action">1</intProp>
+ <intProp name="ActionProcessor.target">0</intProp>
+ <stringProp name="ActionProcessor.duration">0</stringProp>
+ </TestAction>
+ <hashTree>
+ <UserParameters guiclass="UserParametersGui" testclass="UserParameters" testname="User Parameters" enabled="true">
+ <collectionProp name="UserParameters.names">
+ <stringProp name="957830652">counter</stringProp>
+ </collectionProp>
+ <collectionProp name="UserParameters.thread_values">
+ <collectionProp name="85068">
+ <stringProp name="48">0</stringProp>
+ </collectionProp>
+ </collectionProp>
+ <boolProp name="UserParameters.per_iteration">false</boolProp>
+ </UserParameters>
+ <hashTree/>
+ </hashTree>
+ <DebugSampler guiclass="TestBeanGUI" testclass="DebugSampler" testname="WCDS-BeforeLoop-${counter}" enabled="true">
+ <boolProp name="displayJMeterProperties">false</boolProp>
+ <boolProp name="displayJMeterVariables">true</boolProp>
+ <boolProp name="displaySystemProperties">false</boolProp>
+ </DebugSampler>
+ <hashTree/>
+ <WhileController guiclass="WhileControllerGui" testclass="WhileController" testname="WC" enabled="true">
+ <stringProp name="WhileController.condition">${__jexl3(${counter} != 10,)}</stringProp>
+ </WhileController>
+ <hashTree>
+ <CounterConfig guiclass="CounterConfigGui" testclass="CounterConfig" testname="Counter" enabled="true">
+ <stringProp name="CounterConfig.start">0</stringProp>
+ <stringProp name="CounterConfig.end">100</stringProp>
+ <stringProp name="CounterConfig.incr">1</stringProp>
+ <stringProp name="CounterConfig.name">counter</stringProp>
+ <stringProp name="CounterConfig.format"></stringProp>
+ <boolProp name="CounterConfig.per_user">true</boolProp>
+ <boolProp name="CounterConfig.reset_on_tg_iteration">true</boolProp>
+ </CounterConfig>
+ <hashTree/>
+ <DebugSampler guiclass="TestBeanGUI" testclass="DebugSampler" testname="WCDS-${counter}" enabled="true">
+ <boolProp name="displayJMeterProperties">false</boolProp>
+ <boolProp name="displayJMeterVariables">true</boolProp>
+ <boolProp name="displaySystemProperties">false</boolProp>
+ </DebugSampler>
+ <hashTree/>
+ <IfController guiclass="IfControllerPanel" testclass="IfController" testname="If_idx_equal_3" enabled="true">
+ <stringProp name="IfController.condition">${__jexl3(${counter} == 3,)}</stringProp>
+ <boolProp name="IfController.evaluateAll">false</boolProp>
+ <boolProp name="IfController.useExpression">true</boolProp>
+ </IfController>
+ <hashTree>
+ <TestAction guiclass="TestActionGui" testclass="TestAction" testname="Flow Control Action" enabled="true">
+ <intProp name="ActionProcessor.action">5</intProp>
+ <intProp name="ActionProcessor.target">0</intProp>
+ <stringProp name="ActionProcessor.duration">0</stringProp>
+ </TestAction>
+ <hashTree/>
+ </hashTree>
+ <DebugSampler guiclass="TestBeanGUI" testclass="DebugSampler" testname="WCDS_After_Condition-${counter}" enabled="true">
+ <boolProp name="displayJMeterProperties">false</boolProp>
+ <boolProp name="displayJMeterVariables">true</boolProp>
+ <boolProp name="displaySystemProperties">false</boolProp>
+ </DebugSampler>
+ <hashTree/>
+ </hashTree>
+ </hashTree>
+ <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="TG-BL-FEC" enabled="true">
+ <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
+ <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
+ <boolProp name="LoopController.continue_forever">false</boolProp>
+ <stringProp name="LoopController.loops">2</stringProp>
+ </elementProp>
+ <stringProp name="ThreadGroup.num_threads">1</stringProp>
+ <stringProp name="ThreadGroup.ramp_time">1</stringProp>
+ <boolProp name="ThreadGroup.scheduler">false</boolProp>
+ <stringProp name="ThreadGroup.duration"></stringProp>
+ <stringProp name="ThreadGroup.delay"></stringProp>
+ <stringProp name="TestPlan.comments">Break Loop on For Each Controller</stringProp>
+ </ThreadGroup>
+ <hashTree>
+ <Arguments guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments">
+ <elementProp name="var_matchNr" elementType="Argument">
+ <stringProp name="Argument.name">var_matchNr</stringProp>
+ <stringProp name="Argument.value">5</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ </elementProp>
+ <elementProp name="var_1" elementType="Argument">
+ <stringProp name="Argument.name">var_1</stringProp>
+ <stringProp name="Argument.value">0</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ </elementProp>
+ <elementProp name="var_2" elementType="Argument">
+ <stringProp name="Argument.name">var_2</stringProp>
+ <stringProp name="Argument.value">1</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ </elementProp>
+ <elementProp name="var_3" elementType="Argument">
+ <stringProp name="Argument.name">var_3</stringProp>
+ <stringProp name="Argument.value">2</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ </elementProp>
+ <elementProp name="var_4" elementType="Argument">
+ <stringProp name="Argument.name">var_4</stringProp>
+ <stringProp name="Argument.value">3</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ </elementProp>
+ <elementProp name="var_5" elementType="Argument">
+ <stringProp name="Argument.name">var_5</stringProp>
+ <stringProp name="Argument.value">4</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ </elementProp>
+ </collectionProp>
+ </Arguments>
+ <hashTree/>
+ <ForeachController guiclass="ForeachControlPanel" testclass="ForeachController" testname="FEC" enabled="true">
+ <stringProp name="ForeachController.inputVal">var</stringProp>
+ <stringProp name="ForeachController.returnVal">myVar</stringProp>
+ <boolProp name="ForeachController.useSeparator">true</boolProp>
+ </ForeachController>
+ <hashTree>
+ <DebugSampler guiclass="TestBeanGUI" testclass="DebugSampler" testname="FECDS-${__jm__FEC__idx}" enabled="true">
+ <boolProp name="displayJMeterProperties">false</boolProp>
+ <boolProp name="displayJMeterVariables">true</boolProp>
+ <boolProp name="displaySystemProperties">false</boolProp>
+ </DebugSampler>
+ <hashTree/>
+ <IfController guiclass="IfControllerPanel" testclass="IfController" testname="If_idx_equal_3" enabled="true">
+ <stringProp name="IfController.condition">${__jexl3(${__jm__FEC__idx} == 3,)}</stringProp>
+ <boolProp name="IfController.evaluateAll">false</boolProp>
+ <boolProp name="IfController.useExpression">true</boolProp>
+ </IfController>
+ <hashTree>
+ <TestAction guiclass="TestActionGui" testclass="TestAction" testname="Flow Control Action" enabled="true">
+ <intProp name="ActionProcessor.action">5</intProp>
+ <intProp name="ActionProcessor.target">0</intProp>
+ <stringProp name="ActionProcessor.duration">0</stringProp>
+ </TestAction>
+ <hashTree/>
+ </hashTree>
+ <DebugSampler guiclass="TestBeanGUI" testclass="DebugSampler" testname="FECDS_After_Condition-${__jm__FEC__idx}" enabled="true">
+ <boolProp name="displayJMeterProperties">false</boolProp>
+ <boolProp name="displayJMeterVariables">true</boolProp>
+ <boolProp name="displaySystemProperties">false</boolProp>
+ </DebugSampler>
+ <hashTree/>
+ </hashTree>
+ </hashTree>
+ <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="TG-SNIL-LC" enabled="true">
+ <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
+ <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
+ <boolProp name="LoopController.continue_forever">false</boolProp>
+ <stringProp name="LoopController.loops">2</stringProp>
+ </elementProp>
+ <stringProp name="ThreadGroup.num_threads">1</stringProp>
+ <stringProp name="ThreadGroup.ramp_time">1</stringProp>
+ <boolProp name="ThreadGroup.scheduler">false</boolProp>
+ <stringProp name="ThreadGroup.duration"></stringProp>
+ <stringProp name="ThreadGroup.delay"></stringProp>
+ <stringProp name="TestPlan.comments">Switch Iteration of Next Loop on Loop Controller</stringProp>
+ </ThreadGroup>
+ <hashTree>
+ <DebugSampler guiclass="TestBeanGUI" testclass="DebugSampler" testname="LCDS-Before-${__jm__LC__idx}" enabled="true">
+ <boolProp name="displayJMeterProperties">false</boolProp>
+ <boolProp name="displayJMeterVariables">true</boolProp>
+ <boolProp name="displaySystemProperties">false</boolProp>
+ </DebugSampler>
+ <hashTree/>
+ <LoopController guiclass="LoopControlPanel" testclass="LoopController" testname="LC" enabled="true">
+ <boolProp name="LoopController.continue_forever">true</boolProp>
+ <stringProp name="LoopController.loops">5</stringProp>
+ </LoopController>
+ <hashTree>
+ <DebugSampler guiclass="TestBeanGUI" testclass="DebugSampler" testname="LCDS-${__jm__LC__idx}" enabled="true">
+ <boolProp name="displayJMeterProperties">false</boolProp>
+ <boolProp name="displayJMeterVariables">true</boolProp>
+ <boolProp name="displaySystemProperties">false</boolProp>
+ </DebugSampler>
+ <hashTree/>
+ <IfController guiclass="IfControllerPanel" testclass="IfController" testname="If_idx_equal_5" enabled="true">
+ <stringProp name="IfController.condition">${__jexl3(${__jm__LC__idx} == 3,)}</stringProp>
+ <boolProp name="IfController.evaluateAll">false</boolProp>
+ <boolProp name="IfController.useExpression">true</boolProp>
+ </IfController>
+ <hashTree>
+ <TestAction guiclass="TestActionGui" testclass="TestAction" testname="Flow Control Action" enabled="true">
+ <intProp name="ActionProcessor.action">4</intProp>
+ <intProp name="ActionProcessor.target">0</intProp>
+ <stringProp name="ActionProcessor.duration">0</stringProp>
+ </TestAction>
+ <hashTree/>
+ </hashTree>
+ <DebugSampler guiclass="TestBeanGUI" testclass="DebugSampler" testname="LCDS_After_Condition-${__jm__LC__idx}" enabled="true">
+ <boolProp name="displayJMeterProperties">false</boolProp>
+ <boolProp name="displayJMeterVariables">true</boolProp>
+ <boolProp name="displaySystemProperties">false</boolProp>
+ </DebugSampler>
+ <hashTree/>
+ </hashTree>
+ </hashTree>
+ <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="TG-SNIL-WC" enabled="true">
+ <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
+ <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
+ <boolProp name="LoopController.continue_forever">false</boolProp>
+ <stringProp name="LoopController.loops">2</stringProp>
+ </elementProp>
+ <stringProp name="ThreadGroup.num_threads">1</stringProp>
+ <stringProp name="ThreadGroup.ramp_time">1</stringProp>
+ <boolProp name="ThreadGroup.scheduler">false</boolProp>
+ <stringProp name="ThreadGroup.duration"></stringProp>
+ <stringProp name="ThreadGroup.delay"></stringProp>
+ <stringProp name="TestPlan.comments">Switch Iteration of Next Loop on While Controller</stringProp>
+ </ThreadGroup>
+ <hashTree>
+ <TestAction guiclass="TestActionGui" testclass="TestAction" testname="Flow Control Action" enabled="true">
+ <intProp name="ActionProcessor.action">1</intProp>
+ <intProp name="ActionProcessor.target">0</intProp>
+ <stringProp name="ActionProcessor.duration">0</stringProp>
+ </TestAction>
+ <hashTree>
+ <UserParameters guiclass="UserParametersGui" testclass="UserParameters" testname="User Parameters" enabled="true">
+ <collectionProp name="UserParameters.names">
+ <stringProp name="957830652">counter</stringProp>
+ </collectionProp>
+ <collectionProp name="UserParameters.thread_values">
+ <collectionProp name="85068">
+ <stringProp name="48">0</stringProp>
+ </collectionProp>
+ </collectionProp>
+ <boolProp name="UserParameters.per_iteration">false</boolProp>
+ </UserParameters>
+ <hashTree/>
+ </hashTree>
+ <DebugSampler guiclass="TestBeanGUI" testclass="DebugSampler" testname="WCDS-BeforeLoop-${counter}" enabled="true">
+ <boolProp name="displayJMeterProperties">false</boolProp>
+ <boolProp name="displayJMeterVariables">true</boolProp>
+ <boolProp name="displaySystemProperties">false</boolProp>
+ </DebugSampler>
+ <hashTree/>
+ <WhileController guiclass="WhileControllerGui" testclass="WhileController" testname="WC" enabled="true">
+ <stringProp name="WhileController.condition">${__jexl3(${counter} != 5,)}</stringProp>
+ </WhileController>
+ <hashTree>
+ <CounterConfig guiclass="CounterConfigGui" testclass="CounterConfig" testname="Counter" enabled="true">
+ <stringProp name="CounterConfig.start">0</stringProp>
+ <stringProp name="CounterConfig.end">100</stringProp>
+ <stringProp name="CounterConfig.incr">1</stringProp>
+ <stringProp name="CounterConfig.name">counter</stringProp>
+ <stringProp name="CounterConfig.format"></stringProp>
+ <boolProp name="CounterConfig.per_user">true</boolProp>
+ <boolProp name="CounterConfig.reset_on_tg_iteration">true</boolProp>
+ </CounterConfig>
+ <hashTree/>
+ <DebugSampler guiclass="TestBeanGUI" testclass="DebugSampler" testname="WCDS-${counter}" enabled="true">
+ <boolProp name="displayJMeterProperties">false</boolProp>
+ <boolProp name="displayJMeterVariables">true</boolProp>
+ <boolProp name="displaySystemProperties">false</boolProp>
+ </DebugSampler>
+ <hashTree/>
+ <IfController guiclass="IfControllerPanel" testclass="IfController" testname="If_idx_equal_3" enabled="true">
+ <stringProp name="IfController.condition">${__jexl3(${counter} == 3,)}</stringProp>
+ <boolProp name="IfController.evaluateAll">false</boolProp>
+ <boolProp name="IfController.useExpression">true</boolProp>
+ </IfController>
+ <hashTree>
+ <TestAction guiclass="TestActionGui" testclass="TestAction" testname="Flow Control Action" enabled="true">
+ <intProp name="ActionProcessor.action">4</intProp>
+ <intProp name="ActionProcessor.target">0</intProp>
+ <stringProp name="ActionProcessor.duration">0</stringProp>
+ </TestAction>
+ <hashTree/>
+ </hashTree>
+ <DebugSampler guiclass="TestBeanGUI" testclass="DebugSampler" testname="WCDS_After_Condition-${counter}" enabled="true">
+ <boolProp name="displayJMeterProperties">false</boolProp>
+ <boolProp name="displayJMeterVariables">true</boolProp>
+ <boolProp name="displaySystemProperties">false</boolProp>
+ </DebugSampler>
+ <hashTree/>
+ </hashTree>
+ </hashTree>
+ <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="TG-SNIL-FEC" enabled="true">
+ <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
+ <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
+ <boolProp name="LoopController.continue_forever">false</boolProp>
+ <stringProp name="LoopController.loops">2</stringProp>
+ </elementProp>
+ <stringProp name="ThreadGroup.num_threads">1</stringProp>
+ <stringProp name="ThreadGroup.ramp_time">1</stringProp>
+ <boolProp name="ThreadGroup.scheduler">false</boolProp>
+ <stringProp name="ThreadGroup.duration"></stringProp>
+ <stringProp name="ThreadGroup.delay"></stringProp>
+ <stringProp name="TestPlan.comments">Switch Iteration of Next Loop on For Each Controller</stringProp>
+ </ThreadGroup>
+ <hashTree>
+ <Arguments guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments">
+ <elementProp name="var_matchNr" elementType="Argument">
+ <stringProp name="Argument.name">var_matchNr</stringProp>
+ <stringProp name="Argument.value">5</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ </elementProp>
+ <elementProp name="var_1" elementType="Argument">
+ <stringProp name="Argument.name">var_1</stringProp>
+ <stringProp name="Argument.value">0</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ </elementProp>
+ <elementProp name="var_2" elementType="Argument">
+ <stringProp name="Argument.name">var_2</stringProp>
+ <stringProp name="Argument.value">1</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ </elementProp>
+ <elementProp name="var_3" elementType="Argument">
+ <stringProp name="Argument.name">var_3</stringProp>
+ <stringProp name="Argument.value">2</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ </elementProp>
+ <elementProp name="var_4" elementType="Argument">
+ <stringProp name="Argument.name">var_4</stringProp>
+ <stringProp name="Argument.value">3</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ </elementProp>
+ <elementProp name="var_5" elementType="Argument">
+ <stringProp name="Argument.name">var_5</stringProp>
+ <stringProp name="Argument.value">4</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ </elementProp>
+ </collectionProp>
+ </Arguments>
+ <hashTree/>
+ <ForeachController guiclass="ForeachControlPanel" testclass="ForeachController" testname="FEC" enabled="true">
+ <stringProp name="ForeachController.inputVal">var</stringProp>
+ <stringProp name="ForeachController.returnVal">myVar</stringProp>
+ <boolProp name="ForeachController.useSeparator">true</boolProp>
+ </ForeachController>
+ <hashTree>
+ <DebugSampler guiclass="TestBeanGUI" testclass="DebugSampler" testname="FECDS-${__jm__FEC__idx}" enabled="true">
+ <boolProp name="displayJMeterProperties">false</boolProp>
+ <boolProp name="displayJMeterVariables">true</boolProp>
+ <boolProp name="displaySystemProperties">false</boolProp>
+ </DebugSampler>
+ <hashTree/>
+ <IfController guiclass="IfControllerPanel" testclass="IfController" testname="If_idx_equal_3" enabled="true">
+ <stringProp name="IfController.condition">${__jexl3(${__jm__FEC__idx} == 3,)}</stringProp>
+ <boolProp name="IfController.evaluateAll">false</boolProp>
+ <boolProp name="IfController.useExpression">true</boolProp>
+ </IfController>
+ <hashTree>
+ <TestAction guiclass="TestActionGui" testclass="TestAction" testname="Flow Control Action" enabled="true">
+ <intProp name="ActionProcessor.action">4</intProp>
+ <intProp name="ActionProcessor.target">0</intProp>
+ <stringProp name="ActionProcessor.duration">0</stringProp>
+ </TestAction>
+ <hashTree/>
+ </hashTree>
+ <DebugSampler guiclass="TestBeanGUI" testclass="DebugSampler" testname="FECDS_After_Condition-${__jm__FEC__idx}" enabled="true">
+ <boolProp name="displayJMeterProperties">false</boolProp>
+ <boolProp name="displayJMeterVariables">true</boolProp>
+ <boolProp name="displaySystemProperties">false</boolProp>
+ </DebugSampler>
+ <hashTree/>
+ </hashTree>
+ </hashTree>
+ </hashTree>
+ </hashTree>
+</jmeterTestPlan>
Propchange: jmeter/trunk/bin/testfiles/ Bug62239.jmx
------------------------------------------------------------------------------
svn:eol-style = LF
Added: jmeter/trunk/bin/testfiles/Bug62239.csv
URL: http://svn.apache.org/viewvc/jmeter/trunk/bin/testfiles/Bug62239.csv?rev=1828153&view=auto
==============================================================================
--- jmeter/trunk/bin/testfiles/Bug62239.csv (added)
+++ jmeter/trunk/bin/testfiles/Bug62239.csv Sun Apr 1 20:39:42 2018
@@ -0,0 +1,108 @@
+LCDS-Before-${__jm__LC__idx},200,OK,TG-BL-LC 1-1,text,true
+LCDS-0,200,OK,TG-BL-LC 1-1,text,true
+LCDS_After_Condition-0,200,OK,TG-BL-LC 1-1,text,true
+LCDS-1,200,OK,TG-BL-LC 1-1,text,true
+LCDS_After_Condition-1,200,OK,TG-BL-LC 1-1,text,true
+LCDS-2,200,OK,TG-BL-LC 1-1,text,true
+LCDS_After_Condition-2,200,OK,TG-BL-LC 1-1,text,true
+LCDS-3,200,OK,TG-BL-LC 1-1,text,true
+LCDS-Before-0,200,OK,TG-BL-LC 1-1,text,true
+LCDS-0,200,OK,TG-BL-LC 1-1,text,true
+LCDS_After_Condition-0,200,OK,TG-BL-LC 1-1,text,true
+LCDS-1,200,OK,TG-BL-LC 1-1,text,true
+LCDS_After_Condition-1,200,OK,TG-BL-LC 1-1,text,true
+LCDS-2,200,OK,TG-BL-LC 1-1,text,true
+LCDS_After_Condition-2,200,OK,TG-BL-LC 1-1,text,true
+LCDS-3,200,OK,TG-BL-LC 1-1,text,true
+WCDS-BeforeLoop-0,200,OK,TG-BL-WC 2-1,text,true
+WCDS-0,200,OK,TG-BL-WC 2-1,text,true
+WCDS_After_Condition-0,200,OK,TG-BL-WC 2-1,text,true
+WCDS-1,200,OK,TG-BL-WC 2-1,text,true
+WCDS_After_Condition-1,200,OK,TG-BL-WC 2-1,text,true
+WCDS-2,200,OK,TG-BL-WC 2-1,text,true
+WCDS_After_Condition-2,200,OK,TG-BL-WC 2-1,text,true
+WCDS-3,200,OK,TG-BL-WC 2-1,text,true
+WCDS-BeforeLoop-0,200,OK,TG-BL-WC 2-1,text,true
+WCDS-0,200,OK,TG-BL-WC 2-1,text,true
+WCDS_After_Condition-0,200,OK,TG-BL-WC 2-1,text,true
+WCDS-1,200,OK,TG-BL-WC 2-1,text,true
+WCDS_After_Condition-1,200,OK,TG-BL-WC 2-1,text,true
+WCDS-2,200,OK,TG-BL-WC 2-1,text,true
+WCDS_After_Condition-2,200,OK,TG-BL-WC 2-1,text,true
+WCDS-3,200,OK,TG-BL-WC 2-1,text,true
+FECDS-0,200,OK,TG-BL-FEC 3-1,text,true
+FECDS_After_Condition-0,200,OK,TG-BL-FEC 3-1,text,true
+FECDS-1,200,OK,TG-BL-FEC 3-1,text,true
+FECDS_After_Condition-1,200,OK,TG-BL-FEC 3-1,text,true
+FECDS-2,200,OK,TG-BL-FEC 3-1,text,true
+FECDS_After_Condition-2,200,OK,TG-BL-FEC 3-1,text,true
+FECDS-3,200,OK,TG-BL-FEC 3-1,text,true
+FECDS-0,200,OK,TG-BL-FEC 3-1,text,true
+FECDS_After_Condition-0,200,OK,TG-BL-FEC 3-1,text,true
+FECDS-1,200,OK,TG-BL-FEC 3-1,text,true
+FECDS_After_Condition-1,200,OK,TG-BL-FEC 3-1,text,true
+FECDS-2,200,OK,TG-BL-FEC 3-1,text,true
+FECDS_After_Condition-2,200,OK,TG-BL-FEC 3-1,text,true
+FECDS-3,200,OK,TG-BL-FEC 3-1,text,true
+LCDS-Before-${__jm__LC__idx},200,OK,TG-SNIL-LC 4-1,text,true
+LCDS-0,200,OK,TG-SNIL-LC 4-1,text,true
+LCDS_After_Condition-0,200,OK,TG-SNIL-LC 4-1,text,true
+LCDS-1,200,OK,TG-SNIL-LC 4-1,text,true
+LCDS_After_Condition-1,200,OK,TG-SNIL-LC 4-1,text,true
+LCDS-2,200,OK,TG-SNIL-LC 4-1,text,true
+LCDS_After_Condition-2,200,OK,TG-SNIL-LC 4-1,text,true
+LCDS-3,200,OK,TG-SNIL-LC 4-1,text,true
+LCDS-4,200,OK,TG-SNIL-LC 4-1,text,true
+LCDS_After_Condition-4,200,OK,TG-SNIL-LC 4-1,text,true
+LCDS-Before-0,200,OK,TG-SNIL-LC 4-1,text,true
+LCDS-0,200,OK,TG-SNIL-LC 4-1,text,true
+LCDS_After_Condition-0,200,OK,TG-SNIL-LC 4-1,text,true
+LCDS-1,200,OK,TG-SNIL-LC 4-1,text,true
+LCDS_After_Condition-1,200,OK,TG-SNIL-LC 4-1,text,true
+LCDS-2,200,OK,TG-SNIL-LC 4-1,text,true
+LCDS_After_Condition-2,200,OK,TG-SNIL-LC 4-1,text,true
+LCDS-3,200,OK,TG-SNIL-LC 4-1,text,true
+LCDS-4,200,OK,TG-SNIL-LC 4-1,text,true
+LCDS_After_Condition-4,200,OK,TG-SNIL-LC 4-1,text,true
+WCDS-BeforeLoop-0,200,OK,TG-SNIL-WC 5-1,text,true
+WCDS-0,200,OK,TG-SNIL-WC 5-1,text,true
+WCDS_After_Condition-0,200,OK,TG-SNIL-WC 5-1,text,true
+WCDS-1,200,OK,TG-SNIL-WC 5-1,text,true
+WCDS_After_Condition-1,200,OK,TG-SNIL-WC 5-1,text,true
+WCDS-2,200,OK,TG-SNIL-WC 5-1,text,true
+WCDS_After_Condition-2,200,OK,TG-SNIL-WC 5-1,text,true
+WCDS-3,200,OK,TG-SNIL-WC 5-1,text,true
+WCDS-4,200,OK,TG-SNIL-WC 5-1,text,true
+WCDS_After_Condition-4,200,OK,TG-SNIL-WC 5-1,text,true
+WCDS-5,200,OK,TG-SNIL-WC 5-1,text,true
+WCDS_After_Condition-5,200,OK,TG-SNIL-WC 5-1,text,true
+WCDS-BeforeLoop-0,200,OK,TG-SNIL-WC 5-1,text,true
+WCDS-0,200,OK,TG-SNIL-WC 5-1,text,true
+WCDS_After_Condition-0,200,OK,TG-SNIL-WC 5-1,text,true
+WCDS-1,200,OK,TG-SNIL-WC 5-1,text,true
+WCDS_After_Condition-1,200,OK,TG-SNIL-WC 5-1,text,true
+WCDS-2,200,OK,TG-SNIL-WC 5-1,text,true
+WCDS_After_Condition-2,200,OK,TG-SNIL-WC 5-1,text,true
+WCDS-3,200,OK,TG-SNIL-WC 5-1,text,true
+WCDS-4,200,OK,TG-SNIL-WC 5-1,text,true
+WCDS_After_Condition-4,200,OK,TG-SNIL-WC 5-1,text,true
+WCDS-5,200,OK,TG-SNIL-WC 5-1,text,true
+WCDS_After_Condition-5,200,OK,TG-SNIL-WC 5-1,text,true
+FECDS-0,200,OK,TG-SNIL-FEC 6-1,text,true
+FECDS_After_Condition-0,200,OK,TG-SNIL-FEC 6-1,text,true
+FECDS-1,200,OK,TG-SNIL-FEC 6-1,text,true
+FECDS_After_Condition-1,200,OK,TG-SNIL-FEC 6-1,text,true
+FECDS-2,200,OK,TG-SNIL-FEC 6-1,text,true
+FECDS_After_Condition-2,200,OK,TG-SNIL-FEC 6-1,text,true
+FECDS-3,200,OK,TG-SNIL-FEC 6-1,text,true
+FECDS-4,200,OK,TG-SNIL-FEC 6-1,text,true
+FECDS_After_Condition-4,200,OK,TG-SNIL-FEC 6-1,text,true
+FECDS-0,200,OK,TG-SNIL-FEC 6-1,text,true
+FECDS_After_Condition-0,200,OK,TG-SNIL-FEC 6-1,text,true
+FECDS-1,200,OK,TG-SNIL-FEC 6-1,text,true
+FECDS_After_Condition-1,200,OK,TG-SNIL-FEC 6-1,text,true
+FECDS-2,200,OK,TG-SNIL-FEC 6-1,text,true
+FECDS_After_Condition-2,200,OK,TG-SNIL-FEC 6-1,text,true
+FECDS-3,200,OK,TG-SNIL-FEC 6-1,text,true
+FECDS-4,200,OK,TG-SNIL-FEC 6-1,text,true
+FECDS_After_Condition-4,200,OK,TG-SNIL-FEC 6-1,text,true
Added: jmeter/trunk/bin/testfiles/Bug62239.xml
URL: http://svn.apache.org/viewvc/jmeter/trunk/bin/testfiles/Bug62239.xml?rev=1828153&view=auto
==============================================================================
--- jmeter/trunk/bin/testfiles/Bug62239.xml (added)
+++ jmeter/trunk/bin/testfiles/Bug62239.xml Sun Apr 1 20:39:42 2018
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<testResults version="1.2">
+<sample s="true" lb="LCDS-Before-${__jm__LC__idx}" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS-0" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS_After_Condition-0" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS-1" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS_After_Condition-1" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS-2" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS_After_Condition-2" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS-3" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS-Before-0" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS-0" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS_After_Condition-0" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS-1" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS_After_Condition-1" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS-2" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS_After_Condition-2" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS-3" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS-BeforeLoop-0" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS-0" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS_After_Condition-0" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS-1" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS_After_Condition-1" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS-2" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS_After_Condition-2" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS-3" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS-BeforeLoop-0" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS-0" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS_After_Condition-0" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS-1" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS_After_Condition-1" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS-2" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS_After_Condition-2" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS-3" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="FECDS-0" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="FECDS_After_Condition-0" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="FECDS-1" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="FECDS_After_Condition-1" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="FECDS-2" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="FECDS_After_Condition-2" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="FECDS-3" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="FECDS-0" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="FECDS_After_Condition-0" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="FECDS-1" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="FECDS_After_Condition-1" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="FECDS-2" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="FECDS_After_Condition-2" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="FECDS-3" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS-Before-${__jm__LC__idx}" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS-0" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS_After_Condition-0" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS-1" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS_After_Condition-1" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS-2" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS_After_Condition-2" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS-3" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS-4" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS_After_Condition-4" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS-Before-0" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS-0" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS_After_Condition-0" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS-1" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS_After_Condition-1" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS-2" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS_After_Condition-2" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS-3" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS-4" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="LCDS_After_Condition-4" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS-BeforeLoop-0" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS-0" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS_After_Condition-0" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS-1" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS_After_Condition-1" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS-2" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS_After_Condition-2" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS-3" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS-4" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS_After_Condition-4" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS-5" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS_After_Condition-5" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS-BeforeLoop-0" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS-0" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS_After_Condition-0" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS-1" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS_After_Condition-1" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS-2" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS_After_Condition-2" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS-3" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS-4" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS_After_Condition-4" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS-5" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="WCDS_After_Condition-5" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="FECDS-0" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="FECDS_After_Condition-0" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="FECDS-1" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="FECDS_After_Condition-1" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="FECDS-2" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="FECDS_After_Condition-2" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="FECDS-3" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="FECDS-4" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="FECDS_After_Condition-4" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="FECDS-0" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="FECDS_After_Condition-0" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="FECDS-1" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="FECDS_After_Condition-1" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="FECDS-2" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="FECDS_After_Condition-2" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="FECDS-3" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="FECDS-4" rc="200" rm="OK" dt="text"/>
+<sample s="true" lb="FECDS_After_Condition-4" rc="200" rm="OK" dt="text"/>
+
+</testResults>
Propchange: jmeter/trunk/bin/testfiles/Bug62239.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jmeter/trunk/bin/testfiles/Bug62239.xml
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: jmeter/trunk/build.xml
URL: http://svn.apache.org/viewvc/jmeter/trunk/build.xml?rev=1828153&r1=1828152&r2=1828153&view=diff
==============================================================================
--- jmeter/trunk/build.xml (original)
+++ jmeter/trunk/build.xml Sun Apr 1 20:39:42 2018
@@ -2837,6 +2837,13 @@ run JMeter unless all the JMeter jars ar
<param name="batchtest.jmx" value="Bug52310.jmx"/>
<param name="skip.batchtest" value="${skip.bug52310}" />
</antcall>
+
+ <antcall target="batchtest">
+ <!-- Flow Control Action: Break Loop and Start Next Iteration of Loop -->
+ <param name="batchtest.name" value="Bug62239"/>
+ <param name="batchtest.jmx" value="Bug62239.jmx"/>
+ </antcall>
+
<antcall target="batchtest">
<!-- Option Start Next Loop in Thread Group does not mark parent Transaction Sampler in error when an error occurs -->
<param name="batchtest.name" value="Bug52968"/>
Modified: jmeter/trunk/src/components/org/apache/jmeter/control/ForeachController.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/control/ForeachController.java?rev=1828153&r1=1828152&r2=1828153&view=diff
==============================================================================
--- jmeter/trunk/src/components/org/apache/jmeter/control/ForeachController.java (original)
+++ jmeter/trunk/src/components/org/apache/jmeter/control/ForeachController.java Sun Apr 1 20:39:42 2018
@@ -63,7 +63,6 @@ public class ForeachController extends G
public ForeachController() {
}
-
/**
* @param startIndex Start index of loop
@@ -80,14 +79,13 @@ public class ForeachController extends G
return getPropertyAsInt(START_INDEX, 0);
}
-
/**
* @return start index of loop as String
*/
public String getStartIndexAsString() {
return getPropertyAsString(START_INDEX, INDEX_DEFAULT_VALUE);
}
-
+
/**
* @param endIndex End index of loop
*/
@@ -102,14 +100,14 @@ public class ForeachController extends G
// Although the default is not the same as for the string value, it is only used internally
return getPropertyAsInt(END_INDEX, Integer.MAX_VALUE);
}
-
+
/**
* @return end index of loop
*/
public String getEndIndexAsString() {
return getPropertyAsString(END_INDEX, INDEX_DEFAULT_VALUE);
}
-
+
public void setInputVal(String inputValue) {
setProperty(new StringProperty(INPUTVAL, inputValue));
}
@@ -201,7 +199,8 @@ public class ForeachController extends G
@Override
public Sampler next() {
try {
- if (emptyList()) {
+ if (breakLoop || emptyList()) {
+ resetBreakLoop();
reInitialize();
resetLoopCount();
return null;
@@ -243,9 +242,11 @@ public class ForeachController extends G
protected Sampler nextIsNull() throws NextIsNullException {
reInitialize();
// Conditions to reset the loop count
- if (endOfArguments() // no more variables to iterate
- ||loopCount >= getEndIndex() // we reached end index
+ if (breakLoop
+ || endOfArguments() // no more variables to iterate
+ || loopCount >= getEndIndex() // we reached end index
) {
+ resetBreakLoop();
resetLoopCount();
return null;
}
@@ -278,7 +279,7 @@ public class ForeachController extends G
incrementLoopCount();
recoverRunningVersion();
}
-
+
/**
* {@inheritDoc}
*/
@@ -288,7 +289,6 @@ public class ForeachController extends G
resetLoopCount();
}
-
/**
* Reset loopCount to Start index
* @see org.apache.jmeter.control.GenericController#initialize()
@@ -298,15 +298,24 @@ public class ForeachController extends G
super.initialize();
loopCount = getStartIndex();
}
-
+
@Override
public void startNextLoop() {
reInitialize();
}
-
+
+ private void resetBreakLoop() {
+ if(breakLoop) {
+ breakLoop = false;
+ }
+ }
+
@Override
public void breakLoop() {
- // FIXME TO BE COMPLETED
- this.breakLoop = true;
+ breakLoop = true;
+ setFirst(true);
+ resetCurrent();
+ resetLoopCount();
+ recoverRunningVersion();
}
}
Modified: jmeter/trunk/src/core/org/apache/jmeter/control/LoopController.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/control/LoopController.java?rev=1828153&r1=1828152&r2=1828153&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/control/LoopController.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/control/LoopController.java Sun Apr 1 20:39:42 2018
@@ -124,6 +124,7 @@ public class LoopController extends Gene
if (!getContinueForever()) {
setDone(true);
}
+ resetBreakLoop();
return null;
}
return super.next();
@@ -134,11 +135,12 @@ public class LoopController extends Gene
private boolean endOfLoop() {
final int loops = getLoops();
- return (loops > INFINITE_LOOP_COUNT) && (loopCount >= loops);
+ return breakLoop || (loops > INFINITE_LOOP_COUNT) && (loopCount >= loops);
}
@Override
protected void setDone(boolean done) {
+ resetBreakLoop();
nbLoops = null;
super.setDone(done);
}
@@ -205,9 +207,18 @@ public class LoopController extends Gene
reInitialize();
}
+ private void resetBreakLoop() {
+ if(breakLoop) {
+ breakLoop = false;
+ }
+ }
+
@Override
public void breakLoop() {
- // FIXME TO BE COMPLETED
- this.breakLoop = true;
+ breakLoop = true;
+ setFirst(true);
+ resetCurrent();
+ resetLoopCount();
+ recoverRunningVersion();
}
}
Modified: jmeter/trunk/src/core/org/apache/jmeter/control/WhileController.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/control/WhileController.java?rev=1828153&r1=1828152&r2=1828153&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/control/WhileController.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/control/WhileController.java Sun Apr 1 20:39:42 2018
@@ -53,9 +53,12 @@ public class WhileController extends Gen
* Must only be called at start and end of loop
*
* @param loopEnd - are we at loop end?
- * @return true means OK to continue
+ * @return true means end of loop has been reached
*/
private boolean endOfLoop(boolean loopEnd) {
+ if(breakLoop) {
+ return true;
+ }
String cnd = getCondition().trim();
log.debug("Condition string: '{}'", cnd);
boolean res;
@@ -80,6 +83,7 @@ public class WhileController extends Gen
protected Sampler nextIsNull() throws NextIsNullException {
reInitialize();
if (endOfLoop(true)){
+ resetBreakLoop();
resetLoopCount();
return null;
}
@@ -104,7 +108,8 @@ public class WhileController extends Gen
@Override
public Sampler next(){
try {
- if ( isFirst() && endOfLoop(false)) {
+ if (isFirst() && endOfLoop(false)) {
+ resetBreakLoop();
resetLoopCount();
return null;
}
@@ -141,9 +146,18 @@ public class WhileController extends Gen
reInitialize();
}
+ private void resetBreakLoop() {
+ if(breakLoop) {
+ breakLoop = false;
+ }
+ }
+
@Override
public void breakLoop() {
- // FIXME TO BE COMPLETED
- this.breakLoop = true;
+ breakLoop = true;
+ setFirst(true);
+ resetCurrent();
+ resetLoopCount();
+ recoverRunningVersion();
}
}
Modified: jmeter/trunk/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1828153&r1=1828152&r2=1828153&view=diff
==============================================================================
--- jmeter/trunk/xdocs/changes.xml [utf-8] (original)
+++ jmeter/trunk/xdocs/changes.xml [utf-8] Sun Apr 1 20:39:42 2018
@@ -129,6 +129,7 @@ this behaviour, set <code>httpclient.res
<li><bug>62156</bug>Search Feature : Distinguish between node that matches search and node that contains a child that matches search</li>
<li><bug>62234</bug>Search/Replace Feature : Enhance UX and add Replace/Next/Previous/Replace & Find features. Contributed by Ubik Load Pack (support at ubikloadpack.com)</li>
<li><bug>62238</bug>Add ability to Switch to next iteration of Current Loop. Contributed by Ubik Load Pack (support at ubikloadpack.com)</li>
+ <li><bug>62239</bug>Add ability to Break Current Loop</li>
<li><bug>62065</bug>Use Maven artifact for JAF Module instead of embedded module</li>
<li><pr>379</pr> Improve chinese translations. Contributed by XmeterNet</li>
</ul>