1 /* 2 * Copyright (c) 2014, 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 javax.xml.parsers.ptests; 25 26 import static jaxp.library.JAXPTestUtilities.FILE_SEP; 27 import static jaxp.library.JAXPTestUtilities.failUnexpected; 28 import static org.testng.Assert.assertEquals; 29 import static org.testng.Assert.assertFalse; 30 import static org.testng.Assert.assertNotNull; 31 import static org.testng.Assert.assertNull; 32 import static org.testng.Assert.assertTrue; 33 34 import java.io.BufferedReader; 35 import java.io.File; 36 import java.io.FileInputStream; 37 import java.io.FileReader; 38 import java.io.IOException; 39 40 import javax.xml.parsers.DocumentBuilder; 41 import javax.xml.parsers.DocumentBuilderFactory; 42 import javax.xml.parsers.ParserConfigurationException; 43 import javax.xml.parsers.SAXParser; 44 import javax.xml.parsers.SAXParserFactory; 45 46 import org.testng.annotations.Test; 47 import org.w3c.dom.Document; 48 import org.w3c.dom.Element; 49 import org.w3c.dom.NodeList; 50 import org.xml.sax.InputSource; 51 import org.xml.sax.SAXException; 52 import org.xml.sax.helpers.DefaultHandler; 53 54 /** 55 * This checks the methods of DocumentBuilderFactoryImpl 56 */ 57 public class DocumentBuilderFactory01 { 58 /** 59 * Testcase to test the default functionality of schema support method. 60 */ 61 @Test 62 public void testCheckSchemaSupport1() { 63 try { 64 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 65 dbf.setValidating(true); 66 dbf.setNamespaceAware(true); 67 dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema"); 68 MyErrorHandler eh = MyErrorHandler.newInstance(); 69 DocumentBuilder db = dbf.newDocumentBuilder(); 70 db.setErrorHandler(eh); 71 Document doc = db.parse(new File(TestUtils.XML_DIR, "test.xml")); 72 assertFalse(eh.errorOccured); 73 } catch (ParserConfigurationException | SAXException | IOException e) { 74 failUnexpected(e); 75 } 76 } 77 78 /** 79 * Testcase to test the default functionality of schema support method. In 80 * this case the schema source property is set. 81 */ 82 @Test 83 public void testCheckSchemaSupport2() { 84 try { 85 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 86 dbf.setValidating(true); 87 dbf.setNamespaceAware(true); 88 dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema"); 89 dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaSource", new InputSource(new FileInputStream( 90 new File(TestUtils.XML_DIR, "test.xsd")))); 91 MyErrorHandler eh = MyErrorHandler.newInstance(); 92 DocumentBuilder db = dbf.newDocumentBuilder(); 93 db.setErrorHandler(eh); 94 Document doc = db.parse(new File(TestUtils.XML_DIR, "test1.xml")); 95 assertFalse(eh.errorOccured); 96 } catch (IllegalArgumentException | ParserConfigurationException | SAXException | IOException e) { 97 failUnexpected(e); 98 } 99 100 } 101 102 /** 103 * Testcase to test the default functionality of schema support method. In 104 * this case the schema source property is set. 105 */ 106 @Test 107 public void testCheckSchemaSupport3() { 108 try { 109 SAXParserFactory spf = SAXParserFactory.newInstance(); 110 spf.setNamespaceAware(true); 111 spf.setValidating(true); 112 spf.setNamespaceAware(true); 113 SAXParser sp = spf.newSAXParser(); 114 sp.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema"); 115 sp.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource", 116 new InputSource(new FileInputStream(new File(TestUtils.XML_DIR, "test.xsd")))); 117 DefaultHandler dh = new DefaultHandler(); 118 sp.parse(new File(TestUtils.XML_DIR, "test1.xml"), dh); 119 } catch (ParserConfigurationException | SAXException | IOException e) { 120 failUnexpected(e); 121 } 122 } 123 124 /** 125 * Testcase to test the default functionality of newInstance method. To test 126 * the isCoalescing method and setCoalescing This checks to see if the CDATA 127 * and text nodes got combined In that case it will print "<xml>This 128 * is not parsed</xml> yet". 129 */ 130 @Test 131 public void testCheckDocumentBuilderFactory02() { 132 try { 133 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 134 dbf.setCoalescing(true); 135 DocumentBuilder docBuilder = dbf.newDocumentBuilder(); 136 Document doc = docBuilder.parse(new File(TestUtils.XML_DIR, "DocumentBuilderFactory01.xml")); 137 Element e = (Element) doc.getElementsByTagName("html").item(0); 138 NodeList nl = e.getChildNodes(); 139 assertEquals(nl.item(0).getNodeValue().trim(), "<xml>This is not parsed</xml> yet"); 140 } catch (IOException | SAXException | ParserConfigurationException e) { 141 failUnexpected(e); 142 } 143 } 144 145 /** 146 * Testcase to test the isIgnoringComments. By default it is false. 147 */ 148 @Test 149 public void testCheckDocumentBuilderFactory03() { 150 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 151 assertFalse(dbf.isIgnoringComments()); 152 } 153 154 /** 155 * Testcase to test the isValidating. By default it is false, set it to true 156 * and then use a document which is not valid. It should throw a warning or 157 * an error at least. The test passes in case retval 0 is set in the error 158 * method . 159 */ 160 @Test 161 public void testCheckDocumentBuilderFactory04() { 162 try { 163 MyErrorHandler eh = MyErrorHandler.newInstance(); 164 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 165 dbf.setValidating(true); 166 DocumentBuilder db = dbf.newDocumentBuilder(); 167 db.setErrorHandler(eh); 168 Document doc = db.parse(new File(TestUtils.XML_DIR, "DocumentBuilderFactory05.xml")); 169 assertTrue(eh.errorOccured); 170 } catch (ParserConfigurationException | IOException | SAXException e) { 171 failUnexpected(e); 172 } 173 } 174 175 /** 176 * Testcase to test the setValidating. By default it is false, use a 177 * document which is not valid. It should not throw a warning or an error. 178 * The test passes in case the retval equals 1 . 179 */ 180 @Test 181 public void testCheckDocumentBuilderFactory16() { 182 try { 183 MyErrorHandler eh = MyErrorHandler.newInstance(); 184 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 185 DocumentBuilder db = dbf.newDocumentBuilder(); 186 db.setErrorHandler(eh); 187 Document doc = db.parse(new File(TestUtils.XML_DIR, "DocumentBuilderFactory05.xml")); 188 assertFalse(eh.errorOccured); 189 } catch (ParserConfigurationException | IOException | SAXException e) { 190 failUnexpected(e); 191 } 192 193 } 194 195 /** 196 * Testcase to test the setValidating. By default it is false, use a 197 * document which is valid. It should not throw a warning or an error. The 198 * test passes in case the retval equals 1. 199 */ 200 @Test 201 public void testCheckDocumentBuilderFactory17() { 202 try { 203 MyErrorHandler eh = MyErrorHandler.newInstance(); 204 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 205 DocumentBuilder db = dbf.newDocumentBuilder(); 206 db.setErrorHandler(eh); 207 Document doc = db.parse(new File(TestUtils.XML_DIR, "DocumentBuilderFactory04.xml")); 208 assertFalse(eh.errorOccured); 209 } catch (ParserConfigurationException | IOException | SAXException e) { 210 failUnexpected(e); 211 } 212 213 } 214 215 /** 216 * To test the isExpandEntityReferences. By default it is true. 217 */ 218 @Test 219 public void testCheckDocumentBuilderFactory05() { 220 try { 221 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 222 DocumentBuilder docBuilder = dbf.newDocumentBuilder(); 223 Document doc = docBuilder.parse(new FileInputStream(new File(TestUtils.XML_DIR, "DocumentBuilderFactory02.xml"))); 224 Element e = (Element) doc.getElementsByTagName("title").item(0); 225 NodeList nl = e.getChildNodes(); 226 assertTrue(dbf.isExpandEntityReferences()); 227 assertEquals(nl.item(0).getNodeValue().trim().charAt(0), 'W'); 228 } catch (ParserConfigurationException | IOException | SAXException e) { 229 failUnexpected(e); 230 } 231 } 232 233 /** 234 * Testcase to test the default functionality of setValidating method. The 235 * xml file has a DTD which has namespaces defined. The parser takes care to 236 * check if the namespaces using elements and defined attributes are there 237 * or not. 238 */ 239 @Test 240 public void testCheckDocumentBuilderFactory06() { 241 try { 242 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 243 dbf.setValidating(true); 244 DocumentBuilder db = dbf.newDocumentBuilder(); 245 MyErrorHandler eh = MyErrorHandler.newInstance(); 246 db.setErrorHandler(eh); 247 Document doc = db.parse(new File(TestUtils.XML_DIR, "DocumentBuilderFactory04.xml")); 248 assertTrue(doc instanceof Document); 249 assertFalse(eh.errorOccured); 250 } catch (ParserConfigurationException | IOException | SAXException e) { 251 failUnexpected(e); 252 } 253 254 } 255 256 /** 257 * Testcase to test the setExpandEntityReferences. 258 */ 259 @Test 260 public void testCheckDocumentBuilderFactory07() { 261 try { 262 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 263 dbf.setExpandEntityReferences(true); 264 DocumentBuilder docBuilder = dbf.newDocumentBuilder(); 265 Document doc = docBuilder.parse(new FileInputStream(new File(TestUtils.XML_DIR, "DocumentBuilderFactory02.xml"))); 266 Element e = (Element) doc.getElementsByTagName("title").item(0); 267 NodeList nl = e.getChildNodes(); 268 assertTrue(dbf.isExpandEntityReferences()); 269 assertEquals(nl.item(0).getNodeValue().trim().charAt(0), 'W'); 270 } catch (ParserConfigurationException | IOException | SAXException e) { 271 failUnexpected(e); 272 } 273 } 274 275 /** 276 * Testcase to test the setExpandEntityReferences. 277 */ 278 @Test 279 public void testCheckDocumentBuilderFactory08() { 280 try { 281 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 282 dbf.setExpandEntityReferences(false); 283 DocumentBuilder docBuilder = dbf.newDocumentBuilder(); 284 Document doc = docBuilder.parse(new FileInputStream(new File(TestUtils.XML_DIR, "DocumentBuilderFactory02.xml"))); 285 Element e = (Element) doc.getElementsByTagName("title").item(0); 286 NodeList nl = e.getChildNodes(); 287 assertNull(nl.item(0).getNodeValue()); 288 } catch (ParserConfigurationException | IOException | SAXException e) { 289 failUnexpected(e); 290 } 291 } 292 293 /** 294 * Testcase to test the setIgnoringComments. By default it is set to false. 295 * explicitly setting it to false, it recognizes the comment which is in 296 * Element Node Hence the Element's child node is not null. 297 */ 298 @Test 299 public void testCheckDocumentBuilderFactory09() { 300 try { 301 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 302 dbf.setIgnoringComments(false); 303 DocumentBuilder docBuilder = dbf.newDocumentBuilder(); 304 Document doc = docBuilder.parse(new FileInputStream(new File(TestUtils.XML_DIR, "DocumentBuilderFactory07.xml"))); 305 Element e = (Element) doc.getElementsByTagName("body").item(0); 306 NodeList nl = e.getChildNodes(); 307 assertNotNull(nl.item(0).getNodeValue()); 308 } catch (ParserConfigurationException | IOException | SAXException e) { 309 failUnexpected(e); 310 } 311 312 } 313 314 /** 315 * This tests for the parse(InputSource). 316 */ 317 @Test 318 public void testCheckDocumentBuilderFactory10() { 319 try { 320 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 321 DocumentBuilder docBuilder = dbf.newDocumentBuilder(); 322 Document doc = docBuilder.parse(new InputSource(new BufferedReader(new FileReader(new File(TestUtils.XML_DIR, "DocumentBuilderFactory07.xml"))))); 323 assertTrue(doc instanceof Document); 324 } catch (IllegalArgumentException | ParserConfigurationException | IOException | SAXException e) { 325 failUnexpected(e); 326 } 327 } 328 329 /** 330 * This tests for the parse InputStream with SystemID as a second parameter. 331 */ 332 @Test 333 public void testCheckDocumentBuilderFactory11() { 334 try { 335 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 336 DocumentBuilder docBuilder = dbf.newDocumentBuilder(); 337 Document doc = docBuilder.parse(new FileInputStream(new File(TestUtils.XML_DIR, "dbf10import.xsl")), new File(TestUtils.XML_DIR).toURI() 338 .toASCIIString()); 339 assertTrue(doc instanceof Document); 340 } catch (IllegalArgumentException | ParserConfigurationException | IOException | SAXException e) { 341 failUnexpected(e); 342 } 343 } 344 345 /** 346 * This tests for the parse InputStream with empty SystemID as a second 347 * parameter. 348 */ 349 @Test 350 public void testCheckDocumentBuilderFactory12() { 351 try { 352 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 353 DocumentBuilder docBuilder = dbf.newDocumentBuilder(); 354 Document doc = docBuilder.parse(new FileInputStream(new File(TestUtils.XML_DIR, "dbf10import.xsl")), " "); 355 assertTrue(doc instanceof Document); 356 } catch (IllegalArgumentException | ParserConfigurationException | IOException | SAXException e) { 357 failUnexpected(e); 358 } 359 } 360 361 /** 362 * This tests for the parse(uri). 363 */ 364 @Test 365 public void testCheckDocumentBuilderFactory13() { 366 try { 367 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 368 DocumentBuilder docBuilder = dbf.newDocumentBuilder(); 369 Document doc = docBuilder.parse(new File(TestUtils.XML_DIR + FILE_SEP + "dbf10import.xsl").toURI().toASCIIString()); 370 assertTrue(doc instanceof Document); 371 } catch (IllegalArgumentException | ParserConfigurationException | IOException | SAXException e) { 372 failUnexpected(e); 373 } 374 } 375 376 /** 377 * This tests for the parse (uri) with empty string as parameter should 378 * throw Sax Exception. 379 * 380 * @throws SAXException 381 * If any parse errors occur. 382 */ 383 @Test(expectedExceptions = SAXException.class) 384 public void testCheckDocumentBuilderFactory14() throws SAXException { 385 try { 386 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 387 DocumentBuilder docBuilder = dbf.newDocumentBuilder(); 388 docBuilder.parse(""); 389 } catch (ParserConfigurationException | IOException e) { 390 failUnexpected(e); 391 } 392 } 393 394 /** 395 * This tests for the parse (uri) with null uri as parameter should throw 396 * IllegalArgumentException. 397 * 398 */ 399 @Test(expectedExceptions = IllegalArgumentException.class) 400 public void testCheckDocumentBuilderFactory15() { 401 try { 402 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 403 DocumentBuilder docBuilder = dbf.newDocumentBuilder(); 404 String uri = null; 405 docBuilder.parse(uri); 406 } catch (ParserConfigurationException | SAXException | IOException e) { 407 failUnexpected(e); 408 } 409 } 410 411 /** 412 * Testcase to test the setIgnoringComments. By default it is set to false, 413 * setting this to true, It does not recognize the comment, Here the 414 * nodelist has a length 0 because the ignoring comments is true. 415 */ 416 @Test 417 public void testCheckIgnoringComments() { 418 try { 419 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 420 dbf.setIgnoringComments(true); 421 DocumentBuilder docBuilder = dbf.newDocumentBuilder(); 422 Document doc = docBuilder.parse(new FileInputStream(new File(TestUtils.XML_DIR, "DocumentBuilderFactory08.xml"))); 423 Element e = (Element) doc.getElementsByTagName("body").item(0); 424 NodeList nl = e.getChildNodes(); 425 assertEquals(nl.getLength(), 0); 426 } catch (ParserConfigurationException | SAXException | IOException e) { 427 failUnexpected(e); 428 } 429 430 } 431 432 /** 433 * Testcase to test the default behaviour of setIgnoringComments. By default 434 * it is set to false, this is similar to case 9 but not setIgnoringComments 435 * explicitly, it does not recognize the comment. 436 */ 437 @Test 438 public void testCheckIgnoringComments1() { 439 try { 440 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 441 DocumentBuilder docBuilder = dbf.newDocumentBuilder(); 442 Document doc = docBuilder.parse(new FileInputStream(new File(TestUtils.XML_DIR, "DocumentBuilderFactory07.xml"))); 443 Element e = (Element) doc.getElementsByTagName("body").item(0); 444 NodeList nl = e.getChildNodes(); 445 assertFalse(dbf.isIgnoringComments()); 446 assertNotNull(nl.item(0).getNodeValue()); 447 } catch (ParserConfigurationException | SAXException | IOException e) { 448 failUnexpected(e); 449 } 450 } 451 }