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