/*
- * Copyright 2001-2006 Internet2
+ * Copyright 2001-2007 Internet2
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* limitations under the License.
*/
+#ifdef WIN32
+# define _CRT_SECURE_NO_DEPRECATE 1
+# define _CRT_NONSTDC_NO_DEPRECATE 1
+#endif
+
#include <cxxtest/TestSuite.h>
#include <fstream>
#include <saml/exceptions.h>
-#include <saml/SAMLConfig.h>
#include <saml/util/SAMLConstants.h>
#include <xmltooling/XMLObject.h>
#include <xmltooling/XMLObjectBuilder.h>
+#include <xmltooling/XMLToolingConfig.h>
+#include <xmltooling/validation/Validator.h>
-using namespace opensaml;
using namespace xmltooling;
+using namespace xercesc;
using namespace std;
extern string data_path;
return b->buildFromDocument(doc);
}
catch (XMLToolingException& e) {
+ TS_TRACE(typeid(e).name());
TS_TRACE(e.what());
throw;
}
}
- void assertEquals(const char* failMessage, DOMDocument* expectedDOM, XMLObject* xmlObject) {
- DOMElement* generatedDOM = xmlObject->marshall();
- TSM_ASSERT(failMessage,generatedDOM->isEqualNode(expectedDOM->getDocumentElement()));
+ void assertEquals(const char* failMessage, DOMDocument* expectedDOM, XMLObject* xmlObject, bool canMarshall=true) {
+ DOMElement* generatedDOM = xmlObject->getDOM();
+ if (!generatedDOM) {
+ if (!canMarshall) {
+ TSM_ASSERT("DOM not available", false);
+ }
+ else {
+ generatedDOM = xmlObject->marshall();
+ }
+ }
+ if (!generatedDOM->isEqualNode(expectedDOM->getDocumentElement())) {
+ string buf;
+ XMLHelper::serialize(generatedDOM, buf);
+ TS_TRACE(buf.c_str());
+ buf.erase();
+ XMLHelper::serialize(expectedDOM->getDocumentElement(), buf);
+ TS_TRACE(buf.c_str());
+ TSM_ASSERT(failMessage, false);
+ }
}
- void assertEquals(DOMDocument* expectedDOM, XMLObject* xmlObject) {
- assertEquals("Marshalled DOM was not the same as the expected DOM", expectedDOM, xmlObject);
+ void assertEquals(DOMDocument* expectedDOM, XMLObject* xmlObject, bool canMarshall=true) {
+ assertEquals("Marshalled DOM was not the same as the expected DOM", expectedDOM, xmlObject, canMarshall);
delete xmlObject;
}
+ void assertEquals(const char* failMessage, const XMLCh* expectedString, const XMLCh* testString) {
+ char* buf = NULL;
+ if (!XMLString::equals(expectedString, testString)) {
+ buf = XMLString::transcode(testString);
+ TS_TRACE(buf ? buf : "(NULL)");
+ XMLString::release(&buf);
+ buf = XMLString::transcode(expectedString);
+ TS_TRACE(buf ? buf : "(NULL)");
+ XMLString::release(&buf);
+ TSM_ASSERT(failMessage, false);
+ }
+ }
+
public:
void setUp() {
ParserPool& p=XMLToolingConfig::getConfig().getParser();
if (expectedChildElementsDOM) expectedChildElementsDOM->release();
}
};
+
+class SAMLObjectValidatorBaseTestCase : virtual public SAMLObjectBaseTestCase {
+
+ public:
+ SAMLObjectValidatorBaseTestCase() : target(NULL), targetQName(NULL), builder(NULL), validator(NULL) {}
+
+ virtual ~SAMLObjectValidatorBaseTestCase() {
+ delete validator;
+ }
+
+ protected:
+ /** The primary XMLObject which will be the target of a given test run */
+ XMLObject* target;
+
+ /** QName of the object to be tested */
+ QName targetQName;
+
+ /** Builder for XMLObjects of type targetQName */
+ const XMLObjectBuilder* builder;
+
+ /** Validator for the type corresponding to the test target */
+ Validator* validator;
+
+ /** Subclasses should override to populate required elements and attributes */
+ virtual void populateRequiredData() { }
+
+ /**
+ * Asserts that the validation of default test XMLObject target
+ * was successful, as expected.
+ *
+ * @param message
+ */
+ void assertValidationPass(const char* message) {
+ assertValidationPass(message, target);
+ }
+
+ /**
+ * Asserts that the validation of the specified XMLObject target
+ * was successful, as expected.
+ *
+ * @param message
+ * @param validateTarget
+ */
+ void assertValidationPass(const char* message, XMLObject* validateTarget) {
+ try {
+ validator->validate(validateTarget);
+ } catch (ValidationException &e) {
+ TS_TRACE(message);
+ TS_TRACE("Expected success, but validation failure raised following ValidationException: ");
+ TS_FAIL(e.getMessage());
+ }
+ }
+
+ /**
+ * Asserts that the validation of the default test XMLObject target
+ * failed, as expected.
+ *
+ * @param message
+ */
+ void assertValidationFail(const char* message) {
+ assertValidationFail(message, target);
+ }
+
+ /**
+ * Asserts that the validation of the specified XMLObject target
+ * failed, as expected.
+ *
+ * @param message
+ * @param validateTarget
+ */
+ void assertValidationFail(const char* message, XMLObject* validateTarget) {
+ try {
+ validator->validate(validateTarget);
+ TS_TRACE(message);
+ TS_FAIL("Validation success, expected failure to raise ValidationException");
+ } catch (ValidationException&) {
+ }
+ }
+
+ /**
+ * Build an XMLObject based on the specified QName
+ *
+ * @param targetQName QName of the type of object to build
+ * @returns new XMLObject of type targetQName
+ */
+ XMLObject* buildXMLObject(QName &targetQName) {
+ // Create the builder on the first request only, for efficiency
+ if (builder == NULL) {
+ builder = XMLObjectBuilder::getBuilder(targetQName);
+ TSM_ASSERT("Unable to retrieve builder for object QName: " + targetQName.toString(), builder!=NULL);
+ }
+ return builder->buildObject(targetQName.getNamespaceURI(), targetQName.getLocalPart(), targetQName.getPrefix());
+
+ }
+
+ public:
+
+ void setUp() {
+ SAMLObjectBaseTestCase::setUp();
+
+ TSM_ASSERT("targetQName was empty", targetQName.hasLocalPart());
+
+ TSM_ASSERT("validator was null", validator!=NULL);
+
+ target = buildXMLObject(targetQName);
+ TSM_ASSERT("XMLObject target was NULL", target!=NULL);
+ populateRequiredData();
+ }
+
+ void tearDown() {
+ delete target;
+ target=NULL;
+ SAMLObjectBaseTestCase::tearDown();
+ }
+
+};
+