You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jmeter-dev@jakarta.apache.org by se...@apache.org on 2007/12/05 23:35:12 UTC

svn commit: r601554 - in /jakarta/jmeter/trunk: src/components/org/apache/jmeter/control/SwitchController.java test/src/org/apache/jmeter/control/TestSwitchController.java xdocs/changes.xml xdocs/usermanual/component_reference.xml

Author: sebb
Date: Wed Dec  5 14:35:11 2007
New Revision: 601554

URL: http://svn.apache.org/viewvc?rev=601554&view=rev
Log:
Bug 43379 - Switch Controller now supports selection by name as well as number

Modified:
    jakarta/jmeter/trunk/src/components/org/apache/jmeter/control/SwitchController.java
    jakarta/jmeter/trunk/test/src/org/apache/jmeter/control/TestSwitchController.java
    jakarta/jmeter/trunk/xdocs/changes.xml
    jakarta/jmeter/trunk/xdocs/usermanual/component_reference.xml

Modified: jakarta/jmeter/trunk/src/components/org/apache/jmeter/control/SwitchController.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/components/org/apache/jmeter/control/SwitchController.java?rev=601554&r1=601553&r2=601554&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/components/org/apache/jmeter/control/SwitchController.java (original)
+++ jakarta/jmeter/trunk/src/components/org/apache/jmeter/control/SwitchController.java Wed Dec  5 14:35:11 2007
@@ -19,10 +19,34 @@
 package org.apache.jmeter.control;
 
 import java.io.Serializable;
+import java.util.Iterator;
 
 import org.apache.jmeter.samplers.Sampler;
+import org.apache.jmeter.testelement.TestElement;
 import org.apache.jmeter.testelement.property.StringProperty;
 
