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.util;
17  
18  import junit.framework.TestCase;
19  
20  import org.acegisecurity.ConfigAttribute;
21  import org.acegisecurity.ConfigAttributeDefinition;
22  import org.acegisecurity.MockApplicationContext;
23  import org.acegisecurity.MockFilterConfig;
24  
25  import org.acegisecurity.intercept.web.FilterInvocationDefinitionSource;
26  import org.acegisecurity.intercept.web.MockFilterInvocationDefinitionSource;
27  import org.acegisecurity.intercept.web.PathBasedFilterInvocationDefinitionMap;
28  
29  import org.springframework.context.ApplicationContext;
30  import org.springframework.context.support.ClassPathXmlApplicationContext;
31  
32  import org.springframework.mock.web.MockHttpServletRequest;
33  import org.springframework.mock.web.MockHttpServletResponse;
34  
35  
36  /**
37   * Tests {@link FilterChainProxy}.
38   *
39   * @author Carlos Sanchez
40   * @author Ben Alex
41   * @version $Id: FilterChainProxyTests.java 1496 2006-05-23 13:38:33Z benalex $
42   */
43  public class FilterChainProxyTests extends TestCase {
44      //~ Constructors ===================================================================================================
45  
46      // ===========================================================
47      public FilterChainProxyTests() {
48          super();
49      }
50  
51      public FilterChainProxyTests(String arg0) {
52          super(arg0);
53      }
54  
55      //~ Methods ========================================================================================================
56  
57      // ================================================================
58      public static void main(String[] args) {
59          junit.textui.TestRunner.run(FilterChainProxyTests.class);
60      }
61  
62      public void testDetectsFilterInvocationDefinitionSourceThatDoesNotReturnAllConfigAttributes()
63          throws Exception {
64          FilterChainProxy filterChainProxy = new FilterChainProxy();
65          filterChainProxy.setApplicationContext(MockApplicationContext.getContext());
66          filterChainProxy.setFilterInvocationDefinitionSource(new MockFilterInvocationDefinitionSource(false, false));
67  
68          try {
69              filterChainProxy.afterPropertiesSet();
70              fail("Should have thrown IllegalArgumentException");
71          } catch (IllegalArgumentException expected) {
72              assertEquals("FilterChainProxy requires the FilterInvocationDefinitionSource to return a non-null response to getConfigAttributeDefinitions()",
73                  expected.getMessage());
74          }
75      }
76  
77      public void testDetectsIfConfigAttributeDoesNotReturnValueForGetAttributeMethod()
78          throws Exception {
79          FilterChainProxy filterChainProxy = new FilterChainProxy();
80          filterChainProxy.setApplicationContext(MockApplicationContext.getContext());
81  
82          ConfigAttributeDefinition cad = new ConfigAttributeDefinition();
83          cad.addConfigAttribute(new MockConfigAttribute());
84  
85          PathBasedFilterInvocationDefinitionMap fids = new PathBasedFilterInvocationDefinitionMap();
86          fids.addSecureUrl("/**", cad);
87  
88          filterChainProxy.setFilterInvocationDefinitionSource(fids);
89          filterChainProxy.afterPropertiesSet();
90  
91          try {
92              filterChainProxy.init(new MockFilterConfig());
93              fail("Should have thrown IllegalArgumentException");
94          } catch (IllegalArgumentException expected) {
95              assertTrue(expected.getMessage()
96                                 .endsWith("returned null to the getAttribute() method, which is invalid when used with FilterChainProxy"));
97          }
98      }
99  
100     public void testDetectsMissingFilterInvocationDefinitionSource()
101         throws Exception {
102         FilterChainProxy filterChainProxy = new FilterChainProxy();
103         filterChainProxy.setApplicationContext(MockApplicationContext.getContext());
104 
105         try {
106             filterChainProxy.afterPropertiesSet();
107             fail("Should have thrown IllegalArgumentException");
108         } catch (IllegalArgumentException expected) {
109             assertEquals("filterInvocationDefinitionSource must be specified", expected.getMessage());
110         }
111     }
112 
113     public void testDoNotFilter() throws Exception {
114         ApplicationContext appCtx = new ClassPathXmlApplicationContext("org/acegisecurity/util/filtertest-valid.xml");
115         FilterChainProxy filterChainProxy = (FilterChainProxy) appCtx.getBean("filterChain", FilterChainProxy.class);
116         MockFilter filter = (MockFilter) appCtx.getBean("mockFilter", MockFilter.class);
117 
118         MockHttpServletRequest request = new MockHttpServletRequest();
119         request.setServletPath("/do/not/filter/somefile.html");
120 
121         MockHttpServletResponse response = new MockHttpServletResponse();
122         MockFilterChain chain = new MockFilterChain(true);
123 
124         filterChainProxy.doFilter(request, response, chain);
125         assertFalse(filter.isWasInitialized());
126         assertFalse(filter.isWasDoFiltered());
127         assertFalse(filter.isWasDestroyed());
128     }
129 
130     public void testGettersSetters() {
131         FilterChainProxy filterChainProxy = new FilterChainProxy();
132         FilterInvocationDefinitionSource fids = new MockFilterInvocationDefinitionSource(false, false);
133         filterChainProxy.setFilterInvocationDefinitionSource(fids);
134         assertEquals(fids, filterChainProxy.getFilterInvocationDefinitionSource());
135     }
136 
137     public void testNormalOperation() throws Exception {
138         ApplicationContext appCtx = new ClassPathXmlApplicationContext("org/acegisecurity/util/filtertest-valid.xml");
139         FilterChainProxy filterChainProxy = (FilterChainProxy) appCtx.getBean("filterChain", FilterChainProxy.class);
140         MockFilter filter = (MockFilter) appCtx.getBean("mockFilter", MockFilter.class);
141         assertFalse(filter.isWasInitialized());
142         assertFalse(filter.isWasDoFiltered());
143         assertFalse(filter.isWasDestroyed());
144 
145         filterChainProxy.init(new MockFilterConfig());
146         assertTrue(filter.isWasInitialized());
147         assertFalse(filter.isWasDoFiltered());
148         assertFalse(filter.isWasDestroyed());
149 
150         MockHttpServletRequest request = new MockHttpServletRequest();
151         request.setServletPath("/foo/secure/super/somefile.html");
152 
153         MockHttpServletResponse response = new MockHttpServletResponse();
154         MockFilterChain chain = new MockFilterChain(true);
155 
156         filterChainProxy.doFilter(request, response, chain);
157         assertTrue(filter.isWasInitialized());
158         assertTrue(filter.isWasDoFiltered());
159         assertFalse(filter.isWasDestroyed());
160 
161         request.setServletPath("/a/path/which/doesnt/match/any/filter.html");
162         filterChainProxy.doFilter(request, response, chain);
163 
164         filterChainProxy.destroy();
165         assertTrue(filter.isWasInitialized());
166         assertTrue(filter.isWasDoFiltered());
167         assertTrue(filter.isWasDestroyed());
168     }
169 
170     //~ Inner Classes ==================================================================================================
171 
172     private class MockConfigAttribute implements ConfigAttribute {
173         public String getAttribute() {
174             return null;
175         }
176     }
177 }