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 {@link
031: * PathBasedFilterInvocationDefinitionMap}.
032: *
033: * @author Ben Alex
034: * @version $Id: FilterInvocationDefinitionSourceEditorWithPathsTests.java 1496 2006-05-23 13:38:33Z benalex $
035: */
036: public class FilterInvocationDefinitionSourceEditorWithPathsTests
037: extends TestCase {
038: //~ Constructors ===================================================================================================
039:
040: public FilterInvocationDefinitionSourceEditorWithPathsTests() {
041: super ();
042: }
043:
044: public FilterInvocationDefinitionSourceEditorWithPathsTests(
045: String arg0) {
046: super (arg0);
047: }
048:
049: //~ Methods ========================================================================================================
050:
051: public static void main(String[] args) {
052: junit.textui.TestRunner
053: .run(FilterInvocationDefinitionSourceEditorWithPathsTests.class);
054: }
055:
056: public final void setUp() throws Exception {
057: super .setUp();
058: }
059:
060: public void testAntPathDirectiveIsDetected() {
061: FilterInvocationDefinitionSourceEditor editor = new FilterInvocationDefinitionSourceEditor();
062: editor
063: .setAsText("PATTERN_TYPE_APACHE_ANT\r\n/secure/super/*=ROLE_WE_DONT_HAVE\r\n/secure/*=ROLE_SUPERVISOR,ROLE_TELLER");
064:
065: FilterInvocationDefinitionMap map = (FilterInvocationDefinitionMap) editor
066: .getValue();
067: assertTrue(map instanceof PathBasedFilterInvocationDefinitionMap);
068: }
069:
070: public void testConvertUrlToLowercaseDefaultSettingUnchangedByEditor() {
071: FilterInvocationDefinitionSourceEditor editor = new FilterInvocationDefinitionSourceEditor();
072: editor
073: .setAsText("PATTERN_TYPE_APACHE_ANT\r\n/secure/super/*=ROLE_WE_DONT_HAVE\r\n/secure/*=ROLE_SUPERVISOR,ROLE_TELLER");
074:
075: PathBasedFilterInvocationDefinitionMap map = (PathBasedFilterInvocationDefinitionMap) editor
076: .getValue();
077: assertFalse(map.isConvertUrlToLowercaseBeforeComparison());
078: }
079:
080: public void testConvertUrlToLowercaseSettingApplied() {
081: FilterInvocationDefinitionSourceEditor editor = new FilterInvocationDefinitionSourceEditor();
082: editor
083: .setAsText("CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON\r\nPATTERN_TYPE_APACHE_ANT\r\n/secure/super/*=ROLE_WE_DONT_HAVE\r\n/secure/*=ROLE_SUPERVISOR,ROLE_TELLER");
084:
085: PathBasedFilterInvocationDefinitionMap map = (PathBasedFilterInvocationDefinitionMap) editor
086: .getValue();
087: assertTrue(map.isConvertUrlToLowercaseBeforeComparison());
088: }
089:
090: public void testInvalidNameValueFailsToParse() {
091: FilterInvocationDefinitionSourceEditor editor = new FilterInvocationDefinitionSourceEditor();
092:
093: try {
094: // Use a "==" instead of an "="
095: editor
096: .setAsText(" PATTERN_TYPE_APACHE_ANT\r\n /secure/*==ROLE_SUPERVISOR,ROLE_TELLER \r\n");
097: fail("Shouldn't be able to use '==' for config attribute.");
098: } catch (IllegalArgumentException expected) {
099: }
100: }
101:
102: public void testIterator() {
103: FilterInvocationDefinitionSourceEditor editor = new FilterInvocationDefinitionSourceEditor();
104: editor
105: .setAsText("PATTERN_TYPE_APACHE_ANT\r\n/secure/super/*=ROLE_WE_DONT_HAVE\r\n/secure/*=ROLE_SUPERVISOR,ROLE_TELLER");
106:
107: PathBasedFilterInvocationDefinitionMap map = (PathBasedFilterInvocationDefinitionMap) editor
108: .getValue();
109: Iterator iter = map.getConfigAttributeDefinitions();
110: int counter = 0;
111:
112: while (iter.hasNext()) {
113: iter.next();
114: counter++;
115: }
116:
117: assertEquals(2, counter);
118: }
119:
120: public void testMapReturnsNullWhenNoMatchFound() throws Exception {
121: FilterInvocationDefinitionSourceEditor editor = new FilterInvocationDefinitionSourceEditor();
122: editor
123: .setAsText("PATTERN_TYPE_APACHE_ANT\r\n/secure/super/*=ROLE_WE_DONT_HAVE");
124:
125: PathBasedFilterInvocationDefinitionMap map = (PathBasedFilterInvocationDefinitionMap) editor
126: .getValue();
127:
128: MockHttpServletRequest httpRequest = new MockHttpServletRequest(
129: null, null);
130: httpRequest
131: .setServletPath("/totally/different/path/index.html");
132:
133: ConfigAttributeDefinition returned = map
134: .getAttributes(new FilterInvocation(httpRequest,
135: new MockHttpServletResponse(),
136: new MockFilterChain()));
137:
138: assertEquals(null, returned);
139: }
140:
141: public void testMultiUrlParsing() {
142: FilterInvocationDefinitionSourceEditor editor = new FilterInvocationDefinitionSourceEditor();
143: editor
144: .setAsText("PATTERN_TYPE_APACHE_ANT\r\n/secure/super/*=ROLE_WE_DONT_HAVE\r\n/secure/*=ROLE_SUPERVISOR,ROLE_TELLER");
145:
146: PathBasedFilterInvocationDefinitionMap map = (PathBasedFilterInvocationDefinitionMap) editor
147: .getValue();
148: assertEquals(2, map.getMapSize());
149: }
150:
151: public void testNoArgConstructorDoesntExist() {
152: Class clazz = PathBasedFilterInvocationDefinitionMap.EntryHolder.class;
153:
154: try {
155: clazz.getDeclaredConstructor((Class[]) null);
156: fail("Should have thrown NoSuchMethodException");
157: } catch (NoSuchMethodException expected) {
158: assertTrue(true);
159: }
160: }
161:
162: public void testOrderOfEntriesIsPreservedOrderA() {
163: FilterInvocationDefinitionSourceEditor editor = new FilterInvocationDefinitionSourceEditor();
164: editor
165: .setAsText("PATTERN_TYPE_APACHE_ANT\r\n/secure/super/**=ROLE_WE_DONT_HAVE,ANOTHER_ROLE\r\n/secure/**=ROLE_SUPERVISOR,ROLE_TELLER");
166:
167: PathBasedFilterInvocationDefinitionMap map = (PathBasedFilterInvocationDefinitionMap) editor
168: .getValue();
169:
170: // Test ensures we match the first entry, not the second
171: MockHttpServletRequest httpRequest = new MockHttpServletRequest(
172: null, null);
173: httpRequest.setServletPath("/secure/super/very_secret.html");
174:
175: ConfigAttributeDefinition returned = map
176: .getAttributes(new FilterInvocation(httpRequest,
177: new MockHttpServletResponse(),
178: new MockFilterChain()));
179:
180: ConfigAttributeDefinition expected = new ConfigAttributeDefinition();
181: expected.addConfigAttribute(new SecurityConfig(
182: "ROLE_WE_DONT_HAVE"));
183: expected.addConfigAttribute(new SecurityConfig("ANOTHER_ROLE"));
184:
185: assertEquals(expected, returned);
186: }
187:
188: public void testOrderOfEntriesIsPreservedOrderB() {
189: FilterInvocationDefinitionSourceEditor editor = new FilterInvocationDefinitionSourceEditor();
190: editor
191: .setAsText("PATTERN_TYPE_APACHE_ANT\r\n/secure/**=ROLE_SUPERVISOR,ROLE_TELLER\r\n/secure/super/**=ROLE_WE_DONT_HAVE");
192:
193: PathBasedFilterInvocationDefinitionMap map = (PathBasedFilterInvocationDefinitionMap) editor
194: .getValue();
195:
196: MockHttpServletRequest httpRequest = new MockHttpServletRequest(
197: null, null);
198: httpRequest.setServletPath("/secure/super/very_secret.html");
199:
200: ConfigAttributeDefinition returned = map
201: .getAttributes(new FilterInvocation(httpRequest,
202: new MockHttpServletResponse(),
203: new MockFilterChain()));
204:
205: ConfigAttributeDefinition expected = new ConfigAttributeDefinition();
206: expected.addConfigAttribute(new SecurityConfig(
207: "ROLE_SUPERVISOR"));
208: expected.addConfigAttribute(new SecurityConfig("ROLE_TELLER"));
209:
210: assertEquals(expected, returned);
211: }
212:
213: public void testSingleUrlParsing() throws Exception {
214: FilterInvocationDefinitionSourceEditor editor = new FilterInvocationDefinitionSourceEditor();
215: editor
216: .setAsText("PATTERN_TYPE_APACHE_ANT\r\n/secure/super/*=ROLE_WE_DONT_HAVE,ANOTHER_ROLE");
217:
218: PathBasedFilterInvocationDefinitionMap map = (PathBasedFilterInvocationDefinitionMap) editor
219: .getValue();
220:
221: MockHttpServletRequest httpRequest = new MockHttpServletRequest(
222: null, null);
223: httpRequest.setServletPath("/secure/super/very_secret.html");
224:
225: ConfigAttributeDefinition returned = map
226: .getAttributes(new FilterInvocation(httpRequest,
227: new MockHttpServletResponse(),
228: new MockFilterChain()));
229:
230: ConfigAttributeDefinition expected = new ConfigAttributeDefinition();
231: expected.addConfigAttribute(new SecurityConfig(
232: "ROLE_WE_DONT_HAVE"));
233: expected.addConfigAttribute(new SecurityConfig("ANOTHER_ROLE"));
234:
235: assertEquals(expected, returned);
236: }
237:
238: public void testWhitespaceAndCommentsAndLinesWithoutEqualsSignsAreIgnored() {
239: FilterInvocationDefinitionSourceEditor editor = new FilterInvocationDefinitionSourceEditor();
240: editor
241: .setAsText(" PATTERN_TYPE_APACHE_ANT\r\n /secure/super/*=ROLE_WE_DONT_HAVE\r\n /secure/*=ROLE_SUPERVISOR,ROLE_TELLER \r\n \r\n \r\n // comment line \r\n \r\n");
242:
243: PathBasedFilterInvocationDefinitionMap map = (PathBasedFilterInvocationDefinitionMap) editor
244: .getValue();
245: assertEquals(2, map.getMapSize());
246: }
247: }
|