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
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
41
42
43
44
45 public class ChannelDecisionManagerImplTests extends TestCase {
46
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
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 }