1 /* 2 * Copyright (C) 2007 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package tests.api.javax.xml.parsers; 17 18 import java.io.ByteArrayInputStream; 19 import java.io.IOException; 20 import java.io.InputStream; 21 import java.util.HashMap; 22 import java.util.Properties; 23 import java.util.Vector; 24 25 import javax.xml.parsers.FactoryConfigurationError; 26 import javax.xml.parsers.ParserConfigurationException; 27 import javax.xml.parsers.SAXParser; 28 import javax.xml.parsers.SAXParserFactory; 29 30 import junit.framework.TestCase; 31 32 import org.xml.sax.Attributes; 33 import org.xml.sax.SAXException; 34 import org.xml.sax.SAXNotRecognizedException; 35 import org.xml.sax.SAXNotSupportedException; 36 import org.xml.sax.helpers.DefaultHandler; 37 38 import dalvik.annotation.AndroidOnly; 39 import dalvik.annotation.KnownFailure; 40 41 public class SAXParserFactoryTest extends TestCase { 42 43 SAXParserFactory spf; 44 45 InputStream is1; 46 47 static HashMap<String, String> ns; 48 49 static Vector<String> el; 50 51 static HashMap<String, String> attr; 52 53 public void setUp() throws Exception { 54 spf = SAXParserFactory.newInstance(); 55 56 is1 = getClass().getResourceAsStream("/simple.xml"); 57 58 ns = new HashMap<String, String>(); 59 attr = new HashMap<String, String>(); 60 el = new Vector<String>(); 61 } 62 63 public void tearDown() throws Exception { 64 is1.close(); 65 super.tearDown(); 66 } 67 68 @AndroidOnly("Android SAX implementation is non-validating") 69 public void test_Constructor() { 70 MySAXParserFactory mpf = new MySAXParserFactory(); 71 assertTrue(mpf instanceof SAXParserFactory); 72 assertFalse(mpf.isValidating()); 73 } 74 75 /** 76 * javax.xml.parsers.SAXParserFactory#getSchema(). 77 * TBD getSchema() IS NOT SUPPORTED 78 */ 79 /* public void test_getSchema() { 80 assertNull(spf.getSchema()); 81 SchemaFactory sf = 82 SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 83 try { 84 Schema schema = sf.newSchema(); 85 spf.setSchema(schema); 86 assertNotNull(spf.getSchema()); 87 } catch (SAXException sax) { 88 fail("Unexpected exception " + sax.toString()); 89 } 90 } 91 */ 92 93 public void test_setIsNamespaceAware() { 94 spf.setNamespaceAware(true); 95 assertTrue(spf.isNamespaceAware()); 96 spf.setNamespaceAware(false); 97 assertFalse(spf.isNamespaceAware()); 98 spf.setNamespaceAware(true); 99 assertTrue(spf.isNamespaceAware()); 100 } 101 102 public void test_setIsValidating() { 103 spf.setValidating(true); 104 assertTrue(spf.isValidating()); 105 spf.setValidating(false); 106 assertFalse(spf.isValidating()); 107 spf.setValidating(true); 108 assertTrue(spf.isValidating()); 109 } 110 111 public void test_setIsXIncludeAware() { 112 spf.setXIncludeAware(true); 113 assertTrue(spf.isXIncludeAware()); 114 spf.setXIncludeAware(false); 115 assertFalse(spf.isXIncludeAware()); 116 } 117 118 @KnownFailure("Dalvik doesn't honor system properties when choosing a SAX implementation") 119 public void test_newInstance() { 120 try { 121 SAXParserFactory dtf = SAXParserFactory.newInstance(); 122 assertNotNull("New Instance of DatatypeFactory is null", dtf); 123 124 System.setProperty("javax.xml.parsers.SAXParserFactory", 125 "org.apache.harmony.xml.parsers.SAXParserFactoryImpl"); 126 127 SAXParserFactory spf1 = SAXParserFactory.newInstance(); 128 assertTrue(spf1 instanceof org.apache.harmony.xml.parsers.SAXParserFactoryImpl); 129 130 String key = "javax.xml.parsers.SAXParserFactory = org.apache.harmony.xml.parsers.SAXParserFactoryImpl"; 131 132 ByteArrayInputStream bis = new ByteArrayInputStream(key.getBytes()); 133 Properties prop = System.getProperties(); 134 prop.load(bis); 135 SAXParserFactory spf2 = SAXParserFactory.newInstance(); 136 assertTrue(spf2 instanceof org.apache.harmony.xml.parsers.SAXParserFactoryImpl); 137 138 System.setProperty("javax.xml.parsers.SAXParserFactory", ""); 139 try { 140 SAXParserFactory.newInstance(); 141 fail("Expected FactoryConfigurationError was not thrown"); 142 } catch (FactoryConfigurationError e) { 143 // expected 144 } 145 } catch (IOException ioe) { 146 fail("Unexpected exception " + ioe.toString()); 147 } 148 } 149 150 public void test_newSAXParser() { 151 // Ordinary case 152 try { 153 SAXParser sp = spf.newSAXParser(); 154 assertTrue(sp instanceof SAXParser); 155 sp.parse(is1, new MyHandler()); 156 } catch(Exception e) { 157 throw new RuntimeException("Unexpected exception", e); 158 } 159 160 // Exception case 161 spf.setValidating(true); 162 try { 163 SAXParser sp = spf.newSAXParser(); 164 } catch(ParserConfigurationException e) { 165 // Expected, since Android doesn't have a validating parser. 166 } catch (SAXException e) { 167 throw new RuntimeException("Unexpected exception", e); 168 } 169 } 170 171 public void test_setFeatureLjava_lang_StringZ() { 172 // We can't verify ParserConfigurationException and 173 // SAXNotSupportedException since these are never 174 // thrown by Android. 175 176 String[] features = { 177 "http://xml.org/sax/features/namespaces", 178 "http://xml.org/sax/features/validation" }; 179 for (int i = 0; i < features.length; i++) { 180 try { 181 spf.setFeature(features[i], true); 182 assertTrue(spf.getFeature(features[i])); 183 spf.setFeature(features[i], false); 184 assertFalse(spf.getFeature(features[i])); 185 } catch (ParserConfigurationException pce) { 186 fail("ParserConfigurationException is thrown"); 187 } catch (SAXNotRecognizedException snre) { 188 fail("SAXNotRecognizedException is thrown"); 189 } catch (SAXNotSupportedException snse) { 190 fail("SAXNotSupportedException is thrown"); 191 } 192 } 193 194 try { 195 spf.setFeature("", true); 196 fail("SAXNotRecognizedException is not thrown"); 197 } catch (ParserConfigurationException pce) { 198 fail("ParserConfigurationException is thrown"); 199 } catch (SAXNotRecognizedException snre) { 200 //expected 201 } catch (SAXNotSupportedException snse) { 202 fail("SAXNotSupportedException is thrown"); 203 } catch (NullPointerException npe) { 204 fail("NullPointerException is thrown"); 205 } 206 207 try { 208 spf.setFeature("http://xml.org/sax/features/unknown-feature", true); 209 } catch (ParserConfigurationException pce) { 210 fail("ParserConfigurationException is thrown"); 211 } catch (SAXNotRecognizedException snre) { 212 fail("SAXNotRecognizedException is thrown"); 213 } catch (SAXNotSupportedException snse) { 214 // Acceptable, although this doesn't happen an Android. 215 } catch (NullPointerException npe) { 216 fail("NullPointerException is thrown"); 217 } 218 219 try { 220 spf.setFeature(null, true); 221 fail("NullPointerException is not thrown"); 222 } catch (ParserConfigurationException pce) { 223 fail("ParserConfigurationException is thrown"); 224 } catch (SAXNotRecognizedException snre) { 225 fail("SAXNotRecognizedException is thrown"); 226 } catch (SAXNotSupportedException snse) { 227 fail("SAXNotSupportedException is thrown"); 228 } catch (NullPointerException npe) { 229 // expected 230 } 231 } 232 233 public void test_setNamespaceAwareZ() throws Exception { 234 MyHandler mh = new MyHandler(); 235 236 spf.setNamespaceAware(true); 237 InputStream is = getClass().getResourceAsStream("/simple_ns.xml"); 238 spf.newSAXParser().parse(is, mh); 239 is.close(); 240 241 spf.setNamespaceAware(false); 242 is = getClass().getResourceAsStream("/simple_ns.xml"); 243 spf.newSAXParser().parse(is, mh); 244 is.close(); 245 } 246 247 /* public void test_setSchemaLjavax_xml_validation_Schema() { 248 SchemaFactory sf = 249 SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 250 try { 251 Schema schema = sf.newSchema(); 252 spf.setSchema(schema); 253 assertNotNull(spf.getSchema()); 254 } catch (SAXException sax) { 255 fail("Unexpected exception " + sax.toString()); 256 } 257 } 258 */ 259 260 // public void test_setValidatingZ() { 261 // MyHandler mh = new MyHandler(); 262 // InputStream is2 = getClass().getResourceAsStream("/recipe.xml"); 263 // try { 264 // spf.setValidating(true); 265 // assertTrue(spf.isValidating()); 266 // spf.newSAXParser().parse(is2, mh); 267 // } catch (org.xml.sax.SAXException se) { 268 // fail("SAXException was thrown during parsing"); 269 // } catch (javax.xml.parsers.ParserConfigurationException pce) { 270 // fail("ParserConfigurationException was thrown during parsing"); 271 // } catch (IOException ioe) { 272 // fail("IOException was thrown during parsing"); 273 // } finally { 274 // try { 275 // is2.close(); 276 // } catch(Exception ioee) {} 277 // } 278 // InputStream is3 = getClass().getResourceAsStream("/recipe1.xml"); 279 // try { 280 // assertTrue(spf.isValidating()); 281 // spf.newSAXParser().parse(is3, mh); 282 // } catch (org.xml.sax.SAXException se) { 283 // fail("SAXException was thrown during parsing"); 284 // } catch (javax.xml.parsers.ParserConfigurationException pce) { 285 // fail("ParserConfigurationException was thrown during parsing"); 286 // } catch (IOException ioe) { 287 // fail("IOEXception was thrown during parsing: " + ioe.getMessage()); 288 // } finally { 289 // try { 290 // is3.close(); 291 // } catch(Exception ioee) {} 292 // } 293 // is2 = getClass().getResourceAsStream("/recipe.xml"); 294 // try { 295 // spf.setValidating(false); 296 // assertFalse(spf.isValidating()); 297 // spf.newSAXParser().parse(is2, mh); 298 // } catch (org.xml.sax.SAXException se) { 299 // fail("SAXException was thrown during parsing"); 300 // } catch (javax.xml.parsers.ParserConfigurationException pce) { 301 // fail("ParserConfigurationException was thrown during parsing"); 302 // } catch (IOException ioe) { 303 // fail("IOException was thrown during parsing"); 304 // } finally { 305 // try { 306 // is2.close(); 307 // } catch(Exception ioee) {} 308 // } 309 // is3 = getClass().getResourceAsStream("/recipe1.xml"); 310 // try { 311 // assertFalse(spf.isValidating()); 312 // spf.newSAXParser().parse(is3, mh); 313 // } catch (org.xml.sax.SAXException se) { 314 // fail("SAXException was thrown during parsing"); 315 // } catch (javax.xml.parsers.ParserConfigurationException pce) { 316 // fail("ParserConfigurationException was thrown during parsing"); 317 // } catch (IOException ioe) { 318 // fail("IOEXception was thrown during parsing: " + ioe.getMessage()); 319 // } finally { 320 // try { 321 // is3.close(); 322 // } catch(Exception ioee) {} 323 // } 324 // } 325 326 // public void test_setXIncludeAwareZ() { 327 // spf.setXIncludeAware(true); 328 // MyHandler mh = new MyHandler(); 329 // InputStream is = getClass().getResourceAsStream("/simple_ns.xml"); 330 // try { 331 // spf.newSAXParser().parse(is, mh); 332 // } catch(javax.xml.parsers.ParserConfigurationException pce) { 333 // fail("ParserConfigurationException was thrown during parsing"); 334 // } catch(org.xml.sax.SAXException se) { 335 // fail("SAXException was thrown during parsing"); 336 // } catch(IOException ioe) { 337 // fail("IOException was thrown during parsing"); 338 // } finally { 339 // try { 340 // is.close(); 341 // } catch(Exception ioee) {} 342 // } 343 // spf.setXIncludeAware(false); 344 // is = getClass().getResourceAsStream("/simple_ns.xml"); 345 // try { 346 // is = getClass().getResourceAsStream("/simple_ns.xml"); 347 // spf.newSAXParser().parse(is, mh); 348 // } catch(javax.xml.parsers.ParserConfigurationException pce) { 349 // fail("ParserConfigurationException was thrown during parsing"); 350 // } catch(org.xml.sax.SAXException se) { 351 // fail("SAXException was thrown during parsing"); 352 // } catch(IOException ioe) { 353 // fail("IOException was thrown during parsing"); 354 // } finally { 355 // try { 356 // is.close(); 357 // } catch(Exception ioee) {} 358 // } 359 // is = getClass().getResourceAsStream("/simple_ns.xml"); 360 // try { 361 // spf.setXIncludeAware(true); 362 // spf.newSAXParser().parse(is, mh); 363 // } catch(javax.xml.parsers.ParserConfigurationException pce) { 364 // fail("ParserConfigurationException was thrown during parsing"); 365 // } catch(org.xml.sax.SAXException se) { 366 // fail("SAXException was thrown during parsing"); 367 // } catch(IOException ioe) { 368 // fail("IOException was thrown during parsing"); 369 // } finally { 370 // try { 371 // is.close(); 372 // } catch(Exception ioee) {} 373 // } 374 // } 375 376 static class MyHandler extends DefaultHandler { 377 378 public void startElement(String uri, String localName, String qName, 379 Attributes atts) { 380 381 el.add(qName); 382 if (!uri.equals("")) 383 ns.put(qName, uri); 384 for (int i = 0; i < atts.getLength(); i++) { 385 attr.put(atts.getQName(i), atts.getValue(i)); 386 } 387 388 } 389 } 390 391 class MySAXParserFactory extends SAXParserFactory { 392 393 public MySAXParserFactory() { 394 super(); 395 } 396 397 public SAXParser newSAXParser() { 398 return null; 399 } 400 401 public void setFeature(String name, boolean value) throws 402 ParserConfigurationException, SAXNotRecognizedException, 403 SAXNotSupportedException { 404 405 } 406 407 public boolean getFeature(String name) throws 408 ParserConfigurationException, SAXNotRecognizedException, 409 SAXNotSupportedException { 410 return true; 411 } 412 413 } 414 415 } 416