+// For unit tests @see TestSwitchController
+
+/**
+ * <p>
+ * Implements a controller which selects at most one of its children
+ * based on the condition value, which may be a number or a string.
+ * </p>
+ * <p>
+ * For numeric input, the controller processes the appropriate child,
+ * where the numbering starts from 0. 
+ * If the number is out of range, then the first (0th) child is selected.
+ * If the condition is the empty string, then it is assumed to be 0.
+ * </p>
+ * <p>
+ * For non-empty non-numeric input, the child is selected by name.
+ * This may be the name of the controller or a sampler.
+ * If the string does not match any of the names, then the controller
+ * with the name "default" (any case) is processed.
+ * If there is no default entry, then unlike the numeric case,
+ * no child is selected.
+ * </p>
+ */
 public class SwitchController extends GenericController implements Serializable {
 	// Package access for use by Test code
 	final static String SWITCH_VALUE = "SwitchController.value";
@@ -67,13 +91,32 @@
 		String sel = getSelection();
 		try {
 			ret = Integer.parseInt(sel);
+			if (ret < 0 || ret >= getSubControllers().size()) {
+				ret = 0;
+			}
 		} catch (NumberFormatException e) {
-			ret = 0;
-		}
-		if (ret < 0 || ret >= getSubControllers().size()) {
-			ret = 0;
+			if (sel.length()==0) {
+				ret = 0;
+			} else {
+				ret = scanControllerNames(sel);
+			}
 		}
 		return ret;
+	}
+
+	private int scanControllerNames(String sel){
+		Iterator iter = getSubControllers().iterator();
+		int i = 0;
+		int default_pos = Integer.MAX_VALUE;
+		while(iter.hasNext()) {
+			String name;
+		    TestElement el = (TestElement)iter.next();
+		    name=el.getName();
+			if (name.equals(sel)) return i;
+     		if (name.equalsIgnoreCase("default")) default_pos = i;
+			i++;
+		}
+		return default_pos;	
 	}
 
 	public String getSelection() {

Modified: jakarta/jmeter/trunk/test/src/org/apache/jmeter/control/TestSwitchController.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/test/src/org/apache/jmeter/control/TestSwitchController.java?rev=601554&r1=601553&r2=601554&view=diff
==============================================================================
--- jakarta/jmeter/trunk/test/src/org/apache/jmeter/control/TestSwitchController.java (original)
+++ jakarta/jmeter/trunk/test/src/org/apache/jmeter/control/TestSwitchController.java Wed Dec  5 14:35:11 2007
@@ -65,14 +65,17 @@
 
 		public void test1() throws Exception {
 			runSimpleTests("1", "one");
+			runSimpleTests("one", "one"); // Match by name
 		}
 
 		public void test2() throws Exception {
 			runSimpleTests("2", "two");
+			runSimpleTests("two", "two"); // Match by name
 		}
 
 		public void test3() throws Exception {
 			runSimpleTests("3", "three");
+			runSimpleTests("three", "three"); // Match by name
 		}
 
 		public void test4() throws Exception {
@@ -80,16 +83,27 @@
 		}
 
 		public void testX() throws Exception {
-			runSimpleTests("X", "zero");
+			runSimpleTests("X", null); // should not run any children
+			runSimpleTest2("X", "one", "Default"); // should match the default entry
 		}
 
-		public void runSimpleTests(String cond, String exp) throws Exception {
+		private void runSimpleTests(String cond, String exp) throws Exception {
 			runSimpleTest(cond, exp);
-			runSimpleTest2(cond, exp);
+			runSimpleTest2(cond, exp, "one");
 		}
 
-		// Simple test with single Selection controller
-		public void runSimpleTest(String cond, String exp) throws Exception {
+		/*
+		 *  Simple test with single Selection controller
+		 *  Generic Controller
+		 *  + Sampler "before"
+		 *  + Switch Controller
+		 *  + + Sampler "zero"
+		 *  + + Sampler "one"
+		 *  + + Sampler "two"
+		 *  + + Sampler "three"
+		 *  + Sampler "after"
+		 */
+		private void runSimpleTest(String cond, String exp) throws Exception {
 			GenericController controller = new GenericController();
 
 			SwitchController switch_cont = new SwitchController();
@@ -109,7 +123,9 @@
 
 			for (int i = 1; i <= 3; i++) {
 				assertEquals("Loop " + i, "before", nextName(controller));
-				assertEquals("Loop " + i, exp, nextName(controller));
+				if (exp!=null){
+					assertEquals("Loop " + i, exp, nextName(controller));
+				}
 				assertEquals("Loop " + i, "after", nextName(controller));
 				assertNull(nextName(controller));
 			}
@@ -129,7 +145,7 @@
 		 * + + + three
 		 * + After
 		 */
-		public void runSimpleTest2(String cond, String exp) throws Exception {
+		private void runSimpleTest2(String cond, String exp, String sub1Name) throws Exception {
 			GenericController controller = new GenericController();
 			GenericController sub_1 = new GenericController();
 			GenericController sub_2 = new GenericController();
@@ -140,11 +156,13 @@
 			switch_cont.addTestElement(new TestSampler("zero"));
 			switch_cont.addTestElement(sub_1);
 			sub_1.addTestElement(new TestSampler("one"));
+			sub_1.setName(sub1Name);
 
 			switch_cont.addTestElement(new TestSampler("two"));
 
 			switch_cont.addTestElement(sub_2);
 			sub_2.addTestElement(new TestSampler("three"));
+			sub_2.setName("three");
 
 			controller.addTestElement(new TestSampler("before"));
 			controller.addTestElement(switch_cont);
@@ -152,7 +170,9 @@
 			controller.initialize();
 			for (int i = 1; i <= 3; i++) {
 				assertEquals("Loop="+i,"before", nextName(controller));
-				assertEquals("Loop="+i,exp, nextName(controller));
+				if (exp!=null){
+					assertEquals("Loop="+i,exp, nextName(controller));
+				}
 				assertEquals("Loop="+i,"after", nextName(controller));
 				assertNull("Loop="+i,nextName(controller));
 			}
@@ -187,7 +207,7 @@
 		 * cond  = Switch condition 
 		 * exp[] = expected results
 		 */
-		public void runTest2(String cond, String exp[]) throws Exception {
+		private void runTest2(String cond, String exp[]) throws Exception {
 			int loops = 3;
 			LoopController controller = new LoopController();
 			controller.setLoops(loops);

Modified: jakarta/jmeter/trunk/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/xdocs/changes.xml?rev=601554&r1=601553&r2=601554&view=diff
==============================================================================
--- jakarta/jmeter/trunk/xdocs/changes.xml (original)
+++ jakarta/jmeter/trunk/xdocs/changes.xml Wed Dec  5 14:35:11 2007
@@ -62,6 +62,7 @@
 <li>Make Random function variable name optional</li>
 <li>Reduce class loading in non-GUI mode by only looking for Functions in class names
 that contain '.functions.' and don't contain '.gui.'</li>
+<li>Bug 43379 - Switch Controller now supports selection by name as well as number</li>
 </ul>
 
 <h4>Non-functional changes</h4>

Modified: jakarta/jmeter/trunk/xdocs/usermanual/component_reference.xml
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/xdocs/usermanual/component_reference.xml?rev=601554&r1=601553&r2=601554&view=diff
==============================================================================
--- jakarta/jmeter/trunk/xdocs/usermanual/component_reference.xml (original)
+++ jakarta/jmeter/trunk/xdocs/usermanual/component_reference.xml Wed Dec  5 14:35:11 2007
@@ -1454,14 +1454,24 @@
 <p>
 The Switch Controller acts like the <complink name="Interleave Controller"/> 
 in that it runs one of the subordinate elements on each iteration, but rather than
-run them in sequence, the controller runs the element number defined by the switch value.
+run them in sequence, the controller runs the element defined by the switch value.
+</p>
+<p>
+Note: In versions of JMeter after 2.3.1, the switch value can also be a name.
 </p>
 <p>If the switch value is out of range, it will run the zeroth element, 
-which therefore acts as the default.</p>
+which therefore acts as the default for the numeric case.
+It also runs the zeroth element if the value is the empty string.</p>
+<p>
+If the value is non-numeric (and non-empty), then the Switch Controller looks for the
+element with the same name (case is significant).
+If none of the names match, then the element named "default" (case not significant) is selected.
+If there is no default, then no element is selected, and the controller will not run anything.
+</p>
 </description>
 <properties>
 	<property name="Name" required="Yes">Descriptive name for this controller that is shown in the tree, and used to name the transaction.</property>
-	<property name="Switch Value" required="Yes">The number of the subordinate element to be invoked. Elements are numbered from 0.</property>
+	<property name="Switch Value" required="Yes">The number (or name) of the subordinate element to be invoked. Elements are numbered from 0.</property>
 </properties>
 </component>
 



---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org