Home | History | Annotate | Download | only in parsers
      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