Added stand-alone query role.
[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.common.Constants;
47 import edu.internet2.middleware.shibboleth.idp.IdPConfig;
48 import edu.internet2.middleware.shibboleth.metadata.provider.XMLMetadata;
49 import edu.internet2.middleware.shibboleth.xml.Parser;
50
51 /**
52  * Validation suite for the <code>Metadata</code> interface.
53  * 
54  * @author Walter Hoehn
55  */
56
57 public class MetadataTests extends TestCase {
58
59         private Parser.DOMParser parser = new Parser.DOMParser(true);
60
61         public MetadataTests(String name) {
62
63                 super(name);
64                 BasicConfigurator.resetConfiguration();
65                 BasicConfigurator.configure();
66                 Logger.getRootLogger().setLevel(Level.OFF);
67         }
68
69         public static void main(String[] args) {
70
71                 junit.textui.TestRunner.run(MetadataTests.class);
72                 BasicConfigurator.configure();
73                 Logger.getRootLogger().setLevel(Level.OFF);
74         }
75
76         protected void setUp() throws Exception {
77
78                 super.setUp();
79
80         }
81
82         public void testBasicShibbolethXML() {
83
84                 try {
85                         Metadata metadata = new XMLMetadata(new File("data/sites1.xml").toURL().toString());
86
87                         assertNotNull("Unable to find test provider", metadata.lookup("bahsite"));
88                         assertNotNull("Unable to find test provider", metadata.lookup("rootsite"));
89
90                         // This should probably be made more robust at some point
91                         assertNotNull("Incorrect provider role.", metadata.lookup("bahsite").getSPSSODescriptor(
92                                         XML.SAML11_PROTOCOL_ENUM));
93
94                         assertEquals("Incorrect parsing of assertion consumer URL.", ((Endpoint) metadata.lookup("bahsite")
95                                         .getSPSSODescriptor(XML.SAML11_PROTOCOL_ENUM).getAssertionConsumerServiceManager().getEndpoints()
96                                         .next()).getLocation(), "http://foo.com/SHIRE");
97
98                         Iterator keys = metadata.lookup("rootsite").getSPSSODescriptor(XML.SAML11_PROTOCOL_ENUM)
99                                         .getKeyDescriptors();
100                         KeyDescriptor key1 = (KeyDescriptor) keys.next();
101                         KeyDescriptor key2 = (KeyDescriptor) keys.next();
102                         assertTrue("Incorrect attribute requester key parsing.", key1 != null && key2 != null);
103
104                         String[] control = new String[]{
105                                         "C=US, ST=Tennessee, L=Memphis, O=The University of Memphis, OU=Information Systems, CN=test2.memphis.edu",
106                                         "C=US, ST=Tennessee, L=Memphis, O=The University of Memphis, OU=Information Systems, CN=test1.memphis.edu"};
107                         String[] meta = new String[]{key1.getKeyInfo().itemKeyName(0).getKeyName(),
108                                         key2.getKeyInfo().itemKeyName(0).getKeyName()};
109                         Arrays.sort(meta);
110                         Arrays.sort(control);
111                         assertTrue("Encountered unexpected key names", Arrays.equals(control, meta));
112                 } catch (Exception e) {
113                         fail("Failed to correctly load metadata: " + e);
114                 }
115         }
116
117         public void testBasicSAMLXML() {
118
119                 try {
120                         Metadata metadata = new XMLMetadata(new File("src/conf/IQ-sites.xml").toURL().toString());
121
122                         EntityDescriptor entity = metadata.lookup("urn:mace:inqueue:example.edu");
123
124                         assertNotNull("Unable to find test provider", entity);
125                         assertEquals("Descriptor group is wrong.", entity.getEntitiesDescriptor().getName(), "urn:mace:inqueue");
126
127                         IDPSSODescriptor idp = entity.getIDPSSODescriptor(edu.internet2.middleware.shibboleth.common.XML.SHIB_NS);
128                         AttributeAuthorityDescriptor aa = entity.getAttributeAuthorityDescriptor(XML.SAML11_PROTOCOL_ENUM);
129                         SPSSODescriptor sp = entity.getSPSSODescriptor(XML.SAML11_PROTOCOL_ENUM);
130
131                         assertNotNull("Missing IdP provider role.", idp);
132                         assertNotNull("Missing AA provider role.", aa);
133                         assertNotNull("Missing SP provider role.", sp);
134
135                         assertEquals("Incorrect assertion consumer service location.", ((Endpoint) sp
136                                         .getAssertionConsumerServiceManager().getEndpoints().next()).getLocation(),
137                                         "https://wayf.internet2.edu/Shibboleth.shire");
138
139                         Iterator keys = sp.getKeyDescriptors();
140                         KeyDescriptor key = (KeyDescriptor) keys.next();
141                         assertNotNull("Incorrect attribute requester key parsing.", key);
142
143                         String[] control = new String[]{"wayf.internet2.edu"};
144                         String[] meta = new String[]{key.getKeyInfo().itemKeyName(0).getKeyName()};
145                         Arrays.sort(meta);
146                         Arrays.sort(control);
147                         assertTrue("Encountered unexpected key names", Arrays.equals(control, meta));
148                 } catch (Exception e) {
149                         fail("Failed to correctly load metadata: " + e);
150                 }
151         }
152
153         public void testInlineSAMLXML() {
154
155                 try {
156
157                         DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
158                         docFactory.setNamespaceAware(true);
159                         Document placeHolder = docFactory.newDocumentBuilder().newDocument();
160
161                         Element providerNode = placeHolder.createElementNS(IdPConfig.configNameSpace, "MetadataProvider");
162
163                         Document xmlConfig = parser.parse(new InputSource(new FileInputStream("src/conf/IQ-sites.xml")));
164                         Node metadataNode = placeHolder.importNode(xmlConfig.getDocumentElement(), true);
165                         providerNode.appendChild(metadataNode);
166
167                         Metadata metadata = new XMLMetadata(providerNode);
168
169                         EntityDescriptor entity = metadata.lookup("urn:mace:inqueue:example.edu");
170
171                         assertNotNull("Unable to find test provider", entity);
172                         assertEquals("Descriptor group is wrong.", entity.getEntitiesDescriptor().getName(), "urn:mace:inqueue");
173
174                         IDPSSODescriptor idp = entity.getIDPSSODescriptor(edu.internet2.middleware.shibboleth.common.XML.SHIB_NS);
175                         AttributeAuthorityDescriptor aa = entity.getAttributeAuthorityDescriptor(XML.SAML11_PROTOCOL_ENUM);
176                         SPSSODescriptor sp = entity.getSPSSODescriptor(XML.SAML11_PROTOCOL_ENUM);
177
178                         assertNotNull("Missing IdP provider role.", idp);
179                         assertNotNull("Missing AA provider role.", aa);
180                         assertNotNull("Missing SP provider role.", sp);
181
182                         assertEquals("Incorrect assertion consumer service location.", ((Endpoint) sp
183                                         .getAssertionConsumerServiceManager().getEndpoints().next()).getLocation(),
184                                         "https://wayf.internet2.edu/Shibboleth.shire");
185
186                         Iterator keys = sp.getKeyDescriptors();
187                         KeyDescriptor key = (KeyDescriptor) keys.next();
188                         assertNotNull("Incorrect attribute requester key parsing.", key);
189
190                         String[] control = new String[]{"wayf.internet2.edu"};
191                         String[] meta = new String[]{key.getKeyInfo().itemKeyName(0).getKeyName()};
192                         Arrays.sort(meta);
193                         Arrays.sort(control);
194                         assertTrue("Encountered unexpected key names", Arrays.equals(control, meta));
195                 } catch (Exception e) {
196                         fail("Failed to correctly load metadata: " + e);
197                 }
198         }
199
200     public void testExtensionSAMLXML() {
201
202         try {
203             Metadata metadata = new XMLMetadata(new File("data/metadata10.xml").toURL().toString());
204
205             EntityDescriptor entity = metadata.lookup("urn-x:testSP1");
206             assertNotNull("Unable to find test provider", entity);
207
208             AttributeRequesterDescriptor ar = entity.getAttributeRequesterDescriptor(XML.SAML11_PROTOCOL_ENUM);
209             assertNotNull("Missing AR provider role.", ar);
210             
211             Iterator formats = ar.getNameIDFormats();
212             assertTrue("Encountered unexpected NameIDFormat", formats.hasNext() && Constants.SHIB_NAMEID_FORMAT_URI.equals(formats.next()));
213         } catch (Exception e) {
214             fail("Failed to correctly load metadata: " + e);
215         }
216     }
217 }