New structure to JUnit integration test to simplify Test files
[java-idp.git] / tests / edu / internet2 / middleware / shibboleth / integration / IntegrationTest.java
1 /*
2  * Copyright [2005] [University Corporation for Advanced Internet Development, Inc.]
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package edu.internet2.middleware.shibboleth.integration;
18
19 import java.util.Enumeration;
20
21 import javax.naming.directory.Attributes;
22 import javax.naming.directory.BasicAttribute;
23 import javax.servlet.http.HttpServletRequest;
24
25 import junit.framework.TestCase;
26
27 import org.apache.commons.codec.binary.Base64;
28 import org.apache.log4j.Level;
29 import org.opensaml.SAMLException;
30
31 import edu.internet2.middleware.shibboleth.idp.provider.ShibbolethV1SSOHandler;
32 import edu.internet2.middleware.shibboleth.resource.FilterUtil;
33 import edu.internet2.middleware.shibboleth.resource.FilterSupport.NewSessionData;
34 import edu.internet2.middleware.shibboleth.runner.ShibbolethRunner;
35 import edu.internet2.middleware.shibboleth.serviceprovider.AssertionConsumerServlet;
36 import edu.internet2.middleware.shibboleth.serviceprovider.ServiceProviderContext;
37 import edu.internet2.middleware.shibboleth.serviceprovider.Session;
38 import edu.internet2.middleware.shibboleth.serviceprovider.SessionManager;
39
40 /**
41  * A JUnit test case that exercises the IdP, SP, and Filter
42  * @author Howard Gilbert
43  */
44 public class IntegrationTest extends TestCase {
45     
46     ShibbolethRunner runner;
47     ShibbolethRunner.IdpTestContext idp;
48     ShibbolethRunner.AuthenticationFilterContext filter;
49     
50     
51     
52     protected void setUp() throws Exception {
53         super.setUp();
54
55         // Static call to set Log4J appenders and levels
56         ShibbolethRunner.loglevel = Level.INFO;
57         ShibbolethRunner.setupLogging();
58         
59         // Create the overall testing framework
60         runner = new ShibbolethRunner();
61         
62         // Initialize the Idp, create the Mockrunner
63         // objects to do SSO, AA, and Artifact calls, and
64         // configure SAML to use the MockHTTPBindingProvider
65         runner.setIdpConfigFileName("/basicIdpHome/idpconfig.xml");
66         idp = runner.getIdp();
67         
68         // Initialize the SP with the default config file.
69         runner.setSpConfigFileName("/basicSpHome/spconfig.xml");
70         runner.initializeSP();
71         
72         // Initialize the Filter and create its separate
73         // Mockrunner simulated context. 
74         filter= runner.getFilter();
75         
76         // Make changes to Filter init-param values before setUp.
77         filter.setUp();
78         
79         // Create attributes to be returned from the IdP
80         // This could be done in each test, just as long as it
81         // is done before the SSO.
82         Attributes attributes = runner.getAttributesCollection();
83         attributes.put(new BasicAttribute("eduPersonAffiliation", "member"));
84         attributes.put(new BasicAttribute("title", "clown"));
85         attributes.put(new BasicAttribute("givenName", "bozo"));
86         attributes.put(new BasicAttribute("surname", "Clown"));
87     }
88     
89     
90     public void testAttributePush() throws SAMLException {
91         
92         // Set the URL suffix that triggers SSO processing
93         idp.setRequestUrls("SSO");
94         
95         // Add the WAYF/RM parameters
96         idp.testModule.addRequestParameter("target", "https://nonsense");
97         idp.testModule.addRequestParameter("shire","https://sp.example.org/Shibboleth.sso/SAML/POST");
98         idp.testModule.addRequestParameter("providerId", "https://sp.example.org/shibboleth");
99         
100         // Add a userid, as if provided by Basic Authentication or a Filter
101         idp.request.setRemoteUser("BozoTClown");
102         
103         // Force Attribute Push
104         ShibbolethV1SSOHandler.pushAttributeDefault=true;
105         
106         // Call the IdP 
107         idp.testModule.doGet();
108         
109         /*
110          * Sanity check: The IdP normally ends by transferring control to a
111          * JSP page that generates the FORM. However, we have not set up
112          * Mockrunner to perform the transfer, because the form would just
113          * create parsing work. Rather, the following code extracts the
114          * information from the request attributes that the JSP would have
115          * used as its source.
116          */
117         String bin64assertion = (String) idp.request.getAttribute("assertion");
118         String assertion = new String(Base64.decodeBase64(bin64assertion.getBytes()));
119         String handlerURL = (String) idp.request.getAttribute("shire");
120         String targetURL = (String) idp.request.getAttribute("target");
121         
122         
123         // Build the parameter for Session creation
124         NewSessionData data = new NewSessionData();
125         FilterUtil.sessionDataFromRequest(data,idp.request);
126         data.applicationId="default";
127         data.handlerURL=handlerURL;
128         data.providerId="https://sp.example.org/shibboleth";
129         
130         // Create the session, extract pushed Attributes 
131         String sessionId = AssertionConsumerServlet.createSessionFromData(data);
132         
133         // Now get what was created in case you want to test it.
134         ServiceProviderContext context   = ServiceProviderContext.getInstance();
135         Session session = context.getSessionManager().findSession(sessionId, "default");
136         
137         // Pass the SessionId to the Filter, let it fetch the attributes
138         filter.testModule.addRequestParameter("ShibbolethSessionId", sessionId);
139         filter.setRequestUrls("test.txt");
140         filter.testModule.doFilter();
141         
142         /*
143          * Sanity Check: doFilter runs just the Filter itself. On 
144          * input there was a Request and Response. When done, there
145          * will be a replacement Request object created by the Filter
146          * wrapping the original request and adding features.
147          */
148         
149         // Get the Request Wrapper object created by the Filter
150         HttpServletRequest filteredRequest = 
151             (HttpServletRequest) filter.testModule.getFilteredRequest();
152         
153         // Now do something that uses Filter supplied logic
154         Enumeration headerNames = filteredRequest.getHeaderNames();
155         while (headerNames.hasMoreElements()) {
156             String name = (String) headerNames.nextElement();
157             String value = (String) filteredRequest.getHeader(name);
158             System.out.println(name+ "-"+value );
159         }
160         
161         
162     }
163     
164     public void testAttributeQuery() throws SAMLException {
165         
166         // Set the URL suffix that triggers SSO processing
167         idp.setRequestUrls("SSO");
168         
169         // Add the WAYF/RM parameters
170         idp.testModule.addRequestParameter("target", "https://nonsense");
171         idp.testModule.addRequestParameter("shire","https://sp.example.org/Shibboleth.sso/SAML/POST");
172         idp.testModule.addRequestParameter("providerId", "https://sp.example.org/shibboleth");
173         
174         // Add a userid, as if provided by Basic Authentication or a Filter
175         idp.request.setRemoteUser("BozoTClown");
176         
177         // Block Attribute Push
178         ShibbolethV1SSOHandler.pushAttributeDefault=false;
179         
180         // Call the IdP 
181         idp.testModule.doGet();
182         
183         String bin64assertion = (String) idp.request.getAttribute("assertion");
184         String assertion = new String(Base64.decodeBase64(bin64assertion.getBytes()));
185         String handlerURL = (String) idp.request.getAttribute("shire");
186         String targetURL = (String) idp.request.getAttribute("target");
187         
188         
189         // Build the parameter for Session creation
190         NewSessionData data = new NewSessionData();
191         FilterUtil.sessionDataFromRequest(data,idp.request);
192         data.applicationId="default";
193         data.handlerURL=handlerURL;
194         data.providerId="https://sp.example.org/shibboleth";
195         
196         // Create the Session
197         // Internally an AA Query will fetch the attributes through the 
198         // MockHTTPBindingProvider
199         String sessionId = AssertionConsumerServlet.createSessionFromData(data);
200         
201         
202         // Now get what was created in case you want to test it.
203         ServiceProviderContext context   = ServiceProviderContext.getInstance();
204         Session session = context.getSessionManager().findSession(sessionId, "default");
205         StringBuffer buffer = SessionManager.dumpAttributes(session);
206         System.out.println(buffer.toString());
207         
208         // Pass the SessionId to the Filter, let it fetch the attributes
209         filter.testModule.addRequestParameter("ShibbolethSessionId", sessionId);
210         filter.setRequestUrls("test.txt"); // need any URL
211         filter.testModule.doFilter();
212         
213         // Get the Request Wrapper object created by the Filter
214         HttpServletRequest filteredRequest = (HttpServletRequest) filter.testModule.getFilteredRequest();
215         
216         // Now do something that uses Filter supplied logic
217         Enumeration headerNames = filteredRequest.getHeaderNames();
218         while (headerNames.hasMoreElements()) {
219             String name = (String) headerNames.nextElement();
220             String value = (String) filteredRequest.getHeader(name);
221             System.out.println(name+ "-"+value );
222         }
223     }
224     
225     
226 }