Removed ChildlessElement class references, ensure ComplexElement gets copied during...
[shibboleth/cpp-opensaml.git] / samltest / signature / SAML1RequestTest.h
1 /*\r
2  *  Copyright 2001-2005 Internet2\r
3  * \r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  *     http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  */\r
16 \r
17 #include "signature/SAMLSignatureTestBase.h"\r
18 \r
19 #include <saml/saml1/core/Assertions.h>\r
20 #include <saml/saml1/core/Protocols.h>\r
21 \r
22 #include <fstream>\r
23 \r
24 using namespace opensaml::saml1p;\r
25 using namespace opensaml::saml1;\r
26 \r
27 class SAML1RequestTest : public CxxTest::TestSuite, public SAMLSignatureTestBase {\r
28 public:\r
29     void setUp() {\r
30         childElementsFile  = data_path + "signature/SAML1Request.xml";\r
31         SAMLSignatureTestBase::setUp();\r
32     }\r
33 \r
34     void tearDown() {\r
35         SAMLSignatureTestBase::tearDown();\r
36     }\r
37 \r
38     void testSignature() {\r
39         auto_ptr_XMLCh issueInstant("1970-01-02T01:01:02.100Z");\r
40         auto_ptr_XMLCh id("ident");\r
41         auto_ptr_XMLCh method("method");\r
42         auto_ptr_XMLCh nameid("John Doe");\r
43         \r
44         NameIdentifier* n=NameIdentifierBuilder::buildNameIdentifier();\r
45         n->setName(nameid.get());        \r
46         Subject* subject=SubjectBuilder::buildSubject();\r
47         subject->setNameIdentifier(n);\r
48 \r
49         AuthenticationQuery* query=AuthenticationQueryBuilder::buildAuthenticationQuery();\r
50         query->setAuthenticationMethod(method.get());\r
51         query->setSubject(subject);\r
52         \r
53         auto_ptr<Request> request(RequestBuilder::buildRequest());\r
54         request->setRequestID(id.get());\r
55         request->setIssueInstant(issueInstant.get());\r
56         request->setAuthenticationQuery(query);\r
57 \r
58         // Append a Signature.\r
59         Signature* sig=SignatureBuilder::buildSignature();\r
60         request->setSignature(sig);\r
61         Locker locker(m_resolver);\r
62         sig->setSigningKey(m_resolver->getKey());\r
63 \r
64         // Build KeyInfo.\r
65         KeyInfo* keyInfo=KeyInfoBuilder::buildKeyInfo();\r
66         X509Data* x509Data=X509DataBuilder::buildX509Data();\r
67         keyInfo->getX509Datas().push_back(x509Data);\r
68         for_each(m_resolver->getCertificates().begin(),m_resolver->getCertificates().end(),bind1st(_addcert(),x509Data));\r
69         sig->setKeyInfo(keyInfo);\r
70 \r
71         // Sign while marshalling.\r
72         vector<Signature*> sigs(1,sig);\r
73         DOMElement* rootElement = NULL;\r
74         try {\r
75             rootElement=request->marshall((DOMDocument*)NULL,&sigs);\r
76         }\r
77         catch (XMLToolingException& e) {\r
78             TS_TRACE(e.what());\r
79             throw;\r
80         }\r
81         \r
82         string buf;\r
83         XMLHelper::serialize(rootElement, buf);\r
84         istringstream in(buf);\r
85         DOMDocument* doc=XMLToolingConfig::getConfig().getParser().parse(in);\r
86         const XMLObjectBuilder* b = XMLObjectBuilder::getBuilder(doc->getDocumentElement());\r
87 \r
88         auto_ptr<XMLObject> request2(b->buildFromDocument(doc));\r
89         assertEquals("Unmarshalled request does not match", expectedChildElementsDOM, request2.get(), false);\r
90         \r
91         try {\r
92             SignatureProfileValidator spv;\r
93             SignatureValidator sv(new KeyResolver(m_resolver->getKey()));\r
94             spv.validate(dynamic_cast<Request*>(request2.get())->getSignature());\r
95             sv.validate(dynamic_cast<Request*>(request2.get())->getSignature());\r
96         }\r
97         catch (XMLToolingException& e) {\r
98             TS_TRACE(e.what());\r
99             throw;\r
100         }\r
101     }\r
102 \r
103 };\r