You are viewing a plain text version of this content. The canonical link for it is here.
Posted to devnull@infra.apache.org by vl...@apache.org on 2019/06/08 18:42:18 UTC

[jmeter] 14/47: Bug 43364 - add option to enable previous If Controller behaviour

This is an automated email from the ASF dual-hosted git repository.

vladimirsitnikov pushed a commit to annotated tag v2_3
in repository https://gitbox.apache.org/repos/asf/jmeter.git

commit 5deb9175538ad278ae6a91982295cd973cf4e944
Author: Sebastian Bazley <se...@apache.org>
AuthorDate: Wed Sep 19 22:10:28 2007 +0000

    Bug 43364 - add option to enable previous If Controller behaviour
    
    git-svn-id: https://svn.apache.org/repos/asf/jakarta/jmeter/branches/rel-2-2@577455 13f79535-47bb-0310-9956-ffa450edef68
    
    Former-commit-id: 25a2d5d53b13c8941f5ebabf0c37e73ff39560fe
---
 bin/testfiles/BatchTestLocal.csv                   |   8 +
 bin/testfiles/BatchTestLocal.jmx                   | 259 +++++++++++++++++++++
 bin/testfiles/BatchTestLocal.xml                   |  56 +++++
 .../org/apache/jmeter/control/IfController.java    |  14 +-
 .../jmeter/control/gui/IfControllerPanel.java      |  27 +--
 .../apache/jmeter/resources/messages.properties    |   1 +
 xdocs/changes.xml                                  |   3 +-
 xdocs/usermanual/component_reference.xml           |  12 +-
 8 files changed, 363 insertions(+), 17 deletions(-)

diff --git a/bin/testfiles/BatchTestLocal.csv b/bin/testfiles/BatchTestLocal.csv
index f274c71..3d240ba 100644
--- a/bin/testfiles/BatchTestLocal.csv
+++ b/bin/testfiles/BatchTestLocal.csv
@@ -9,3 +9,11 @@ Loop,200,OK,Thread Group 1-1,,true,,0,1,1,null,
 Module,200,OK,Thread Group 1-1,,true,,0,1,1,null,
 Loop,200,OK,Thread Group 1-1,,true,,0,1,1,null,
 Module,200,OK,Thread Group 1-1,,true,,0,1,1,null,
+Java If once 1,,,Thread Group 1-1,,false,,0,1,1,null,
+Java If once 2,200,OK,Thread Group 1-1,,true,,0,1,1,null,
+Java If all 1,,,Thread Group 1-1,,false,,0,1,1,null,
+Java OK,200,OK,Thread Group 1-1,,true,,0,1,1,null,
+Java If once 1,,,Thread Group 1-1,,false,,0,1,1,null,
+Java If once 2,200,OK,Thread Group 1-1,,true,,0,1,1,null,
+Java If all 1,,,Thread Group 1-1,,false,,0,1,1,null,
+Java OK,200,OK,Thread Group 1-1,,true,,0,1,1,null,
diff --git a/bin/testfiles/BatchTestLocal.jmx b/bin/testfiles/BatchTestLocal.jmx
index 0098331..afcccee 100644
--- a/bin/testfiles/BatchTestLocal.jmx
+++ b/bin/testfiles/BatchTestLocal.jmx
@@ -87,6 +87,7 @@
         <hashTree>
           <IfController guiclass="IfControllerPanel" testclass="IfController" testname="If Controller" enabled="true">
             <stringProp name="IfController.condition">${__StringFromFile(testfiles/BatchTestLocal.txt)} &gt; 2</stringProp>
+            <stringProp name="IfController.evaluateAll">false</stringProp>
           </IfController>
           <hashTree>
             <JavaSampler guiclass="JavaTestSamplerGui" testclass="JavaSampler" testname="If Test" enabled="true">
@@ -303,6 +304,264 @@
           <stringProp name="filename"></stringProp>
         </ResultCollector>
         <hashTree/>
