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.MockFilterConfig;
21  
22  import org.springframework.context.ApplicationContext;
23  import org.springframework.context.support.ClassPathXmlApplicationContext;
24  
25  import org.springframework.mock.web.MockHttpServletRequest;
26  import org.springframework.mock.web.MockHttpServletResponse;
27  
28  import java.io.IOException;
29  
30  import javax.servlet.Filter;
31  import javax.servlet.FilterChain;
32  import javax.servlet.FilterConfig;
33  import javax.servlet.ServletException;
34  import javax.servlet.ServletRequest;
35  import javax.servlet.ServletResponse;
36  
37  
38  /**
39   * Tests {@link FilterToBeanProxy}.
40   *
41   * @author Ben Alex
42   * @version $Id: FilterToBeanProxyTests.java 1496 2006-05-23 13:38:33Z benalex $
43   */
44  public class FilterToBeanProxyTests extends TestCase {
45      //~ Constructors ===================================================================================================
46  
47      public FilterToBeanProxyTests() {
48          super();
49      }
50  
51      public FilterToBeanProxyTests(String arg0) {
52          super(arg0);
53      }
54  
55      //~ Methods ========================================================================================================
56  
57      private void executeFilterInContainerSimulator(FilterConfig filterConfig, Filter filter, ServletRequest request,
58          ServletResponse response, FilterChain filterChain)
59          throws ServletException, IOException {
60          filter.init(filterConfig);
61          filter.doFilter(request, response, filterChain);
62          filter.destroy();
63      }
64  
65      public static void main(String[] args) {
66          junit.textui.TestRunner.run(FilterToBeanProxyTests.class);
67      }
68  
69      public final void setUp() throws Exception {
70          super.setUp();
71      }
72  
73      public void testDetectsClassNotInClassLoader() throws Exception {
74          // Setup our filter
75          MockFilterConfig config = new MockFilterConfig();
76          config.setInitParmeter("targetClass", "net.sf.DOES.NOT.EXIST");
77  
78          FilterToBeanProxy filter = new MockFilterToBeanProxy("org/acegisecurity/util/filtertest-valid.xml");
79  
80          try {
81              filter.init(config);
82              fail("Should have thrown ServletException");
83          } catch (ServletException expected) {
84              assertEquals("Class of type net.sf.DOES.NOT.EXIST not found in classloader", expected.getMessage());
85          }
86      }
87  
88      public void testDetectsNeitherPropertyBeingSet() throws Exception {
89          // Setup our filter
90          MockFilterConfig config = new MockFilterConfig();
91  
92          FilterToBeanProxy filter = new MockFilterToBeanProxy("org/acegisecurity/util/filtertest-valid.xml");
93  
94          try {
95              filter.init(config);
96              fail("Should have thrown ServletException");
97          } catch (ServletException expected) {
98              assertEquals("targetClass or targetBean must be specified", expected.getMessage());
99          }
100     }
101 
102     public void testDetectsTargetBeanIsNotAFilter() throws Exception {
103         // Setup our filter
104         MockFilterConfig config = new MockFilterConfig();
105         config.setInitParmeter("targetClass", "org.acegisecurity.util.MockNotAFilter");
106 
107         FilterToBeanProxy filter = new MockFilterToBeanProxy("org/acegisecurity/util/filtertest-valid.xml");
108 
109         try {
110             filter.init(config);
111             fail("Should have thrown ServletException");
112         } catch (ServletException expected) {
113             assertEquals("Bean 'mockNotAFilter' does not implement javax.servlet.Filter", expected.getMessage());
114         }
115     }
116 
117     public void testDetectsTargetBeanNotInBeanContext()
118         throws Exception {
119         // Setup our filter
120         MockFilterConfig config = new MockFilterConfig();
121         config.setInitParmeter("targetBean", "WRONG_NAME");
122 
123         FilterToBeanProxy filter = new MockFilterToBeanProxy("org/acegisecurity/util/filtertest-valid.xml");
124 
125         try {
126             filter.init(config);
127             fail("Should have thrown ServletException");
128         } catch (ServletException expected) {
129             assertEquals("targetBean 'WRONG_NAME' not found in context", expected.getMessage());
130         }
131     }
132 
133     public void testDetectsTargetClassNotInBeanContext()
134         throws Exception {
135         // Setup our filter
136         MockFilterConfig config = new MockFilterConfig();
137         config.setInitParmeter("targetClass", "org.acegisecurity.util.FilterToBeanProxyTests");
138 
139         FilterToBeanProxy filter = new MockFilterToBeanProxy("org/acegisecurity/util/filtertest-valid.xml");
140 
141         try {
142             filter.init(config);
143             fail("Should have thrown ServletException");
144         } catch (ServletException expected) {
145             assertEquals("Bean context must contain at least one bean of type org.acegisecurity.util.FilterToBeanProxyTests",
146                 expected.getMessage());
147         }
148     }
149 
150     public void testIgnoresEmptyTargetBean() throws Exception {
151         // Setup our filter
152         MockFilterConfig config = new MockFilterConfig();
153         config.setInitParmeter("targetClass", "org.acegisecurity.util.MockFilter");
154         config.setInitParmeter("targetBean", "");
155 
156         // Setup our expectation that the filter chain will be invoked
157         MockFilterChain chain = new MockFilterChain(true);
158 
159         MockHttpServletResponse response = new MockHttpServletResponse();
160         MockHttpServletRequest request = new MockHttpServletRequest();
161 
162         FilterToBeanProxy filter = new MockFilterToBeanProxy("org/acegisecurity/util/filtertest-valid.xml");
163 
164         executeFilterInContainerSimulator(config, filter, request, response, chain);
165     }
166 
167     public void testNormalOperationWithLazyTrue() throws Exception {
168         // Setup our filter
169         MockFilterConfig config = new MockFilterConfig();
170         config.setInitParmeter("targetBean", "mockFilter");
171         config.setInitParmeter("init", "lazy");
172 
173         // Setup our expectation that the filter chain will be invoked
174         MockFilterChain chain = new MockFilterChain(true);
175 
176         MockHttpServletResponse response = new MockHttpServletResponse();
177         MockHttpServletRequest request = new MockHttpServletRequest();
178 
179         FilterToBeanProxy filter = new MockFilterToBeanProxy("org/acegisecurity/util/filtertest-valid.xml");
180 
181         executeFilterInContainerSimulator(config, filter, request, response, chain);
182     }
183 
184     public void testNormalOperationWithSpecificBeanName()
185         throws Exception {
186         // Setup our filter
187         MockFilterConfig config = new MockFilterConfig();
188         config.setInitParmeter("targetBean", "mockFilter");
189 
190         // Setup our expectation that the filter chain will be invoked
191         MockFilterChain chain = new MockFilterChain(true);
192 
193         MockHttpServletResponse response = new MockHttpServletResponse();
194         MockHttpServletRequest request = new MockHttpServletRequest();
195 
196         FilterToBeanProxy filter = new MockFilterToBeanProxy("org/acegisecurity/util/filtertest-valid.xml");
197 
198         executeFilterInContainerSimulator(config, filter, request, response, chain);
199     }
200 
201     public void testNormalOperationWithTargetClass() throws Exception {
202         // Setup our filter
203         MockFilterConfig config = new MockFilterConfig();
204         config.setInitParmeter("targetClass", "org.acegisecurity.util.MockFilter");
205 
206         // Setup our expectation that the filter chain will be invoked
207         MockFilterChain chain = new MockFilterChain(true);
208 
209         MockHttpServletResponse response = new MockHttpServletResponse();
210         MockHttpServletRequest request = new MockHttpServletRequest();
211 
212         FilterToBeanProxy filter = new MockFilterToBeanProxy("org/acegisecurity/util/filtertest-valid.xml");
213 
214         executeFilterInContainerSimulator(config, filter, request, response, chain);
215     }
216 
217     public void testNullDelegateDoesNotCauseNullPointerException()
218         throws Exception {
219         // Setup our filter
220         MockFilterConfig config = new MockFilterConfig();
221         config.setInitParmeter("targetBean", "aFilterThatDoesntExist");
222         config.setInitParmeter("init", "lazy");
223 
224         // Setup our expectation that the filter chain will be invoked
225         MockFilterChain chain = new MockFilterChain(true);
226 
227         MockHttpServletResponse response = new MockHttpServletResponse();
228         MockHttpServletRequest request = new MockHttpServletRequest();
229 
230         FilterToBeanProxy filter = new MockFilterToBeanProxy("org/acegisecurity/util/filtertest-valid.xml");
231 
232         // do not init (which would hapen if called .doFilter)
233         filter.destroy();
234     }
235 
236     //~ Inner Classes ==================================================================================================
237 
238     private class MockFilterToBeanProxy extends FilterToBeanProxy {
239         private String appContextLocation;
240 
241         public MockFilterToBeanProxy(String appContextLocation) {
242             this.appContextLocation = appContextLocation;
243         }
244 
245         private MockFilterToBeanProxy() {
246             super();
247         }
248 
249         protected ApplicationContext getContext(FilterConfig filterConfig) {
250             return new ClassPathXmlApplicationContext(appContextLocation);
251         }
252     }
253 }