1
2
3
4
5
6
7
8
9
10
11
12
13
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
38
39
40
41
42
43 public class FilterChainProxyTests extends TestCase {
44
45
46
47 public FilterChainProxyTests() {
48 super();
49 }
50
51 public FilterChainProxyTests(String arg0) {
52 super(arg0);
53 }
54
55
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
171
172 private class MockConfigAttribute implements ConfigAttribute {
173 public String getAttribute() {
174 return null;
175 }
176 }
177 }