+        <LoopController guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
+          <boolProp name="LoopController.continue_forever">true</boolProp>
+          <stringProp name="LoopController.loops">2</stringProp>
+        </LoopController>
+        <hashTree>
+          <IfController guiclass="IfControllerPanel" testclass="IfController" testname="If once" enabled="true">
+            <stringProp name="IfController.condition">${JMeterThread.last_sample_ok}</stringProp>
+            <stringProp name="IfController.evaluateAll">false</stringProp>
+          </IfController>
+          <hashTree>
+            <JavaSampler guiclass="JavaTestSamplerGui" testclass="JavaSampler" testname="Java If once 1" 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"></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">BAD</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/>
+            <JavaSampler guiclass="JavaTestSamplerGui" testclass="JavaSampler" testname="Java If once 2" 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"></stringProp>
+                    <stringProp name="Argument.metadata">=</stringProp>
+                  </elementProp>
+                  <elementProp name="ResponseCode" elementType="Argument">
+                    <stringProp name="Argument.name">ResponseCode</stringProp>
+                    <stringProp name="Argument.value">200</stringProp>
+                    <stringProp name="Argument.metadata">=</stringProp>
+                  </elementProp>
+                  <elementProp name="ResponseMessage" elementType="Argument">
+                    <stringProp name="Argument.name">ResponseMessage</stringProp>
+                    <stringProp name="Argument.value">OK</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>
+          <IfController guiclass="IfControllerPanel" testclass="IfController" testname="If all" enabled="true">
+            <stringProp name="IfController.condition">${JMeterThread.last_sample_ok}</stringProp>
+            <stringProp name="IfController.evaluateAll">true</stringProp>
+          </IfController>
+          <hashTree>
+            <JavaSampler guiclass="JavaTestSamplerGui" testclass="JavaSampler" testname="Java If all 1" 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"></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">BAD</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/>
+            <JavaSampler guiclass="JavaTestSamplerGui" testclass="JavaSampler" testname="Java If all 2" 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"></stringProp>
+                    <stringProp name="Argument.metadata">=</stringProp>
+                  </elementProp>
+                  <elementProp name="ResponseCode" elementType="Argument">
+                    <stringProp name="Argument.name">ResponseCode</stringProp>
+                    <stringProp name="Argument.value">200</stringProp>
+                    <stringProp name="Argument.metadata">=</stringProp>
+                  </elementProp>
+                  <elementProp name="ResponseMessage" elementType="Argument">
+                    <stringProp name="Argument.name">ResponseMessage</stringProp>
+                    <stringProp name="Argument.value">OK</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>
+          <JavaSampler guiclass="JavaTestSamplerGui" testclass="JavaSampler" testname="Java OK" 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"></stringProp>
+                  <stringProp name="Argument.metadata">=</stringProp>
+                </elementProp>
+                <elementProp name="ResponseCode" elementType="Argument">
+                  <stringProp name="Argument.name">ResponseCode</stringProp>
+                  <stringProp name="Argument.value">200</stringProp>
+                  <stringProp name="Argument.metadata">=</stringProp>
+                </elementProp>
+                <elementProp name="ResponseMessage" elementType="Argument">
+                  <stringProp name="Argument.name">ResponseMessage</stringProp>
+                  <stringProp name="Argument.value">OK</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>
         <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="Simple Controller" enabled="false">
           <stringProp name="TestPlan.comments"> for Module Controller</stringProp>
         </GenericController>
