Am 28. November 2017 22:24:33 MEZ schrieb Philippe Mouawad <[email protected]>: >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 < >[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> >>> >>> >>> >>
