You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jmeter.apache.org by fs...@apache.org on 2020/03/07 13:46:52 UTC

[jmeter] branch master updated: Allow spaces in ${...} expressions around function calls.

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

fschumacher pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jmeter.git


The following commit(s) were added to refs/heads/master by this push:
     new 89ed2ef  Allow spaces in ${...} expressions around function calls.
89ed2ef is described below

commit 89ed2ef64bea7a082171ea8dcc1c9cb1a2e302bf
Author: Felix Schumacher <fe...@internetallee.de>
AuthorDate: Thu Mar 5 21:35:20 2020 +0100

    Allow spaces in ${...} expressions around function calls.
    
    With this change it is possible to write
    
     ${ __P(something, 1) }
    
    where such an expression would previously have resulted in an error.
    
    Bugzilla Id: 64198
---
 .../apache/jmeter/engine/util/FunctionParser.java  | 14 ++++-
 .../jmeter/engine/util/FunctionParserSpec.groovy   | 62 ++++++++++++++++++++++
 xdocs/changes.xml                                  |  1 +
 3 files changed, 75 insertions(+), 2 deletions(-)

diff --git a/src/core/src/main/java/org/apache/jmeter/engine/util/FunctionParser.java b/src/core/src/main/java/org/apache/jmeter/engine/util/FunctionParser.java
index 5c19d4e..8f5a16c 100644
--- a/src/core/src/main/java/org/apache/jmeter/engine/util/FunctionParser.java
+++ b/src/core/src/main/java/org/apache/jmeter/engine/util/FunctionParser.java
@@ -125,10 +125,10 @@ class FunctionParser {
                     buffer.append(current[0]);
                 } else if (current[0] == '(' && previous != ' ') {
                     String funcName = buffer.toString();
-                    function = CompoundVariable.getNamedFunction(funcName);
+                    function = CompoundVariable.getNamedFunction(funcName.trim());
                     if (function instanceof Function) {
                         ((Function) function).setParameters(parseParams(reader));
-                        if (reader.read(current) == 0 || current[0] != '}') {
+                        if (firstNonSpace(reader, '#') != '}') {
                             reader.reset();// set to start of string
                             char []cb = new char[100];
                             int nbRead = reader.read(cb);
@@ -162,6 +162,16 @@ class FunctionParser {
         return buffer.toString();
     }
 
+    private char firstNonSpace(StringReader reader, char defaultResult) throws IOException {
+        char[] current = new char[1];
+        while (reader.read(current) == 1) {
+            if (!Character.isSpaceChar(current[0])) {
+                return current[0];
+            }
+        }
+        return defaultResult;
+    }
+
     /**
      * Compile a String into a list of parameters, each made into a
      * CompoundVariable.
diff --git a/src/core/src/test/groovy/org/apache/jmeter/engine/util/FunctionParserSpec.groovy b/src/core/src/test/groovy/org/apache/jmeter/engine/util/FunctionParserSpec.groovy
new file mode 100644
index 0000000..5913437
--- /dev/null
+++ b/src/core/src/test/groovy/org/apache/jmeter/engine/util/FunctionParserSpec.groovy
@@ -0,0 +1,62 @@
+/*
+ * 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.engine.util
+
+import org.apache.jmeter.functions.Function
+import org.apache.jmeter.samplers.SampleResult
+import org.apache.jmeter.samplers.Sampler
+
+import spock.lang.Specification
+import spock.lang.Unroll
+
+@Unroll
+class FunctionParserSpec extends Specification {
+    def "function '#value' gets compiled"() {
+        given:
+            CompoundVariable.functions.put('__func', Func.class)
+            def parser = new FunctionParser()
+        when:
+            def result = parser.compileString(value)
+        then:
+            "$result" == "$expected"
+        where:
+            value           | expected
+            '${__func()}'   | [new Func()]
+            '${ __func()}'  | [new Func()]
+            '${__func() }'  | [new Func()]
+            '${ __func() }' | [new Func()]
+    }
+
+    public static class Func implements Function {
+        void setParameters(Collection params) {
+            // do nothing
+        }
+        String getReferenceKey() {
+            return "__func"
+        }
+        List<String> getArgumentDesc() {
+            return Collections.emptyList()
+        }
+        String execute(SampleResult result, Sampler sampler) {
+            return "done"
+        }
+        String toString() {
+            return "__func()"
+        }
+    }
+}
\ No newline at end of file
diff --git a/xdocs/changes.xml b/xdocs/changes.xml
index 7ce5f34..4e1ac7d 100644
--- a/xdocs/changes.xml
+++ b/xdocs/changes.xml
@@ -123,6 +123,7 @@ to view the last release notes of version 5.2.1.
   <li><bug>63458</bug><pr>551</pr>Add new template "Functional Testing Test Plan [01]". Contributed by Sebastian Boga (sebastian.boga at endava.com)</li>
   <li><bug>64119</bug>Use first renderer from <code>view.results.tree.renderers_order</code> property as default in View Results Tree</li>
   <li><bug>64148</bug>Use gray icons for disabled elements in the tree, display subtree as gray</li>
+  <li><bug>64198</bug>Allow spaces in <code>${...}</code> expressions around functions.</li>
 </ul>
 
 <ch_section>Non-functional changes</ch_section>