1   /* Copyright 2004 Acegi Technology Pty Limited
2    *
3    * Licensed under the Apache License, Version 2.0 (the "License");
4    * you may not use this file except in compliance with the License.
5    * You may obtain a copy of the License at
6    *
7    *     http://www.apache.org/licenses/LICENSE-2.0
8    *
9    * Unless required by applicable law or agreed to in writing, software
10   * distributed under the License is distributed on an "AS IS" BASIS,
11   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12   * See the License for the specific language governing permissions and
13   * limitations under the License.
14   */
15  
16  package org.acegisecurity.intercept.method.aopalliance;
17  
18  import junit.framework.TestCase;
19  
20  import org.acegisecurity.TargetObject;
21  import org.acegisecurity.intercept.method.MethodDefinitionMap;
22  import org.acegisecurity.intercept.method.MethodDefinitionSourceEditor;
23  
24  import org.springframework.aop.framework.AopConfigException;
25  
26  import java.lang.reflect.Method;
27  
28  
29  /***
30   * Tests {@link MethodDefinitionSourceAdvisor}.
31   *
32   * @author Ben Alex
33   * @version $Id: MethodDefinitionSourceAdvisorTests.java,v 1.3 2005/11/17 00:56:28 benalex Exp $
34   */
35  public class MethodDefinitionSourceAdvisorTests extends TestCase {
36      //~ Constructors ===========================================================
37  
38      public MethodDefinitionSourceAdvisorTests() {
39          super();
40      }
41  
42      public MethodDefinitionSourceAdvisorTests(String arg0) {
43          super(arg0);
44      }
45  
46      //~ Methods ================================================================
47  
48      public final void setUp() throws Exception {
49          super.setUp();
50      }
51  
52      public static void main(String[] args) {
53          junit.textui.TestRunner.run(MethodDefinitionSourceAdvisorTests.class);
54      }
55  
56      public void testAdvisorReturnsFalseWhenMethodInvocationNotDefined()
57          throws Exception {
58          Class clazz = TargetObject.class;
59          Method method = clazz.getMethod("makeLowerCase",
60                  new Class[] {String.class});
61  
62          MethodDefinitionSourceAdvisor advisor = new MethodDefinitionSourceAdvisor(getInterceptor());
63          assertFalse(advisor.matches(method, clazz));
64      }
65  
66      public void testAdvisorReturnsTrueWhenMethodInvocationIsDefined()
67          throws Exception {
68          Class clazz = TargetObject.class;
69          Method method = clazz.getMethod("countLength",
70                  new Class[] {String.class});
71  
72          MethodDefinitionSourceAdvisor advisor = new MethodDefinitionSourceAdvisor(getInterceptor());
73          assertTrue(advisor.matches(method, clazz));
74      }
75  
76      public void testDetectsImproperlyConfiguredAdvice() {
77          MethodSecurityInterceptor msi = new MethodSecurityInterceptor();
78  
79          try {
80              new MethodDefinitionSourceAdvisor(msi);
81              fail(
82                  "Should have detected null ObjectDefinitionSource and thrown AopConfigException");
83          } catch (AopConfigException expected) {
84              assertTrue(true);
85          }
86      }
87  
88      public void testUnsupportedOperations() throws Throwable {
89          Class clazz = TargetObject.class;
90          Method method = clazz.getMethod("countLength",
91                  new Class[] {String.class});
92  
93          MethodDefinitionSourceAdvisor.InternalMethodInvocation imi = new MethodDefinitionSourceAdvisor(getInterceptor()).new InternalMethodInvocation(method);
94  
95          try {
96              imi.getArguments();
97              fail("Should have thrown UnsupportedOperationException");
98          } catch (UnsupportedOperationException expected) {
99              assertTrue(true);
100         }
101 
102         try {
103             imi.getStaticPart();
104             fail("Should have thrown UnsupportedOperationException");
105         } catch (UnsupportedOperationException expected) {
106             assertTrue(true);
107         }
108 
109         try {
110             imi.getThis();
111             fail("Should have thrown UnsupportedOperationException");
112         } catch (UnsupportedOperationException expected) {
113             assertTrue(true);
114         }
115 
116         try {
117             imi.proceed();
118             fail("Should have thrown UnsupportedOperationException");
119         } catch (UnsupportedOperationException expected) {
120             assertTrue(true);
121         }
122 
123         try {
124             new MethodDefinitionSourceAdvisor(getInterceptor()).new InternalMethodInvocation();
125             fail("Should have thrown UnsupportedOperationException");
126         } catch (UnsupportedOperationException expected) {
127             assertTrue(true);
128         }
129     }
130 
131     private MethodSecurityInterceptor getInterceptor() {
132         MethodDefinitionSourceEditor editor = new MethodDefinitionSourceEditor();
133         editor.setAsText(
134             "org.acegisecurity.TargetObject.countLength=ROLE_NOT_USED");
135 
136         MethodDefinitionMap map = (MethodDefinitionMap) editor.getValue();
137 
138         MethodSecurityInterceptor msi = new MethodSecurityInterceptor();
139         msi.setObjectDefinitionSource(map);
140 
141         return msi;
142     }
143 }