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 &amp; 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>