diff --git a/bin/testfiles/BatchTestLocal.xml b/bin/testfiles/BatchTestLocal.xml
index 54ff842..c005b7d 100644
--- a/bin/testfiles/BatchTestLocal.xml
+++ b/bin/testfiles/BatchTestLocal.xml
@@ -73,5 +73,61 @@
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
+<sample lt="0" s="false" lb="Java If once 1" rc="" rm="" tn="Thread Group 1-1" dt="" by="0" ng="1" na="1">
+  <responseHeader class="java.lang.String"></responseHeader>
+  <requestHeader class="java.lang.String"></requestHeader>
+  <responseData class="java.lang.String"/>
+  <responseFile class="java.lang.String"></responseFile>
+  <null/>
+</sample>
+<sample lt="0" s="true" lb="Java If once 2" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" ng="1" na="1">
+  <responseHeader class="java.lang.String"></responseHeader>
+  <requestHeader class="java.lang.String"></requestHeader>
+  <responseData class="java.lang.String"/>
+  <responseFile class="java.lang.String"></responseFile>
+  <null/>
+</sample>
+<sample lt="0" s="false" lb="Java If all 1" rc="" rm="" tn="Thread Group 1-1" dt="" by="0" ng="1" na="1">
+  <responseHeader class="java.lang.String"></responseHeader>
+  <requestHeader class="java.lang.String"></requestHeader>
+  <responseData class="java.lang.String"/>
+  <responseFile class="java.lang.String"></responseFile>
+  <null/>
+</sample>
+<sample lt="0" s="true" lb="Java OK" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" ng="1" na="1">
+  <responseHeader class="java.lang.String"></responseHeader>
+  <requestHeader class="java.lang.String"></requestHeader>
+  <responseData class="java.lang.String"/>
+  <responseFile class="java.lang.String"></responseFile>
+  <null/>
+</sample>
+<sample lt="0" s="false" lb="Java If once 1" rc="" rm="" tn="Thread Group 1-1" dt="" by="0" ng="1" na="1">
+  <responseHeader class="java.lang.String"></responseHeader>
+  <requestHeader class="java.lang.String"></requestHeader>
+  <responseData class="java.lang.String"/>
+  <responseFile class="java.lang.String"></responseFile>
+  <null/>
+</sample>
+<sample lt="0" s="true" lb="Java If once 2" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" ng="1" na="1">
+  <responseHeader class="java.lang.String"></responseHeader>
+  <requestHeader class="java.lang.String"></requestHeader>
+  <responseData class="java.lang.String"/>
+  <responseFile class="java.lang.String"></responseFile>
+  <null/>
+</sample>
+<sample lt="0" s="false" lb="Java If all 1" rc="" rm="" tn="Thread Group 1-1" dt="" by="0" ng="1" na="1">
+  <responseHeader class="java.lang.String"></responseHeader>
+  <requestHeader class="java.lang.String"></requestHeader>
+  <responseData class="java.lang.String"/>
+  <responseFile class="java.lang.String"></responseFile>
+  <null/>
+</sample>
+<sample lt="0" s="true" lb="Java OK" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" ng="1" na="1">
+  <responseHeader class="java.lang.String"></responseHeader>
+  <requestHeader class="java.lang.String"></requestHeader>
+  <responseData class="java.lang.String"/>
+  <responseFile class="java.lang.String"></responseFile>
+  <null/>
+</sample>
 
 </testResults>
