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 < [email protected]> wrote: > Am 28.11.2017 um 08:11 schrieb [email protected]: > >> 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.
