You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jmeter.apache.org by pm...@apache.org on 2019/06/07 20:29:00 UTC

svn commit: r1860789 - in /jmeter/trunk: src/components/org/apache/jmeter/assertions/ test/src/org/apache/jmeter/assertions/ test/src/org/apache/jmeter/extractor/ test/src/org/apache/jmeter/util/

Author: pmouawad
Date: Fri Jun  7 20:29:00 2019
New Revision: 1860789

URL: http://svn.apache.org/viewvc?rev=1860789&view=rev
Log:
Bug 63480 - XPathAssertion and XPathAssertion2: Cover input coming from variable

Contributed by UbikLoadPack Team
Bugzilla Id: 63480

Added:
    jmeter/trunk/test/src/org/apache/jmeter/extractor/TestXPath2Extractor.java   (with props)
Modified:
    jmeter/trunk/src/components/org/apache/jmeter/assertions/XPath2Assertion.java
    jmeter/trunk/test/src/org/apache/jmeter/assertions/XPath2AssertionTest.java
    jmeter/trunk/test/src/org/apache/jmeter/assertions/XPathAssertionTest.java
    jmeter/trunk/test/src/org/apache/jmeter/util/XPathUtilTest.java

Modified: jmeter/trunk/src/components/org/apache/jmeter/assertions/XPath2Assertion.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/assertions/XPath2Assertion.java?rev=1860789&r1=1860788&r2=1860789&view=diff
==============================================================================
--- jmeter/trunk/src/components/org/apache/jmeter/assertions/XPath2Assertion.java (original)
+++ jmeter/trunk/src/components/org/apache/jmeter/assertions/XPath2Assertion.java Fri Jun  7 20:29:00 2019
@@ -18,6 +18,7 @@
 package org.apache.jmeter.assertions;
 
 import java.io.Serializable;
+import java.util.concurrent.CompletionException;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.jmeter.samplers.SampleResult;
@@ -67,9 +68,10 @@ public class XPath2Assertion extends Abs
         try {
             XPathUtil.computeAssertionResultUsingSaxon(result, responseData, getXPathString(),
                     getNamespaces(),isNegated());
-        } catch (SaxonApiException e) { // NOSONAR We handle exception within result failur message
+        } catch (CompletionException|SaxonApiException e) { // NOSONAR We handle exception within result failure message
             result.setError(true);
-            result.setFailureMessage("SaxonApiException occured computing assertion with XPath:" + getXPathString() + ", error:" + e.getMessage());
+            // CompletionException happens if caching fails
+            result.setFailureMessage("Exception occured computing assertion with XPath:" + getXPathString() + ", error:" + e.getMessage());
             return result;
         }
         return result;

Modified: jmeter/trunk/test/src/org/apache/jmeter/assertions/XPath2AssertionTest.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/test/src/org/apache/jmeter/assertions/XPath2AssertionTest.java?rev=1860789&r1=1860788&r2=1860789&view=diff
==============================================================================
--- jmeter/trunk/test/src/org/apache/jmeter/assertions/XPath2AssertionTest.java (original)
+++ jmeter/trunk/test/src/org/apache/jmeter/assertions/XPath2AssertionTest.java Fri Jun  7 20:29:00 2019
@@ -18,22 +18,42 @@
 
 package org.apache.jmeter.assertions;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
 import javax.xml.parsers.FactoryConfigurationError;
 
 import org.apache.jmeter.samplers.SampleResult;
+import org.apache.jmeter.threads.JMeterContext;
+import org.apache.jmeter.threads.JMeterContextService;
+import org.apache.jmeter.threads.JMeterVariables;
 import org.apache.jmeter.util.JMeterUtils;
