You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@jmeter.apache.org by Philippe Mouawad <ph...@gmail.com> on 2017/11/28 21:24:33 UTC
Re: svn commit: r1816519 - in /jmeter/trunk: src/components/org/apache/jmeter/control/
src/core/org/apache/jmeter/control/ src/core/org/apache/jmeter/util/
test/src/org/apache/jmeter/control/ xdocs/
Hi Felix,
The constante is package protected because it's used in ForEachController.
Regarding your second remark, If you are sure the underlying bytecode is
the same, it 's ok for me, but I read some disturbing thing this morning
about it, but maybe I was not really awaken :-)
But I now remember that you had proved it in the past by showing bytecode.
Regards
On Tue, Nov 28, 2017 at 9:58 PM, Felix Schumacher <
felix.schumacher@internetallee.de> wrote:
> Am 28.11.2017 um 08:11 schrieb pmouawad@apache.org:
>
>> Author: pmouawad
>> Date: Tue Nov 28 07:11:35 2017
>> New Revision: 1816519
>>
>> URL: http://svn.apache.org/viewvc?rev=1816519&view=rev
>> Log:
>> Bug 61802 - Loop / ForEach Controller should expose a variable for
>> current iteration
>> Bugzilla Id: 61802
>>
>> Modified:
>> jmeter/trunk/src/components/org/apache/jmeter/control/Forea
>> chController.java
>> jmeter/trunk/src/core/org/apache/jmeter/control/LoopController.java
>> jmeter/trunk/src/core/org/apache/jmeter/util/JMeterUtils.java
>> jmeter/trunk/test/src/org/apache/jmeter/control/TestLoopCon
>> troller.java
>> jmeter/trunk/xdocs/changes.xml
>>
>> Modified: jmeter/trunk/src/components/org/apache/jmeter/control/Foreac
>> hController.java
>> URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org
>> /apache/jmeter/control/ForeachController.java?rev=1816519&
>> r1=1816518&r2=1816519&view=diff
>> ============================================================
>> ==================
>> --- jmeter/trunk/src/components/org/apache/jmeter/control/ForeachController.java
>> (original)
>> +++ jmeter/trunk/src/components/org/apache/jmeter/control/ForeachController.java
>> Tue Nov 28 07:11:35 2017
>> @@ -24,7 +24,9 @@ import org.apache.jmeter.samplers.Sample
>> import org.apache.jmeter.testelement.property.BooleanProperty;
>> import org.apache.jmeter.testelement.property.StringProperty;
>> import org.apache.jmeter.threads.JMeterContext;
>> +import org.apache.jmeter.threads.JMeterContextService;
>> import org.apache.jmeter.threads.JMeterVariables;
>> +import org.apache.jmeter.util.JMeterUtils;
>> import org.slf4j.Logger;
>> import org.slf4j.LoggerFactory;
>> @@ -36,6 +38,7 @@ import org.slf4j.LoggerFactory;
>> *
>> */
>> public class ForeachController extends GenericController implements
>> Serializable {
>> +
>> private static final Logger log = LoggerFactory.getLogger(Foreac
>> hController.class);
>> private static final long serialVersionUID = 241L;
>> @@ -195,12 +198,21 @@ public class ForeachController extends G
>> // Prevent entry if nothing to do
>> @Override
>> public Sampler next() {
>> - if (emptyList()) {
>> - reInitialize();
>> - resetLoopCount();
>> - return null;
>> + try {
>> + if (emptyList()) {
>> + reInitialize();
>> + resetLoopCount();
>> + return null;
>> + }
>> + return super.next();
>> + } finally {
>> + JMeterVariables variables = JMeterContextService.getContex
>> t().getVariables();
>> + if(variables != null) {
>> + variables.putObject(
>> + JMeterUtils.formatJMeterExportedVariableName(
>> + getName()+LoopController.INDEX_VAR_NAME_SUFFIX),
>> loopCount);
>> + }
>> }
>> - return super.next();
>> }
>> /**
>>
>> Modified: jmeter/trunk/src/core/org/apache/jmeter/control/LoopControll
>> er.java
>> URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apach
>> e/jmeter/control/LoopController.java?rev=1816519&r1=1816518&
>> r2=1816519&view=diff
>> ============================================================
>> ==================
>> --- jmeter/trunk/src/core/org/apache/jmeter/control/LoopController.java
>> (original)
>> +++ jmeter/trunk/src/core/org/apache/jmeter/control/LoopController.java
>> Tue Nov 28 07:11:35 2017
>> @@ -25,12 +25,16 @@ import org.apache.jmeter.testelement.pro
>> import org.apache.jmeter.testelement.property.IntegerProperty;
>> import org.apache.jmeter.testelement.property.JMeterProperty;
>> import org.apache.jmeter.testelement.property.StringProperty;
>> +import org.apache.jmeter.threads.JMeterContextService;
>> +import org.apache.jmeter.threads.JMeterVariables;
>> +import org.apache.jmeter.util.JMeterUtils;
>> /**
>> * Class that implements the Loop Controller, ie iterate infinitely or
>> a configured number of times
>> */
>> public class LoopController extends GenericController implements
>> Serializable {
>> -
>> + static final String INDEX_VAR_NAME_SUFFIX = "__idx";
>>
> Should this be private?
>
>
> +
>> public static final int INFINITE_LOOP_COUNT = -1; // $NON-NLS-1$
>> public static final String LOOPS = "LoopController.loops"; //
>> $NON-NLS-1$
>> @@ -114,15 +118,23 @@ public class LoopController extends Gene
>> */
>> @Override
>> public Sampler next() {
>> - if(endOfLoop()) {
>> - if (!getContinueForever()) {
>> - setDone(true);
>> + try {
>> + if(endOfLoop()) {
>> + if (!getContinueForever()) {
>> + setDone(true);
>> + }
>> + return null;
>> + }
>> + return super.next();
>> + } finally {
>> + JMeterVariables variables = JMeterContextService.getContex
>> t().getVariables();
>> + if(variables != null) {
>> + variables.putObject(
>> + JMeterUtils.formatJMeterExport
>> edVariableName(getName()+INDEX_VAR_NAME_SUFFIX), loopCount);
>> }
>> - return null;
>> }
>> - return super.next();
>> }
>> -
>> +
>> private boolean endOfLoop() {
>> final int loops = getLoops();
>> return (loops > INFINITE_LOOP_COUNT) && (loopCount >= loops);
>>
>> Modified: jmeter/trunk/src/core/org/apache/jmeter/util/JMeterUtils.java
>> URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apach
>> e/jmeter/util/JMeterUtils.java?rev=1816519&r1=1816518&
>> r2=1816519&view=diff
>> ============================================================
>> ==================
>> --- jmeter/trunk/src/core/org/apache/jmeter/util/JMeterUtils.java
>> (original)
>> +++ jmeter/trunk/src/core/org/apache/jmeter/util/JMeterUtils.java Tue
>> Nov 28 07:11:35 2017
>> @@ -79,7 +79,7 @@ import com.thoughtworks.xstream.security
>> */
>> public class JMeterUtils implements UnitTestManager {
>> private static final Logger log = LoggerFactory.getLogger(JMeter
>> Utils.class);
>> -
>> + private static final String JMETER_VARS_PREFIX = "__jm__";
>> // Note: cannot use a static variable here, because that would be
>> processed before the JMeter properties
>> // have been defined (Bug 52783)
>> private static class LazyPatternCacheHolder {
>> @@ -1261,4 +1261,16 @@ public class JMeterUtils implements Unit
>> // TODO : How much are we concerned by CVE-2013-7285
>> xstream.addPermission(AnyTypePermission.ANY);
>> }
>> +
>> + /**
>> + * @param elementName String elementName
>> + * @return variable name for index following JMeter convention
>> + */
>> + public static String formatJMeterExportedVariableName(String
>> elementName) {
>> + StringBuilder builder = new StringBuilder(
>> + JMETER_VARS_PREFIX.length()+elementName.length());
>> + return builder.append(JMETER_VARS_PREFIX)
>> + .append(elementName)
>> + .toString();
>>
>
> a "return JMETER_VARS_PREFIX + elementName;" is probably more readable and
> should result in some equivalent bytecode.
>
> Regards,
> Felix
>
>
> + }
>> }
>>
>> Modified: jmeter/trunk/test/src/org/apache/jmeter/control/TestLoopCont
>> roller.java
>> URL: http://svn.apache.org/viewvc/jmeter/trunk/test/src/org/apach
>> e/jmeter/control/TestLoopController.java?rev=1816519&r1=
>> 1816518&r2=1816519&view=diff
>> ============================================================
>> ==================
>> --- jmeter/trunk/test/src/org/apache/jmeter/control/TestLoopController.java
>> (original)
>> +++ jmeter/trunk/test/src/org/apache/jmeter/control/TestLoopController.java
>> Tue Nov 28 07:11:35 2017
>> @@ -36,12 +36,17 @@ import org.apache.jmeter.testelement.pro
>> import org.apache.jmeter.threads.JMeterContext;
>> import org.apache.jmeter.threads.JMeterContextService;
>> import org.apache.jmeter.threads.JMeterVariables;
>> +import org.apache.jmeter.util.JMeterUtils;
>> import org.junit.Test;
>> public class TestLoopController extends JMeterTestCase {
>> @Test
>> public void testProcessing() throws Exception {
>> + JMeterContext jmctx = JMeterContextService.getContext();
>> + JMeterVariables variables = new JMeterVariables();
>> + jmctx.setVariables(variables);
>> +
>> GenericController controller = new GenericController();
>> GenericController sub_1 = new GenericController();
>> sub_1.addTestElement(new TestSampler("one"));
>> @@ -49,6 +54,8 @@ public class TestLoopController extends
>> controller.addTestElement(sub_1);
>> controller.addTestElement(new TestSampler("three"));
>> LoopController sub_2 = new LoopController();
>> + String lcName = "LC";
>> + sub_2.setName(lcName);
>> sub_2.setLoops(3);
>> GenericController sub_3 = new GenericController();
>> sub_2.addTestElement(new TestSampler("four"));
>> @@ -65,41 +72,72 @@ public class TestLoopController extends
>> sub_2.setRunningVersion(true);
>> sub_3.setRunningVersion(true);
>> controller.initialize();
>> + int loopControl = 0;
>> for (int i = 0; i < 2; i++) {
>> + loopControl = 0;
>> assertEquals(15, counter);
>> counter = 0;
>> TestElement sampler = null;
>> while ((sampler = controller.next()) != null) {
>> assertEquals(order[counter++], sampler.getName());
>> + if("four".equals(sampler.getName())) {
>> + Integer value = (Integer) variables.getObject(
>> + JMeterUtils.formatJMeterExport
>> edVariableName(lcName+LoopController.INDEX_VAR_NAME_SUFFIX));
>> + assertNotNull(value);
>> + assertEquals(Integer.valueOf(loopControl++),
>> value);
>> + }
>> }
>> +
>> }
>> +
>> }
>> @Test
>> public void testLoopZeroTimes() throws Exception {
>> + JMeterContext jmctx = JMeterContextService.getContext();
>> + JMeterVariables variables = new JMeterVariables();
>> + jmctx.setVariables(variables);
>> +
>> LoopController loop = new LoopController();
>> + String lcName = "LC";
>> + loop.setName(lcName);
>> loop.setLoops(0);
>> loop.addTestElement(new TestSampler("never run"));
>> loop.initialize();
>> assertNull(loop.next());
>> + Integer value = (Integer) variables.getObject(
>> + JMeterUtils.formatJMeterExportedVariableName(lcName+
>> LoopController.INDEX_VAR_NAME_SUFFIX));
>> + assertNotNull(value);
>> + assertEquals(Integer.valueOf(0), value);
>> }
>> @Test
>> public void testInfiniteLoop() throws Exception {
>> + JMeterContext jmctx = JMeterContextService.getContext();
>> LoopController loop = new LoopController();
>> + String lcName = "LC";
>> + loop.setName(lcName);
>> loop.setLoops(LoopController.INFINITE_LOOP_COUNT);
>> loop.addTestElement(new TestSampler("never run"));
>> + JMeterVariables variables = new JMeterVariables();
>> + jmctx.setVariables(variables);
>> loop.setRunningVersion(true);
>> loop.initialize();
>> for (int i = 0; i < 42; i++) {
>> assertNotNull(loop.next());
>> + Integer value = (Integer) variables.getObject(
>> + JMeterUtils.formatJMeterExport
>> edVariableName(lcName+LoopController.INDEX_VAR_NAME_SUFFIX));
>> + assertNotNull(value);
>> + assertEquals(Integer.valueOf(i), value);
>> }
>> }
>> @Test
>> public void testBug54467() throws Exception {
>> JMeterContext jmctx = JMeterContextService.getContext();
>> + String lcName = "LC";
>> LoopController loop = new LoopController();
>> + loop.setName(lcName);
>> Map<String, String> variables = new HashMap<>();
>> ReplaceStringWithFunctions transformer = new
>> ReplaceStringWithFunctions(new CompoundVariable(), variables);
>> jmctx.setVariables(new JMeterVariables());
>> @@ -116,6 +154,10 @@ public class TestLoopController extends
>> for (int i = 0; i < loops; i++) {
>> Sampler s = loop.next();
>> assertNotNull(s);
>> + Integer value = (Integer) jmctx.getVariables().getObject
>> (
>> + JMeterUtils.formatJMeterExport
>> edVariableName(lcName+LoopController.INDEX_VAR_NAME_SUFFIX));
>> + assertNotNull(value);
>> + assertEquals(Integer.valueOf(i), value);
>> }
>> assertNull(loop.next());
>> }
>>
>> Modified: jmeter/trunk/xdocs/changes.xml
>> URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?
>> rev=1816519&r1=1816518&r2=1816519&view=diff
>> ============================================================
>> ==================
>> --- jmeter/trunk/xdocs/changes.xml [utf-8] (original)
>> +++ jmeter/trunk/xdocs/changes.xml [utf-8] Tue Nov 28 07:11:35 2017
>> @@ -172,6 +172,7 @@ Summary
>> <li><bug>61640</bug>JSR223 Test Elements : Enable by default
>> caching. Contributed by Ubik Load Pack (support at ubikloadpack.com)</li>
>> <li><bug>61785</bug>Add <menuchoice><guimenuitem>Help<
>> /guimenuitem><guimenuitem>Useful links</guimenuitem></menuchoice> to
>> create issues and download nightly build</li>
>> <li><bug>61808</bug>Fix main frame position. Implemented by Artem
>> Fedorov (artem at blazemeter.com) and contributed by BlazeMeter Ltd.</li>
>> + <li><bug>61802</bug>Loop / ForEach Controller should expose a
>> variable for current iteration. Contributed by Ubik Load Pack (support at
>> ubikloadpack.com)</li>
>> </ul>
>> <ch_section>Non-functional changes</ch_section>
>>
>>
>>
>
--
Cordialement.
Philippe Mouawad.
Re: svn commit: r1816519 - in /jmeter/trunk: src/components/org/apache/jmeter/control/ src/core/org/apache/jmeter/control/ src/core/org/apache/jmeter/util/ test/src/org/apache/jmeter/control/ xdocs/
Posted by Felix Schumacher <fe...@internetallee.de>.
Am 28. November 2017 22:24:33 MEZ schrieb Philippe Mouawad <ph...@gmail.com>:
>Hi Felix,
>The constante is package protected because it's used in
>ForEachController.
>
>Regarding your second remark, If you are sure the underlying bytecode
>is
>the same, it 's ok for me, but I read some disturbing thing this
>morning
>about it, but maybe I was not really awaken :-)
>But I now remember that you had proved it in the past by showing
>bytecode.
You could always look at the bytecode yourself. :)
Felix
>
>
>Regards
>
>
>On Tue, Nov 28, 2017 at 9:58 PM, Felix Schumacher <
>felix.schumacher@internetallee.de> wrote:
>
>> Am 28.11.2017 um 08:11 schrieb pmouawad@apache.org:
>>
>>> Author: pmouawad
>>> Date: Tue Nov 28 07:11:35 2017
>>> New Revision: 1816519
>>>
>>> URL: http://svn.apache.org/viewvc?rev=1816519&view=rev
>>> Log:
>>> Bug 61802 - Loop / ForEach Controller should expose a variable for
>>> current iteration
>>> Bugzilla Id: 61802
>>>
>>> Modified:
>>> jmeter/trunk/src/components/org/apache/jmeter/control/Forea
>>> chController.java
>>>
>jmeter/trunk/src/core/org/apache/jmeter/control/LoopController.java
>>> jmeter/trunk/src/core/org/apache/jmeter/util/JMeterUtils.java
>>> jmeter/trunk/test/src/org/apache/jmeter/control/TestLoopCon
>>> troller.java
>>> jmeter/trunk/xdocs/changes.xml
>>>
>>> Modified:
>jmeter/trunk/src/components/org/apache/jmeter/control/Foreac
>>> hController.java
>>> URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org
>>> /apache/jmeter/control/ForeachController.java?rev=1816519&
>>> r1=1816518&r2=1816519&view=diff
>>> ============================================================
>>> ==================
>>> ---
>jmeter/trunk/src/components/org/apache/jmeter/control/ForeachController.java
>>> (original)
>>> +++
>jmeter/trunk/src/components/org/apache/jmeter/control/ForeachController.java
>>> Tue Nov 28 07:11:35 2017
>>> @@ -24,7 +24,9 @@ import org.apache.jmeter.samplers.Sample
>>> import org.apache.jmeter.testelement.property.BooleanProperty;
>>> import org.apache.jmeter.testelement.property.StringProperty;
>>> import org.apache.jmeter.threads.JMeterContext;
>>> +import org.apache.jmeter.threads.JMeterContextService;
>>> import org.apache.jmeter.threads.JMeterVariables;
>>> +import org.apache.jmeter.util.JMeterUtils;
>>> import org.slf4j.Logger;
>>> import org.slf4j.LoggerFactory;
>>> @@ -36,6 +38,7 @@ import org.slf4j.LoggerFactory;
>>> *
>>> */
>>> public class ForeachController extends GenericController
>implements
>>> Serializable {
>>> +
>>> private static final Logger log =
>LoggerFactory.getLogger(Foreac
>>> hController.class);
>>> private static final long serialVersionUID = 241L;
>>> @@ -195,12 +198,21 @@ public class ForeachController extends G
>>> // Prevent entry if nothing to do
>>> @Override
>>> public Sampler next() {
>>> - if (emptyList()) {
>>> - reInitialize();
>>> - resetLoopCount();
>>> - return null;
>>> + try {
>>> + if (emptyList()) {
>>> + reInitialize();
>>> + resetLoopCount();
>>> + return null;
>>> + }
>>> + return super.next();
>>> + } finally {
>>> + JMeterVariables variables =
>JMeterContextService.getContex
>>> t().getVariables();
>>> + if(variables != null) {
>>> + variables.putObject(
>>> + JMeterUtils.formatJMeterExportedVariableName(
>>> +
>getName()+LoopController.INDEX_VAR_NAME_SUFFIX),
>>> loopCount);
>>> + }
>>> }
>>> - return super.next();
>>> }
>>> /**
>>>
>>> Modified:
>jmeter/trunk/src/core/org/apache/jmeter/control/LoopControll
>>> er.java
>>> URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apach
>>> e/jmeter/control/LoopController.java?rev=1816519&r1=1816518&
>>> r2=1816519&view=diff
>>> ============================================================
>>> ==================
>>> ---
>jmeter/trunk/src/core/org/apache/jmeter/control/LoopController.java
>>> (original)
>>> +++
>jmeter/trunk/src/core/org/apache/jmeter/control/LoopController.java
>>> Tue Nov 28 07:11:35 2017
>>> @@ -25,12 +25,16 @@ import org.apache.jmeter.testelement.pro
>>> import org.apache.jmeter.testelement.property.IntegerProperty;
>>> import org.apache.jmeter.testelement.property.JMeterProperty;
>>> import org.apache.jmeter.testelement.property.StringProperty;
>>> +import org.apache.jmeter.threads.JMeterContextService;
>>> +import org.apache.jmeter.threads.JMeterVariables;
>>> +import org.apache.jmeter.util.JMeterUtils;
>>> /**
>>> * Class that implements the Loop Controller, ie iterate
>infinitely or
>>> a configured number of times
>>> */
>>> public class LoopController extends GenericController implements
>>> Serializable {
>>> -
>>> + static final String INDEX_VAR_NAME_SUFFIX = "__idx";
>>>
>> Should this be private?
>>
>>
>> +
>>> public static final int INFINITE_LOOP_COUNT = -1; //
>$NON-NLS-1$
>>> public static final String LOOPS =
>"LoopController.loops"; //
>>> $NON-NLS-1$
>>> @@ -114,15 +118,23 @@ public class LoopController extends Gene
>>> */
>>> @Override
>>> public Sampler next() {
>>> - if(endOfLoop()) {
>>> - if (!getContinueForever()) {
>>> - setDone(true);
>>> + try {
>>> + if(endOfLoop()) {
>>> + if (!getContinueForever()) {
>>> + setDone(true);
>>> + }
>>> + return null;
>>> + }
>>> + return super.next();
>>> + } finally {
>>> + JMeterVariables variables =
>JMeterContextService.getContex
>>> t().getVariables();
>>> + if(variables != null) {
>>> + variables.putObject(
>>> + JMeterUtils.formatJMeterExport
>>> edVariableName(getName()+INDEX_VAR_NAME_SUFFIX), loopCount);
>>> }
>>> - return null;
>>> }
>>> - return super.next();
>>> }
>>> -
>>> +
>>> private boolean endOfLoop() {
>>> final int loops = getLoops();
>>> return (loops > INFINITE_LOOP_COUNT) && (loopCount >=
>loops);
>>>
>>> Modified:
>jmeter/trunk/src/core/org/apache/jmeter/util/JMeterUtils.java
>>> URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apach
>>> e/jmeter/util/JMeterUtils.java?rev=1816519&r1=1816518&
>>> r2=1816519&view=diff
>>> ============================================================
>>> ==================
>>> --- jmeter/trunk/src/core/org/apache/jmeter/util/JMeterUtils.java
>>> (original)
>>> +++ jmeter/trunk/src/core/org/apache/jmeter/util/JMeterUtils.java
>Tue
>>> Nov 28 07:11:35 2017
>>> @@ -79,7 +79,7 @@ import com.thoughtworks.xstream.security
>>> */
>>> public class JMeterUtils implements UnitTestManager {
>>> private static final Logger log =
>LoggerFactory.getLogger(JMeter
>>> Utils.class);
>>> -
>>> + private static final String JMETER_VARS_PREFIX = "__jm__";
>>> // Note: cannot use a static variable here, because that would
>be
>>> processed before the JMeter properties
>>> // have been defined (Bug 52783)
>>> private static class LazyPatternCacheHolder {
>>> @@ -1261,4 +1261,16 @@ public class JMeterUtils implements Unit
>>> // TODO : How much are we concerned by CVE-2013-7285
>>> xstream.addPermission(AnyTypePermission.ANY);
>>> }
>>> +
>>> + /**
>>> + * @param elementName String elementName
>>> + * @return variable name for index following JMeter convention
>>> + */
>>> + public static String formatJMeterExportedVariableName(String
>>> elementName) {
>>> + StringBuilder builder = new StringBuilder(
>>> + JMETER_VARS_PREFIX.length()+elementName.length());
>>> + return builder.append(JMETER_VARS_PREFIX)
>>> + .append(elementName)
>>> + .toString();
>>>
>>
>> a "return JMETER_VARS_PREFIX + elementName;" is probably more
>readable and
>> should result in some equivalent bytecode.
>>
>> Regards,
>> Felix
>>
>>
>> + }
>>> }
>>>
>>> Modified:
>jmeter/trunk/test/src/org/apache/jmeter/control/TestLoopCont
>>> roller.java
>>> URL: http://svn.apache.org/viewvc/jmeter/trunk/test/src/org/apach
>>> e/jmeter/control/TestLoopController.java?rev=1816519&r1=
>>> 1816518&r2=1816519&view=diff
>>> ============================================================
>>> ==================
>>> ---
>jmeter/trunk/test/src/org/apache/jmeter/control/TestLoopController.java
>>> (original)
>>> +++
>jmeter/trunk/test/src/org/apache/jmeter/control/TestLoopController.java
>>> Tue Nov 28 07:11:35 2017
>>> @@ -36,12 +36,17 @@ import org.apache.jmeter.testelement.pro
>>> import org.apache.jmeter.threads.JMeterContext;
>>> import org.apache.jmeter.threads.JMeterContextService;
>>> import org.apache.jmeter.threads.JMeterVariables;
>>> +import org.apache.jmeter.util.JMeterUtils;
>>> import org.junit.Test;
>>> public class TestLoopController extends JMeterTestCase {
>>> @Test
>>> public void testProcessing() throws Exception {
>>> + JMeterContext jmctx =
>JMeterContextService.getContext();
>>> + JMeterVariables variables = new JMeterVariables();
>>> + jmctx.setVariables(variables);
>>> +
>>> GenericController controller = new
>GenericController();
>>> GenericController sub_1 = new GenericController();
>>> sub_1.addTestElement(new TestSampler("one"));
>>> @@ -49,6 +54,8 @@ public class TestLoopController extends
>>> controller.addTestElement(sub_1);
>>> controller.addTestElement(new TestSampler("three"));
>>> LoopController sub_2 = new LoopController();
>>> + String lcName = "LC";
>>> + sub_2.setName(lcName);
>>> sub_2.setLoops(3);
>>> GenericController sub_3 = new GenericController();
>>> sub_2.addTestElement(new TestSampler("four"));
>>> @@ -65,41 +72,72 @@ public class TestLoopController extends
>>> sub_2.setRunningVersion(true);
>>> sub_3.setRunningVersion(true);
>>> controller.initialize();
>>> + int loopControl = 0;
>>> for (int i = 0; i < 2; i++) {
>>> + loopControl = 0;
>>> assertEquals(15, counter);
>>> counter = 0;
>>> TestElement sampler = null;
>>> while ((sampler = controller.next()) != null) {
>>> assertEquals(order[counter++],
>sampler.getName());
>>> + if("four".equals(sampler.getName())) {
>>> + Integer value = (Integer)
>variables.getObject(
>>> + JMeterUtils.formatJMeterExport
>>> edVariableName(lcName+LoopController.INDEX_VAR_NAME_SUFFIX));
>>> + assertNotNull(value);
>>> +
>assertEquals(Integer.valueOf(loopControl++),
>>> value);
>>> + }
>>> }
>>> +
>>> }
>>> +
>>> }
>>> @Test
>>> public void testLoopZeroTimes() throws Exception {
>>> + JMeterContext jmctx =
>JMeterContextService.getContext();
>>> + JMeterVariables variables = new JMeterVariables();
>>> + jmctx.setVariables(variables);
>>> +
>>> LoopController loop = new LoopController();
>>> + String lcName = "LC";
>>> + loop.setName(lcName);
>>> loop.setLoops(0);
>>> loop.addTestElement(new TestSampler("never run"));
>>> loop.initialize();
>>> assertNull(loop.next());
>>> + Integer value = (Integer) variables.getObject(
>>> +
>JMeterUtils.formatJMeterExportedVariableName(lcName+
>>> LoopController.INDEX_VAR_NAME_SUFFIX));
>>> + assertNotNull(value);
>>> + assertEquals(Integer.valueOf(0), value);
>>> }
>>> @Test
>>> public void testInfiniteLoop() throws Exception {
>>> + JMeterContext jmctx =
>JMeterContextService.getContext();
>>> LoopController loop = new LoopController();
>>> + String lcName = "LC";
>>> + loop.setName(lcName);
>>> loop.setLoops(LoopController.INFINITE_LOOP_COUNT);
>>> loop.addTestElement(new TestSampler("never run"));
>>> + JMeterVariables variables = new JMeterVariables();
>>> + jmctx.setVariables(variables);
>>> loop.setRunningVersion(true);
>>> loop.initialize();
>>> for (int i = 0; i < 42; i++) {
>>> assertNotNull(loop.next());
>>> + Integer value = (Integer) variables.getObject(
>>> + JMeterUtils.formatJMeterExport
>>> edVariableName(lcName+LoopController.INDEX_VAR_NAME_SUFFIX));
>>> + assertNotNull(value);
>>> + assertEquals(Integer.valueOf(i), value);
>>> }
>>> }
>>> @Test
>>> public void testBug54467() throws Exception {
>>> JMeterContext jmctx =
>JMeterContextService.getContext();
>>> + String lcName = "LC";
>>> LoopController loop = new LoopController();
>>> + loop.setName(lcName);
>>> Map<String, String> variables = new HashMap<>();
>>> ReplaceStringWithFunctions transformer = new
>>> ReplaceStringWithFunctions(new CompoundVariable(), variables);
>>> jmctx.setVariables(new JMeterVariables());
>>> @@ -116,6 +154,10 @@ public class TestLoopController extends
>>> for (int i = 0; i < loops; i++) {
>>> Sampler s = loop.next();
>>> assertNotNull(s);
>>> + Integer value = (Integer)
>jmctx.getVariables().getObject
>>> (
>>> + JMeterUtils.formatJMeterExport
>>> edVariableName(lcName+LoopController.INDEX_VAR_NAME_SUFFIX));
>>> + assertNotNull(value);
>>> + assertEquals(Integer.valueOf(i), value);
>>> }
>>> assertNull(loop.next());
>>> }
>>>
>>> Modified: jmeter/trunk/xdocs/changes.xml
>>> URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?
>>> rev=1816519&r1=1816518&r2=1816519&view=diff
>>> ============================================================
>>> ==================
>>> --- jmeter/trunk/xdocs/changes.xml [utf-8] (original)
>>> +++ jmeter/trunk/xdocs/changes.xml [utf-8] Tue Nov 28 07:11:35 2017
>>> @@ -172,6 +172,7 @@ Summary
>>> <li><bug>61640</bug>JSR223 Test Elements : Enable by default
>>> caching. Contributed by Ubik Load Pack (support at
>ubikloadpack.com)</li>
>>> <li><bug>61785</bug>Add <menuchoice><guimenuitem>Help<
>>> /guimenuitem><guimenuitem>Useful links</guimenuitem></menuchoice> to
>>> create issues and download nightly build</li>
>>> <li><bug>61808</bug>Fix main frame position. Implemented by
>Artem
>>> Fedorov (artem at blazemeter.com) and contributed by BlazeMeter
>Ltd.</li>
>>> + <li><bug>61802</bug>Loop / ForEach Controller should expose a
>>> variable for current iteration. Contributed by Ubik Load Pack
>(support at
>>> ubikloadpack.com)</li>
>>> </ul>
>>> <ch_section>Non-functional changes</ch_section>
>>>
>>>
>>>
>>