1 /* 2 * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 package xpath; 25 26 import javax.xml.namespace.NamespaceContext; 27 import javax.xml.parsers.DocumentBuilderFactory; 28 import javax.xml.parsers.ParserConfigurationException; 29 import javax.xml.xpath.XPath; 30 import javax.xml.xpath.XPathConstants; 31 import javax.xml.xpath.XPathExpressionException; 32 import javax.xml.xpath.XPathFactory; 33 import org.testng.annotations.DataProvider; 34 import org.testng.annotations.Listeners; 35 import org.testng.annotations.Test; 36 import org.w3c.dom.Document; 37 import org.w3c.dom.Node; 38 39 /* 40 * @test 41 * @bug 6376058 42 * @library /javax/xml/jaxp/libs /javax/xml/jaxp/unittest 43 * @run testng/othervm -DrunSecMngr=true xpath.XPathTest 44 * @run testng/othervm xpath.XPathTest 45 * @summary Test XPath functions. See details for each test. 46 */ 47 @Listeners({jaxp.library.BasePolicy.class}) 48 public class XPathTest { 49 50 /* 51 @bug 6211561 52 * Verifies the specification for XPath and XPathExpression: 53 * If a null value is provided for item (the context), 54 * the expression must have no dependency on the context. 55 */ 56 @Test(dataProvider = "noContextDependency") 57 public void testNoContextDependency1(String expression, Object item) throws XPathExpressionException { 58 XPath xPath = XPathFactory.newInstance().newXPath(); 59 xPath.evaluate(expression, item, XPathConstants.STRING); 60 } 61 62 @Test(dataProvider = "noContextDependency") 63 public void testNoContextDependency2(String expression, Object item) throws XPathExpressionException { 64 XPath xPath = XPathFactory.newInstance().newXPath(); 65 xPath.evaluateExpression(expression, item, String.class); 66 } 67 68 /* 69 @bug 6211561 70 * Verifies the specification for XPath and XPathExpression: 71 * If a null value is provided for item (the context) that the operation 72 * depends on, XPathExpressionException will be thrown 73 */ 74 @Test(dataProvider = "hasContextDependency", expectedExceptions = XPathExpressionException.class) 75 public void testHasContextDependency1(String expression, Object item) throws XPathExpressionException { 76 XPath xPath = XPathFactory.newInstance().newXPath(); 77 xPath.evaluate(expression, item, XPathConstants.STRING); 78 } 79 80 @Test(dataProvider = "hasContextDependency", expectedExceptions = XPathExpressionException.class) 81 public void testHasContextDependency2(String expression, Object item) throws XPathExpressionException { 82 XPath xPath = XPathFactory.newInstance().newXPath(); 83 xPath.evaluateExpression(expression, item, String.class); 84 } 85 86 /* 87 @bug 6376058 88 Verifies that XPath.getNamespaceContext() is supported. 89 */ 90 @Test 91 public void testNamespaceContext() { 92 XPathFactory xPathFactory = XPathFactory.newInstance(); 93 XPath xPath = xPathFactory.newXPath(); 94 NamespaceContext namespaceContext = xPath.getNamespaceContext(); 95 } 96 97 /* 98 * DataProvider: the expression has no dependency on the context 99 */ 100 @DataProvider(name = "noContextDependency") 101 public Object[][] getExpressionContext() throws Exception { 102 return new Object[][]{ 103 {"1+1", (Node)null}, 104 {"5 mod 2", (Node)null}, 105 {"8 div 2", (Node)null}, 106 {"/node", getEmptyDocument()} 107 }; 108 } 109 110 /* 111 * DataProvider: the expression has dependency on the context, but the context 112 * is null. 113 */ 114 @DataProvider(name = "hasContextDependency") 115 public Object[][] getExpressionContext1() throws Exception { 116 return new Object[][]{ 117 {"/node", (Node)null}, 118 {"//@lang", (Node)null}, 119 {"bookstore//book", (Node)null}, 120 {"/bookstore/book[last()]", (Node)null}, 121 {"//title[@lang='en']", (Node)null}, 122 {"/bookstore/book[price>9.99]", (Node)null}, 123 {"/bookstore/book[price>8.99 and price<9.99]", (Node)null}, 124 {"/bookstore/*", (Node)null}, 125 {"//title[@*]", (Node)null}, 126 {"//title | //price", (Node)null}, 127 {"//book/title | //book/price", (Node)null}, 128 {"/bookstore/book/title | //price", (Node)null}, 129 {"child::book", (Node)null}, 130 {"child::text()", (Node)null}, 131 {"child::*/child::price", (Node)null} 132 }; 133 } 134 135 /** 136 * Returns an empty {@link org.w3c.dom.Document}. 137 * @return a DOM Document, null in case of Exception 138 */ 139 public Document getEmptyDocument() { 140 try { 141 return DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); 142 } catch (ParserConfigurationException e) { 143 return null; 144 } 145 } 146 } 147