+import org.junit.Before;
 import org.junit.Test;
 
 public class XPath2AssertionTest {
 
-    final String xmlDoc = JMeterUtils.getResourceFileAsText("XPathUtilTestXml.xml");
+    private final String xmlDoc = JMeterUtils.getResourceFileAsText("XPathUtilTestXml.xml");
+    private XPath2Assertion assertion;
+    private SampleResult response;
+    private JMeterVariables vars;
+    private JMeterContext jmctx;
+
+    @Before
+    public void setUp() throws Exception {
+        jmctx = JMeterContextService.getContext();
+        assertion = new  XPath2Assertion();
+        assertion.setThreadContext(jmctx);// This would be done by the run command
+        response = new SampleResult();
+        response.setResponseData(xmlDoc, "UTF-8");
+        vars = new JMeterVariables();
+        jmctx.setVariables(vars);
+        jmctx.setPreviousResult(response);
+    }
+
     @Test
     public void testXPath2AssertionPath1() throws FactoryConfigurationError {
-        XPath2Assertion assertion = new XPath2Assertion();
-        SampleResult response = new SampleResult();
         String namespaces = "age=http://www.w3.org/2003/01/geo/wgs84_pos#";
         String xPathQuery = "//Employees/Employee[1]/age:ag";
         assertion.setNamespaces(namespaces);
@@ -45,8 +65,6 @@ public class XPath2AssertionTest {
     }
     @Test
     public void testXPath2AssertionPath1Negated() throws FactoryConfigurationError {
-        XPath2Assertion assertion = new XPath2Assertion();
-        SampleResult response = new SampleResult();
         String namespaces = "age=http://www.w3.org/2003/01/geo/wgs84_pos#";
         String xPathQuery = "//Employees/Employee[1]/age:ag";
         assertion.setNamespaces(namespaces);
@@ -60,8 +78,6 @@ public class XPath2AssertionTest {
     }
     @Test
     public void testXPath2AssertionPath2() throws FactoryConfigurationError {
-       XPath2Assertion assertion = new XPath2Assertion();
-        SampleResult response = new SampleResult();
         String namespaces = "age=http://www.w3.org/2003/01/geo/wgs84#";
         String xPathQuery = "//Employees/Employee[1]/age:ag";
         assertion.setNamespaces(namespaces);
@@ -73,8 +89,6 @@ public class XPath2AssertionTest {
     }
     @Test
     public void testXPath2AssertionPath2Negated() throws FactoryConfigurationError {
-        XPath2Assertion assertion = new XPath2Assertion();
-        SampleResult response = new SampleResult();
         String namespaces = "age=http://www.w3.org/2003/01/geo/wgs84#";
         String xPathQuery = "//Employees/Employee[1]/age:ag";
         assertion.setNamespaces(namespaces);
@@ -84,13 +98,10 @@ public class XPath2AssertionTest {
         AssertionResult res = assertion.getResult(response);
         assertFalse("When xpath2 doesn't conform to xml, the result of assertion should be true ", res.isFailure());
         assertFalse("When the format of xpath2 is right, assertion will run correctly ",res.isError());
-
     }
     
     @Test
     public void testXPath2AssertionBool1() throws FactoryConfigurationError {
-       XPath2Assertion assertion = new XPath2Assertion();
-        SampleResult response = new SampleResult();
         String namespaces = "age=http://www.w3.org/2003/01/geo/wgs84_pos#";
         String xPathQuery = "count(//Employee)=4";
         assertion.setNamespaces(namespaces);
@@ -102,8 +113,6 @@ public class XPath2AssertionTest {
     }
     @Test
     public void testXPath2AssertionBool1Negated() throws FactoryConfigurationError {
-        XPath2Assertion assertion = new XPath2Assertion();
-        SampleResult response = new SampleResult();
         String namespaces = "age=http://www.w3.org/2003/01/geo/wgs84_pos#";
         String xPathQuery = "count(//Employee)=4";
         assertion.setNamespaces(namespaces);
@@ -116,8 +125,6 @@ public class XPath2AssertionTest {
     }
     @Test
     public void testXPath2AssertionBool2() throws FactoryConfigurationError {
-        XPath2Assertion assertion = new XPath2Assertion();
-        SampleResult response = new SampleResult();
         String namespaces = "age=http://www.w3.org/2003/01/geo/wgs84_pos#";
         String xPathQuery = "count(//Employee)=3";  //Wrong
         assertion.setNamespaces(namespaces);
@@ -129,8 +136,6 @@ public class XPath2AssertionTest {
     }
     @Test
     public void testXPath2AssertionBool2Negated() throws FactoryConfigurationError {
-        XPath2Assertion assertion = new XPath2Assertion();
-        SampleResult response = new SampleResult();
         String namespaces = "age=http://www.w3.org/2003/01/geo/wgs84_pos#";
         String xPathQuery = "count(//Employee)=3";  //Wrong
         assertion.setNamespaces(namespaces);
@@ -141,6 +146,76 @@ public class XPath2AssertionTest {
         assertFalse("When xpath2 doesn't conforms to xml, the result of assertion should be true ",res.isFailure());
         assertFalse("When the format of xpath2 is right, assertion will run correctly ",res.isError());
     }
-          
-
+      
+    @Test
+    public void testScope(){
+        assertion.setThreadContext(jmctx);// This would be done by the run command
+        SampleResult result = new SampleResult();
+        String data = "<html><head><title>testtitle</title></head></html>";
+        assertion.setScopeVariable("testScope");
+        vars.put("testScope", data);
+        jmctx.setVariables(vars);
+        jmctx.setPreviousResult(result);
+        assertion.setXPathString("/html/head/title");
+        AssertionResult res = assertion.getResult(result);
+        assertFalse("When xpath conforms to xml, the result of assertion "
+                + "should be true ",res.isFailure());
+        assertFalse(res.isError());            
+    }
+    @Test
+    public void testScopeFailure(){
+        assertion.setThreadContext(jmctx);// This would be done by the run command
+        SampleResult result = new SampleResult();
+        String data = "<html><head><title>testtitle</title></head></html>";
+        assertion.setScopeVariable("testScope");
+        vars.put("testScope", data);
+        jmctx.setVariables(vars);
+        jmctx.setPreviousResult(result);
+        assertion.setXPathString("/html/head/tit");
+        AssertionResult res = assertion.getResult(result);
+        assertTrue("When xpath doesn't conforms to xml, the result "
+                + "of assertion should be false ",res.isFailure());
+        assertFalse(res.isError());
+    }
+    @Test
+    public void testResponseDataIsEmpty(){
+        assertion.setThreadContext(jmctx);// This would be done by the run command
+        SampleResult result = new SampleResult();   
+        assertion.setScopeVariable("testScope");
+        vars.put("testScope", null);
+        jmctx.setVariables(vars);
+        jmctx.setPreviousResult(result);
+        assertion.setXPathString("/html/head/tit");
+        AssertionResult res = assertion.getResult(result);
+        assertTrue("When xpath doesn't conforms to xml, the result "
+                + "of assertion should be false ",res.isFailure());
+        assertFalse(res.isError());
+        assertEquals("When the response data is empty, the result of assertion should be false",
+                "Response was null", res.getFailureMessage());
+    }
+    @Test
+    public void testBadXpathFormat() throws FactoryConfigurationError {
+        String namespaces = "age=http://www.w3.org/2003/01/geo/wgs84_pos#";
+        String xPathQuery = "///Employees/Employee[1]/age:ag";
+        assertion.setNamespaces(namespaces);
+        assertion.setXPathString(xPathQuery);
+        response.setResponseData(xmlDoc, "UTF-8");
+        AssertionResult res = assertion.getResult(response);
+        assertTrue("When format of xpath is wrong, the test should failed",res.isError());
+        assertTrue(res.getFailureMessage().contains("Exception occured computing assertion with XPath"));
+    }
+    
+    @Test
+    public void testXPath2AssertionPathWithoutNamespace() throws FactoryConfigurationError {
+        String data = "<html><head><title>testtitle</title></head></html>";
+        vars = new JMeterVariables();
+        jmctx.setVariables(vars);
+        jmctx.setPreviousResult(response);
+        String xPathQuery = "/html/head";
+        assertion.setXPathString(xPathQuery);
+        response.setResponseData(data, "UTF-8");
+        AssertionResult res = assertion.getResult(response);
+        assertFalse("When xpath2 conforms to xml, the result of assertion should be true ",res.isFailure());
+        assertFalse("When the format of xpath2 is right, assertion will run correctly ",res.isError());
+    }
 }

Modified: jmeter/trunk/test/src/org/apache/jmeter/assertions/XPathAssertionTest.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/test/src/org/apache/jmeter/assertions/XPathAssertionTest.java?rev=1860789&r1=1860788&r2=1860789&view=diff
==============================================================================
--- jmeter/trunk/test/src/org/apache/jmeter/assertions/XPathAssertionTest.java (original)
+++ jmeter/trunk/test/src/org/apache/jmeter/assertions/XPathAssertionTest.java Fri Jun  7 20:29:00 2019
@@ -409,5 +409,63 @@ public class XPathAssertionTest extends
         assertFalse(res.isError());
     }
     
+    @Test
+    public void testScope(){
+        String data = "<html><head><title>testtitle</title></head><body>"
+                + "<p><i><b>invalid tag nesting</i></b><hr></body></html>";
+        assertion.setScopeVariable("testScope");
+        vars = new JMeterVariables();
+        vars.put("testScope", data);
+        jmctx.setVariables(vars);
+        jmctx.setPreviousResult(result);
+        assertion.setXPathString("/html/head/title");
+        assertion.setValidating(true);
+        assertion.setTolerant(true);
+        AssertionResult res = assertion.getResult(result);
+        log.debug("failureMessage: {}", res.getFailureMessage());
+        assertFalse("When xpath conforms to xml, the result of assertion "
+                + "should be true ",res.isFailure());
+        assertFalse(res.isError());            
+    }
+    @Test
+    public void testScopeFailure(){
+        String data = "<html><head><title>testtitle</title></head><body>"
+                + "<p><i><b>invalid tag nesting</i></b><hr></body></html>";
+        assertion.setScopeVariable("testScope");
+        vars = new JMeterVariables();
+        vars.put("testScope", data);
+        jmctx.setVariables(vars);
+        jmctx.setPreviousResult(result);
+        assertion.setXPathString("/html/head/tit");
+        assertion.setValidating(true);
+        assertion.setTolerant(true);
+        AssertionResult res = assertion.getResult(result);
+        log.debug("failureMessage: {}", res.getFailureMessage());
+        assertTrue("When xpath doesn't conforms to xml, the result "
+                + "of assertion should be false ",res.isFailure());
+        assertFalse(res.isError());
+    }
 
+    @Test
+    public void testWrongXpathMethod() {
+        assertion.setXPathString("cou(//error)=1"); // wrong
+        assertion.setNegated(true);
+        AssertionResult res = assertion.getResult(result);
+        testLog.debug("isError() {} isFailure() {}", res.isError(), res.isFailure());
+        testLog.debug("failure message: {}", res.getFailureMessage());
+        assertTrue("Should not be an error", res.isError());
+        assertTrue("Un transformerException should be throw",
+                res.getFailureMessage().contains("TransformerException"));
+    }
+    @Test
+    public void testWithoutSuitableNamespaces() {
+        setAlternateResponseData();
+        assertion.setNamespace(true);
+        assertion.setXPathString("//b:row/value[@field = 'alias']");
+        AssertionResult res = assertion.getResult(jmctx.getPreviousResult());
+        log.debug(" res {}", res.isError());
+        log.debug(" failure {}", res.getFailureMessage());
+        assertTrue("When the user give namspaces, un transformerException should be throw",
+                res.getFailureMessage().contains("TransformerException"));
+    }
 }

Added: jmeter/trunk/test/src/org/apache/jmeter/extractor/TestXPath2Extractor.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/test/src/org/apache/jmeter/extractor/TestXPath2Extractor.java?rev=1860789&view=auto
==============================================================================
--- jmeter/trunk/test/src/org/apache/jmeter/extractor/TestXPath2Extractor.java (added)
+++ jmeter/trunk/test/src/org/apache/jmeter/extractor/TestXPath2Extractor.java Fri Jun  7 20:29:00 2019
@@ -0,0 +1,292 @@
+/*
+ * 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.extractor;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.io.UnsupportedEncodingException;
+
+import org.apache.jmeter.samplers.SampleResult;
+import org.apache.jmeter.threads.JMeterContext;
+import org.apache.jmeter.threads.JMeterContextService;
+import org.apache.jmeter.threads.JMeterVariables;
+import org.junit.Before;
+import org.junit.Test;
+
+public class TestXPath2Extractor {
+    private static final String VAL_NAME = "value";
+    private static final String VAL_NAME_NR = "value_matchNr";
+
+    private XPath2Extractor extractor;
+    private SampleResult result;
+    private String data;
+    private JMeterVariables vars;
+    private JMeterContext jmctx;
+
+    @Before
+    public void setUp() throws UnsupportedEncodingException {
+        jmctx = JMeterContextService.getContext();
+        extractor = new XPath2Extractor();
+        extractor.setThreadContext(jmctx);// This would be done by the run
+                                          // command
+        extractor.setRefName(VAL_NAME);
+        extractor.setDefaultValue("Default");
+        result = new SampleResult();
+        data = "<book><preface title='Intro'>zero</preface><page>one</page><page>two</page><empty></empty><a><b></b></a></book>";
+        result.setResponseData(data.getBytes("UTF-8"));
+        vars = new JMeterVariables();
+        jmctx.setVariables(vars);
+        jmctx.setPreviousResult(result);
+    }
+
+    @Test
+    public void testAttributeExtraction() throws Exception {
+        extractor.setXPathQuery("/book/preface/@title");
+        extractor.process();
+        assertEquals("Intro", vars.get(VAL_NAME));
+        assertEquals("1", vars.get(VAL_NAME_NR));
+        assertEquals("Intro", vars.get(VAL_NAME + "_1"));
+        assertNull(vars.get(VAL_NAME + "_2"));
+
+        extractor.setXPathQuery("/book/preface[@title]");
+        extractor.process();
+        assertEquals("zero", vars.get(VAL_NAME));
+        assertEquals("1", vars.get(VAL_NAME_NR));
+        assertEquals("zero", vars.get(VAL_NAME + "_1"));
+        assertNull(vars.get(VAL_NAME + "_2"));
+
+        extractor.setXPathQuery("/book/preface[@title='Intro']");
+        extractor.process();
+        assertEquals("zero", vars.get(VAL_NAME));
+        assertEquals("1", vars.get(VAL_NAME_NR));
+        assertEquals("zero", vars.get(VAL_NAME + "_1"));
+        assertNull(vars.get(VAL_NAME + "_2"));
+
+        extractor.setXPathQuery("/book/preface[@title='xyz']");
+        extractor.process();
+        assertEquals("Default", vars.get(VAL_NAME));
+        assertEquals("0", vars.get(VAL_NAME_NR));
+        assertNull(vars.get(VAL_NAME + "_1"));
+    }
+
+    @Test
+    public void testVariableExtraction() throws Exception {
+        extractor.setXPathQuery("/book/preface");
+        extractor.process();
+        assertEquals("zero", vars.get(VAL_NAME));
+        assertEquals("1", vars.get(VAL_NAME_NR));
+        assertEquals("zero", vars.get(VAL_NAME + "_1"));
+        assertNull(vars.get(VAL_NAME + "_2"));
+
+        // Test match 1
+        extractor.setXPathQuery("/book/page");
+        extractor.setMatchNumber(1);
+        extractor.process();
+        assertEquals("one", vars.get(VAL_NAME));
+        assertEquals("1", vars.get(VAL_NAME_NR));
+        assertEquals("one", vars.get(VAL_NAME + "_1"));
+        assertNull(vars.get(VAL_NAME + "_2"));
+        assertNull(vars.get(VAL_NAME + "_3"));
+
+        // Test match 1 in String
+        extractor.setXPathQuery("/book/page");
+        extractor.setMatchNumber("1");
+        extractor.process();
+        assertEquals("one", vars.get(VAL_NAME));
+        assertEquals("1", vars.get(VAL_NAME_NR));
+        assertEquals("one", vars.get(VAL_NAME + "_1"));
+        assertNull(vars.get(VAL_NAME + "_2"));
+        assertNull(vars.get(VAL_NAME + "_3"));
+
+        // Test match 2
+        extractor.setXPathQuery("/book/page");
+        extractor.setMatchNumber(2);
+        extractor.process();
+        assertEquals("two", vars.get(VAL_NAME));
+        assertEquals("1", vars.get(VAL_NAME_NR));
+        assertEquals("two", vars.get(VAL_NAME + "_1"));
+        assertNull(vars.get(VAL_NAME + "_2"));
+        assertNull(vars.get(VAL_NAME + "_3"));
+
+        // Test more than one match
+        extractor.setMatchNumber(-1);
+        extractor.setXPathQuery("/book/page");
+        extractor.process();
+        assertEquals("2", vars.get(VAL_NAME_NR));
+        assertEquals("one", vars.get(VAL_NAME + "_1"));
+        assertEquals("one", vars.get(VAL_NAME));
+        assertEquals("two", vars.get(VAL_NAME + "_2"));
+        assertNull(vars.get(VAL_NAME + "_3"));
+
+        // Put back default value
+        extractor.setMatchNumber(-1);
+
+        extractor.setXPathQuery("/book/page[2]");
+        extractor.process();
+        assertEquals("two", vars.get(VAL_NAME));
+        assertEquals("1", vars.get(VAL_NAME_NR));
+        assertEquals("two", vars.get(VAL_NAME + "_1"));
+        assertNull(vars.get(VAL_NAME + "_2"));
+        assertNull(vars.get(VAL_NAME + "_3"));
+
+        extractor.setXPathQuery("/book/index");
+        extractor.process();
+        assertEquals("Default", vars.get(VAL_NAME));
+        assertEquals("0", vars.get(VAL_NAME_NR));
+        assertNull(vars.get(VAL_NAME + "_1"));
+
+        extractor.setMatchNumber(-1);
+        // Test fragment
+        extractor.setXPathQuery("/book/page[2]");
+        extractor.setFragment(true);
+        extractor.process();
+        assertEquals("<page>two</page>", vars.get(VAL_NAME));
+        // Now get its text
+        extractor.setXPathQuery("/book/page[2]/text()");
+        extractor.process();
+        assertEquals("two", vars.get(VAL_NAME));
+
+    }
+
+    //
+    @Test
+    public void testScope() {
+        extractor.setXPathQuery("/book/preface");
+        extractor.process();
+        assertEquals("zero", vars.get(VAL_NAME));
+        assertEquals("1", vars.get(VAL_NAME_NR));
+        assertEquals("zero", vars.get(VAL_NAME + "_1"));
+        assertNull(vars.get(VAL_NAME + "_2"));
+
+        extractor.setScopeChildren(); // There aren't any
+        extractor.process();
+        assertEquals("Default", vars.get(VAL_NAME));
+        assertEquals("0", vars.get(VAL_NAME_NR));
+        assertNull(vars.get(VAL_NAME + "_1"));
+
+        extractor.setScopeAll(); // same as Parent
+        extractor.process();
+        assertEquals("zero", vars.get(VAL_NAME));
+        assertEquals("1", vars.get(VAL_NAME_NR));
+        assertEquals("zero", vars.get(VAL_NAME + "_1"));
+        assertNull(vars.get(VAL_NAME + "_2"));
+
+        // Try to get data from subresult
+        result.sampleStart(); // Needed for addSubResult()
+        result.sampleEnd();
+        SampleResult subResult = new SampleResult();
+        subResult.sampleStart();
+        subResult.setResponseData(result.getResponseData());
+        subResult.sampleEnd();
+        result.addSubResult(subResult);
+
+        // Get data from both
+        extractor.setScopeAll();
+        extractor.process();
+        assertEquals("zero", vars.get(VAL_NAME));
+        assertEquals("2", vars.get(VAL_NAME_NR));
+        assertEquals("zero", vars.get(VAL_NAME + "_1"));
+        assertEquals("zero", vars.get(VAL_NAME + "_2"));
+        assertNull(vars.get(VAL_NAME + "_3"));
+
+        // get data from child
+        extractor.setScopeChildren();
+        extractor.process();
+        assertEquals("zero", vars.get(VAL_NAME));
+        assertEquals("1", vars.get(VAL_NAME_NR));
+        assertEquals("zero", vars.get(VAL_NAME + "_1"));
+        assertNull(vars.get(VAL_NAME + "_2"));
+
+        // get data from child
+        extractor.setScopeVariable("result");
+        result = new SampleResult();
+        vars.put("result", data);
+        extractor.process();
+        assertEquals("zero", vars.get(VAL_NAME));
+        assertEquals("1", vars.get(VAL_NAME_NR));
+        assertEquals("zero", vars.get(VAL_NAME + "_1"));
+        assertNull(vars.get(VAL_NAME + "_2"));
+
+        // get data from child
+        extractor.setScopeVariable("result");
+        result = new SampleResult();
+        vars.remove("result");
+        extractor.process();
+        assertEquals("Default", vars.get(VAL_NAME));
+        assertEquals("0", vars.get(VAL_NAME_NR));
+    }
+
+    @Test
+    public void testWithNamespace() throws Exception {
+        result.setResponseData(
+                "<age:ag xmlns:age=\"http://www.w3.org/wgs84_pos#\"><head><title>test</title></head></age:ag>", null);
+        String namespaces = "age=http://www.w3.org/wgs84_pos#";
+        String xPathQuery = "/age:ag/head/title";
+        extractor.setXPathQuery(xPathQuery);
+        extractor.setNamespaces(namespaces);
+        extractor.process();
+        assertEquals("test", vars.get(VAL_NAME));
+        assertEquals("1", vars.get(VAL_NAME_NR));
+        assertEquals("test", vars.get(VAL_NAME + "_1"));
+        assertNull(vars.get(VAL_NAME + "_2"));
+    }
+
+    @Test
+    public void testWithNamespaces() throws Exception {
+        result.setResponseData(
+                "<age:ag xmlns:age=\"http://www.w3.org/wgs84_pos#\">"
+                        + "<hd:head xmlns:hd=\"http://www.w3.org/wgs85_pos#\"><title>test</title></hd:head></age:ag>",
+                null);
+        String namespaces = "age=http://www.w3.org/wgs84_pos#" + "\n" + "hd=http://www.w3.org/wgs85_pos#";
+        String xPathQuery = "/age:ag/hd:head/title";
+        extractor.setXPathQuery(xPathQuery);
+        extractor.setNamespaces(namespaces);
+        extractor.process();
+        assertEquals("test", vars.get(VAL_NAME));
+        assertEquals("1", vars.get(VAL_NAME_NR));
+        assertEquals("test", vars.get(VAL_NAME + "_1"));
+        assertNull(vars.get(VAL_NAME + "_2"));
+    }
+
+    @Test
+    public void testWithoutNamespace() throws Exception {
+        result.setResponseData(
+                "<age:ag xmlns:age=\"http://www.w3.org/wgs84_pos#\"><head><title>test</title></head></age:ag>", null);
+        String xPathQuery = "/age:ag/head/title";
+        extractor.setXPathQuery(xPathQuery);
+        extractor.process();
+        assertEquals("Default", vars.get(VAL_NAME));
+        assertEquals("0", vars.get(VAL_NAME_NR));
+    }
+
+    @Test
+    public void testPreviousResultIsEmpty() throws Exception {
+        JMeterContext jmc = JMeterContextService.getContext();
+        extractor = new XPath2Extractor();
+        extractor.setThreadContext(jmctx);// This would be done by the run
+                                          // command
+        extractor.setRefName(VAL_NAME);
+        extractor.setDefaultValue("Default");
+        jmc.setPreviousResult(null);
+        extractor.setXPathQuery("/book/preface");
+        extractor.process();
+        assertEquals(null, vars.get(VAL_NAME));
+    }
+}

Propchange: jmeter/trunk/test/src/org/apache/jmeter/extractor/TestXPath2Extractor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jmeter/trunk/test/src/org/apache/jmeter/extractor/TestXPath2Extractor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: jmeter/trunk/test/src/org/apache/jmeter/util/XPathUtilTest.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/test/src/org/apache/jmeter/util/XPathUtilTest.java?rev=1860789&r1=1860788&r2=1860789&view=diff
==============================================================================
--- jmeter/trunk/test/src/org/apache/jmeter/util/XPathUtilTest.java (original)
+++ jmeter/trunk/test/src/org/apache/jmeter/util/XPathUtilTest.java Fri Jun  7 20:29:00 2019
@@ -23,23 +23,27 @@ import static org.junit.Assert.assertFal
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
 import java.io.PrintStream;
 import java.io.StringReader;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.List;
 
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.stream.FactoryConfigurationError;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.transform.TransformerException;
 import javax.xml.transform.stream.StreamSource;
 
-import org.apache.jmeter.assertions.XPath2Assertion;
+import org.apache.jmeter.assertions.AssertionResult;
 import org.apache.jmeter.assertions.gui.XPath2Panel;
 import org.hamcrest.CoreMatchers;
 import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
+import org.xml.sax.SAXException;
 
 import net.sf.saxon.s9api.Processor;
 import net.sf.saxon.s9api.SaxonApiException;
@@ -50,11 +54,10 @@ import net.sf.saxon.s9api.XdmItem;
 import net.sf.saxon.s9api.XdmValue;
 
 public class XPathUtilTest {
-    private static final Logger log = LoggerFactory.getLogger(XPathUtil.class);
-    final String lineSeparator = System.getProperty("line.separator");
+    private final String lineSeparator = System.getProperty("line.separator");
 
     final String xmlDoc = JMeterUtils.getResourceFileAsText("XPathUtilTestXml.xml");
-    private XPath2Assertion assertion;
+
     @Test
     public void testBug63033() throws SaxonApiException {
         Processor p = new Processor(false);
@@ -161,7 +164,6 @@ public class XPathUtilTest {
                         "")));
     }
     
-
     @Test()
     public void testFormatXmlInvalid() {
         PrintStream origErr = System.err;
@@ -172,18 +174,124 @@ public class XPathUtilTest {
                 .is(XPathUtil.formatXml("No well formed xml here")));
         System.setErr(origErr);
     }
-    
+
     @Test()
     public void testValidateXPath2() throws ParserConfigurationException {
-        Document testDoc=XPathUtil.makeDocumentBuilder(false, false, false, false).newDocument();
+        Document testDoc = XPathUtil.makeDocumentBuilder(false, false, false, false).newDocument();
         Element el = testDoc.createElement("root"); //$NON-NLS-1$
         testDoc.appendChild(el);
         String namespaces = "a=http://www.w3.org/2003/01/geo/wgs84_pos# b=http://www.w3.org/2003/01/geo/wgs85_pos#";
         String xPathQuery = "//Employees/b:Employee[1]/a:ag";
-        assertTrue("When the user give namspaces, the result of validation should be true", XPath2Panel.validXPath(xPathQuery, false, namespaces));
-        namespaces ="a=http://www.w3.org/2003/01/geo/wgs84_pos#";
-        assertFalse("When the user doesn't give namspaces, the result of validation should be false", XPath2Panel.validXPath(xPathQuery, false, namespaces));
-}
-    
+        assertTrue("When the user give namspaces, the result of validation should be true",
+                XPath2Panel.validXPath(xPathQuery, false, namespaces));
+        namespaces = "a=http://www.w3.org/2003/01/geo/wgs84_pos#";
+        assertFalse("When the user doesn't give namspaces, the result of validation should be false",
+                XPath2Panel.validXPath(xPathQuery, false, namespaces));
+    }
+
+    @Test()
+    public void testMakeDocument() throws ParserConfigurationException, SAXException, IOException, TidyException {
+        String responseData = "<book><page>one</page><page>two</page><empty></empty><a><b></b></a></book>";
+        Document testDoc = XPathUtil.makeDocument(
+                new ByteArrayInputStream(responseData.getBytes(StandardCharsets.UTF_8)), false, false, false, false,
+                false, false, false, false, false);
+        AssertionResult res = new AssertionResult("test");
+        String xpathquery = "/book";
+        XPathUtil.computeAssertionResult(res, testDoc, xpathquery, false);
+        assertFalse("Should not be an error", res.isError());
+        assertFalse("Should not be a failure", res.isFailure());
+        xpathquery = "/book/error";
+        XPathUtil.computeAssertionResult(res, testDoc, xpathquery, false);
+        assertFalse("Should not be an error", res.isError());
+        assertTrue("Should be a failure", res.isFailure());
+        xpathquery = "count(/book/page)=2";
+        XPathUtil.computeAssertionResult(res, testDoc, xpathquery, false);
+        assertFalse("Should not be an error", res.isError());
+        assertFalse("Should not be a failure", res.isFailure());
+        xpathquery = "count(/book/page)=1";
+        XPathUtil.computeAssertionResult(res, testDoc, xpathquery, false);
+        assertFalse("Should not be an error", res.isError());
+        assertTrue("Should be a failure", res.isFailure());
+        xpathquery = "///book";
+        XPathUtil.computeAssertionResult(res, testDoc, xpathquery, false);
+        assertTrue("Should be an error", res.isError());
+    }
 
+    @Test()
+    public void testMakeDocumentIsnegated()
+            throws ParserConfigurationException, SAXException, IOException, TidyException {
+        String responseData = "<book><preface>zero</preface><page>one</page><page>two</page><empty></empty><a><b></b></a></book>";
+        Document testDoc = XPathUtil.makeDocument(
+                new ByteArrayInputStream(responseData.getBytes(StandardCharsets.UTF_8)), false, false, false, false,
+                false, false, false, false, false);
+        AssertionResult res = new AssertionResult("test");
+        String xpathquery = "/book/error";
+        XPathUtil.computeAssertionResult(res, testDoc, xpathquery, true);
+        assertFalse("Should not be an error", res.isError());
+        assertFalse("Should not be a failure", res.isFailure());
+        xpathquery = "/book/preface";
+        XPathUtil.computeAssertionResult(res, testDoc, xpathquery, true);
+        assertFalse("Should not be an error", res.isError());
+        assertTrue("Should be a failure", res.isFailure());
+        XPathUtil.computeAssertionResult(res, testDoc, xpathquery, true);
+        assertFalse("Should not be an error", res.isError());
+        assertTrue("Should be a failure", res.isFailure());
+        xpathquery = "count(/book/page)=1";
+        XPathUtil.computeAssertionResult(res, testDoc, xpathquery, true);
+        assertFalse("Should not be an error", res.isError());
+        assertFalse("Should not be a failure", res.isFailure());
+    }
+
+    @Test()
+    public void testGetNamespaces() throws XMLStreamException, FactoryConfigurationError {
+        String responseData = "<age:ag xmlns:age=\"http://www.w3.org/wgs84_pos#\">\n"
+                + "<hd:head xmlns:hd=\"http://www.w3.org/wgs85_pos#\"><title>test</title></hd:head></age:ag>";
+        List<String[]> res = XPathUtil.getNamespaces(responseData);
+        assertEquals("age", res.get(0)[0]);
+        assertEquals("http://www.w3.org/wgs84_pos#", res.get(0)[1]);
+        assertEquals("hd", res.get(1)[0]);
+        assertEquals("http://www.w3.org/wgs85_pos#", res.get(1)[1]);
+    }
+    
+    @Test()
+    public void testComputeAssertionResultUsingSaxon() throws SaxonApiException, FactoryConfigurationError {
+        //test xpath2 assertion 
+        AssertionResult res = new AssertionResult("test");
+        String responseData = "<book><page>one</page><page>two</page><empty></empty><a><b></b></a></book>";
+        String xpathquery = "/book";
+        XPathUtil.computeAssertionResultUsingSaxon(res, responseData, xpathquery, "", false);
+        assertFalse("Should not be an error", res.isError());
+        assertFalse("Should not be a failure", res.isFailure());
+        //test xpath2 assertion 
+        xpathquery = "/b";
+        XPathUtil.computeAssertionResultUsingSaxon(res, responseData, xpathquery, "", false);
+        assertFalse("Should not be an error", res.isError());
+        assertTrue("Should be a failure", res.isFailure());
+        //test xpath2 assertion boolean
+        xpathquery = "count(//page)=2";
+        XPathUtil.computeAssertionResultUsingSaxon(res, responseData, xpathquery, "", false);
+        assertFalse("Should not be an error", res.isError());
+        assertFalse("Should not be a failure", res.isFailure());
+        //test xpath2 assertion boolean
+        xpathquery = "count(//page)=3";
+        XPathUtil.computeAssertionResultUsingSaxon(res, responseData, xpathquery, "", false);
+        assertFalse("Should not be an error", res.isError());
+        assertTrue("Should be a failure", res.isFailure());
+    }
+    @Test()
+    public void testPutValuesForXPathInList() throws ParserConfigurationException, SAXException, IOException, TidyException, TransformerException {
+        String responseData = "<book><page>one</page><page>two</page><empty></empty><a><b></b></a></book>";
+        Document testDoc = XPathUtil.makeDocument(
+                new ByteArrayInputStream(responseData.getBytes(StandardCharsets.UTF_8)), false, false, false, false,
+                false, false, false, false, false);
+        String xpathquery = "/book/page";
+        List<String> matchs=new ArrayList<>();
+        XPathUtil.putValuesForXPathInList(testDoc, xpathquery, matchs, true);
+        assertEquals("<page>one</page>", matchs.get(0));
+        assertEquals("<page>two</page>", matchs.get(1));
+        matchs=new ArrayList<>();
+        XPathUtil.putValuesForXPathInList(testDoc, xpathquery, matchs, false); 
+        assertEquals("one", matchs.get(0));
+        assertEquals("two", matchs.get(1));
+    }
 }