Bump lib version.
[shibboleth/cpp-opensaml.git] / samltest / internal.h
index 1c97b69..05eeb7e 100644 (file)
@@ -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.
  * 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;
@@ -70,16 +76,45 @@ protected:
         }
     }
 
-    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();
@@ -105,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();
+        }
+
+};
+