Author: fschumacher
Date: Thu Dec  1 18:39:36 2016
New Revision: 1772247

URL: http://svn.apache.org/viewvc?rev=1772247&view=rev
Log:
Clear leftover variables before extracting new ones in JSON Extractor.
Based on a patch by Qi Chen (qi.chensh at ele.me)

This closes #235 on github.

Modified:
    
jmeter/trunk/src/components/org/apache/jmeter/extractor/json/jsonpath/JSONPostProcessor.java
    jmeter/trunk/test/src/org/apache/jmeter/extractor/TestJSONPostProcessor.java
    jmeter/trunk/xdocs/changes.xml

Modified: 
jmeter/trunk/src/components/org/apache/jmeter/extractor/json/jsonpath/JSONPostProcessor.java
URL: 
http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/extractor/json/jsonpath/JSONPostProcessor.java?rev=1772247&r1=1772246&r2=1772247&view=diff
==============================================================================
--- 
jmeter/trunk/src/components/org/apache/jmeter/extractor/json/jsonpath/JSONPostProcessor.java
 (original)
+++ 
jmeter/trunk/src/components/org/apache/jmeter/extractor/json/jsonpath/JSONPostProcessor.java
 Thu Dec  1 18:39:36 2016
@@ -99,6 +99,7 @@ public class JSONPostProcessor extends A
             int matchNumber = matchNumbers[i];
             String currentRefName = refNames[i].trim();
             String currentJsonPath = jsonPathExpressions[i].trim();
+            clearOldRefVars(vars, currentRefName);
             try {
                 if (jsonResponse.isEmpty()) {
                     vars.put(currentRefName, defaultValues[i]);
@@ -167,7 +168,9 @@ public class JSONPostProcessor extends A
                                 vars.put(currentRefName + ALL_SUFFIX, 
vars.get(currentRefName));
                             }
                         }
-                        vars.put(currentRefName + REF_MATCH_NR, 
Integer.toString(extractedValues.size()));
+                        if (matchNumber != 0) {
+                            vars.put(currentRefName + REF_MATCH_NR, 
Integer.toString(extractedValues.size()));
+                        }
                     }
                 }
             } catch (Exception e) {
@@ -183,6 +186,13 @@ public class JSONPostProcessor extends A
         }
     }
 
