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