diff --git a/src/components/src/main/java/org/apache/jmeter/control/IncludeController.java b/src/components/src/main/java/org/apache/jmeter/control/IncludeController.java index 4913bd7eb14..4e1ce90d2f0 100644 --- a/src/components/src/main/java/org/apache/jmeter/control/IncludeController.java +++ b/src/components/src/main/java/org/apache/jmeter/control/IncludeController.java @@ -22,6 +22,8 @@ import java.io.IOException; import java.util.ArrayList; +import org.apache.jmeter.engine.util.CompoundVariable; +import org.apache.jmeter.functions.InvalidVariableException; import org.apache.jmeter.gui.tree.JMeterTreeNode; import org.apache.jmeter.save.SaveService; import org.apache.jmeter.services.FileServer; @@ -101,6 +103,32 @@ public String getIncludePath() { return get(getSchema().getIncludePath()); } + /** + * return the JMX file path with function support. + * @return the JMX file path with function support + */ + public String getIncludePathAsFunction() + { + String jmxfile = this.getPropertyAsString(INCLUDE_PATH); + CompoundVariable masterFunction = new CompoundVariable(); + try{ + log.debug("Trying to evaluate 'Include Path' as an expression: {}", jmxfile); + masterFunction.setParameters(jmxfile); + if(masterFunction.hasFunction()) { + String jmxfileCompile = masterFunction.getFunction().execute(); + log.debug("The value of 'Include Path' is computed as: {}", jmxfileCompile); + return jmxfileCompile; + } + } catch (InvalidVariableException e) + { + log.warn("Invalid variable in 'Include Path' {}. See log for details", jmxfile); + log.warn("Invalid variable in 'Include Path':", e); + } + + log.debug("The value of 'Include Path' is simple string: {}", jmxfile); + return jmxfile; + } + /** * The way ReplaceableController works is clone is called first, * followed by replace(HashTree) and finally getReplacement(). @@ -126,7 +154,7 @@ public void resolveReplacementSubTree(JMeterTreeNode context) { */ protected HashTree loadIncludedElements() { // only try to load the JMX test plan if there is one - final String includePath = getIncludePath(); + final String includePath = getIncludePathAsFunction(); HashTree tree = null; if (includePath != null && includePath.length() > 0) { String fileName=PREFIX+includePath; diff --git a/src/components/src/test/java/org/apache/jmeter/control/TestIncludeController.java b/src/components/src/test/java/org/apache/jmeter/control/TestIncludeController.java new file mode 100644 index 00000000000..875a6017a03 --- /dev/null +++ b/src/components/src/test/java/org/apache/jmeter/control/TestIncludeController.java @@ -0,0 +1,96 @@ +/* + * 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.Assert.assertEquals; + +import org.apache.jmeter.junit.JMeterTestCase; +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 TestIncludeController extends JMeterTestCase { + + + @Test + public void testGetIncludePathWithVariable() { + String varName = "testGetIncludePathWithVariable_file_name"; + String varValue = "C:\\testPath\\testFile.jmx"; + String varExpression = "${" + varName + "}"; + + JMeterVariables vars = new JMeterVariables(); + JMeterContext jmctx = JMeterContextService.getContext(); + + jmctx.setVariables(vars); + vars.put(varName, varValue); + + IncludeController includeController = new IncludeController(); + includeController.setIncludePath(varExpression); + + assertEquals(varValue, includeController.getIncludePathAsFunction()); + } + + @Test + public void testGetIncludePathWithVariables() { + String dirName = "var1"; + String dirValue = "/tmp/path/test"; + + String fileName = "var2"; + String fileValue = "testFile.jmx"; + + String varExpression = "${" + dirName + "}/${" + fileName + "}"; + + JMeterVariables vars = new JMeterVariables(); + JMeterContext jmctx = JMeterContextService.getContext(); + + jmctx.setVariables(vars); + vars.put(dirName, dirValue); + vars.put(fileName, fileValue); + + IncludeController includeController = new IncludeController(); + includeController.setIncludePath(varExpression); + + assertEquals(dirValue + "/" + fileValue, includeController.getIncludePathAsFunction()); + } + + + @Test + public void testGetIncludePathWithSimpleString() { + String varValue = "C:\\testPath\\testFile.jmx"; + + JMeterVariables vars = new JMeterVariables(); + JMeterContext jmctx = JMeterContextService.getContext(); + + IncludeController includeController = new IncludeController(); + includeController.setIncludePath(varValue); + + assertEquals(varValue, includeController.getIncludePathAsFunction()); + } + + @Test + public void testGetIncludePathWithEmptyString() { + String varValue = ""; + + IncludeController includeController = new IncludeController(); + includeController.setIncludePath(varValue); + + assertEquals(varValue, includeController.getIncludePathAsFunction()); + } + +}