/* * Copyright [2005] [University Corporation for Advanced Internet Development, Inc.] * * 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 org.opensaml.common; import javax.xml.namespace.QName; import org.custommonkey.xmlunit.XMLTestCase; import org.custommonkey.xmlunit.XMLUnit; import org.opensaml.Configuration; import org.opensaml.xml.ConfigurationException; import org.opensaml.xml.XMLObject; import org.opensaml.xml.XMLObjectBuilder; import org.opensaml.xml.XMLObjectBuilderFactory; import org.opensaml.xml.io.Marshaller; import org.opensaml.xml.io.MarshallerFactory; import org.opensaml.xml.io.Unmarshaller; import org.opensaml.xml.io.UnmarshallerFactory; import org.opensaml.xml.io.UnmarshallingException; import org.opensaml.xml.parse.BasicParserPool; import org.opensaml.xml.parse.XMLParserException; import org.opensaml.xml.util.XMLHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; /** * Intermediate class that serves to initialize the configuration environment for other base test classes. */ public abstract class BaseTestCase extends XMLTestCase { /** Parser manager used to parse XML. */ protected static BasicParserPool parser; /** XMLObject builder factory. */ protected static XMLObjectBuilderFactory builderFactory; /** XMLObject marshaller factory. */ protected static MarshallerFactory marshallerFactory; /** XMLObject unmarshaller factory. */ protected static UnmarshallerFactory unmarshallerFactory; /** Class logger. */ private static Logger log = LoggerFactory.getLogger(BaseTestCase.class); /** Constructor. */ public BaseTestCase(){ super(); parser = new BasicParserPool(); parser.setNamespaceAware(true); builderFactory = Configuration.getBuilderFactory(); marshallerFactory = Configuration.getMarshallerFactory(); unmarshallerFactory = Configuration.getUnmarshallerFactory(); } /** {@inheritDoc} */ protected void setUp() throws Exception { super.setUp(); XMLUnit.setIgnoreWhitespace(true); try{ TestBootstrap.bootstrap(); }catch(ConfigurationException e){ fail(e.getMessage()); } } /** {@inheritDoc} */ protected void tearDown() throws Exception { super.tearDown(); } /** * Asserts a given XMLObject is equal to an expected DOM. The XMLObject is marshalled and the resulting DOM object * is compared against the expected DOM object for equality. * * @param expectedDOM the expected DOM * @param xmlObject the XMLObject to be marshalled and compared against the expected DOM */ public void assertEquals(Document expectedDOM, XMLObject xmlObject) { assertEquals("Marshalled DOM was not the same as the expected DOM", expectedDOM, xmlObject); } /** * Asserts a given XMLObject is equal to an expected DOM. The XMLObject is marshalled and the resulting DOM object * is compared against the expected DOM object for equality. * * @param failMessage the message to display if the DOMs are not equal * @param expectedDOM the expected DOM * @param xmlObject the XMLObject to be marshalled and compared against the expected DOM */ public void assertEquals(String failMessage, Document expectedDOM, XMLObject xmlObject) { Marshaller marshaller = marshallerFactory.getMarshaller(xmlObject); if(marshaller == null){ fail("Unable to locate marshaller for " + xmlObject.getElementQName() + " can not perform equality check assertion"); } try { Element generatedDOM = marshaller.marshall(xmlObject, parser.newDocument()); if(log.isDebugEnabled()) { log.debug("Marshalled DOM was " + XMLHelper.nodeToString(generatedDOM)); } assertXMLEqual(failMessage, expectedDOM, generatedDOM.getOwnerDocument()); } catch (Exception e) { log.error("Marshalling failed with the following error:", e); fail("Marshalling failed with the following error: " + e); } } /** * Builds the requested XMLObject. * * @param objectQName name of the XMLObject * * @return the build XMLObject */ public XMLObject buildXMLObject(QName objectQName){ XMLObjectBuilder builder = Configuration.getBuilderFactory().getBuilder(objectQName); if(builder == null){ fail("Unable to retrieve builder for object QName " + objectQName); } return builder.buildObject(objectQName.getNamespaceURI(), objectQName.getLocalPart(), objectQName.getPrefix()); } /** * Unmarshalls an element file into its SAMLObject. * * @param elementFile the classpath path to an XML document to unmarshall * * @return the SAMLObject from the file */ protected XMLObject unmarshallElement(String elementFile) { try { Document doc = parser.parse(BaseTestCase.class .getResourceAsStream(elementFile)); Element samlElement = doc.getDocumentElement(); Unmarshaller unmarshaller = Configuration.getUnmarshallerFactory().getUnmarshaller(samlElement); if (unmarshaller == null) { fail("Unable to retrieve unmarshaller by DOM Element"); } return unmarshaller.unmarshall(samlElement); } catch (XMLParserException e) { fail("Unable to parse element file " + elementFile); } catch (UnmarshallingException e) { fail("Unmarshalling failed when parsing element file " + elementFile + ": " + e); } return null; } }