Hello sebb, I have a question about this , see below. Regards Philippe
On Thu, Mar 28, 2013 at 2:12 AM, <[email protected]> wrote: > Author: sebb > Date: Thu Mar 28 01:12:10 2013 > New Revision: 1461911 > > URL: http://svn.apache.org/r1461911 > Log: > ArrayIndexOutOfBoundsException if "sample_variable" is set in client but > not server > Bugzilla Id: 54685 > > Added: > jmeter/trunk/bin/testfiles/Bug54685.csv > jmeter/trunk/bin/testfiles/Bug54685.jmx (with props) > jmeter/trunk/bin/testfiles/Bug54685.xml (with props) > Modified: > jmeter/trunk/build.xml > > jmeter/trunk/src/core/org/apache/jmeter/engine/StandardJMeterEngine.java > jmeter/trunk/src/core/org/apache/jmeter/samplers/SampleEvent.java > jmeter/trunk/xdocs/changes.xml > > Added: jmeter/trunk/bin/testfiles/Bug54685.csv > URL: > http://svn.apache.org/viewvc/jmeter/trunk/bin/testfiles/Bug54685.csv?rev=1461911&view=auto > > ============================================================================== > --- jmeter/trunk/bin/testfiles/Bug54685.csv (added) > +++ jmeter/trunk/bin/testfiles/Bug54685.csv Thu Mar 28 01:12:10 2013 > @@ -0,0 +1,2 @@ > > +label,responseCode,responseMessage,threadName,dataType,success,bytes,"REFERENCE","JSESSIONID" > +"sample_variables=REFERENCE,JSESSIONID REFERENCE=reference > JSESSIONID=jsessionId",,,Thread Group 1-1,,true,0,reference,jsessionId > > Added: jmeter/trunk/bin/testfiles/Bug54685.jmx > URL: > http://svn.apache.org/viewvc/jmeter/trunk/bin/testfiles/Bug54685.jmx?rev=1461911&view=auto > > ============================================================================== > --- jmeter/trunk/bin/testfiles/Bug54685.jmx (added) > +++ jmeter/trunk/bin/testfiles/Bug54685.jmx Thu Mar 28 01:12:10 2013 > @@ -0,0 +1,155 @@ > +<?xml version="1.0" encoding="UTF-8"?> > +<jmeterTestPlan version="1.2" properties="2.5" > jmeter="2.9-SNAPSHOT.20130327"> > + <hashTree> > + <TestPlan guiclass="TestPlanGui" testclass="TestPlan" > testname="Bug54685" enabled="true"> > + <stringProp name="TestPlan.comments"></stringProp> > + <boolProp name="TestPlan.functional_mode">false</boolProp> > + <boolProp name="TestPlan.serialize_threadgroups">false</boolProp> > + <elementProp name="TestPlan.user_defined_variables" > elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" > testname="User Defined Variables" enabled="true"> > + <collectionProp name="Arguments.arguments"> > + <elementProp name="REFERENCE" elementType="Argument"> > + <stringProp name="Argument.name">REFERENCE</stringProp> > + <stringProp name="Argument.value">reference</stringProp> > + <stringProp name="Argument.metadata">=</stringProp> > + </elementProp> > + <elementProp name="JSESSIONID" elementType="Argument"> > + <stringProp name="Argument.name">JSESSIONID</stringProp> > + <stringProp name="Argument.value">jsessionId</stringProp> > + <stringProp name="Argument.metadata">=</stringProp> > + </elementProp> > + </collectionProp> > + </elementProp> > + <stringProp name="TestPlan.user_define_classpath"></stringProp> > + </TestPlan> > + <hashTree> > + <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" > testname="Thread Group" 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">1</stringProp> > + </elementProp> > + <stringProp name="ThreadGroup.num_threads">1</stringProp> > + <stringProp name="ThreadGroup.ramp_time">1</stringProp> > + <longProp name="ThreadGroup.start_time">1364309240000</longProp> > + <longProp name="ThreadGroup.end_time">1364309240000</longProp> > + <boolProp name="ThreadGroup.scheduler">false</boolProp> > + <stringProp name="ThreadGroup.duration"></stringProp> > + <stringProp name="ThreadGroup.delay"></stringProp> > + </ThreadGroup> > + <hashTree> > + <JavaSampler guiclass="JavaTestSamplerGui" > testclass="JavaSampler" testname="Java Request" enabled="true"> > + <elementProp name="arguments" elementType="Arguments" > guiclass="ArgumentsPanel" testclass="Arguments" enabled="true"> > + <collectionProp name="Arguments.arguments"> > + <elementProp name="Sleep_Time" elementType="Argument"> > + <stringProp name="Argument.name">Sleep_Time</stringProp> > + <stringProp name="Argument.value">100</stringProp> > + <stringProp name="Argument.metadata">=</stringProp> > + </elementProp> > + <elementProp name="Sleep_Mask" elementType="Argument"> > + <stringProp name="Argument.name">Sleep_Mask</stringProp> > + <stringProp name="Argument.value">0xFF</stringProp> > + <stringProp name="Argument.metadata">=</stringProp> > + </elementProp> > + <elementProp name="Label" elementType="Argument"> > + <stringProp name="Argument.name">Label</stringProp> > + <stringProp > name="Argument.value">sample_variables=${__P(sample_variables,'undef')} > REFERENCE=${REFERENCE} JSESSIONID=${JSESSIONID}</stringProp> > + <stringProp name="Argument.metadata">=</stringProp> > + </elementProp> > + <elementProp name="ResponseCode" elementType="Argument"> > + <stringProp name="Argument.name">ResponseCode</stringProp> > + <stringProp name="Argument.value"></stringProp> > + <stringProp name="Argument.metadata">=</stringProp> > + </elementProp> > + <elementProp name="ResponseMessage" elementType="Argument"> > + <stringProp > name="Argument.name">ResponseMessage</stringProp> > + <stringProp name="Argument.value"></stringProp> > + <stringProp name="Argument.metadata">=</stringProp> > + </elementProp> > + <elementProp name="Status" elementType="Argument"> > + <stringProp name="Argument.name">Status</stringProp> > + <stringProp name="Argument.value">OK</stringProp> > + <stringProp name="Argument.metadata">=</stringProp> > + </elementProp> > + <elementProp name="SamplerData" elementType="Argument"> > + <stringProp name="Argument.name">SamplerData</stringProp> > + <stringProp name="Argument.value"></stringProp> > + <stringProp name="Argument.metadata">=</stringProp> > + </elementProp> > + <elementProp name="ResultData" elementType="Argument"> > + <stringProp name="Argument.name">ResultData</stringProp> > + <stringProp name="Argument.value"></stringProp> > + <stringProp name="Argument.metadata">=</stringProp> > + </elementProp> > + </collectionProp> > + </elementProp> > + <stringProp > name="classname">org.apache.jmeter.protocol.java.test.JavaTest</stringProp> > + </JavaSampler> > + <hashTree/> > + </hashTree> > + <ResultCollector guiclass="TableVisualizer" > testclass="ResultCollector" testname="View Results in Table" 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>true</fieldNames> > + <responseHeaders>false</responseHeaders> > + <requestHeaders>false</requestHeaders> > + <responseDataOnError>false</responseDataOnError> > + > > <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage> > + <assertionsResultsToSave>0</assertionsResultsToSave> > + <bytes>true</bytes> > + </value> > + </objProp> > + <stringProp name="filename">Bug54685.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>true</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> > + <bytes>true</bytes> > + </value> > + </objProp> > + <stringProp name="filename">Bug54685.xml</stringProp> > + </ResultCollector> > + <hashTree/> > + </hashTree> > + </hashTree> > +</jmeterTestPlan> > > Propchange: jmeter/trunk/bin/testfiles/Bug54685.jmx > > ------------------------------------------------------------------------------ > svn:eol-style = LF > > Added: jmeter/trunk/bin/testfiles/Bug54685.xml > URL: > http://svn.apache.org/viewvc/jmeter/trunk/bin/testfiles/Bug54685.xml?rev=1461911&view=auto > > ============================================================================== > --- jmeter/trunk/bin/testfiles/Bug54685.xml (added) > +++ jmeter/trunk/bin/testfiles/Bug54685.xml Thu Mar 28 01:12:10 2013 > @@ -0,0 +1,5 @@ > +<?xml version="1.0" encoding="UTF-8"?> > +<testResults version="1.2"> > +<sample s="true" lb="sample_variables=REFERENCE,JSESSIONID > REFERENCE=reference JSESSIONID=jsessionId" rc="" rm="" tn="Thread Group > 1-1" dt="" by="0" REFERENCE="reference" JSESSIONID="jsessionId"/> > + > +</testResults> > > Propchange: jmeter/trunk/bin/testfiles/Bug54685.xml > > ------------------------------------------------------------------------------ > svn:eol-style = native > > Modified: jmeter/trunk/build.xml > URL: > http://svn.apache.org/viewvc/jmeter/trunk/build.xml?rev=1461911&r1=1461910&r2=1461911&view=diff > > ============================================================================== > --- jmeter/trunk/build.xml (original) > +++ jmeter/trunk/build.xml Thu Mar 28 01:12:10 2013 > @@ -2341,7 +2341,7 @@ run JMeter unless all the JMeter jars ar > <antcall target="batchtest"> > <param name="remote" value="-Rlocalhost:${rmi_port}"/> > <param name="taskname" value="client"/> > - <param name="batchtest.name" > value="BatchTestLocalRemote"/> > + <!-- Default the test name so we can override with a > parameter --> > </antcall> > </sequential> > </parallel> > @@ -2373,6 +2373,12 @@ run JMeter unless all the JMeter jars ar > <property name="batchtest.inp" location="${basedir}/bin/testfiles"/> > <property name="batchtest.out" location="${basedir}/bin"/> > <property name="batchtest.name" value="BatchTestLocal"/> > + <!-- > + Allow variable to be set on the command line > + Cannot omit value because that causes a warning message > + --> > + <property name="batchtest.variable" value="dummy"/> > + <property name="batchtest.value" value="dummy"/> > > <!-- Fix the EOL in case the file was derived from the "wrong" > archive type --> > <fixcrlf srcdir="${batchtest.inp}" includes="${batchtest.name}.csv"/> > @@ -2429,6 +2435,7 @@ run JMeter unless all the JMeter jars ar > <arg value="-Gmodule=Module"/> > <!-- Check property can be used for filenames in local/remote > tests (no need to defined as -G) --> > <arg value="-JCSVFILE=${batchtest.name}.csv"/> > + <arg value="-J${batchtest.variable}=${batchtest.value}"/> > </java> > > <checkfile type="output" file="${batchtest.out}${file.separator}${ > batchtest.name}.csv"/> > @@ -2481,6 +2488,7 @@ run JMeter unless all the JMeter jars ar > </antcall> > <antcall target="batchtest"> > <!-- variable in IPSource failed HTTP request if "Concurrent > Pool Size" is enabled --> > + <!-- N.B. requires access to jmeter.apache.org --> > <param name="batchtest.name" value="Bug52310"/> > </antcall> > <antcall target="batchtest"> > @@ -2492,6 +2500,22 @@ run JMeter unless all the JMeter jars ar > <!-- IncludeController : NullPointerException loading script in > non-GUI mode if Includers use same element name --> > <param name="batchtest.name" value="Bug50898"/> > </antcall> > + > + <antcall target="batchtest"> > + <!-- ArrayIndexOutOfBoundsException if "sample_variable" is set > in client but not server --> > + <!-- This is unaffected by the bug; it just checks the script > works OK in local mode --> > + <param name="batchtest.name" value="Bug54685"/> > + <param name="batchtest.variable" value="sample_variables"/> > + <param name="batchtest.value" value="REFERENCE,JSESSIONID"/> > + </antcall> > + > + <antcall target="batchtestserver"> > + <!-- ArrayIndexOutOfBoundsException if "sample_variable" is set > in client but not server --> > + <!-- This is the actual test --> > + <param name="batchtest.name" value="Bug54685"/> > + <param name="batchtest.variable" value="sample_variables"/> > + <param name="batchtest.value" value="REFERENCE,JSESSIONID"/> > + </antcall> > </target> > > <!-- Run all batch tests; used by test target --> > > Modified: > jmeter/trunk/src/core/org/apache/jmeter/engine/StandardJMeterEngine.java > URL: > http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/engine/StandardJMeterEngine.java?rev=1461911&r1=1461910&r2=1461911&view=diff > > ============================================================================== > --- > jmeter/trunk/src/core/org/apache/jmeter/engine/StandardJMeterEngine.java > (original) > +++ > jmeter/trunk/src/core/org/apache/jmeter/engine/StandardJMeterEngine.java > Thu Mar 28 01:12:10 2013 > @@ -27,6 +27,7 @@ import java.util.Properties; > import java.util.concurrent.CopyOnWriteArrayList; > > import org.apache.jmeter.JMeter; > +import org.apache.jmeter.samplers.SampleEvent; > import org.apache.jmeter.testbeans.TestBean; > import org.apache.jmeter.testbeans.TestBeanHelper; > import org.apache.jmeter.testelement.TestElement; > @@ -302,6 +303,12 @@ public class StandardJMeterEngine implem > log.info("Running the test!"); > running = true; > > + /* > + * Ensure that the sample variables are correctly initialised for > each run. > + * TODO is this the best way to do this? should it be done > elsewhere ? > + */ > + SampleEvent.initSampleVariables(); > + > I don't understand the logic behind this. Won't this method be called by static initializer ? Why calling it here ? > JMeterContextService.startTest(); > try { > PreCompiler compiler = new PreCompiler(); > > Modified: jmeter/trunk/src/core/org/apache/jmeter/samplers/SampleEvent.java > URL: > http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/samplers/SampleEvent.java?rev=1461911&r1=1461910&r2=1461911&view=diff > > ============================================================================== > --- jmeter/trunk/src/core/org/apache/jmeter/samplers/SampleEvent.java > (original) > +++ jmeter/trunk/src/core/org/apache/jmeter/samplers/SampleEvent.java Thu > Mar 28 01:12:10 2013 > @@ -21,6 +21,7 @@ package org.apache.jmeter.samplers; > import java.io.Serializable; > import java.net.InetAddress; > import java.net.UnknownHostException; > +import java.util.Arrays; > > import org.apache.jmeter.threads.JMeterVariables; > import org.apache.jmeter.util.JMeterUtils; > @@ -37,16 +38,18 @@ public class SampleEvent implements Seri > > private static final long serialVersionUID = 232L; > > + /** The property {@value} is used to define additional variables to > be saved */ > public static final String SAMPLE_VARIABLES = "sample_variables"; // > $NON-NLS-1$ > > public static final String HOSTNAME; > > // List of variable names to be saved in JTL files > - private static final String[] variableNames; > + private static volatile String[] variableNames = new String[0]; > > // The values. Entries may be null, but there will be the correct > number. > private final String[] values; > > + // The hostname cannot change during a run, so safe to cache it just > once > static { > String hn=""; > try { > @@ -55,16 +58,19 @@ public class SampleEvent implements Seri > log.error("Cannot obtain local host name "+e); > } > HOSTNAME=hn; > + initSampleVariables(); > + } > > + /** > + * Set up the additional variable names to be saved > + * from the value in the {@link #SAMPLE_VARIABLES} property > + */ > + public static void initSampleVariables() { > String vars = JMeterUtils.getProperty(SAMPLE_VARIABLES); > - variableNames=vars != null ? vars.split(",") : new String[0]; > - int varCount=variableNames.length; > - if (varCount>0){ > - log.info(varCount + " sample_variables have been declared: > "+vars); > - } > + variableNames=vars != null ? vars.split(",") : new String[0]; > + log.info("List of sample_variables: " + > Arrays.toString(variableNames)); > } > > - > private final SampleResult result; > > private final String threadGroup; // TODO appears to duplicate the > threadName field in SampleResult > > Modified: jmeter/trunk/xdocs/changes.xml > URL: > http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1461911&r1=1461910&r2=1461911&view=diff > > ============================================================================== > --- jmeter/trunk/xdocs/changes.xml (original) > +++ jmeter/trunk/xdocs/changes.xml Thu Mar 28 01:12:10 2013 > @@ -109,7 +109,8 @@ This does not affect JMeter operation. > <h3>Listeners</h3> > <ul> > <li><bugzilla>54589</bugzilla> - View Results Tree have a lot of Garbage > characters if html page uses double-byte charset</li> > -<li><bugzilla>5473</bugzilla> - StringIndexOutOfBoundsException at > SampleResult.getSampleLabel() if key_on_threadname=false when using > Statistical mode</li> > +<li><bugzilla>54753</bugzilla> - StringIndexOutOfBoundsException at > SampleResult.getSampleLabel() if key_on_threadname=false when using > Statistical mode</li> > +<li><bugzilla>54865</bugzilla> - ArrayIndexOutOfBoundsException if > "sample_variable" is set in client but not server</li> > </ul> > > <h3>Timers, Assertions, Config, Pre- & Post-Processors</h3> > > > -- Cordialement. Philippe Mouawad.