+    private void clearOldRefVars(JMeterVariables vars, String refName) {
+        vars.remove(refName + REF_MATCH_NR);
+        for (int i=1; vars.get(refName + "_" + i) != null; i++) {
+            vars.remove(refName + "_" + i);
+        }
+    }
+
     private void placeObjectIntoVars(JMeterVariables vars, String 
currentRefName,
             List<Object> extractedValues, int matchNr) {
         vars.put(currentRefName,

Modified: 
jmeter/trunk/test/src/org/apache/jmeter/extractor/TestJSONPostProcessor.java
URL: 
http://svn.apache.org/viewvc/jmeter/trunk/test/src/org/apache/jmeter/extractor/TestJSONPostProcessor.java?rev=1772247&r1=1772246&r2=1772247&view=diff
==============================================================================
--- 
jmeter/trunk/test/src/org/apache/jmeter/extractor/TestJSONPostProcessor.java 
(original)
+++ 
jmeter/trunk/test/src/org/apache/jmeter/extractor/TestJSONPostProcessor.java 
Thu Dec  1 18:39:36 2016
@@ -73,6 +73,70 @@ public class TestJSONPostProcessor {
     }
 
     @Test
+    public void testProcessRandomElementMultipleMatches() {
+        JMeterContext context = JMeterContextService.getContext();
+        JSONPostProcessor processor = setupProcessor(context, "0", true);
+        JMeterVariables vars = new JMeterVariables();
+        processor.setDefaultValues("NONE");
+        processor.setJsonPathExpressions("$[*]");
+        processor.setRefNames("varname");
+        processor.setScopeVariable("contentvar");
+        context.setVariables(vars);
+        vars.put("contentvar", "[\"one\", \"two\"]");
+        processor.process();
+        assertThat(vars.get("varname"), 
CoreMatchers.is(CoreMatchers.anyOf(CoreMatchers.is("one"), 
CoreMatchers.is("two"))));
+        assertThat(vars.get("varname_1"), 
CoreMatchers.is(CoreMatchers.nullValue()));
+        assertThat(vars.get("varname_2"), 
CoreMatchers.is(CoreMatchers.nullValue()));
+        assertThat(vars.get("varname_matchNr"), 
CoreMatchers.is(CoreMatchers.nullValue()));
+    }
+
+    @Test
+    public void testPR235CaseEmptyResponse() {
+        JMeterContext context = JMeterContextService.getContext();
+        JSONPostProcessor processor = setupProcessor(context, "-1", true);
+        JMeterVariables vars = new JMeterVariables();
+        processor.setDefaultValues("NONE");
+        processor.setJsonPathExpressions("$[*]");
+        processor.setRefNames("varname");
+        processor.setScopeVariable("contentvar");
+        context.setVariables(vars);
+        vars.put("contentvar", "[\"one\", \"two\"]");
+        processor.process();
+        assertThat(vars.get("varname_1"), CoreMatchers.is("one"));
+        assertThat(vars.get("varname_2"), CoreMatchers.is("two"));
+        assertThat(vars.get("varname_matchNr"), CoreMatchers.is("2"));
+        vars.put("contentvar", "");
+        processor.process();
+        assertThat(vars.get("varname_matchNr"), 
CoreMatchers.is(CoreMatchers.nullValue()));
+        assertThat(vars.get("varname_1"), 
CoreMatchers.is(CoreMatchers.nullValue()));
+        assertThat(vars.get("varname_2"), 
CoreMatchers.is(CoreMatchers.nullValue()));
+    }
+
+    @Test
+    public void testPR235CaseMatchOneWithZero() {
+        JMeterContext context = JMeterContextService.getContext();
+        JSONPostProcessor processor = setupProcessor(context, "-1", true);
+        JMeterVariables vars = new JMeterVariables();
+        processor.setDefaultValues("NONE");
+        processor.setJsonPathExpressions("$[*]");
+        processor.setRefNames("varname");
+        processor.setScopeVariable("contentvar");
+        context.setVariables(vars);
+        vars.put("contentvar", "[\"one\", \"two\"]");
+        processor.process();
+        assertThat(vars.get("varname_1"), CoreMatchers.is("one"));
+        assertThat(vars.get("varname_2"), CoreMatchers.is("two"));
+        assertThat(vars.get("varname_matchNr"), CoreMatchers.is("2"));
+        vars.put("contentvar", "[\"A\", \"B\"]");
+        processor.setMatchNumbers("0");
+        processor.process();
+        assertThat(vars.get("varname"), 
CoreMatchers.is(CoreMatchers.anyOf(CoreMatchers.is("A"), 
CoreMatchers.is("B"))));
+        assertThat(vars.get("varname_matchNr"), 
CoreMatchers.is(CoreMatchers.nullValue()));
+        assertThat(vars.get("varname_1"), 
CoreMatchers.is(CoreMatchers.nullValue()));
+        assertThat(vars.get("varname_2"), 
CoreMatchers.is(CoreMatchers.nullValue()));
+    }
+
+    @Test
     public void testBug59609() throws ParseException {
         JMeterContext context = JMeterContextService.getContext();
         JSONPostProcessor processor = setupProcessor(context, "0", false);
@@ -91,8 +155,9 @@ public class TestJSONPostProcessor {
 
         JSONParser parser = new JSONParser(0);
         Object expectedValue = parser.parse(innerValue);
-        Assert.assertEquals(expectedValue, parser.parse(vars.get(VAR_NAME)));
-        Assert.assertEquals("1", vars.get(VAR_NAME + "_matchNr"));
+        assertThat(parser.parse(vars.get(VAR_NAME)), 
CoreMatchers.is(expectedValue));
+        assertThat(vars.get(VAR_NAME + "_matchNr"), 
CoreMatchers.is(CoreMatchers.nullValue()));
+        assertThat(vars.get(VAR_NAME + "_1"), 
CoreMatchers.is(CoreMatchers.nullValue()));
     }
 
     @Test

Modified: jmeter/trunk/xdocs/changes.xml
URL: 
http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1772247&r1=1772246&r2=1772247&view=diff
==============================================================================
--- jmeter/trunk/xdocs/changes.xml [utf-8] (original)
+++ jmeter/trunk/xdocs/changes.xml [utf-8] Thu Dec  1 18:39:36 2016
@@ -168,6 +168,8 @@ Fill in some detail.
 
 <h3>Timers, Assertions, Config, Pre- &amp; Post-Processors</h3>
 <ul>
+    <li><pr>235</pr>Clear old variables before extracting new ones in JSON 
Extractor.
+    Based on a patch by Qi Chen (qi.chensh at ele.me)</li>
 </ul>
 
 <h3>Functions</h3>


Reply via email to