X-Git-Url: http://www.project-moonshot.org/gitweb/?p=shibboleth%2Fcpp-opensaml.git;a=blobdiff_plain;f=samltest%2Finternal.h;h=05eeb7ea9fe2456cc0d69849c9308dd016f970e0;hp=84cbd20a4e7269a62d84ed53ce56fc2217079c99;hb=c9e0e2dc2e15d2004333db7f135947db13956b5e;hpb=b63d7aa57a16e6a2b45c9347784db721dadee942 diff --git a/samltest/internal.h b/samltest/internal.h index 84cbd20..05eeb7e 100644 --- a/samltest/internal.h +++ b/samltest/internal.h @@ -1,5 +1,5 @@ /* - * 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. @@ -14,17 +14,23 @@ * limitations under the License. */ +#ifdef WIN32 +# define _CRT_SECURE_NO_DEPRECATE 1 +# define _CRT_NONSTDC_NO_DEPRECATE 1 +#endif + #include #include #include -#include #include #include #include +#include +#include -using namespace opensaml; using namespace xmltooling; +using namespace xercesc; using namespace std; extern string data_path; @@ -70,8 +76,16 @@ protected: } } - void assertEquals(const char* failMessage, DOMDocument* expectedDOM, XMLObject* xmlObject) { - DOMElement* generatedDOM = xmlObject->marshall(); + 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); @@ -83,11 +97,24 @@ protected: } } - 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(); @@ -113,3 +140,120 @@ public: 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(); + } + +}; +