1b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson/* 2b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson * Copyright (C) 2010 The Android Open Source Project 3b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson * 4b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson * Licensed under the Apache License, Version 2.0 (the "License"); 5b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson * you may not use this file except in compliance with the License. 6b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson * You may obtain a copy of the License at 7b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson * 8b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 9b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson * 10b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson * Unless required by applicable law or agreed to in writing, software 11b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 12b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson * See the License for the specific language governing permissions and 14b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson * limitations under the License. 15b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson */ 16b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson 17c4145311fb4a343f59851aea9f36dcabc84ff737Jesse Wilsonpackage libcore.xml; 18b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson 19b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilsonimport java.io.ByteArrayInputStream; 20b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilsonimport java.io.StringReader; 21b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilsonimport junit.framework.TestCase; 22b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilsonimport org.xmlpull.v1.XmlPullParser; 23b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilsonimport org.xmlpull.v1.XmlPullParserException; 24b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson 25b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilsonpublic abstract class PullParserTest extends TestCase { 26b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson 27406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson public void testAttributeNoValueWithRelaxed() throws Exception { 28406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson XmlPullParser parser = newPullParser(); 29406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.setFeature("http://xmlpull.org/v1/doc/features.html#relaxed", true); 30406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.setInput(new StringReader("<input checked></input>")); 31406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 32406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("input", parser.getName()); 33406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("checked", parser.getAttributeName(0)); 34406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("checked", parser.getAttributeValue(0)); 35406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 36406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 37406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson public void testAttributeUnquotedValueWithRelaxed() throws Exception { 38406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson XmlPullParser parser = newPullParser(); 39406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.setFeature("http://xmlpull.org/v1/doc/features.html#relaxed", true); 40406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.setInput(new StringReader("<input checked=true></input>")); 41406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 42406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("input", parser.getName()); 43406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("checked", parser.getAttributeName(0)); 44406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("true", parser.getAttributeValue(0)); 45406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 46406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 47406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson public void testUnterminatedEntityWithRelaxed() throws Exception { 48406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson XmlPullParser parser = newPullParser(); 49406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.setFeature("http://xmlpull.org/v1/doc/features.html#relaxed", true); 50406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.setInput(new StringReader("<foo bar='A&W'>mac&cheese</foo>")); 51406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 52406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("foo", parser.getName()); 53406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("bar", parser.getAttributeName(0)); 54406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("A&W", parser.getAttributeValue(0)); 55406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.TEXT, parser.next()); 56406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("mac&cheese", parser.getText()); 57406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 58406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 59406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson public void testEntitiesAndNamespaces() throws Exception { 60406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson XmlPullParser parser = newPullParser(); 61406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.setFeature("http://xmlpull.org/v1/doc/features.html#process-namespaces", true); 62406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.setInput(new StringReader( 63406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson "<foo:a xmlns:foo='http://foo' xmlns:bar='http://bar'><bar:b/></foo:a>")); 64406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson testNamespace(parser); 65406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 66406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 67406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson public void testEntitiesAndNamespacesWithRelaxed() throws Exception { 68406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson XmlPullParser parser = newPullParser(); 69406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.setFeature("http://xmlpull.org/v1/doc/features.html#process-namespaces", true); 70406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.setFeature("http://xmlpull.org/v1/doc/features.html#relaxed", true); 71406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.setInput(new StringReader( 72406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson "<foo:a xmlns:foo='http://foo' xmlns:bar='http://bar'><bar:b/></foo:a>")); 73bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson testNamespace(parser); 74406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 75406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 76995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson private void testNamespace(XmlPullParser parser) throws Exception { 77406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 78406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("http://foo", parser.getNamespace()); 79406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("a", parser.getName()); 80406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 81406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("http://bar", parser.getNamespace()); 82406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("b", parser.getName()); 83406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.END_TAG, parser.next()); 84406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("http://bar", parser.getNamespace()); 85406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("b", parser.getName()); 86406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.END_TAG, parser.next()); 87406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("http://foo", parser.getNamespace()); 88406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("a", parser.getName()); 89406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 90406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 913b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson public void testRegularNumericEntities() throws Exception { 923b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson XmlPullParser parser = newPullParser(); 933b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson parser.setInput(new StringReader("<foo>A</foo>")); 943b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 953b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson assertEquals(XmlPullParser.ENTITY_REF, parser.nextToken()); 963b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson assertEquals("#65", parser.getName()); 973b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson assertEquals("A", parser.getText()); 983b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson } 993b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson 100e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson public void testNumericEntitiesLargerThanChar() throws Exception { 101995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson assertParseFailure("<foo>� &#-2147483648;</foo>"); 102406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 103406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 104e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson public void testNumericEntitiesLargerThanInt() throws Exception { 105995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson assertParseFailure("<foo>�</foo>"); 106406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 107406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 108e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson public void testCharacterReferenceOfHexUtf16Surrogates() throws Exception { 109e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson testCharacterReferenceOfUtf16Surrogates("<foo>𐀀 𐎁 􏿰</foo>"); 110e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson } 111e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson 112e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson public void testCharacterReferenceOfDecimalUtf16Surrogates() throws Exception { 113e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson testCharacterReferenceOfUtf16Surrogates("<foo>𐀀 𐎁 􏿰</foo>"); 114e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson } 115e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson 116e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson private void testCharacterReferenceOfUtf16Surrogates(String xml) throws Exception { 117e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson XmlPullParser parser = newPullParser(); 118e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson parser.setInput(new StringReader(xml)); 119e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 120e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson assertEquals(XmlPullParser.TEXT, parser.next()); 121995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson assertEquals(new String(new int[]{65536, ' ', 66433, ' ', 1114096}, 0, 5), 122e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson parser.getText()); 123e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson assertEquals(XmlPullParser.END_TAG, parser.next()); 124e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson } 125e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson 126e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson public void testCharacterReferenceOfLastUtf16Surrogate() throws Exception { 127e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson XmlPullParser parser = newPullParser(); 128e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson parser.setInput(new StringReader("<foo></foo>")); 129e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 130e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson assertEquals(XmlPullParser.TEXT, parser.next()); 131995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson assertEquals(new String(new int[]{0x10FFFF}, 0, 1), parser.getText()); 132e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson assertEquals(XmlPullParser.END_TAG, parser.next()); 133e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson } 134e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson 1353b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson public void testOmittedNumericEntities() throws Exception { 136995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson assertParseFailure("<foo>&#;</foo>"); 137406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 138406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 139406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson /** 140406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson * Carriage returns followed by line feeds are silently discarded. 141406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson */ 142406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson public void testCarriageReturnLineFeed() throws Exception { 143406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson testLineEndings("\r\n<foo\r\na='b\r\nc'\r\n>d\r\ne</foo\r\n>\r\n"); 144406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 145406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 146406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson /** 147406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson * Lone carriage returns are treated like newlines. 148406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson */ 149406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson public void testLoneCarriageReturn() throws Exception { 150406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson testLineEndings("\r<foo\ra='b\rc'\r>d\re</foo\r>\r"); 151406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 152406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 153406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson public void testLoneNewLine() throws Exception { 154406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson testLineEndings("\n<foo\na='b\nc'\n>d\ne</foo\n>\n"); 155406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 156406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 157995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson private void testLineEndings(String xml) throws Exception { 158406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson XmlPullParser parser = newPullParser(); 159406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.setInput(new StringReader(xml)); 160406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 161406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("foo", parser.getName()); 162406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("b c", parser.getAttributeValue(0)); 163406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.TEXT, parser.next()); 164406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("d\ne", parser.getText()); 165406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.END_TAG, parser.next()); 166406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("foo", parser.getName()); 167406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.END_DOCUMENT, parser.next()); 168406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 169406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 170406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson public void testXmlDeclaration() throws Exception { 171406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson XmlPullParser parser = newPullParser(); 172406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.setInput(new StringReader( 173406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson "<?xml version='1.0' encoding='UTF-8' standalone='no'?><foo/>")); 174406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.START_TAG, parser.nextToken()); 175406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("1.0", parser.getProperty( 176406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson "http://xmlpull.org/v1/doc/properties.html#xmldecl-version")); 177406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(Boolean.FALSE, parser.getProperty( 178406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson "http://xmlpull.org/v1/doc/properties.html#xmldecl-standalone")); 179406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("UTF-8", parser.getInputEncoding()); 180406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 181406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 182406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson public void testXmlDeclarationExtraAttributes() throws Exception { 183995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson assertParseFailure("<?xml version='1.0' encoding='UTF-8' standalone='no' a='b'?><foo/>"); 184b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson } 185b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson 186406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson public void testCustomEntitiesUsingNext() throws Exception { 187406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson XmlPullParser parser = newPullParser(); 188406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.setInput(new StringReader( 189406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson "<foo a='cd&aaaaaaaaaa;ef'>wx&aaaaaaaaaa;yz</foo>")); 190406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.defineEntityReplacementText("aaaaaaaaaa", "b"); 191406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 192406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("cdbef", parser.getAttributeValue(0)); 193406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.TEXT, parser.next()); 194406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("wxbyz", parser.getText()); 195406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 196406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 197406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson public void testCustomEntitiesUsingNextToken() throws Exception { 198406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson XmlPullParser parser = newPullParser(); 199406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.setInput(new StringReader( 200406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson "<foo a='cd&aaaaaaaaaa;ef'>wx&aaaaaaaaaa;yz</foo>")); 201406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.defineEntityReplacementText("aaaaaaaaaa", "b"); 202406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.START_TAG, parser.nextToken()); 203406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("cdbef", parser.getAttributeValue(0)); 204406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.TEXT, parser.nextToken()); 205406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("wx", parser.getText()); 206406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.ENTITY_REF, parser.nextToken()); 207406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("aaaaaaaaaa", parser.getName()); 208406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("b", parser.getText()); 209406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.TEXT, parser.nextToken()); 210406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("yz", parser.getText()); 211406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 212406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 21376c85883787791ba605a51d7bea3cfc27b5c5d95Jesse Wilson public void testCustomEntitiesAreNotEvaluated() throws Exception { 21476c85883787791ba605a51d7bea3cfc27b5c5d95Jesse Wilson XmlPullParser parser = newPullParser(); 21576c85883787791ba605a51d7bea3cfc27b5c5d95Jesse Wilson parser.setInput(new StringReader( 21676c85883787791ba605a51d7bea3cfc27b5c5d95Jesse Wilson "<foo a='&a;'>&a;</foo>")); 21776c85883787791ba605a51d7bea3cfc27b5c5d95Jesse Wilson parser.defineEntityReplacementText("a", "& &a;"); 21876c85883787791ba605a51d7bea3cfc27b5c5d95Jesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 21976c85883787791ba605a51d7bea3cfc27b5c5d95Jesse Wilson assertEquals("& &a;", parser.getAttributeValue(0)); 22076c85883787791ba605a51d7bea3cfc27b5c5d95Jesse Wilson assertEquals(XmlPullParser.TEXT, parser.next()); 22176c85883787791ba605a51d7bea3cfc27b5c5d95Jesse Wilson assertEquals("& &a;", parser.getText()); 22276c85883787791ba605a51d7bea3cfc27b5c5d95Jesse Wilson } 22376c85883787791ba605a51d7bea3cfc27b5c5d95Jesse Wilson 2243b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson public void testMissingEntities() throws Exception { 225995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson assertParseFailure("<foo>&aaa;</foo>"); 2263b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson } 2273b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson 2283b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson public void testMissingEntitiesWithRelaxed() throws Exception { 2293b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson XmlPullParser parser = newPullParser(); 2303b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson parser.setFeature("http://xmlpull.org/v1/doc/features.html#relaxed", true); 2313b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson parser.setInput(new StringReader("<foo>&aaa;</foo>")); 2323b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 2333b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson assertEquals(XmlPullParser.TEXT, parser.next()); 2343b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson assertEquals(null, parser.getName()); 235086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson assertEquals("Expected unresolved entities to be left in-place. The old parser " 236086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson + "would resolve these to the empty string.", "&aaa;", parser.getText()); 2373b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson assertEquals(XmlPullParser.END_TAG, parser.next()); 2383b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson } 2393b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson 2403b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson public void testMissingEntitiesUsingNextToken() throws Exception { 2413b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson XmlPullParser parser = newPullParser(); 2423b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson testMissingEntitiesUsingNextToken(parser); 2433b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson } 2443b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson 2453b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson public void testMissingEntitiesUsingNextTokenWithRelaxed() throws Exception { 2463b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson XmlPullParser parser = newPullParser(); 2473b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson parser.setFeature("http://xmlpull.org/v1/doc/features.html#relaxed", true); 2483b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson testMissingEntitiesUsingNextToken(parser); 2493b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson } 2503b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson 251995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson private void testMissingEntitiesUsingNextToken(XmlPullParser parser) throws Exception { 2523b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson parser.setInput(new StringReader("<foo>&aaa;</foo>")); 2533b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson assertEquals(XmlPullParser.START_TAG, parser.nextToken()); 2543b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson assertEquals(XmlPullParser.ENTITY_REF, parser.nextToken()); 2553b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson assertEquals("aaa", parser.getName()); 2563b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson assertEquals(null, parser.getText()); 2573b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson assertEquals(XmlPullParser.END_TAG, parser.next()); 2583b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson } 2593b8cee4de39f9ff8199b4c1fd46cc8037fa45d15Jesse Wilson 260086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson public void testEntityInAttributeUsingNextToken() throws Exception { 261bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson XmlPullParser parser = newPullParser(); 262bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson parser.setInput(new StringReader("<foo bar=\"&\"></foo>")); 263bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson assertEquals(XmlPullParser.START_TAG, parser.nextToken()); 264bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson assertEquals("foo", parser.getName()); 265bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson assertEquals("&", parser.getAttributeValue(null, "bar")); 266bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson } 267bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson 268086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson public void testMissingEntitiesInAttributesUsingNext() throws Exception { 269995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson assertParseFailure("<foo b='&aaa;'></foo>"); 270086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson } 271086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson 272086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson public void testMissingEntitiesInAttributesUsingNextWithRelaxed() throws Exception { 273086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson XmlPullParser parser = newPullParser(); 274086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson parser.setInput(new StringReader("<foo b='&aaa;'></foo>")); 275086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson parser.setFeature("http://xmlpull.org/v1/doc/features.html#relaxed", true); 276086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson assertEquals(XmlPullParser.START_TAG, parser.nextToken()); 277086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson assertEquals(1, parser.getAttributeCount()); 278086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson assertEquals("b", parser.getAttributeName(0)); 279086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson assertEquals("Expected unresolved entities to be left in-place. The old parser " 280086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson + "would resolve these to the empty string.", "&aaa;", parser.getAttributeValue(0)); 281086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson } 282086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson 283086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson public void testMissingEntitiesInAttributesUsingNextToken() throws Exception { 284086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson XmlPullParser parser = newPullParser(); 285086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson parser.setInput(new StringReader("<foo b='&aaa;'></foo>")); 286086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson testMissingEntitiesInAttributesUsingNextToken(parser); 287086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson } 288086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson 289086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson public void testMissingEntitiesInAttributesUsingNextTokenWithRelaxed() throws Exception { 290086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson XmlPullParser parser = newPullParser(); 291086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson parser.setInput(new StringReader("<foo b='&aaa;'></foo>")); 292086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson parser.setFeature("http://xmlpull.org/v1/doc/features.html#relaxed", true); 293086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson testMissingEntitiesInAttributesUsingNextToken(parser); 294086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson } 295086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson 296086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson private void testMissingEntitiesInAttributesUsingNextToken(XmlPullParser parser) 297995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson throws Exception { 298086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson assertEquals(XmlPullParser.START_TAG, parser.nextToken()); 299086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson assertEquals(1, parser.getAttributeCount()); 300086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson assertEquals("b", parser.getAttributeName(0)); 301086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson assertEquals("Expected unresolved entities to be left in-place. The old parser " 302086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson + "would resolve these to the empty string.", "&aaa;", parser.getAttributeValue(0)); 303086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson } 304086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson 305406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson public void testGreaterThanInText() throws Exception { 306406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson XmlPullParser parser = newPullParser(); 307406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.setInput(new StringReader("<foo>></foo>")); 308406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 309406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.TEXT, parser.next()); 310e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson assertEquals(">", parser.getText()); 311406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 312406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 313406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson public void testGreaterThanInAttribute() throws Exception{ 314406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson XmlPullParser parser = newPullParser(); 315406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.setInput(new StringReader("<foo a='>'></foo>")); 316406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 317e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson assertEquals(">", parser.getAttributeValue(0)); 318406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 319406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 320406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson public void testLessThanInText() throws Exception{ 321995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson assertParseFailure("<foo><</foo>"); 322406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 323406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 324406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson public void testLessThanInAttribute() throws Exception{ 325995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson assertParseFailure("<foo a='<'></foo>"); 326406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 327406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 328406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson public void testQuotesInAttribute() throws Exception{ 329406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson XmlPullParser parser = newPullParser(); 330406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.setInput(new StringReader("<foo a='\"' b=\"'\"></foo>")); 331406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 332406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("\"", parser.getAttributeValue(0)); 333406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("'", parser.getAttributeValue(1)); 334406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 335406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 336406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson public void testQuotesInText() throws Exception{ 337406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson XmlPullParser parser = newPullParser(); 338406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.setInput(new StringReader("<foo>\" '</foo>")); 339406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 340406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.TEXT, parser.next()); 341406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("\" '", parser.getText()); 342406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 343406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 344406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson public void testCdataDelimiterInAttribute() throws Exception{ 345406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson XmlPullParser parser = newPullParser(); 346406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.setInput(new StringReader("<foo a=']]>'></foo>")); 347406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 348406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("]]>", parser.getAttributeValue(0)); 349406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 350406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 351406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson public void testCdataDelimiterInText() throws Exception{ 352995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson assertParseFailure("<foo>]]></foo>"); 353fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson } 354fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson 355fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson public void testUnexpectedEof() throws Exception { 356995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson assertParseFailure("<foo><![C"); 357fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson } 358fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson 359fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson public void testUnexpectedSequence() throws Exception { 360995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson assertParseFailure("<foo><![Cdata[bar]]></foo>"); 361fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson } 362fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson 363fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson public void testThreeDashCommentDelimiter() throws Exception { 364995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson assertParseFailure("<foo><!--a---></foo>"); 365fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson } 366fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson 367fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson public void testTwoDashesInComment() throws Exception { 368995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson assertParseFailure("<foo><!-- -- --></foo>"); 369fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson } 370fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson 371fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson public void testEmptyComment() throws Exception { 372fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson XmlPullParser parser = newPullParser(); 373fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson parser.setInput(new StringReader("<foo><!----></foo>")); 374fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 375fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson assertEquals(XmlPullParser.COMMENT, parser.nextToken()); 376fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson assertEquals("", parser.getText()); 377406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 378406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 379406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson /** 380406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson * Close braces require lookaheads because we need to defend against "]]>". 381406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson */ 382406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson public void testManyCloseBraces() throws Exception{ 383406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson XmlPullParser parser = newPullParser(); 384406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.setInput(new StringReader("<foo>]]]]]]]]]]]]]]]]]]]]]]]</foo>")); 385406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 386406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.TEXT, parser.next()); 387406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("]]]]]]]]]]]]]]]]]]]]]]]", parser.getText()); 388406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 389406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 390086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson public void testCommentUsingNext() throws Exception { 391406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson XmlPullParser parser = newPullParser(); 392406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.setInput(new StringReader("<foo>ab<!-- comment! -->cd</foo>")); 393406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 394406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.TEXT, parser.next()); 395406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("abcd", parser.getText()); 396406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 397406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 398086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson public void testCommentUsingNextToken() throws Exception { 399406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson XmlPullParser parser = newPullParser(); 400406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.setInput(new StringReader("<foo>ab<!-- comment! -->cd</foo>")); 401406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 402406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.TEXT, parser.nextToken()); 403406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("ab", parser.getText()); 404406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.COMMENT, parser.nextToken()); 405406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(" comment! ", parser.getText()); 406406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.TEXT, parser.nextToken()); 407406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("cd", parser.getText()); 408406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 409406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 410086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson public void testCdataUsingNext() throws Exception { 411406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson XmlPullParser parser = newPullParser(); 412406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.setInput(new StringReader("<foo>ab<![CDATA[cdef]]gh&i]]>jk</foo>")); 413406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 414406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.TEXT, parser.next()); 415406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("abcdef]]gh&ijk", parser.getText()); 416e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson assertEquals(XmlPullParser.END_TAG, parser.next()); 417406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 418406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 419086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson public void testCdataUsingNextToken() throws Exception { 420406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson XmlPullParser parser = newPullParser(); 421406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.setInput(new StringReader("<foo>ab<![CDATA[cdef]]gh&i]]>jk</foo>")); 422406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 423406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.TEXT, parser.nextToken()); 424406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("ab", parser.getText()); 425406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.CDSECT, parser.nextToken()); 426406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("cdef]]gh&i", parser.getText()); 427406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.TEXT, parser.nextToken()); 428406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("jk", parser.getText()); 429406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.END_TAG, parser.nextToken()); 430406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 431406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 432406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson public void testEntityLooksLikeCdataClose() throws Exception { 433406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson XmlPullParser parser = newPullParser(); 434406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.setInput(new StringReader("<foo>]]></foo>")); 435406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 436406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.TEXT, parser.next()); 437406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("]]>", parser.getText()); 438406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 439406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 440086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson public void testProcessingInstructionUsingNext() throws Exception { 441406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson XmlPullParser parser = newPullParser(); 442406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.setInput(new StringReader("<foo>ab<?cd efg hij?>kl</foo>")); 443406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 444406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.TEXT, parser.next()); 445406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("abkl", parser.getText()); 446406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.END_TAG, parser.next()); 447406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 448406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 449086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson public void testProcessingInstructionUsingNextToken() throws Exception { 450406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson XmlPullParser parser = newPullParser(); 451406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.setInput(new StringReader("<foo>ab<?cd efg hij?>kl</foo>")); 452406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.START_TAG, parser.nextToken()); 453406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.TEXT, parser.nextToken()); 454406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("ab", parser.getText()); 455406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.PROCESSING_INSTRUCTION, parser.nextToken()); 456406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("cd efg hij", parser.getText()); 457406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.TEXT, parser.nextToken()); 458406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals("kl", parser.getText()); 459406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson assertEquals(XmlPullParser.END_TAG, parser.next()); 460406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 461406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 462086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson public void testWhitespaceUsingNextToken() throws Exception { 463bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson XmlPullParser parser = newPullParser(); 464bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson parser.setInput(new StringReader(" \n <foo> \n </foo> \n ")); 465bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson assertEquals(XmlPullParser.IGNORABLE_WHITESPACE, parser.nextToken()); 466bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson assertEquals(true, parser.isWhitespace()); 467bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson assertEquals(" \n ", parser.getText()); 468bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson assertEquals(XmlPullParser.START_TAG, parser.nextToken()); 469bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson assertEquals(XmlPullParser.TEXT, parser.nextToken()); 470bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson assertEquals(true, parser.isWhitespace()); 471bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson assertEquals(" \n ", parser.getText()); 472bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson assertEquals(XmlPullParser.END_TAG, parser.nextToken()); 473bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson assertEquals(XmlPullParser.IGNORABLE_WHITESPACE, parser.nextToken()); 474bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson assertEquals(true, parser.isWhitespace()); 475bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson assertEquals(" \n ", parser.getText()); 476bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson assertEquals(XmlPullParser.END_DOCUMENT, parser.nextToken()); 477bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson } 478bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson 479fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson public void testLinesAndColumns() throws Exception { 480fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson XmlPullParser parser = newPullParser(); 481fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson parser.setInput(new StringReader("\n" 482fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson + " <foo><bar a='\n" 483fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson + "' b='cde'></bar\n" 484fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson + "><!--\n" 485fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson + "\n" 486fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson + "--><baz/>fg\n" 487fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson + "</foo>")); 488fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson assertEquals("1,1", parser.getLineNumber() + "," + parser.getColumnNumber()); 489fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson assertEquals(XmlPullParser.IGNORABLE_WHITESPACE, parser.nextToken()); 490fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson assertEquals("2,3", parser.getLineNumber() + "," + parser.getColumnNumber()); 491fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson assertEquals(XmlPullParser.START_TAG, parser.nextToken()); 492fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson assertEquals("2,8", parser.getLineNumber() + "," + parser.getColumnNumber()); 493fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson assertEquals(XmlPullParser.START_TAG, parser.nextToken()); 494fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson assertEquals("3,11", parser.getLineNumber() + "," + parser.getColumnNumber()); 495fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson assertEquals(XmlPullParser.END_TAG, parser.nextToken()); 496fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson assertEquals("4,2", parser.getLineNumber() + "," + parser.getColumnNumber()); 497fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson assertEquals(XmlPullParser.COMMENT, parser.nextToken()); 498fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson assertEquals("6,4", parser.getLineNumber() + "," + parser.getColumnNumber()); 499fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson assertEquals(XmlPullParser.START_TAG, parser.nextToken()); 500fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson assertEquals("6,10", parser.getLineNumber() + "," + parser.getColumnNumber()); 501fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson assertEquals(XmlPullParser.END_TAG, parser.nextToken()); 502fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson assertEquals("6,10", parser.getLineNumber() + "," + parser.getColumnNumber()); 503fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson assertEquals(XmlPullParser.TEXT, parser.nextToken()); 504fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson assertEquals("7,1", parser.getLineNumber() + "," + parser.getColumnNumber()); 505fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson assertEquals(XmlPullParser.END_TAG, parser.nextToken()); 506fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson assertEquals("7,7", parser.getLineNumber() + "," + parser.getColumnNumber()); 507fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson assertEquals(XmlPullParser.END_DOCUMENT, parser.nextToken()); 508fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson assertEquals("7,7", parser.getLineNumber() + "," + parser.getColumnNumber()); 509fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson } 510fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson 511086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson public void testEmptyEntityReferenceUsingNext() throws Exception { 512bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson XmlPullParser parser = newPullParser(); 513bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson parser.setInput(new StringReader("<foo>∅</foo>")); 514bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson parser.defineEntityReplacementText("empty", ""); 515bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 516bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson assertEquals(XmlPullParser.END_TAG, parser.next()); 517bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson } 518bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson 519086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson public void testEmptyEntityReferenceUsingNextToken() throws Exception { 520bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson XmlPullParser parser = newPullParser(); 521bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson parser.setInput(new StringReader("<foo>∅</foo>")); 522bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson parser.defineEntityReplacementText("empty", ""); 523bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson assertEquals(XmlPullParser.START_TAG, parser.nextToken()); 524bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson assertEquals(XmlPullParser.ENTITY_REF, parser.nextToken()); 525bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson assertEquals("empty", parser.getName()); 526bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson assertEquals("", parser.getText()); 527bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson assertEquals(XmlPullParser.END_TAG, parser.nextToken()); 528bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson } 529bbf35ecae9bb5b69fb0d016a57a666d0a9e0f2fcJesse Wilson 530086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson public void testEmptyCdataUsingNext() throws Exception { 531fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson XmlPullParser parser = newPullParser(); 532fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson parser.setInput(new StringReader("<foo><![CDATA[]]></foo>")); 533fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 534e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson assertEquals(XmlPullParser.END_TAG, parser.next()); 535e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson } 536e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson 537086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson public void testEmptyCdataUsingNextToken() throws Exception { 538e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson XmlPullParser parser = newPullParser(); 539e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson parser.setInput(new StringReader("<foo><![CDATA[]]></foo>")); 540e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 541e18eccdf4719fef764651d2560264fe2d17a7493Jesse Wilson assertEquals(XmlPullParser.CDSECT, parser.nextToken()); 542fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson assertEquals("", parser.getText()); 543fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson assertEquals(XmlPullParser.END_TAG, parser.next()); 544fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson } 545fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson 546406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson public void testParseReader() throws Exception { 547406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson String snippet = "<dagny dad=\"bob\">hello</dagny>"; 548406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson XmlPullParser parser = newPullParser(); 549406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); 550406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.setInput(new StringReader(snippet)); 551406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson validate(parser); 552406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 553406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 554406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson public void testParseInputStream() throws Exception { 555406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson String snippet = "<dagny dad=\"bob\">hello</dagny>"; 556406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson XmlPullParser parser = newPullParser(); 557406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); 558406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.setInput(new ByteArrayInputStream(snippet.getBytes()), "UTF-8"); 559406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson validate(parser); 560406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson } 561406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson 562995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson static void validate(XmlPullParser parser) throws Exception { 563b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals(XmlPullParser.START_DOCUMENT, parser.getEventType()); 564b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals(0, parser.getDepth()); 565b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 566b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals(1, parser.getDepth()); 567b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals("dagny", parser.getName()); 568b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals(1, parser.getAttributeCount()); 569b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals("dad", parser.getAttributeName(0)); 570b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals("bob", parser.getAttributeValue(0)); 571b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals("bob", parser.getAttributeValue(null, "dad")); 572b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals(XmlPullParser.TEXT, parser.next()); 573b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals(1, parser.getDepth()); 574b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals("hello", parser.getText()); 575b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals(XmlPullParser.END_TAG, parser.next()); 576b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals(1, parser.getDepth()); 577b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals("dagny", parser.getName()); 578b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals(XmlPullParser.END_DOCUMENT, parser.next()); 579b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals(0, parser.getDepth()); 580b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson } 581b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson 58238e84b835c2101206d846f7ab6fc444914661753Jesse Wilson public void testNextAfterEndDocument() throws Exception { 58338e84b835c2101206d846f7ab6fc444914661753Jesse Wilson XmlPullParser parser = newPullParser(); 58438e84b835c2101206d846f7ab6fc444914661753Jesse Wilson parser.setInput(new StringReader("<foo></foo>")); 58538e84b835c2101206d846f7ab6fc444914661753Jesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 58638e84b835c2101206d846f7ab6fc444914661753Jesse Wilson assertEquals(XmlPullParser.END_TAG, parser.next()); 58738e84b835c2101206d846f7ab6fc444914661753Jesse Wilson assertEquals(XmlPullParser.END_DOCUMENT, parser.next()); 58838e84b835c2101206d846f7ab6fc444914661753Jesse Wilson assertEquals(XmlPullParser.END_DOCUMENT, parser.next()); 58938e84b835c2101206d846f7ab6fc444914661753Jesse Wilson } 59038e84b835c2101206d846f7ab6fc444914661753Jesse Wilson 591406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson public void testNamespaces() throws Exception { 592406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson String xml = "<one xmlns='ns:default' xmlns:n1='ns:1' a='b'>\n" 593406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson + " <n1:two c='d' n1:e='f' xmlns:n2='ns:2'>text</n1:two>\n" 594406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson + "</one>"; 595b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson 596b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson XmlPullParser parser = newPullParser(); 597b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true); 598406cbf66d790024777ac5bc1eeafc59ba4b0c59bJesse Wilson parser.setInput(new StringReader(xml)); 599b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson 600b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals(0, parser.getDepth()); 601b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals(0, parser.getNamespaceCount(0)); 602b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson 603b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson try { 604b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson parser.getNamespaceCount(1); 605b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson fail(); 606b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson } catch (IndexOutOfBoundsException e) { /* expected */ } 607b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson 608b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson // one 609b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 610b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals(1, parser.getDepth()); 611b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson 612b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson checkNamespacesInOne(parser); 613b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson 614b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson // n1:two 615b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals(XmlPullParser.START_TAG, parser.nextTag()); 616b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson 617b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals(2, parser.getDepth()); 618b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson checkNamespacesInTwo(parser); 619b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson 620b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson // Body of two. 621b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals(XmlPullParser.TEXT, parser.next()); 622b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson 623b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson // End of two. 624b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals(XmlPullParser.END_TAG, parser.nextTag()); 625b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson 626b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson // Depth should still be 2. 627b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals(2, parser.getDepth()); 628b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson 629b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson // We should still be able to see the namespaces from two. 630b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson checkNamespacesInTwo(parser); 631b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson 632b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson // End of one. 633b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals(XmlPullParser.END_TAG, parser.nextTag()); 634b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson 635b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson // Depth should be back to 1. 636b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals(1, parser.getDepth()); 637b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson 638b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson // We can still see the namespaces in one. 639b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson checkNamespacesInOne(parser); 640b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson 641b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson // We shouldn't be able to see the namespaces in two anymore. 642b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson try { 643b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson parser.getNamespaceCount(2); 644b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson fail(); 645b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson } catch (IndexOutOfBoundsException e) { /* expected */ } 646b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson 647b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals(XmlPullParser.END_DOCUMENT, parser.next()); 648b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson 649b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson // We shouldn't be able to see the namespaces in one anymore. 650b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson try { 651b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson parser.getNamespaceCount(1); 652b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson fail(); 653b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson } catch (IndexOutOfBoundsException e) { /* expected */ } 654b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson 655b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals(0, parser.getNamespaceCount(0)); 656b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson } 657b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson 658b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson private void checkNamespacesInOne(XmlPullParser parser) throws XmlPullParserException { 659b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals(2, parser.getNamespaceCount(1)); 660b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson 661b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson // Prefix for default namespace is null. 662b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertNull(parser.getNamespacePrefix(0)); 663b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals("ns:default", parser.getNamespaceUri(0)); 664b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson 665b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals("n1", parser.getNamespacePrefix(1)); 666b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals("ns:1", parser.getNamespaceUri(1)); 667b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson 668b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals("ns:default", parser.getNamespace(null)); 669b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson 670b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson // KXML returns null. 671b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson // assertEquals("ns:default", parser.getNamespace("")); 672b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson } 673b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson 674b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson private void checkNamespacesInTwo(XmlPullParser parser) throws XmlPullParserException { 675b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson // These should still be valid. 676b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson checkNamespacesInOne(parser); 677b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson 678b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals(3, parser.getNamespaceCount(2)); 679b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson 680b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson // Default ns should still be in the stack 681b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertNull(parser.getNamespacePrefix(0)); 682b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson assertEquals("ns:default", parser.getNamespaceUri(0)); 683b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson } 684b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson 685995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson public void testTextBeforeDocumentElement() throws Exception { 686995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson assertParseFailure("not xml<foo/>"); 687995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson } 688995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson 689995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson public void testTextAfterDocumentElement() throws Exception { 690995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson assertParseFailure("<foo/>not xml"); 691995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson } 692995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson 693995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson public void testTextNoDocumentElement() throws Exception { 694995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson assertParseFailure("not xml"); 695995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson } 696995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson 6976ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson public void testBomAndByteInput() throws Exception { 6986ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson byte[] xml = "\ufeff<?xml version='1.0'?><input/>".getBytes("UTF-8"); 6996ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson XmlPullParser parser = newPullParser(); 7006ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson parser.setInput(new ByteArrayInputStream(xml), null); 7016ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 7026ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson assertEquals("input", parser.getName()); 7036ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson assertEquals(XmlPullParser.END_TAG, parser.next()); 7046ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson assertEquals("input", parser.getName()); 7056ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson assertEquals(XmlPullParser.END_DOCUMENT, parser.next()); 7066ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson } 7076ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson 7086ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson public void testBomAndByteInputWithExplicitCharset() throws Exception { 7096ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson byte[] xml = "\ufeff<?xml version='1.0'?><input/>".getBytes("UTF-8"); 7106ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson XmlPullParser parser = newPullParser(); 7116ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson parser.setInput(new ByteArrayInputStream(xml), "UTF-8"); 7126ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 7136ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson assertEquals("input", parser.getName()); 7146ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson assertEquals(XmlPullParser.END_TAG, parser.next()); 7156ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson assertEquals("input", parser.getName()); 7166ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson assertEquals(XmlPullParser.END_DOCUMENT, parser.next()); 7176ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson } 7186ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson 7196ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson public void testBomAndCharacterInput() throws Exception { 7206ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson assertParseFailure("\ufeff<?xml version='1.0'?><input/>"); 7216ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson } 7226ce8e6ee5da964f724d39655fba0e432cff4c3a6Jesse Wilson 72348d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson // http://code.google.com/p/android/issues/detail?id=21425 72448d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson public void testNextTextAdvancesToEndTag() throws Exception { 72548d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson XmlPullParser parser = newPullParser(); 72648d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson parser.setInput(new StringReader("<foo>bar</foo>")); 72748d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson assertEquals(XmlPullParser.START_TAG, parser.next()); 72848d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson assertEquals("bar", parser.nextText()); 72948d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson assertEquals(XmlPullParser.END_TAG, parser.getEventType()); 73048d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson } 73148d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson 73248d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson public void testNextTag() throws Exception { 73348d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson XmlPullParser parser = newPullParser(); 73448d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson parser.setInput(new StringReader("<foo> <bar></bar> </foo>")); 73548d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson assertEquals(XmlPullParser.START_TAG, parser.nextTag()); 73648d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson assertEquals("foo", parser.getName()); 73748d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson assertEquals(XmlPullParser.START_TAG, parser.nextTag()); 73848d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson assertEquals("bar", parser.getName()); 73948d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson assertEquals(XmlPullParser.END_TAG, parser.nextTag()); 74048d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson assertEquals("bar", parser.getName()); 74148d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson assertEquals(XmlPullParser.END_TAG, parser.nextTag()); 74248d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson assertEquals("foo", parser.getName()); 74348d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson } 74448d7dbad8dd83395667d9846e49c5ba38f0a5258Jesse Wilson 7459349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko public void testEofInElementSpecRelaxed() throws Exception { 7469349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko assertRelaxedParseFailure("<!DOCTYPE foo [<!ELEMENT foo (unterminated"); 7479349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko } 7489349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko 7499349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko public void testEofInAttributeValue() throws Exception { 7509349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko assertParseFailure("<!DOCTYPE foo [<!ATTLIST foo x y \"unterminated"); 7519349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko } 7529349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko 7539349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko public void testEofInEntityValue() throws Exception { 7549349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko assertParseFailure("<!DOCTYPE foo [<!ENTITY aaa \"unterminated"); 7559349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko } 7569349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko 7579349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko public void testEofInStartTagAttributeValue() throws Exception { 7589349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko assertParseFailure("<long foo=\"unterminated"); 7599349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko } 7609349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko 7619349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko public void testEofInReadCharRelaxed() throws Exception { 7629349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko assertRelaxedParseFailure("<!DOCTYPE foo [<!ELEMENT foo ()"); // EOF in read('>') 7639349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko } 7649349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko 7659349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko public void testEofAfterReadCharArrayRelaxed() throws Exception { 7669349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko assertRelaxedParseFailure("<!DOCTYPE foo [<!ELEMENT foo EMPTY"); // EOF in read('>') 7679349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko } 7689349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko 769995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson private void assertParseFailure(String xml) throws Exception { 770995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson XmlPullParser parser = newPullParser(); 7719349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko assertParseFailure(xml, parser); 7729349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko } 7739349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko 7749349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko private void assertRelaxedParseFailure(String xml) throws Exception { 7759349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko XmlPullParser parser = newPullParser(); 7769349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko parser.setFeature("http://xmlpull.org/v1/doc/features.html#relaxed", true); 7779349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko assertParseFailure(xml, parser); 7789349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko } 7799349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko 7809349ec01a1bebc3b704b400fb00ccfb42e047a02Vladimir Marko private void assertParseFailure(String xml, XmlPullParser parser) throws Exception { 781995a384234fd0ba9233ebcce380628bbe346b911Jesse Wilson parser.setInput(new StringReader(xml)); 782fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson try { 783773533775fab54079cebc329d54f6286f5ac16f2Jesse Wilson while (parser.next() != XmlPullParser.END_DOCUMENT) { 784773533775fab54079cebc329d54f6286f5ac16f2Jesse Wilson } 785fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson fail(); 786fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson } catch (XmlPullParserException expected) { 787fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson } 788fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson } 789fda724de28fe86804e6ef6a0afd7ae5be1529083Jesse Wilson 790b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson /** 791838419e39510cb3bf04cf5bfef2929a7cf759e65Jesse Wilson * Creates a new pull parser. 792b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson */ 793b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson abstract XmlPullParser newPullParser(); 794b076473aecb31da29217acbc5f9832345aeb4784Jesse Wilson} 795