/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package libcore.xml;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;
import junit.framework.TestCase;
import org.kxml2.io.KXmlParser;
import org.kxml2.io.KXmlSerializer;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import org.xmlpull.v1.XmlSerializer;
public class XmlPullParserFactoryTest extends TestCase {
public void testDefaultNewInstance() throws Exception {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance(null, null);
XmlPullParser parser = factory.newPullParser();
XmlSerializer serializer = factory.newSerializer();
assertNotNull(parser);
assertNotNull(serializer);
assertTrue(parser instanceof KXmlParser);
assertTrue(serializer instanceof KXmlSerializer);
}
/**
* Tests that trying to instantiate a parser with an empty list of
* parsers and serializers fails.
*/
public void testOverriding_emptyClassList() {
TestXmlPullParserFactory tf = new TestXmlPullParserFactory(null, null);
try {
tf.newPullParser();
fail();
} catch (XmlPullParserException expected) {
}
try {
tf.newPullParser();
fail();
} catch (XmlPullParserException expected) {
}
}
public void testOverriding_customClassList() throws Exception {
TestXmlPullParserFactory tf = new TestXmlPullParserFactory(
new String[] { "libcore.xml.XmlPullParserFactoryTest$XmlPullParserStub" },
new String[] { "libcore.xml.XmlPullParserFactoryTest$XmlSerializerStub" });
assertTrue(tf.newPullParser() instanceof XmlPullParserStub);
assertTrue(tf.newSerializer() instanceof XmlSerializerStub);
// Also check that we ignore instantiation errors as long as
// at least one parser / serializer is instantiable.
tf = new TestXmlPullParserFactory(
new String[] {
"libcore.xml.XmlPullParserFactoryTest$InaccessibleXmlParser",
"libcore.xml.XmlPullParserFactoryTest$XmlPullParserStub" },
new String[] {
"libcore.xml.XmlPullParserFactoryTest$InaccessibleXmlSerializer",
"libcore.xml.XmlPullParserFactoryTest$XmlSerializerStub" });
assertTrue(tf.newPullParser() instanceof XmlPullParserStub);
assertTrue(tf.newSerializer() instanceof XmlSerializerStub);
}
// https://b/12956724
public void testSetFeature_setsFeatureOnlyIfTrue() throws Exception {
TestXmlPullParserFactory tf = new TestXmlPullParserFactory(
new String[] { "libcore.xml.XmlPullParserFactoryTest$XmlParserThatHatesAllFeatures" }, null);
tf.setFeature("foo", false);
tf.newPullParser();
}
/**
* A class that makes use of inherited XmlPullParserFactory fields to check they are
* supported.
*/
static final class TestXmlPullParserFactory extends XmlPullParserFactory {
TestXmlPullParserFactory(String[] parserClassList, String[] serializerClassList) {
super();
parserClasses.remove(0);
serializerClasses.remove(0);
try {
if (parserClassList != null) {
for (String parserClass : parserClassList) {
parserClasses.add(Class.forName(parserClass));
}
}
if (serializerClassList != null) {
for (String serializerClass : serializerClassList) {
serializerClasses.add(Class.forName(serializerClass));
}
}
} catch (ClassNotFoundException ignored) {
throw new AssertionError(ignored);
}
}
}
public static final class XmlParserThatHatesAllFeatures extends XmlPullParserStub {
@Override
public void setFeature(String name, boolean state) {
fail();
}
}
static final class InaccessibleXmlSerializer extends XmlSerializerStub {
}
static final class InaccessibleXmlParser extends XmlPullParserStub {
}
public static class XmlSerializerStub implements XmlSerializer {
public void setFeature(String name, boolean state) throws IllegalArgumentException,
IllegalStateException {
}
public boolean getFeature(String name) {
return false;
}
public void setProperty(String name, Object value) {
}
public Object getProperty(String name) {
return null;
}
public void setOutput(OutputStream os, String encoding) throws IOException {
}
public void setOutput(Writer writer) throws IOException {
}
public void startDocument(String encoding, Boolean standalone) throws IOException {
}
public void endDocument() throws IOException {
}
public void setPrefix(String prefix, String namespace) throws IOException {
}
public String getPrefix(String namespace, boolean generatePrefix) throws IllegalArgumentException {
return null;
}
public int getDepth() {
return 0;
}
public String getNamespace() {
return null;
}
public String getName() {
return null;
}
public XmlSerializer startTag(String namespace, String name) throws IOException {
return null;
}
public XmlSerializer attribute(String namespace, String name, String value) throws IOException {
return null;
}
public XmlSerializer endTag(String namespace, String name) throws IOException {
return null;
}
public XmlSerializer text(String text) throws IOException {
return null;
}
public XmlSerializer text(char[] buf, int start, int len) throws IOException {
return null;
}
public void cdsect(String text) throws IOException {
}
public void entityRef(String text) throws IOException {
}
public void processingInstruction(String text) throws IOException {
}
public void comment(String text) throws IOException {
}
public void docdecl(String text) throws IOException {
}
public void ignorableWhitespace(String text) throws IOException {
}
public void flush() throws IOException {
}
}
public static class XmlPullParserStub implements XmlPullParser {
public void setFeature(String name, boolean state) throws XmlPullParserException {
}
public boolean getFeature(String name) {
return false;
}
public void setProperty(String name, Object value) throws XmlPullParserException {
}
public Object getProperty(String name) {
return null;
}
public void setInput(Reader in) throws XmlPullParserException {
}
public void setInput(InputStream inputStream, String inputEncoding)
throws XmlPullParserException {
}
public String getInputEncoding() {
return null;
}
public void defineEntityReplacementText(String entityName, String replacementText)
throws XmlPullParserException {
}
public int getNamespaceCount(int depth) throws XmlPullParserException {
return 0;
}
public String getNamespacePrefix(int pos) throws XmlPullParserException {
return null;
}
public String getNamespaceUri(int pos) throws XmlPullParserException {
return null;
}
public String getNamespace(String prefix) {
return null;
}
public int getDepth() {
return 0;
}
public String getPositionDescription() {
return null;
}
public int getLineNumber() {
return 0;
}
public int getColumnNumber() {
return 0;
}
public boolean isWhitespace() throws XmlPullParserException {
return false;
}
public String getText() {
return null;
}
public char[] getTextCharacters(int[] holderForStartAndLength) {
return null;
}
public String getNamespace() {
return null;
}
public String getName() {
return null;
}
public String getPrefix() {
return null;
}
public boolean isEmptyElementTag() throws XmlPullParserException {
return false;
}
public int getAttributeCount() {
return 0;
}
public String getAttributeNamespace(int index) {
return null;
}
public String getAttributeName(int index) {
return null;
}
public String getAttributePrefix(int index) {
return null;
}
public String getAttributeType(int index) {
return null;
}
public boolean isAttributeDefault(int index) {
return false;
}
public String getAttributeValue(int index) {
return null;
}
public String getAttributeValue(String namespace, String name) {
return null;
}
public int getEventType() throws XmlPullParserException {
return 0;
}
public int next() throws XmlPullParserException, IOException {
return 0;
}
public int nextToken() throws XmlPullParserException, IOException {
return 0;
}
public void require(int type, String namespace, String name)
throws XmlPullParserException, IOException {
}
public String nextText() throws XmlPullParserException, IOException {
return null;
}
public int nextTag() throws XmlPullParserException, IOException {
return 0;
}
}
}