diff --git a/src/core/org/apache/jmeter/control/IfController.java b/src/core/org/apache/jmeter/control/IfController.java
index 7961f0d..2ba0945 100644
--- a/src/core/org/apache/jmeter/control/IfController.java
+++ b/src/core/org/apache/jmeter/control/IfController.java
@@ -53,6 +53,8 @@ public class IfController extends GenericController implements Serializable {
 
 	private final static String CONDITION = "IfController.condition"; //$NON-NLS-1$
 
+	private final static String EVALUATE_ALL = "IfController.evaluateAll"; //$NON-NLS-1$
+
 	/**
 	 * constructor
 	 */
@@ -105,7 +107,7 @@ public class IfController extends GenericController implements Serializable {
 			} else if (resultStr.equals("true")) { //$NON-NLS-1$
 				result = true;
 			} else {
-				throw new Exception(" BAD CONDITION :: " + cond);
+				throw new Exception(" BAD CONDITION :: " + cond + " :: expected true or false");
 			}
 
 			logger.debug("    >> evaluate Condition -  [ " + cond + "] results is  [" + result + "]");
@@ -145,7 +147,7 @@ public class IfController extends GenericController implements Serializable {
         // For subsequent calls, we are inside the IfControllerGroup,
         // so then we just pass the control to the next item inside the if control
         boolean result = true;
-        if(isFirst()) {
+        if(isEvaluateAll() || isFirst()) {
             result = evaluateCondition(getCondition());
         }
         
@@ -158,4 +160,12 @@ public class IfController extends GenericController implements Serializable {
 			return null;
 		}
 	}
+
+	public boolean isEvaluateAll() {
+		return getPropertyAsBoolean(EVALUATE_ALL,false);
+	}
+
+	public void setEvaluateAll(boolean b) {
+		setProperty(EVALUATE_ALL,b);
+	}
 }
diff --git a/src/core/org/apache/jmeter/control/gui/IfControllerPanel.java b/src/core/org/apache/jmeter/control/gui/IfControllerPanel.java
index 7cac512..3aa62fd 100644
--- a/src/core/org/apache/jmeter/control/gui/IfControllerPanel.java
+++ b/src/core/org/apache/jmeter/control/gui/IfControllerPanel.java
@@ -23,6 +23,7 @@ import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 
 import javax.swing.Box;
+import javax.swing.JCheckBox;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JTextField;
@@ -41,13 +42,13 @@ import org.apache.jmeter.util.JMeterUtils;
 
 public class IfControllerPanel extends AbstractControllerGui implements ActionListener {
 
-	private static final String CONDITION_LABEL = "if_controller_label"; // $NON-NLS-1$
-
 	/**
 	 * A field allowing the user to specify the number of times the controller
 	 * should loop.
 	 */
 	private JTextField theCondition;
+	
+	private JCheckBox evaluateAll;
 
 	/**
 	 * Boolean indicating whether or not this component should display its name.
@@ -56,9 +57,6 @@ public class IfControllerPanel extends AbstractControllerGui implements ActionLi
 	 */
 	private boolean displayName = true;
 
-	/** The name of the loops field component. */
-	private static final String CONDITION = "JS_Condition"; // $NON-NLS-1$
-
 	/**
 	 * Create a new LoopControlPanel as a standalone component.
 	 */
@@ -93,7 +91,9 @@ public class IfControllerPanel extends AbstractControllerGui implements ActionLi
 	public void configure(TestElement element) {
 		super.configure(element);
 		if (element instanceof IfController) {
-			theCondition.setText(((IfController) element).getCondition());
+			IfController ifController = (IfController) element;
+			theCondition.setText(ifController.getCondition());
+			evaluateAll.setSelected(ifController.isEvaluateAll());
 		}
 
 	}
@@ -113,11 +113,9 @@ public class IfControllerPanel extends AbstractControllerGui implements ActionLi
 	public void modifyTestElement(TestElement controller) {
 		configureTestElement(controller);
 		if (controller instanceof IfController) {
-			if (theCondition.getText().length() > 0) {
-				((IfController) controller).setCondition(theCondition.getText());
-			} else {
-				((IfController) controller).setCondition(""); // $NON-NLS-1$
-			}
+			IfController ifController = (IfController) controller;
+			ifController.setCondition(theCondition.getText());
+			ifController.setEvaluateAll(evaluateAll.isSelected());
 		}
 	}
     
@@ -127,6 +125,7 @@ public class IfControllerPanel extends AbstractControllerGui implements ActionLi
     public void clearGui() {
         super.clearGui();
         theCondition.setText(""); // $NON-NLS-1$
+        evaluateAll.setSelected(false);
     }
 
 	/**
@@ -174,12 +173,11 @@ public class IfControllerPanel extends AbstractControllerGui implements ActionLi
 		JPanel conditionPanel = new JPanel(new BorderLayout(5, 0));
 
 		// Condition LABEL
-		JLabel conditionLabel = new JLabel(JMeterUtils.getResString(CONDITION_LABEL));
+		JLabel conditionLabel = new JLabel(JMeterUtils.getResString("if_controller_label")); // $NON-NLS-1$
 		conditionPanel.add(conditionLabel, BorderLayout.WEST);
 
 		// TEXT FIELD
 		theCondition = new JTextField(""); // $NON-NLS-1$
-		theCondition.setName(CONDITION);
 		conditionLabel.setLabelFor(theCondition);
 		conditionPanel.add(theCondition, BorderLayout.CENTER);
 		theCondition.addActionListener(this);
@@ -187,6 +185,9 @@ public class IfControllerPanel extends AbstractControllerGui implements ActionLi
 		conditionPanel.add(Box.createHorizontalStrut(conditionLabel.getPreferredSize().width
 				+ theCondition.getPreferredSize().width), BorderLayout.NORTH);
 
+		// Evaluate All checkbox
+		evaluateAll = new JCheckBox(JMeterUtils.getResString("if_controller_evaluate_all")); // $NON-NLS-1$
+		conditionPanel.add(evaluateAll,BorderLayout.SOUTH);
 		return conditionPanel;
 	}
 }
\ No newline at end of file
diff --git a/src/core/org/apache/jmeter/resources/messages.properties b/src/core/org/apache/jmeter/resources/messages.properties
index d04347d..ea62a73 100644
--- a/src/core/org/apache/jmeter/resources/messages.properties
+++ b/src/core/org/apache/jmeter/resources/messages.properties
@@ -260,6 +260,7 @@ http_user_parameter_modifier=HTTP User Parameter Modifier
 httpmirror_title=HTTP Mirror Server
 id_prefix=ID Prefix
 id_suffix=ID Suffix
+if_controller_evaluate_all=Evaluate for all children?
 if_controller_label=Condition
 if_controller_title=If Controller
 ignore_subcontrollers=Ignore sub-controller blocks
diff --git a/xdocs/changes.xml b/xdocs/changes.xml
index aa1e008..fb2de75 100644
--- a/xdocs/changes.xml
+++ b/xdocs/changes.xml
@@ -38,6 +38,7 @@
 <li>Bug 43332 - 2.3RC4 does not clear Guis based on TestBean</li>
 <li>Bug 42948 - Problems with Proxy gui table fields in Java 1.6</li>
 <li>Fixup broken jmeter-server script</li>
+<li>Bug 43364 - option to revert If Controller to pre 2.3RC3 behaviour</li>
 </ul>
 
 <h4>Improvements</h4>
@@ -385,7 +386,7 @@ It was unused so far, and used the only Sun-specific class in JMeter.
 <li>Function methods setParameters() need to be synchronized</li>
 <li>Fix CLI long optional argument to require "=" (as for short options)</li>
 <li>Fix SlowSocket to work properly with Httpclient (both http and https)</li>
-<li>Bug 41612 - Loop nested in IF behaves erratically</li>
+<li>Bug 41612 - Loop nested in If Controller behaves erratically</li>
 <li>Bug 42232 - changing language clears UDV contents</li>
 <li>Jexl function did not allow variables</li>
 </ul>
diff --git a/xdocs/usermanual/component_reference.xml b/xdocs/usermanual/component_reference.xml
index 3377905..cd884bb 100644
--- a/xdocs/usermanual/component_reference.xml
+++ b/xdocs/usermanual/component_reference.xml
@@ -1345,16 +1345,26 @@ setting is reset when a parent Loop Controller restarts.
 <component name="If Controller" index="&sect-num;.2.9"  width="358" height="131" screenshot="ifcontroller.png">
 	<description>
 		<p>The If Controller allows the user to control whether the test elements below it (its children) are run or not.</p>
+		<p>
+		Prior to JMeter 2.3RC3, the condition was evaluated for every runnable element contained in the controller.
+		This sometimes caused unexpected behaviour, so 2.3RC3 was changed to evaluate the condition only once on initial entry.
+		However, the original behaviour is also useful, so versions of JMeter after 2.3RC4 have an additional
+		option to select the original behaviour.
+		</p>
 	</description>
 <properties>
     <property name="Name" required="No">Descriptive name for this controller that is shown in the tree.</property>
 	<property name="Condition" required="Yes"><b>Javascript</b> code that returns "true" or "false"</property>
+	<property name="Evaluate for all children" required="Yes">
+	Should condition be evaluated for all children?
+	If not checked, then the condition is only evaluated on entry.
+	</property>
 </properties>
 	<p>Examples:
 		<ul>
 			<li>${COUNT} &lt; 10</li>
 			<li>"${VAR}" == "abcd"</li>
-			<li>"${JMeterThread.last_sample_ok}" == "true" (check if last sample succeeded)</li>
+			<li>${JMeterThread.last_sample_ok} (check if last sample succeeded)</li>
 		</ul>
 		If there is an error interpreting the code, the condition is assumed to be false, and a message is logged in jmeter.log.
 	</p>