1   /* Copyright 2004, 2005 Acegi Technology Pty Limited
2    *
3    * Licensed under the Apache License, Version 2.0 (the "License");
4    * you may not use this file except in compliance with the License.
5    * You may obtain a copy of the License at
6    *
7    *     http://www.apache.org/licenses/LICENSE-2.0
8    *
9    * Unless required by applicable law or agreed to in writing, software
10   * distributed under the License is distributed on an "AS IS" BASIS,
11   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12   * See the License for the specific language governing permissions and
13   * limitations under the License.
14   */
15  
16  package org.acegisecurity.providers.jaas;
17  
18  import junit.framework.TestCase;
19  
20  import org.acegisecurity.context.SecurityContextHolder;
21  import org.acegisecurity.context.SecurityContextImpl;
22  import org.acegisecurity.providers.UsernamePasswordAuthenticationToken;
23  
24  import java.util.HashSet;
25  import java.util.Map;
26  import java.util.HashMap;
27  
28  import javax.security.auth.Subject;
29  import javax.security.auth.login.LoginException;
30  
31  
32  /***
33   * Tests SecurityContextLoginModule
34   *
35   * @author Ray Krueger
36   */
37  public class SecurityContextLoginModuleTests extends TestCase {
38      //~ Instance fields ========================================================
39  
40      private SecurityContextLoginModule module = null;
41      private Subject subject = new Subject(false, new HashSet(), new HashSet(),
42              new HashSet());
43      private UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken("principal",
44              "credentials");
45  
46      //~ Methods ================================================================
47  
48      public void testAbort() throws Exception {
49          assertFalse("Should return false, no auth is set", module.abort());
50          SecurityContextHolder.getContext().setAuthentication(auth);
51          module.login();
52          module.commit();
53          assertTrue(module.abort());
54      }
55  
56      public void testLoginException() throws Exception {
57          try {
58              module.login();
59              fail(
60                  "LoginException expected, there is no Authentication in the SecurityContext");
61          } catch (LoginException e) {}
62      }
63  
64      public void testLoginSuccess() throws Exception {
65          SecurityContextHolder.getContext().setAuthentication(auth);
66          assertTrue("Login should succeed, there is an authentication set",
67              module.login());
68          assertTrue("The authentication is not null, this should return true",
69              module.commit());
70          assertTrue("Principals should contain the authentication",
71              subject.getPrincipals().contains(auth));
72      }
73  
74      public void testLogout() throws Exception {
75          SecurityContextHolder.getContext().setAuthentication(auth);
76          module.login();
77          assertTrue("Should return true as it succeeds", module.logout());
78          assertEquals("Authentication should be null", null,
79              module.getAuthentication());
80  
81          assertFalse("Principals should not contain the authentication after logout",
82              subject.getPrincipals().contains(auth));
83      }
84  
85      public void testNullAuthenticationInSecurityContext()
86          throws Exception {
87          try {
88              SecurityContextHolder.getContext().setAuthentication(null);
89              module.login();
90              fail("LoginException expected, the authentication is null in the SecurityContext");
91          } catch (Exception e) {
92          }
93      }
94  
95      public void testNullAuthenticationInSecurityContextIgnored()
96          throws Exception {
97          module = new SecurityContextLoginModule();
98  
99          Map options = new HashMap();
100         options.put("ignoreMissingAuthentication", "true");
101 
102         module.initialize(subject, null, null, options);
103         SecurityContextHolder.getContext().setAuthentication(null);
104         assertFalse("Should return false and ask to be ignored", module.login());
105     }
106 
107     public void testNullLogout() throws Exception {
108         assertFalse(module.logout());
109     }
110 
111     protected void setUp() throws Exception {
112         module = new SecurityContextLoginModule();
113         module.initialize(subject, null, null, null);
114         SecurityContextHolder.setContext(new SecurityContextImpl());
115     }
116 
117     protected void tearDown() throws Exception {
118         SecurityContextHolder.setContext(new SecurityContextImpl());
119         module = null;
120     }
121 }