1   /* Copyright 2004, 2005, 2006 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.securechannel;
17  
18  import junit.framework.TestCase;
19  
20  import org.acegisecurity.ConfigAttribute;
21  import org.acegisecurity.ConfigAttributeDefinition;
22  import org.acegisecurity.MockFilterChain;
23  import org.acegisecurity.SecurityConfig;
24  
25  import org.acegisecurity.intercept.web.FilterInvocation;
26  
27  import org.springframework.mock.web.MockHttpServletRequest;
28  import org.springframework.mock.web.MockHttpServletResponse;
29  
30  import java.io.IOException;
31  
32  import java.util.Iterator;
33  import java.util.List;
34  import java.util.Vector;
35  
36  import javax.servlet.ServletException;
37  
38  
39  /**
40   * Tests {@link ChannelDecisionManagerImpl}.
41   *
42   * @author Ben Alex
43   * @version $Id: ChannelDecisionManagerImplTests.java 1678 2006-09-15 06:27:45Z benalex $
44   */
45  public class ChannelDecisionManagerImplTests extends TestCase {
46      //~ Methods ========================================================================================================
47  
48      public static void main(String[] args) {
49          junit.textui.TestRunner.run(ChannelDecisionManagerImplTests.class);
50      }
51  
52      public final void setUp() throws Exception {
53          super.setUp();
54      }
55  
56      public void testCannotSetEmptyChannelProcessorsList()
57          throws Exception {
58          ChannelDecisionManagerImpl cdm = new ChannelDecisionManagerImpl();
59  
60          try {
61              cdm.setChannelProcessors(new Vector());
62              fail("Should have thrown IllegalArgumentException");
63          } catch (IllegalArgumentException expected) {
64              assertEquals("A list of ChannelProcessors is required", expected.getMessage());
65          }
66      }
67  
68      public void testCannotSetIncorrectObjectTypesIntoChannelProcessorsList()
69          throws Exception {
70          ChannelDecisionManagerImpl cdm = new ChannelDecisionManagerImpl();
71          List list = new Vector();
72          list.add("THIS IS NOT A CHANNELPROCESSOR");
73  
74          try {
75              cdm.setChannelProcessors(list);
76              fail("Should have thrown IllegalArgumentException");
77          } catch (IllegalArgumentException expected) {
78              assertTrue(true);
79          }
80      }
81  
82      public void testCannotSetNullChannelProcessorsList()
83          throws Exception {
84          ChannelDecisionManagerImpl cdm = new ChannelDecisionManagerImpl();
85  
86          try {
87              cdm.setChannelProcessors(null);
88              fail("Should have thrown IllegalArgumentException");
89          } catch (IllegalArgumentException expected) {
90              assertEquals("A list of ChannelProcessors is required", expected.getMessage());
91          }
92      }
93  
94      public void testDecideIsOperational() throws Exception {
95          ChannelDecisionManagerImpl cdm = new ChannelDecisionManagerImpl();
96          MockChannelProcessor cpXyz = new MockChannelProcessor("xyz", false);
97          MockChannelProcessor cpAbc = new MockChannelProcessor("abc", true);
98          List list = new Vector();
99          list.add(cpXyz);
100         list.add(cpAbc);
101         cdm.setChannelProcessors(list);
102         cdm.afterPropertiesSet();
103 
104         MockHttpServletRequest request = new MockHttpServletRequest();
105         MockHttpServletResponse response = new MockHttpServletResponse();
106         MockFilterChain chain = new MockFilterChain();
107         FilterInvocation fi = new FilterInvocation(request, response, chain);
108 
109         ConfigAttributeDefinition cad = new ConfigAttributeDefinition();
110         cad.addConfigAttribute(new SecurityConfig("xyz"));
111 
112         cdm.decide(fi, cad);
113         assertTrue(fi.getResponse().isCommitted());
114     }
115 
116     public void testDecideIteratesAllProcessorsIfNoneCommitAResponse()
117         throws Exception {
118         ChannelDecisionManagerImpl cdm = new ChannelDecisionManagerImpl();
119         MockChannelProcessor cpXyz = new MockChannelProcessor("xyz", false);
120         MockChannelProcessor cpAbc = new MockChannelProcessor("abc", false);
121         List list = new Vector();
122         list.add(cpXyz);
123         list.add(cpAbc);
124         cdm.setChannelProcessors(list);
125         cdm.afterPropertiesSet();
126 
127         MockHttpServletRequest request = new MockHttpServletRequest();
128         MockHttpServletResponse response = new MockHttpServletResponse();
129         MockFilterChain chain = new MockFilterChain();
130         FilterInvocation fi = new FilterInvocation(request, response, chain);
131 
132         ConfigAttributeDefinition cad = new ConfigAttributeDefinition();
133         cad.addConfigAttribute(new SecurityConfig("SOME_ATTRIBUTE_NO_PROCESSORS_SUPPORT"));
134 
135         cdm.decide(fi, cad);
136         assertFalse(fi.getResponse().isCommitted());
137     }
138 
139     public void testDelegatesSupports() throws Exception {
140         ChannelDecisionManagerImpl cdm = new ChannelDecisionManagerImpl();
141         MockChannelProcessor cpXyz = new MockChannelProcessor("xyz", false);
142         MockChannelProcessor cpAbc = new MockChannelProcessor("abc", false);
143         List list = new Vector();
144         list.add(cpXyz);
145         list.add(cpAbc);
146         cdm.setChannelProcessors(list);
147         cdm.afterPropertiesSet();
148 
149         assertTrue(cdm.supports(new SecurityConfig("xyz")));
150         assertTrue(cdm.supports(new SecurityConfig("abc")));
151         assertFalse(cdm.supports(new SecurityConfig("UNSUPPORTED")));
152     }
153 
154     public void testGettersSetters() {
155         ChannelDecisionManagerImpl cdm = new ChannelDecisionManagerImpl();
156         assertNull(cdm.getChannelProcessors());
157 
158         MockChannelProcessor cpXyz = new MockChannelProcessor("xyz", false);
159         MockChannelProcessor cpAbc = new MockChannelProcessor("abc", false);
160         List list = new Vector();
161         list.add(cpXyz);
162         list.add(cpAbc);
163         cdm.setChannelProcessors(list);
164 
165         assertEquals(list, cdm.getChannelProcessors());
166     }
167 
168     public void testStartupFailsWithEmptyChannelProcessorsList()
169         throws Exception {
170         ChannelDecisionManagerImpl cdm = new ChannelDecisionManagerImpl();
171 
172         try {
173             cdm.afterPropertiesSet();
174             fail("Should have thrown IllegalArgumentException");
175         } catch (IllegalArgumentException expected) {
176             assertEquals("A list of ChannelProcessors is required", expected.getMessage());
177         }
178     }
179 
180     //~ Inner Classes ==================================================================================================
181 
182     private class MockChannelProcessor implements ChannelProcessor {
183         private String configAttribute;
184         private boolean failIfCalled;
185 
186         public MockChannelProcessor(String configAttribute, boolean failIfCalled) {
187             this.configAttribute = configAttribute;
188             this.failIfCalled = failIfCalled;
189         }
190 
191         private MockChannelProcessor() {
192             super();
193         }
194 
195         public void decide(FilterInvocation invocation, ConfigAttributeDefinition config)
196             throws IOException, ServletException {
197             Iterator iter = config.getConfigAttributes();
198 
199             if (failIfCalled) {
200                 fail("Should not have called this channel processor: " + configAttribute);
201             }
202 
203             while (iter.hasNext()) {
204                 ConfigAttribute attr = (ConfigAttribute) iter.next();
205 
206                 if (attr.getAttribute().equals(configAttribute)) {
207                     invocation.getHttpResponse().sendRedirect("/redirected");
208 
209                     return;
210                 }
211             }
212         }
213 
214         public boolean supports(ConfigAttribute attribute) {
215             if (attribute.getAttribute().equals(configAttribute)) {
216                 return true;
217             } else {
218                 return false;
219             }
220         }
221     }
222 }