001: /* Copyright 2004, 2005, 2006 Acegi Technology Pty Limited
002: *
003: * Licensed under the Apache License, Version 2.0 (the "License");
004: * you may not use this file except in compliance with the License.
005: * You may obtain a copy of the License at
006: *
007: * http://www.apache.org/licenses/LICENSE-2.0
008: *
009: * Unless required by applicable law or agreed to in writing, software
010: * distributed under the License is distributed on an "AS IS" BASIS,
011: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012: * See the License for the specific language governing permissions and
013: * limitations under the License.
014: */
015:
016: package org.acegisecurity.intercept.web;
017:
018: import junit.framework.TestCase;
019:
020: import org.acegisecurity.ConfigAttributeDefinition;
021: import org.acegisecurity.MockFilterChain;
022: import org.acegisecurity.SecurityConfig;
023:
024: import org.springframework.mock.web.MockHttpServletRequest;
025: import org.springframework.mock.web.MockHttpServletResponse;
026:
027: import java.util.Iterator;
028:
029: /**
030: * Tests {@link FilterInvocationDefinitionSourceEditor} and its associated default {@link
031: * RegExpBasedFilterInvocationDefinitionMap}.
032: *
033: * @author Ben Alex
034: * @version $Id: FilterInvocationDefinitionSourceEditorTests.java 1748 2006-11-14 20:55:24Z benalex $
035: */
036: public class FilterInvocationDefinitionSourceEditorTests extends
037: TestCase {
038: //~ Constructors ===================================================================================================
039:
040: public FilterInvocationDefinitionSourceEditorTests() {
041: super ();
042: }
043:
044: public FilterInvocationDefinitionSourceEditorTests(String arg0) {
045: super (arg0);
046: }
047:
048: //~ Methods ========================================================================================================
049:
050: public static void main(String[] args) {
051: junit.textui.TestRunner
052: .run(FilterInvocationDefinitionSourceEditorTests.class);
053: }
054:
055: public final void setUp() throws Exception {
056: super .setUp();
057: }
058:
059: public void testConvertUrlToLowercaseDefaultSettingUnchangedByEditor() {
060: FilterInvocationDefinitionSourceEditor editor = new FilterInvocationDefinitionSourceEditor();
061: editor
062: .setAsText("\\A/secure/super.*\\Z=ROLE_WE_DONT_HAVE\r\n\\A/secure/.*\\Z=ROLE_SUPERVISOR,ROLE_TELLER");
063:
064: RegExpBasedFilterInvocationDefinitionMap map = (RegExpBasedFilterInvocationDefinitionMap) editor
065: .getValue();
066: assertFalse(map.isConvertUrlToLowercaseBeforeComparison());
067: }
068:
069: public void testConvertUrlToLowercaseDetectsUppercaseEntries() {
070: FilterInvocationDefinitionSourceEditor editor = new FilterInvocationDefinitionSourceEditor();
071:
072: try {
073: editor
074: .setAsText("CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON\r\nPATTERN_TYPE_APACHE_ANT\r\n\\/secUre/super/**=ROLE_WE_DONT_HAVE");
075: fail("Should have thrown IllegalArgumentException");
076: } catch (IllegalArgumentException expected) {
077: assertTrue(expected
078: .getMessage()
079: .lastIndexOf(
080: "you have specified an uppercase character in line") != -1);
081: }
082: }
083:
084: public void testConvertUrlToLowercaseSettingApplied() {
085: FilterInvocationDefinitionSourceEditor editor = new FilterInvocationDefinitionSourceEditor();
086: editor
087: .setAsText("CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON\r\n\\A/secure/super.*\\Z=ROLE_WE_DONT_HAVE\r\n\\A/secure/.*\\Z=ROLE_SUPERVISOR,ROLE_TELLER");
088:
089: RegExpBasedFilterInvocationDefinitionMap map = (RegExpBasedFilterInvocationDefinitionMap) editor
090: .getValue();
091: assertTrue(map.isConvertUrlToLowercaseBeforeComparison());
092: }
093:
094: public void testDefaultIsRegularExpression() {
095: FilterInvocationDefinitionSourceEditor editor = new FilterInvocationDefinitionSourceEditor();
096: editor
097: .setAsText("\\A/secure/super.*\\Z=ROLE_WE_DONT_HAVE\r\n\\A/secure/.*\\Z=ROLE_SUPERVISOR,ROLE_TELLER");
098:
099: FilterInvocationDefinitionMap map = (FilterInvocationDefinitionMap) editor
100: .getValue();
101: assertTrue(map instanceof RegExpBasedFilterInvocationDefinitionMap);
102: }
103:
104: public void testDetectsDuplicateDirectivesOnSameLineSituation1() {
105: FilterInvocationDefinitionSourceEditor editor = new FilterInvocationDefinitionSourceEditor();
106:
107: try {
108: editor
109: .setAsText("CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON PATTERN_TYPE_APACHE_ANT\r\n\\/secure/super/**=ROLE_WE_DONT_HAVE");
110: fail("Should have thrown IllegalArgumentException");
111: } catch (IllegalArgumentException expected) {
112: assertTrue(expected.getMessage().lastIndexOf(
113: "Line appears to be malformed") != -1);
114: }
115: }
116:
117: public void testDetectsDuplicateDirectivesOnSameLineSituation2() {
118: FilterInvocationDefinitionSourceEditor editor = new FilterInvocationDefinitionSourceEditor();
119:
120: try {
121: editor
122: .setAsText("CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON\r\nPATTERN_TYPE_APACHE_ANT /secure/super/**=ROLE_WE_DONT_HAVE");
123: fail("Should have thrown IllegalArgumentException");
124: } catch (IllegalArgumentException expected) {
125: assertTrue(expected.getMessage().lastIndexOf(
126: "Line appears to be malformed") != -1);
127: }
128: }
129:
130: public void testDetectsDuplicateDirectivesOnSameLineSituation3() {
131: FilterInvocationDefinitionSourceEditor editor = new FilterInvocationDefinitionSourceEditor();
132:
133: try {
134: editor
135: .setAsText("PATTERN_TYPE_APACHE_ANT\r\nCONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON /secure/super/**=ROLE_WE_DONT_HAVE");
136: fail("Should have thrown IllegalArgumentException");
137: } catch (IllegalArgumentException expected) {
138: assertTrue(expected.getMessage().lastIndexOf(
139: "Line appears to be malformed") != -1);
140: }
141: }
142:
143: public void testEmptyStringReturnsEmptyMap() {
144: FilterInvocationDefinitionSourceEditor editor = new FilterInvocationDefinitionSourceEditor();
145: editor.setAsText("");
146:
147: RegExpBasedFilterInvocationDefinitionMap map = (RegExpBasedFilterInvocationDefinitionMap) editor
148: .getValue();
149: assertEquals(0, map.getMapSize());
150: }
151:
152: public void testInvalidRegularExpressionsDetected()
153: throws Exception {
154: FilterInvocationDefinitionSourceEditor editor = new FilterInvocationDefinitionSourceEditor();
155:
156: try {
157: editor.setAsText("*=SOME_ROLE");
158: } catch (IllegalArgumentException expected) {
159: assertEquals("Malformed regular expression: *", expected
160: .getMessage());
161: }
162: }
163:
164: public void testIterator() {
165: FilterInvocationDefinitionSourceEditor editor = new FilterInvocationDefinitionSourceEditor();
166: editor
167: .setAsText("\\A/secure/super.*\\Z=ROLE_WE_DONT_HAVE\r\n\\A/secure/.*\\Z=ROLE_SUPERVISOR,ROLE_TELLER");
168:
169: RegExpBasedFilterInvocationDefinitionMap map = (RegExpBasedFilterInvocationDefinitionMap) editor
170: .getValue();
171: Iterator iter = map.getConfigAttributeDefinitions();
172: int counter = 0;
173:
174: while (iter.hasNext()) {
175: iter.next();
176: counter++;
177: }
178:
179: assertEquals(2, counter);
180: }
181:
182: public void testMapReturnsNullWhenNoMatchFound() throws Exception {
183: FilterInvocationDefinitionSourceEditor editor = new FilterInvocationDefinitionSourceEditor();
184: editor
185: .setAsText("\\A/secure/super.*\\Z=ROLE_WE_DONT_HAVE,ANOTHER_ROLE");
186:
187: RegExpBasedFilterInvocationDefinitionMap map = (RegExpBasedFilterInvocationDefinitionMap) editor
188: .getValue();
189:
190: MockHttpServletRequest httpRequest = new MockHttpServletRequest(
191: null, null);
192: httpRequest
193: .setServletPath("/totally/different/path/index.html");
194:
195: ConfigAttributeDefinition returned = map
196: .getAttributes(new FilterInvocation(httpRequest,
197: new MockHttpServletResponse(),
198: new MockFilterChain()));
199:
200: assertEquals(null, returned);
201: }
202:
203: public void testMultiUrlParsing() {
204: FilterInvocationDefinitionSourceEditor editor = new FilterInvocationDefinitionSourceEditor();
205: editor
206: .setAsText("\\A/secure/super.*\\Z=ROLE_WE_DONT_HAVE\r\n\\A/secure/.*\\Z=ROLE_SUPERVISOR,ROLE_TELLER");
207:
208: RegExpBasedFilterInvocationDefinitionMap map = (RegExpBasedFilterInvocationDefinitionMap) editor
209: .getValue();
210: assertEquals(2, map.getMapSize());
211: }
212:
213: public void testNoArgConstructorDoesntExist() {
214: Class clazz = RegExpBasedFilterInvocationDefinitionMap.EntryHolder.class;
215:
216: try {
217: clazz.getDeclaredConstructor((Class[]) null);
218: fail("Should have thrown NoSuchMethodException");
219: } catch (NoSuchMethodException expected) {
220: assertTrue(true);
221: }
222: }
223:
224: public void testNullReturnsEmptyMap() {
225: FilterInvocationDefinitionSourceEditor editor = new FilterInvocationDefinitionSourceEditor();
226: editor.setAsText(null);
227:
228: RegExpBasedFilterInvocationDefinitionMap map = (RegExpBasedFilterInvocationDefinitionMap) editor
229: .getValue();
230: assertEquals(0, map.getMapSize());
231: }
232:
233: public void testOrderOfEntriesIsPreservedOrderA() {
234: FilterInvocationDefinitionSourceEditor editor = new FilterInvocationDefinitionSourceEditor();
235: editor
236: .setAsText("\\A/secure/super.*\\Z=ROLE_WE_DONT_HAVE,ANOTHER_ROLE\r\n\\A/secure/.*\\Z=ROLE_SUPERVISOR,ROLE_TELLER");
237:
238: RegExpBasedFilterInvocationDefinitionMap map = (RegExpBasedFilterInvocationDefinitionMap) editor
239: .getValue();
240:
241: // Test ensures we match the first entry, not the second
242: MockHttpServletRequest httpRequest = new MockHttpServletRequest(
243: null, null);
244: httpRequest.setServletPath("/secure/super/very_secret.html");
245:
246: ConfigAttributeDefinition returned = map
247: .getAttributes(new FilterInvocation(httpRequest,
248: new MockHttpServletResponse(),
249: new MockFilterChain()));
250:
251: ConfigAttributeDefinition expected = new ConfigAttributeDefinition();
252: expected.addConfigAttribute(new SecurityConfig(
253: "ROLE_WE_DONT_HAVE"));
254: expected.addConfigAttribute(new SecurityConfig("ANOTHER_ROLE"));
255:
256: assertEquals(expected, returned);
257: }
258:
259: public void testOrderOfEntriesIsPreservedOrderB() {
260: FilterInvocationDefinitionSourceEditor editor = new FilterInvocationDefinitionSourceEditor();
261: editor
262: .setAsText("\\A/secure/.*\\Z=ROLE_SUPERVISOR,ROLE_TELLER\r\n\\A/secure/super.*\\Z=ROLE_WE_DONT_HAVE,ANOTHER_ROLE");
263:
264: RegExpBasedFilterInvocationDefinitionMap map = (RegExpBasedFilterInvocationDefinitionMap) editor
265: .getValue();
266:
267: MockHttpServletRequest httpRequest = new MockHttpServletRequest(
268: null, null);
269: httpRequest.setServletPath("/secure/super/very_secret.html");
270:
271: ConfigAttributeDefinition returned = map
272: .getAttributes(new FilterInvocation(httpRequest,
273: new MockHttpServletResponse(),
274: new MockFilterChain()));
275:
276: ConfigAttributeDefinition expected = new ConfigAttributeDefinition();
277: expected.addConfigAttribute(new SecurityConfig(
278: "ROLE_SUPERVISOR"));
279: expected.addConfigAttribute(new SecurityConfig("ROLE_TELLER"));
280:
281: assertEquals(expected, returned);
282: }
283:
284: public void testSingleUrlParsingWithRegularExpressions()
285: throws Exception {
286: FilterInvocationDefinitionSourceEditor editor = new FilterInvocationDefinitionSourceEditor();
287: editor
288: .setAsText("\\A/secure/super.*\\Z=ROLE_WE_DONT_HAVE,ANOTHER_ROLE");
289:
290: RegExpBasedFilterInvocationDefinitionMap map = (RegExpBasedFilterInvocationDefinitionMap) editor
291: .getValue();
292:
293: MockHttpServletRequest httpRequest = new MockHttpServletRequest(
294: null, null);
295: httpRequest.setServletPath("/secure/super/very_secret.html");
296:
297: ConfigAttributeDefinition returned = map
298: .getAttributes(new FilterInvocation(httpRequest,
299: new MockHttpServletResponse(),
300: new MockFilterChain()));
301:
302: ConfigAttributeDefinition expected = new ConfigAttributeDefinition();
303: expected.addConfigAttribute(new SecurityConfig(
304: "ROLE_WE_DONT_HAVE"));
305: expected.addConfigAttribute(new SecurityConfig("ANOTHER_ROLE"));
306:
307: assertEquals(expected, returned);
308: }
309:
310: public void testSingleUrlParsingWithAntPaths() throws Exception {
311: FilterInvocationDefinitionSourceEditor editor = new FilterInvocationDefinitionSourceEditor();
312: editor
313: .setAsText("PATTERN_TYPE_APACHE_ANT\r\n/secure/super/**=ROLE_WE_DONT_HAVE,ANOTHER_ROLE");
314:
315: PathBasedFilterInvocationDefinitionMap map = (PathBasedFilterInvocationDefinitionMap) editor
316: .getValue();
317:
318: MockHttpServletRequest httpRequest = new MockHttpServletRequest(
319: null, null);
320: httpRequest.setServletPath("/secure/super/very_secret.html");
321:
322: ConfigAttributeDefinition returned = map
323: .getAttributes(new FilterInvocation(httpRequest,
324: new MockHttpServletResponse(),
325: new MockFilterChain()));
326:
327: ConfigAttributeDefinition expected = new ConfigAttributeDefinition();
328: expected.addConfigAttribute(new SecurityConfig(
329: "ROLE_WE_DONT_HAVE"));
330: expected.addConfigAttribute(new SecurityConfig("ANOTHER_ROLE"));
331:
332: assertEquals(expected, returned);
333: }
334:
335: public void testWhitespaceAndCommentsAndLinesWithoutEqualsSignsAreIgnored() {
336: FilterInvocationDefinitionSourceEditor editor = new FilterInvocationDefinitionSourceEditor();
337: editor
338: .setAsText(" \\A/secure/super.*\\Z=ROLE_WE_DONT_HAVE,ANOTHER_ROLE \r\n \r\n \r\n // comment line \r\n \\A/testing.*\\Z=ROLE_TEST \r\n");
339:
340: RegExpBasedFilterInvocationDefinitionMap map = (RegExpBasedFilterInvocationDefinitionMap) editor
341: .getValue();
342: assertEquals(2, map.getMapSize());
343: }
344: }
|