2 * Licensed to the University Corporation for Advanced Internet
3 * Development, Inc. (UCAID) under one or more contributor license
4 * agreements. See the NOTICE file distributed with this work for
5 * additional information regarding copyright ownership.
7 * UCAID licenses this file to you under the Apache License,
8 * Version 2.0 (the "License"); you may not use this file except
9 * in compliance with the License. You may obtain a copy of the
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing,
15 * software distributed under the License is distributed on an
16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
17 * either express or implied. See the License for the specific
18 * language governing permissions and limitations under the License.
22 #include <saml/saml2/core/Protocols.h>
23 #include <saml/util/SAMLConstants.h>
25 using namespace opensaml::saml2p;
26 using namespace opensaml::saml2;
28 class LogoutRequest20Test : public CxxTest::TestSuite, public SAMLObjectBaseTestCase {
30 XMLCh* expectedVersion;
31 DateTime* expectedIssueInstant;
32 XMLCh* expectedConsent;
33 XMLCh* expectedDestination;
34 XMLCh* expectedReason;
35 DateTime* expectedNotOnOrAfter;
39 expectedID = XMLString::transcode("abc123");;
40 expectedVersion = XMLString::transcode("2.0");
41 expectedIssueInstant = new DateTime(XMLString::transcode("2006-02-21T16:40:00.000Z"));
42 expectedIssueInstant->parseDateTime();
43 expectedConsent = XMLString::transcode("urn:string:consent");
44 expectedDestination = XMLString::transcode("http://idp.example.org/endpoint");
45 expectedReason = XMLString::transcode("urn:string:reason");
46 expectedNotOnOrAfter = new DateTime(XMLString::transcode("2006-02-21T20:45:00.000Z"));
47 expectedNotOnOrAfter->parseDateTime();
49 singleElementFile = data_path + "saml2/core/impl/LogoutRequest.xml";
50 singleElementOptionalAttributesFile = data_path + "saml2/core/impl/LogoutRequestOptionalAttributes.xml";
51 childElementsFile = data_path + "saml2/core/impl/LogoutRequestChildElements.xml";
52 SAMLObjectBaseTestCase::setUp();
56 XMLString::release(&expectedID);
57 XMLString::release(&expectedVersion);
58 XMLString::release(&expectedConsent);
59 XMLString::release(&expectedDestination);
60 XMLString::release(&expectedReason);
61 delete expectedIssueInstant;
62 delete expectedNotOnOrAfter;
63 SAMLObjectBaseTestCase::tearDown();
66 void testSingleElementUnmarshall() {
67 auto_ptr<XMLObject> xo(unmarshallElement(singleElementFile));
68 LogoutRequest* request = dynamic_cast<LogoutRequest*>(xo.get());
69 TS_ASSERT(request!=nullptr);
70 assertEquals("ID attribute", expectedID, request->getID());
71 assertEquals("Version attribute", expectedVersion, request->getVersion());
72 TSM_ASSERT_EQUALS("IssueInstant attribute", expectedIssueInstant->getEpoch(), request->getIssueInstant()->getEpoch());
74 TS_ASSERT(request->getIssuer()==nullptr);
75 TS_ASSERT(request->getSignature()==nullptr);
76 TS_ASSERT(request->getExtensions()==nullptr);
77 TS_ASSERT(request->getBaseID()==nullptr);
78 TS_ASSERT(request->getNameID()==nullptr);
79 TS_ASSERT(request->getEncryptedID()==nullptr);
80 TSM_ASSERT_EQUALS("# of SessionIndex child elements", 0, request->getSessionIndexs().size());
83 void testSingleElementOptionalAttributesUnmarshall() {
84 auto_ptr<XMLObject> xo(unmarshallElement(singleElementOptionalAttributesFile));
85 LogoutRequest* request = dynamic_cast<LogoutRequest*>(xo.get());
86 TS_ASSERT(request!=nullptr);
88 assertEquals("Consent attribute", expectedConsent, request->getConsent());
89 assertEquals("Destination attribute", expectedDestination, request->getDestination());
90 assertEquals("Reason attribute", expectedReason, request->getReason());
91 TSM_ASSERT_EQUALS("NotOnOrAfter attribute", expectedNotOnOrAfter->getEpoch(), request->getNotOnOrAfter()->getEpoch());
93 TS_ASSERT(request->getIssuer()==nullptr);
94 TS_ASSERT(request->getSignature()==nullptr);
95 TS_ASSERT(request->getExtensions()==nullptr);
96 TS_ASSERT(request->getBaseID()==nullptr);
97 TS_ASSERT(request->getNameID()==nullptr);
98 TS_ASSERT(request->getEncryptedID()==nullptr);
99 TSM_ASSERT_EQUALS("# of SessionIndex child elements", 0, request->getSessionIndexs().size());
102 void testChildElementsUnmarshall() {
103 auto_ptr<XMLObject> xo(unmarshallElement(childElementsFile));
104 LogoutRequest* request= dynamic_cast<LogoutRequest*>(xo.get());
105 TS_ASSERT(request!=nullptr);
106 TS_ASSERT(request->getIssuer()!=nullptr);
107 TS_ASSERT(request->getSignature()==nullptr);
108 TS_ASSERT(request->getExtensions()==nullptr);
109 TS_ASSERT(request->getBaseID()==nullptr);
110 TS_ASSERT(request->getNameID()!=nullptr);
111 TS_ASSERT(request->getEncryptedID()==nullptr);
112 TSM_ASSERT_EQUALS("# of SessionIndex child elements", 2, request->getSessionIndexs().size());
115 void testSingleElementMarshall() {
116 LogoutRequest* request=LogoutRequestBuilder::buildLogoutRequest();
117 request->setID(expectedID);
118 request->setIssueInstant(expectedIssueInstant);
119 //request->setVersion(expectedVersion);
120 assertEquals(expectedDOM, request);
123 void testSingleElementOptionalAttributesMarshall() {
124 LogoutRequest* request=LogoutRequestBuilder::buildLogoutRequest();
125 request->setID(expectedID);
126 request->setIssueInstant(expectedIssueInstant);
127 //request->setVersion(expectedVersion);
128 request->setConsent(expectedConsent);
129 request->setDestination(expectedDestination);
130 request->setReason(expectedReason);
131 request->setNotOnOrAfter(expectedNotOnOrAfter);
132 assertEquals(expectedOptionalAttributesDOM, request);
135 void testChildElementsMarshall() {
136 LogoutRequest* request=LogoutRequestBuilder::buildLogoutRequest();
137 request->setID(expectedID);
138 request->setIssueInstant(expectedIssueInstant);
139 // Do this just so don't have to redeclare the saml namespace prefix on every child element in the control XML file
140 Namespace* ns = new Namespace(samlconstants::SAML20_NS, samlconstants::SAML20_PREFIX);
141 request->addNamespace(*ns);
142 request->setIssuer(IssuerBuilder::buildIssuer());
143 request->setNameID(NameIDBuilder::buildNameID());
144 request->getSessionIndexs().push_back(SessionIndexBuilder::buildSessionIndex());
145 request->getSessionIndexs().push_back(SessionIndexBuilder::buildSessionIndex());
146 assertEquals(expectedChildElementsDOM, request);