15213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson/* 25213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson * Copyright (C) 2010 The Android Open Source Project 35213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson * 45213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson * Licensed under the Apache License, Version 2.0 (the "License"); 55213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson * you may not use this file except in compliance with the License. 65213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson * You may obtain a copy of the License at 75213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson * 85213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 95213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson * 105213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson * Unless required by applicable law or agreed to in writing, software 115213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 125213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson * See the License for the specific language governing permissions and 145213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson * limitations under the License. 155213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson */ 165213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson 171c92541d38ed4d0b6e958f478cd7b129f140cd44Jesse Wilsonpackage libcore.xml; 185213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson 195213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilsonimport junit.framework.TestCase; 205213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilsonimport org.w3c.dom.Document; 215213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilsonimport org.xml.sax.InputSource; 225213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson 235213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilsonimport javax.xml.parsers.DocumentBuilder; 245213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilsonimport javax.xml.parsers.DocumentBuilderFactory; 255213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilsonimport java.io.File; 265213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilsonimport java.io.FileOutputStream; 275213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilsonimport java.io.IOException; 285213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilsonimport java.io.OutputStream; 295213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson 305213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson/** 315213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson * Test the parsing of the XML declaration, plus the additional document fields 325213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson * captured during parsing. 335213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson */ 345213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilsonpublic class DeclarationTest extends TestCase { 355213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson 365213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson private String systemIdA; 375213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson private Document documentA; 385213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson 395213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson private String systemIdB; 405213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson private Document documentB; 415213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson 425213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson @Override protected void setUp() throws Exception { 435213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 445213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson factory.setNamespaceAware(true); 455213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson DocumentBuilder builder = factory.newDocumentBuilder(); 465213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson 475213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson systemIdA = stringToSystemId( 485213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" standalone=\"no\" ?><foo />"); 495213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson InputSource inputSourceA = new InputSource(systemIdA); 505213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson inputSourceA.setEncoding("US-ASCII"); 515213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson documentA = builder.parse(inputSourceA); 525213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson 535213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson systemIdB = stringToSystemId( 545213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson "<?xml version=\"1.1\" encoding=\"US-ASCII\" standalone=\"yes\" ?><foo />"); 555213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson InputSource inputSourceB = new InputSource(systemIdB); 565213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson inputSourceB.setEncoding("ISO-8859-1"); 575213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson documentB = builder.parse(inputSourceB); 585213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson } 595213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson 605213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson private String stringToSystemId(String contents) throws IOException { 615213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson File file = File.createTempFile("temp", "xml"); 625213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson file.deleteOnExit(); 635213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson OutputStream out = new FileOutputStream(file); 645213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson out.write(contents.getBytes("UTF-8")); 655213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson out.close(); 665213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson return "file:" + file; 675213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson } 685213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson 695213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson /** 705213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson * XML parsers are advised of the document's character set via two channels: 715213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson * via the declaration and also the document's input source. To test that 725213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson * each of these winds up in the correct location in the document model, we 735213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson * supply different names for each. This is only safe because for the subset 745213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson * of characters in the document, the character sets are equivalent. 755213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson */ 765213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson public void testGetInputEncoding() throws Exception { 775213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson assertEquals("US-ASCII", documentA.getInputEncoding()); 785213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson assertEquals("ISO-8859-1", documentB.getInputEncoding()); 795213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson } 805213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson 815213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson public void testGetXmlEncoding() throws Exception { 825213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson String message = "This implementation doesn't parse the encoding from the XML declaration"; 835213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson assertEquals(message, "ISO-8859-1", documentA.getXmlEncoding()); 845213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson assertEquals(message, "US-ASCII", documentB.getXmlEncoding()); 855213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson } 865213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson 875213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson public void testGetXmlVersion() throws Exception { 885213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson String message = "This implementation doesn't parse the version from the XML declaration"; 895213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson assertEquals(message, "1.0", documentA.getXmlVersion()); 905213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson assertEquals(message, "1.1", documentB.getXmlVersion()); 915213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson } 925213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson 935213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson public void testGetXmlStandalone() throws Exception { 945213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson String message = "This implementation doesn't parse standalone from the XML declaration"; 955213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson assertEquals(message, false, documentA.getXmlStandalone()); 965213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson assertEquals(message, true, documentB.getXmlStandalone()); 975213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson } 985213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson 995213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson public void testGetDocumentUri() throws Exception { 1005213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson assertEquals(systemIdA, documentA.getDocumentURI()); 1015213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson assertEquals(systemIdB, documentB.getDocumentURI()); 1025213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson } 1035213a38431ea28c97d29e76c5b2d8e156c2d1705Jesse Wilson} 104