blob: 246c803f21c6a843d2239b92f3781c87a02b1b37 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to you under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jmeter.control;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
import java.util.HashMap;
import java.util.Map;
import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.engine.util.ReplaceStringWithFunctions;
import org.apache.jmeter.junit.JMeterTestCase;
import org.apache.jmeter.junit.stubs.TestSampler;
import org.apache.jmeter.samplers.Sampler;
import org.apache.jmeter.testelement.property.JMeterProperty;
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.junit.jupiter.api.Test;
public class TestSwitchController extends JMeterTestCase {
// Get next sample and its name
private String nextName(GenericController c) {
Sampler s = c.next();
String n;
if (s == null) {
return null;
}
n = s.getName();
return n;
}
@Test
public void test() throws Exception {
runSimpleTests("", "zero");
}
@Test
public void test0() throws Exception {
runSimpleTests("0", "zero");
}
@Test
public void test1() throws Exception {
runSimpleTests("1", "one");
runSimpleTests(" 1 ", "one");
runSimpleTests("one", "one"); // Match by name
runSimpleTests("one ", "one"); // Match by name with space
}
@Test
public void test2() throws Exception {
runSimpleTests("2", "two");
runSimpleTests("two", "two"); // Match by name
}
@Test
public void test3() throws Exception {
runSimpleTests("3", "three");
runSimpleTests("three", "three"); // Match by name
}
@Test
public void test4() throws Exception {
runSimpleTests("4", "zero");
}
@Test
public void testX() throws Exception {
runSimpleTests("X", null); // should not run any children
runSimpleTest2("X", "one", "Default"); // should match the default entry
}
private void runSimpleTests(String cond, String exp) throws Exception {
runSimpleTest(cond, exp);
runSimpleTest2(cond, exp, "one");
}
/*
* 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();
switch_cont.setSelection(cond);
controller.addTestElement(new TestSampler("before"));
controller.addTestElement(switch_cont);
switch_cont.addTestElement(new TestSampler("zero"));
switch_cont.addTestElement(new TestSampler("one"));
switch_cont.addTestElement(new TestSampler("two"));
switch_cont.addTestElement(new TestSampler("three"));
controller.addTestElement(new TestSampler("after"));
controller.initialize();
for (int i = 1; i <= 3; i++) {
assertEquals("before", nextName(controller), "Loop " + i);
if (exp != null) {
assertEquals(exp, nextName(controller), "Loop " + i);
}
assertEquals("after", nextName(controller), "Loop " + i);
assertNull(nextName(controller));
}
}
// Selection controller with two sub-controllers, but each has only 1
// child
/*
* Controller
* + Before
* + Switch (cond)
* + + zero
* + + Controller sub_1
* + + + one
* + + two
* + + Controller sub_2
* + + + three
* + After
*/
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();
SwitchController switch_cont = new SwitchController();
switch_cont.setSelection(cond);
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);
controller.addTestElement(new TestSampler("after"));
controller.initialize();
for (int i = 1; i <= 3; i++) {
assertEquals("before", nextName(controller), "Loop=" + i);
if (exp != null) {
assertEquals(exp, nextName(controller), "Loop=" + i);
}
assertEquals("after", nextName(controller), "Loop=" + i);
assertNull(nextName(controller), "Loop=" + i);
}
}
@Test
public void testTest2() throws Exception {
runTest2("", new String[]{"zero"});
runTest2("0", new String[]{"zero"});
runTest2("7", new String[]{"zero"});
runTest2("5", new String[]{"zero"});
runTest2("4", new String[]{"six"});
runTest2("4 ", new String[]{"six"});
runTest2("3", new String[]{"five"});
runTest2("1", new String[]{"one", "two"});
runTest2("2", new String[]{"three", "four"});
}
/*
* Test:
* Before
* Selection Controller
* - zero (default)
* - simple controller 1
* - - one
* - - two
* - simple controller 2
* - - three
* - - four
* - five
* - six
* After
*
* cond = Switch condition
* exp[] = expected results
*/
private void runTest2(String cond, String[] exp) throws Exception {
int loops = 3;
LoopController controller = new LoopController();
controller.setLoops(loops);
controller.setContinueForever(false);
GenericController sub_1 = new GenericController();
GenericController sub_2 = new GenericController();
SwitchController switch_cont = new SwitchController();
switch_cont.setSelection(cond);
switch_cont.addTestElement(new TestSampler("zero"));
switch_cont.addTestElement(sub_1);
sub_1.addTestElement(new TestSampler("one"));
sub_1.addTestElement(new TestSampler("two"));
switch_cont.addTestElement(sub_2);
sub_2.addTestElement(new TestSampler("three"));
sub_2.addTestElement(new TestSampler("four"));
switch_cont.addTestElement(new TestSampler("five"));
switch_cont.addTestElement(new TestSampler("six"));
controller.addTestElement(new TestSampler("before"));
controller.addTestElement(switch_cont);
controller.addTestElement(new TestSampler("after"));
controller.setRunningVersion(true);
sub_1.setRunningVersion(true);
sub_2.setRunningVersion(true);
switch_cont.setRunningVersion(true);
controller.initialize();
for (int i = 1; i <= 3; i++) {
assertEquals("before", nextName(controller), "Loop:" + i);
for (String anExp : exp) {
assertEquals(anExp, nextName(controller), "Loop:" + i);
}
assertEquals("after", nextName(controller), "Loop:" + i);
}
assertNull(nextName(controller), "Loops:" + loops);
}
/*
* N.B. Requires ApacheJMeter_functions.jar to be on the classpath,
* otherwise the function cannot be resolved.
*/
@Test
public void testFunction() throws Exception {
JMeterContext jmctx = JMeterContextService.getContext();
Map<String, String> variables = new HashMap<>();
ReplaceStringWithFunctions transformer = new ReplaceStringWithFunctions(new CompoundVariable(), variables);
jmctx.setVariables(new JMeterVariables());
JMeterVariables jmvars = jmctx.getVariables();
jmvars.put("VAR", "100");
StringProperty prop = new StringProperty(SwitchController.SWITCH_VALUE, "${__counter(TRUE,VAR)}");
JMeterProperty newProp = transformer.transformValue(prop);
newProp.setRunningVersion(true);
GenericController controller = new GenericController();
SwitchController switch_cont = new SwitchController();
switch_cont.setProperty(newProp);
controller.addTestElement(new TestSampler("before"));
controller.addTestElement(switch_cont);
switch_cont.addTestElement(new TestSampler("0"));
switch_cont.addTestElement(new TestSampler("1"));
switch_cont.addTestElement(new TestSampler("2"));
switch_cont.addTestElement(new TestSampler("3"));
controller.addTestElement(new TestSampler("after"));
controller.initialize();
assertEquals("100", jmvars.get("VAR"));
for (int i = 1; i <= 3; i++) {
assertEquals("before", nextName(controller), "Loop " + i);
assertEquals("" + i, nextName(controller), "Loop " + i);
assertEquals("" + i, jmvars.get("VAR"), "Loop " + i);
assertEquals("after", nextName(controller), "Loop " + i);
assertNull(nextName(controller));
}
int i = 4;
assertEquals("before", nextName(controller), "Loop " + i);
assertEquals("0", nextName(controller), "Loop " + i);
assertEquals("" + i, jmvars.get("VAR"), "Loop " + i);
assertEquals("after", nextName(controller), "Loop " + i);
assertNull(nextName(controller));
assertEquals("4", jmvars.get("VAR"));
}
}