2c4a5c320dc7b551ee226c81e29d102cf762cd5a
[java-idp.git] / tests / edu / internet2 / middleware / shibboleth / metadata / MetadataTests.java
1 /*
2  * The Shibboleth License, Version 1. Copyright (c) 2002 University Corporation for Advanced Internet Development, Inc.
3  * All rights reserved Redistribution and use in source and binary forms, with or without modification, are permitted
4  * provided that the following conditions are met: Redistributions of source code must retain the above copyright
5  * notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above
6  * copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials
7  * provided with the distribution, if any, must include the following acknowledgment: "This product includes software
8  * developed by the University Corporation for Advanced Internet Development <http://www.ucaid.edu> Internet2 Project.
9  * Alternately, this acknowledegement may appear in the software itself, if and wherever such third-party
10  * acknowledgments normally appear. Neither the name of Shibboleth nor the names of its contributors, nor Internet2, nor
11  * the University Corporation for Advanced Internet Development, Inc., nor UCAID may be used to endorse or promote
12  * products derived from this software without specific prior written permission. For written permission, please contact
13  * shibboleth@shibboleth.org Products derived from this software may not be called Shibboleth, Internet2, UCAID, or the
14  * University Corporation for Advanced Internet Development, nor may Shibboleth appear in their name, without prior
15  * written permission of the University Corporation for Advanced Internet Development. THIS SOFTWARE IS PROVIDED BY THE
16  * COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND WITH ALL FAULTS. ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE
18  * DISCLAIMED AND THE ENTIRE RISK OF SATISFACTORY QUALITY, PERFORMANCE, ACCURACY, AND EFFORT IS WITH LICENSEE. IN NO
19  * EVENT SHALL THE COPYRIGHT OWNER, CONTRIBUTORS OR THE UNIVERSITY CORPORATION FOR ADVANCED INTERNET DEVELOPMENT, INC.
20  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
21  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
23  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 package edu.internet2.middleware.shibboleth.metadata;
27
28 import java.io.File;
29 import java.io.FileInputStream;
30 import java.util.Arrays;
31 import java.util.Iterator;
32
33 import javax.xml.parsers.DocumentBuilderFactory;
34
35 import junit.framework.TestCase;
36
37 import org.apache.log4j.BasicConfigurator;
38 import org.apache.log4j.Level;
39 import org.apache.log4j.Logger;
40 import org.opensaml.XML;
41 import org.w3c.dom.Document;
42 import org.w3c.dom.Element;
43 import org.w3c.dom.Node;
44 import org.xml.sax.InputSource;
45
46 import edu.internet2.middleware.shibboleth.idp.IdPConfig;
47 import edu.internet2.middleware.shibboleth.metadata.provider.XMLMetadata;
48 import edu.internet2.middleware.shibboleth.xml.Parser;
49
50 /**
51  * Validation suite for the <code>Metadata</code> interface.
52  * 
53  * @author Walter Hoehn
54  */
55
56 public class MetadataTests extends TestCase {
57
58         private Parser.DOMParser parser = new Parser.DOMParser(true);
59
60         public MetadataTests(String name) {
61
62                 super(name);
63                 BasicConfigurator.resetConfiguration();
64                 BasicConfigurator.configure();
65                 Logger.getRootLogger().setLevel(Level.OFF);
66         }
67
68         public static void main(String[] args) {
69
70                 junit.textui.TestRunner.run(MetadataTests.class);
71                 BasicConfigurator.configure();
72                 Logger.getRootLogger().setLevel(Level.OFF);
73         }
74
75         protected void setUp() throws Exception {
76
77                 super.setUp();
78
79         }
80
81         public void testBasicShibbolethXML() {
82
83                 try {
84                         Metadata metadata = new XMLMetadata(new File("data/sites1.xml").toURL().toString());
85
86                         assertNotNull("Unable to find test provider", metadata.lookup("bahsite"));
87                         assertNotNull("Unable to find test provider", metadata.lookup("rootsite"));
88
89                         // This should probably be made more robust at some point
90                         assertNotNull("Incorrect provider role.", metadata.lookup("bahsite").getSPSSODescriptor(
91                                         XML.SAML11_PROTOCOL_ENUM));
92
93                         assertEquals("Incorrect parsing of assertion consumer URL.", ((Endpoint) metadata.lookup("bahsite")
94                                         .getSPSSODescriptor(XML.SAML11_PROTOCOL_ENUM).getAssertionConsumerServiceManager().getEndpoints()
95                                         .next()).getLocation(), "http://foo.com/SHIRE");
96
97                         Iterator keys = metadata.lookup("rootsite").getSPSSODescriptor(XML.SAML11_PROTOCOL_ENUM)
98                                         .getKeyDescriptors();
99                         KeyDescriptor key1 = (KeyDescriptor) keys.next();
100                         KeyDescriptor key2 = (KeyDescriptor) keys.next();
101                         assertTrue("Incorrect attribute requester key parsing.", key1 != null && key2 != null);
102
103                         String[] control = new String[]{
104                                         "C=US, ST=Tennessee, L=Memphis, O=The University of Memphis, OU=Information Systems, CN=test2.memphis.edu",
105                                         "C=US, ST=Tennessee, L=Memphis, O=The University of Memphis, OU=Information Systems, CN=test1.memphis.edu"};
106                         String[] meta = new String[]{key1.getKeyInfo().itemKeyName(0).getKeyName(),
107                                         key2.getKeyInfo().itemKeyName(0).getKeyName()};
108                         Arrays.sort(meta);
109                         Arrays.sort(control);
110                         assertTrue("Encountered unexpected key names", Arrays.equals(control, meta));
111                 } catch (Exception e) {
112                         fail("Failed to correctly load metadata: " + e);
113                 }
114         }
115
116         public void testBasicSAMLXML() {
117
118                 try {
119                         Metadata metadata = new XMLMetadata(new File("src/conf/IQ-sites.xml").toURL().toString());
120
121                         EntityDescriptor entity = metadata.lookup("urn:mace:inqueue:example.edu");
122
123                         assertNotNull("Unable to find test provider", entity);
124                         assertEquals("Descriptor group is wrong.", entity.getEntitiesDescriptor().getName(), "urn:mace:inqueue");
125
126                         IDPSSODescriptor idp = entity.getIDPSSODescriptor(edu.internet2.middleware.shibboleth.common.XML.SHIB_NS);
127                         AttributeAuthorityDescriptor aa = entity.getAttributeAuthorityDescriptor(XML.SAML11_PROTOCOL_ENUM);
128                         SPSSODescriptor sp = entity.getSPSSODescriptor(XML.SAML11_PROTOCOL_ENUM);
129
130                         assertNotNull("Missing IdP provider role.", idp);
131                         assertNotNull("Missing AA provider role.", aa);
132                         assertNotNull("Missing SP provider role.", sp);
133
134                         assertEquals("Incorrect assertion consumer service location.", ((Endpoint) sp
135                                         .getAssertionConsumerServiceManager().getEndpoints().next()).getLocation(),
136                                         "https://wayf.internet2.edu/Shibboleth.shire");
137
138                         Iterator keys = sp.getKeyDescriptors();
139                         KeyDescriptor key = (KeyDescriptor) keys.next();
140                         assertNotNull("Incorrect attribute requester key parsing.", key);
141
142                         String[] control = new String[]{"wayf.internet2.edu"};
143                         String[] meta = new String[]{key.getKeyInfo().itemKeyName(0).getKeyName()};
144                         Arrays.sort(meta);
145                         Arrays.sort(control);
146                         assertTrue("Encountered unexpected key names", Arrays.equals(control, meta));
147                 } catch (Exception e) {
148                         fail("Failed to correctly load metadata: " + e);
149                 }
150         }
151
152         public void testInlineSAMLXML() {
153
154                 try {
155
156                         DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
157                         docFactory.setNamespaceAware(true);
158                         Document placeHolder = docFactory.newDocumentBuilder().newDocument();
159
160                         Element providerNode = placeHolder.createElementNS(IdPConfig.configNameSpace, "MetadataProvider");
161
162                         Document xmlConfig = parser.parse(new InputSource(new FileInputStream("src/conf/IQ-sites.xml")));
163                         Node metadataNode = placeHolder.importNode(xmlConfig.getDocumentElement(), true);
164                         providerNode.appendChild(metadataNode);
165
166                         Metadata metadata = new XMLMetadata(providerNode);
167
168                         EntityDescriptor entity = metadata.lookup("urn:mace:inqueue:example.edu");
169
170                         assertNotNull("Unable to find test provider", entity);
171                         assertEquals("Descriptor group is wrong.", entity.getEntitiesDescriptor().getName(), "urn:mace:inqueue");
172
173                         IDPSSODescriptor idp = entity.getIDPSSODescriptor(edu.internet2.middleware.shibboleth.common.XML.SHIB_NS);
174                         AttributeAuthorityDescriptor aa = entity.getAttributeAuthorityDescriptor(XML.SAML11_PROTOCOL_ENUM);
175                         SPSSODescriptor sp = entity.getSPSSODescriptor(XML.SAML11_PROTOCOL_ENUM);
176
177                         assertNotNull("Missing IdP provider role.", idp);
178                         assertNotNull("Missing AA provider role.", aa);
179                         assertNotNull("Missing SP provider role.", sp);
180
181                         assertEquals("Incorrect assertion consumer service location.", ((Endpoint) sp
182                                         .getAssertionConsumerServiceManager().getEndpoints().next()).getLocation(),
183                                         "https://wayf.internet2.edu/Shibboleth.shire");
184
185                         Iterator keys = sp.getKeyDescriptors();
186                         KeyDescriptor key = (KeyDescriptor) keys.next();
187                         assertNotNull("Incorrect attribute requester key parsing.", key);
188
189                         String[] control = new String[]{"wayf.internet2.edu"};
190                         String[] meta = new String[]{key.getKeyInfo().itemKeyName(0).getKeyName()};
191                         Arrays.sort(meta);
192                         Arrays.sort(control);
193                         assertTrue("Encountered unexpected key names", Arrays.equals(control, meta));
194                 } catch (Exception e) {
195                         fail("Failed to correctly load metadata: " + e);
196                 }
197         }
198 }