From a39dd1db39c010ca65ca4860281205dd1a7a0c99 Mon Sep 17 00:00:00 2001 From: felmer <felmer> Date: Tue, 13 Oct 2009 09:20:03 +0000 Subject: [PATCH] SE-146 XMLInfraStructure tests SVN: 12913 --- .../utilities/XMLInfraStructureTest.java | 196 ++++++++++++++++++ 1 file changed, 196 insertions(+) create mode 100644 common/sourceTest/java/ch/systemsx/cisd/common/utilities/XMLInfraStructureTest.java diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/utilities/XMLInfraStructureTest.java b/common/sourceTest/java/ch/systemsx/cisd/common/utilities/XMLInfraStructureTest.java new file mode 100644 index 00000000000..5a7bef88ede --- /dev/null +++ b/common/sourceTest/java/ch/systemsx/cisd/common/utilities/XMLInfraStructureTest.java @@ -0,0 +1,196 @@ +/* + * Copyright 2009 ETH Zuerich, CISD + * + * 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 ch.systemsx.cisd.common.utilities; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; + +import org.testng.AssertJUnit; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; +import org.xml.sax.ContentHandler; +import org.xml.sax.EntityResolver; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +/** + * + * + * @author Franz-Josef Elmer + */ +public class XMLInfraStructureTest extends AssertJUnit +{ + private static final class MockContentHandler extends DefaultHandler + { + private List<String> texts = new ArrayList<String>(); + + @Override + public void characters(char[] ch, int start, int length) throws SAXException + { + String text = new String(ch, start, length).trim(); + if (text.length() > 0) + { + texts.add(text); + } + } + + @Override + public String toString() + { + return texts.toString(); + } + } + + private static final String EXAMPLE_XSD = + "<?xml version='1.0'?>\n" + + "<xs:schema targetNamespace='http://my.host.org' xmlns:xs='http://www.w3.org/2001/XMLSchema'>\n" + + "<xs:element name='note'>\n" + + " <xs:complexType>\n" + + " <xs:sequence>\n" + + " <xs:element name='to' type='xs:string'/>\n" + + " <xs:element name='from' type='xs:string'/>\n" + + " <xs:element name='heading' type='xs:string'/>\n" + + " <xs:element name='body' type='xs:string'/>\n" + + " </xs:sequence>\n" + + " </xs:complexType>\n" + + "</xs:element>\n" + + "</xs:schema>"; + + private static final String VALID_EXAMPLE_XML = + "<?xml version='1.0'?>\n" + "<n:note\n" + "xmlns:n='http://my.host.org'\n" + + "xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'\n" + + "xsi:schemaLocation='http://my.host.org /note.xsd'>\n" + + " <to>Albert</to>\n" + + " <from>Isaac</from>\n" + + " <heading>Space and Time</heading>\n" + + " <body>New theory on space and time.</body>\n" + + "</n:note>"; + + private static final String INVALID_EXAMPLE_XML = + "<?xml version='1.0'?>\n" + "<n:note\n" + "xmlns:n='http://my.host.org'\n" + + "xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'\n" + + "xsi:schemaLocation='http://my.host.org /note.xsd'>\n" + + " <to>Albert</to>\n" + + " <from>Isaac</from>\n" + + " <heading>Space and Time</heading>\n" + + "</n:note>"; + + private static final String NOT_WELLFORMED_EXAMPLE_XML = + "<?xml version='1.0'?>\n" + "<n:note\n" + "xmlns:n='http://my.host.org'\n" + + "xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'\n" + + "xsi:schemaLocation='http://my.host.org /note.xsd'>\n" + + " <to>Albert</to>\n"; + + private ContentHandler contentHandler; + + private EntityResolver entityResolver; + + @BeforeMethod + public void beforeMethod() + { + contentHandler = new MockContentHandler(); + entityResolver = new EntityResolver() + { + public InputSource resolveEntity(String publicId, String systemId) throws SAXException, + IOException + { + assertEquals("file:///note.xsd", systemId); + return new InputSource(new StringReader(EXAMPLE_XSD)); + } + }; + } + + @Test + public void testCreateSchema() + { + XMLInfraStructure.createSchema(new ByteArrayInputStream(EXAMPLE_XSD.getBytes())); + } + + @Test + public void testCreateInvalidSchema() + { + try + { + XMLInfraStructure.createSchema(new ByteArrayInputStream(VALID_EXAMPLE_XML.getBytes())); + fail("Expection expected"); + } catch (Exception ex) + { + // ignored + } + } + + @Test + public void testNoValidation() + { + XMLInfraStructure xmlInfraStructure = new XMLInfraStructure(false); + xmlInfraStructure.setEntityResolver(entityResolver); + + xmlInfraStructure.parse(new StringReader(INVALID_EXAMPLE_XML), contentHandler); + assertEquals("[Albert, Isaac, Space and Time]", contentHandler.toString()); + } + + @Test + public void testValidXML() + { + XMLInfraStructure xmlInfraStructure = new XMLInfraStructure(true); + xmlInfraStructure.setEntityResolver(entityResolver); + + xmlInfraStructure.parse(new StringReader(VALID_EXAMPLE_XML), contentHandler); + assertEquals("[Albert, Isaac, Space and Time, New theory on space and time.]", + contentHandler.toString()); + } + + @Test + public void testInvalidXML() + { + XMLInfraStructure xmlInfraStructure = new XMLInfraStructure(true); + xmlInfraStructure.setEntityResolver(entityResolver); + + try + { + xmlInfraStructure.parse(new StringReader(INVALID_EXAMPLE_XML), contentHandler); + fail("Exception expected"); + } catch (Exception ex) + { + assertEquals("org.xml.sax.SAXException: XML validation errors:\n" + + "Error in line 9 column 10:cvc-complex-type.2.4.b: " + + "The content of element 'n:note' is not complete. " + + "One of '{\"\":body}' is expected.", ex.getMessage()); + } + } + + @Test + public void testNotWellFormedXML() + { + XMLInfraStructure xmlInfraStructure = new XMLInfraStructure(true); + xmlInfraStructure.setEntityResolver(entityResolver); + + try + { + xmlInfraStructure.parse(new StringReader(NOT_WELLFORMED_EXAMPLE_XML), contentHandler); + fail("Exception expected"); + } catch (Exception ex) + { + assertEquals("org.xml.sax.SAXParseException: XML document structures must start " + + "and end within the same entity.", ex.getMessage()); + } + } +} -- GitLab