X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=samltest%2Finternal.h;h=4575bc425603f3255bf264465a83fe5ae8ab92ff;hb=6f7fde34b9483bf9edffdb1fabc692cc5cdb45ae;hp=251b3c13c78f5aba43534196bde0aa45817f48e9;hpb=88027d1b5e80e35f34c5ee733c2ff6908fe043d7;p=shibboleth%2Fcpp-opensaml.git diff --git a/samltest/internal.h b/samltest/internal.h index 251b3c1..4575bc4 100644 --- a/samltest/internal.h +++ b/samltest/internal.h @@ -20,6 +20,8 @@ #include #include #include +#include +#include #include #include @@ -64,21 +66,51 @@ protected: 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); + XMLString::release(&buf); + buf = XMLString::transcode(expectedString); + TS_TRACE(buf); + XMLString::release(&buf); + TSM_ASSERT(failMessage, false); + } + } + public: void setUp() { ParserPool& p=XMLToolingConfig::getConfig().getParser(); @@ -104,3 +136,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(); + } + +}; +