Browse Source
With a Java 8 baseline in place for quite some time now, it no longer makes sense to refer to features such as annotations as "Java 5 annotations". This commit also removes old `Tiger*Tests` classes, thereby avoiding duplicate execution of various tests.pull/27953/head
Sam Brannen
3 years ago
27 changed files with 581 additions and 693 deletions
@ -1,44 +0,0 @@
@@ -1,44 +0,0 @@
|
||||
/* |
||||
* Copyright 2002-2018 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.aop.aspectj; |
||||
|
||||
import org.aspectj.lang.ProceedingJoinPoint; |
||||
import org.junit.jupiter.api.Test; |
||||
|
||||
/** |
||||
* Additional parameter name discover tests that need Java 5. |
||||
* Yes this will re-run the tests from the superclass, but that |
||||
* doesn't matter in the grand scheme of things... |
||||
* |
||||
* @author Adrian Colyer |
||||
* @author Chris Beams |
||||
*/ |
||||
public class AspectJAdviceParameterNameDiscoverAnnotationTests extends AspectJAdviceParameterNameDiscovererTests { |
||||
|
||||
@Test |
||||
public void testAnnotationBinding() { |
||||
assertParameterNames(getMethod("pjpAndAnAnnotation"), |
||||
"execution(* *(..)) && @annotation(ann)", |
||||
new String[] {"thisJoinPoint","ann"}); |
||||
} |
||||
|
||||
|
||||
public void pjpAndAnAnnotation(ProceedingJoinPoint pjp, MyAnnotation ann) {} |
||||
|
||||
@interface MyAnnotation {} |
||||
|
||||
} |
@ -1,89 +0,0 @@
@@ -1,89 +0,0 @@
|
||||
/* |
||||
* Copyright 2002-2017 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.aop.aspectj; |
||||
|
||||
import org.junit.jupiter.api.Test; |
||||
|
||||
import org.springframework.aop.aspectj.AspectJAdviceParameterNameDiscoverer.AmbiguousBindingException; |
||||
|
||||
/** |
||||
* Tests just the annotation binding part of {@link AspectJAdviceParameterNameDiscoverer}; |
||||
* see supertype for remaining tests. |
||||
* |
||||
* @author Adrian Colyer |
||||
* @author Chris Beams |
||||
*/ |
||||
public class TigerAspectJAdviceParameterNameDiscovererTests extends AspectJAdviceParameterNameDiscovererTests { |
||||
|
||||
@Test |
||||
public void testAtThis() { |
||||
assertParameterNames(getMethod("oneAnnotation"),"@this(a)", new String[] {"a"}); |
||||
} |
||||
|
||||
@Test |
||||
public void testAtTarget() { |
||||
assertParameterNames(getMethod("oneAnnotation"),"@target(a)", new String[] {"a"}); |
||||
} |
||||
|
||||
@Test |
||||
public void testAtArgs() { |
||||
assertParameterNames(getMethod("oneAnnotation"),"@args(a)", new String[] {"a"}); |
||||
} |
||||
|
||||
@Test |
||||
public void testAtWithin() { |
||||
assertParameterNames(getMethod("oneAnnotation"),"@within(a)", new String[] {"a"}); |
||||
} |
||||
|
||||
@Test |
||||
public void testAtWithincode() { |
||||
assertParameterNames(getMethod("oneAnnotation"),"@withincode(a)", new String[] {"a"}); |
||||
} |
||||
|
||||
@Test |
||||
public void testAtAnnotation() { |
||||
assertParameterNames(getMethod("oneAnnotation"),"@annotation(a)", new String[] {"a"}); |
||||
} |
||||
|
||||
@Test |
||||
public void testAmbiguousAnnotationTwoVars() { |
||||
assertException(getMethod("twoAnnotations"),"@annotation(a) && @this(x)", AmbiguousBindingException.class, |
||||
"Found 2 potential annotation variable(s), and 2 potential argument slots"); |
||||
} |
||||
|
||||
@Test |
||||
public void testAmbiguousAnnotationOneVar() { |
||||
assertException(getMethod("oneAnnotation"),"@annotation(a) && @this(x)",IllegalArgumentException.class, |
||||
"Found 2 candidate annotation binding variables but only one potential argument binding slot"); |
||||
} |
||||
|
||||
@Test |
||||
public void testAnnotationMedley() { |
||||
assertParameterNames(getMethod("annotationMedley"),"@annotation(a) && args(count) && this(foo)", |
||||
null, "ex", new String[] {"ex", "foo", "count", "a"}); |
||||
} |
||||
|
||||
|
||||
public void oneAnnotation(MyAnnotation ann) {} |
||||
|
||||
public void twoAnnotations(MyAnnotation ann, MyAnnotation anotherAnn) {} |
||||
|
||||
public void annotationMedley(Throwable t, Object foo, int x, MyAnnotation ma) {} |
||||
|
||||
@interface MyAnnotation {} |
||||
|
||||
} |
@ -1,330 +0,0 @@
@@ -1,330 +0,0 @@
|
||||
/* |
||||
* Copyright 2002-2019 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.aop.aspectj; |
||||
|
||||
import java.lang.reflect.Method; |
||||
import java.util.HashMap; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
|
||||
import org.junit.jupiter.api.BeforeEach; |
||||
import org.junit.jupiter.api.Test; |
||||
import test.annotation.EmptySpringAnnotation; |
||||
import test.annotation.transaction.Tx; |
||||
|
||||
import org.springframework.aop.framework.ProxyFactory; |
||||
import org.springframework.beans.testfixture.beans.TestBean; |
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat; |
||||
|
||||
/** |
||||
* Java 5 specific {@link AspectJExpressionPointcutTests}. |
||||
* |
||||
* @author Rod Johnson |
||||
* @author Chris Beams |
||||
*/ |
||||
public class TigerAspectJExpressionPointcutTests { |
||||
|
||||
private Method getAge; |
||||
|
||||
private final Map<String, Method> methodsOnHasGeneric = new HashMap<>(); |
||||
|
||||
|
||||
@BeforeEach |
||||
public void setup() throws NoSuchMethodException { |
||||
getAge = TestBean.class.getMethod("getAge"); |
||||
// Assumes no overloading
|
||||
for (Method method : HasGeneric.class.getMethods()) { |
||||
methodsOnHasGeneric.put(method.getName(), method); |
||||
} |
||||
} |
||||
|
||||
|
||||
@Test |
||||
public void testMatchGenericArgument() { |
||||
String expression = "execution(* set*(java.util.List<org.springframework.beans.testfixture.beans.TestBean>) )"; |
||||
AspectJExpressionPointcut ajexp = new AspectJExpressionPointcut(); |
||||
ajexp.setExpression(expression); |
||||
|
||||
// TODO this will currently map, would be nice for optimization
|
||||
//assertTrue(ajexp.matches(HasGeneric.class));
|
||||
//assertFalse(ajexp.matches(TestBean.class));
|
||||
|
||||
Method takesGenericList = methodsOnHasGeneric.get("setFriends"); |
||||
assertThat(ajexp.matches(takesGenericList, HasGeneric.class)).isTrue(); |
||||
assertThat(ajexp.matches(methodsOnHasGeneric.get("setEnemies"), HasGeneric.class)).isTrue(); |
||||
assertThat(ajexp.matches(methodsOnHasGeneric.get("setPartners"), HasGeneric.class)).isFalse(); |
||||
assertThat(ajexp.matches(methodsOnHasGeneric.get("setPhoneNumbers"), HasGeneric.class)).isFalse(); |
||||
|
||||
assertThat(ajexp.matches(getAge, TestBean.class)).isFalse(); |
||||
} |
||||
|
||||
@Test |
||||
public void testMatchVarargs() throws Exception { |
||||
|
||||
@SuppressWarnings("unused") |
||||
class MyTemplate { |
||||
public int queryForInt(String sql, Object... params) { |
||||
return 0; |
||||
} |
||||
} |
||||
|
||||
String expression = "execution(int *.*(String, Object...))"; |
||||
AspectJExpressionPointcut jdbcVarArgs = new AspectJExpressionPointcut(); |
||||
jdbcVarArgs.setExpression(expression); |
||||
|
||||
assertThat(jdbcVarArgs.matches( |
||||
MyTemplate.class.getMethod("queryForInt", String.class, Object[].class), |
||||
MyTemplate.class)).isTrue(); |
||||
|
||||
Method takesGenericList = methodsOnHasGeneric.get("setFriends"); |
||||
assertThat(jdbcVarArgs.matches(takesGenericList, HasGeneric.class)).isFalse(); |
||||
assertThat(jdbcVarArgs.matches(methodsOnHasGeneric.get("setEnemies"), HasGeneric.class)).isFalse(); |
||||
assertThat(jdbcVarArgs.matches(methodsOnHasGeneric.get("setPartners"), HasGeneric.class)).isFalse(); |
||||
assertThat(jdbcVarArgs.matches(methodsOnHasGeneric.get("setPhoneNumbers"), HasGeneric.class)).isFalse(); |
||||
assertThat(jdbcVarArgs.matches(getAge, TestBean.class)).isFalse(); |
||||
} |
||||
|
||||
@Test |
||||
public void testMatchAnnotationOnClassWithAtWithin() throws Exception { |
||||
String expression = "@within(test.annotation.transaction.Tx)"; |
||||
testMatchAnnotationOnClass(expression); |
||||
} |
||||
|
||||
@Test |
||||
public void testMatchAnnotationOnClassWithoutBinding() throws Exception { |
||||
String expression = "within(@test.annotation.transaction.Tx *)"; |
||||
testMatchAnnotationOnClass(expression); |
||||
} |
||||
|
||||
@Test |
||||
public void testMatchAnnotationOnClassWithSubpackageWildcard() throws Exception { |
||||
String expression = "within(@(test.annotation..*) *)"; |
||||
AspectJExpressionPointcut springAnnotatedPc = testMatchAnnotationOnClass(expression); |
||||
assertThat(springAnnotatedPc.matches(TestBean.class.getMethod("setName", String.class), TestBean.class)).isFalse(); |
||||
assertThat(springAnnotatedPc.matches(SpringAnnotated.class.getMethod("foo"), SpringAnnotated.class)).isTrue(); |
||||
|
||||
expression = "within(@(test.annotation.transaction..*) *)"; |
||||
AspectJExpressionPointcut springTxAnnotatedPc = testMatchAnnotationOnClass(expression); |
||||
assertThat(springTxAnnotatedPc.matches(SpringAnnotated.class.getMethod("foo"), SpringAnnotated.class)).isFalse(); |
||||
} |
||||
|
||||
@Test |
||||
public void testMatchAnnotationOnClassWithExactPackageWildcard() throws Exception { |
||||
String expression = "within(@(test.annotation.transaction.*) *)"; |
||||
testMatchAnnotationOnClass(expression); |
||||
} |
||||
|
||||
private AspectJExpressionPointcut testMatchAnnotationOnClass(String expression) throws Exception { |
||||
AspectJExpressionPointcut ajexp = new AspectJExpressionPointcut(); |
||||
ajexp.setExpression(expression); |
||||
|
||||
assertThat(ajexp.matches(getAge, TestBean.class)).isFalse(); |
||||
assertThat(ajexp.matches(HasTransactionalAnnotation.class.getMethod("foo"), HasTransactionalAnnotation.class)).isTrue(); |
||||
assertThat(ajexp.matches(HasTransactionalAnnotation.class.getMethod("bar", String.class), HasTransactionalAnnotation.class)).isTrue(); |
||||
assertThat(ajexp.matches(BeanB.class.getMethod("setName", String.class), BeanB.class)).isTrue(); |
||||
assertThat(ajexp.matches(BeanA.class.getMethod("setName", String.class), BeanA.class)).isFalse(); |
||||
return ajexp; |
||||
} |
||||
|
||||
@Test |
||||
public void testAnnotationOnMethodWithFQN() throws Exception { |
||||
String expression = "@annotation(test.annotation.transaction.Tx)"; |
||||
AspectJExpressionPointcut ajexp = new AspectJExpressionPointcut(); |
||||
ajexp.setExpression(expression); |
||||
|
||||
assertThat(ajexp.matches(getAge, TestBean.class)).isFalse(); |
||||
assertThat(ajexp.matches(HasTransactionalAnnotation.class.getMethod("foo"), HasTransactionalAnnotation.class)).isFalse(); |
||||
assertThat(ajexp.matches(HasTransactionalAnnotation.class.getMethod("bar", String.class), HasTransactionalAnnotation.class)).isFalse(); |
||||
assertThat(ajexp.matches(BeanA.class.getMethod("setName", String.class), BeanA.class)).isFalse(); |
||||
assertThat(ajexp.matches(BeanA.class.getMethod("getAge"), BeanA.class)).isTrue(); |
||||
assertThat(ajexp.matches(BeanA.class.getMethod("setName", String.class), BeanA.class)).isFalse(); |
||||
} |
||||
|
||||
@Test |
||||
public void testAnnotationOnCglibProxyMethod() throws Exception { |
||||
String expression = "@annotation(test.annotation.transaction.Tx)"; |
||||
AspectJExpressionPointcut ajexp = new AspectJExpressionPointcut(); |
||||
ajexp.setExpression(expression); |
||||
|
||||
ProxyFactory factory = new ProxyFactory(new BeanA()); |
||||
factory.setProxyTargetClass(true); |
||||
BeanA proxy = (BeanA) factory.getProxy(); |
||||
assertThat(ajexp.matches(BeanA.class.getMethod("getAge"), proxy.getClass())).isTrue(); |
||||
} |
||||
|
||||
@Test |
||||
public void testAnnotationOnDynamicProxyMethod() throws Exception { |
||||
String expression = "@annotation(test.annotation.transaction.Tx)"; |
||||
AspectJExpressionPointcut ajexp = new AspectJExpressionPointcut(); |
||||
ajexp.setExpression(expression); |
||||
|
||||
ProxyFactory factory = new ProxyFactory(new BeanA()); |
||||
factory.setProxyTargetClass(false); |
||||
IBeanA proxy = (IBeanA) factory.getProxy(); |
||||
assertThat(ajexp.matches(IBeanA.class.getMethod("getAge"), proxy.getClass())).isTrue(); |
||||
} |
||||
|
||||
@Test |
||||
public void testAnnotationOnMethodWithWildcard() throws Exception { |
||||
String expression = "execution(@(test.annotation..*) * *(..))"; |
||||
AspectJExpressionPointcut anySpringMethodAnnotation = new AspectJExpressionPointcut(); |
||||
anySpringMethodAnnotation.setExpression(expression); |
||||
|
||||
assertThat(anySpringMethodAnnotation.matches(getAge, TestBean.class)).isFalse(); |
||||
assertThat(anySpringMethodAnnotation.matches( |
||||
HasTransactionalAnnotation.class.getMethod("foo"), HasTransactionalAnnotation.class)).isFalse(); |
||||
assertThat(anySpringMethodAnnotation.matches( |
||||
HasTransactionalAnnotation.class.getMethod("bar", String.class), HasTransactionalAnnotation.class)).isFalse(); |
||||
assertThat(anySpringMethodAnnotation.matches(BeanA.class.getMethod("setName", String.class), BeanA.class)).isFalse(); |
||||
assertThat(anySpringMethodAnnotation.matches(BeanA.class.getMethod("getAge"), BeanA.class)).isTrue(); |
||||
assertThat(anySpringMethodAnnotation.matches(BeanA.class.getMethod("setName", String.class), BeanA.class)).isFalse(); |
||||
} |
||||
|
||||
@Test |
||||
public void testAnnotationOnMethodArgumentsWithFQN() throws Exception { |
||||
String expression = "@args(*, test.annotation.EmptySpringAnnotation))"; |
||||
AspectJExpressionPointcut takesSpringAnnotatedArgument2 = new AspectJExpressionPointcut(); |
||||
takesSpringAnnotatedArgument2.setExpression(expression); |
||||
|
||||
assertThat(takesSpringAnnotatedArgument2.matches(getAge, TestBean.class)).isFalse(); |
||||
assertThat(takesSpringAnnotatedArgument2.matches( |
||||
HasTransactionalAnnotation.class.getMethod("foo"), HasTransactionalAnnotation.class)).isFalse(); |
||||
assertThat(takesSpringAnnotatedArgument2.matches( |
||||
HasTransactionalAnnotation.class.getMethod("bar", String.class), HasTransactionalAnnotation.class)).isFalse(); |
||||
assertThat(takesSpringAnnotatedArgument2.matches(BeanA.class.getMethod("setName", String.class), BeanA.class)).isFalse(); |
||||
assertThat(takesSpringAnnotatedArgument2.matches(BeanA.class.getMethod("getAge"), BeanA.class)).isFalse(); |
||||
assertThat(takesSpringAnnotatedArgument2.matches(BeanA.class.getMethod("setName", String.class), BeanA.class)).isFalse(); |
||||
|
||||
assertThat(takesSpringAnnotatedArgument2.matches( |
||||
ProcessesSpringAnnotatedParameters.class.getMethod("takesAnnotatedParameters", TestBean.class, SpringAnnotated.class), |
||||
ProcessesSpringAnnotatedParameters.class)).isTrue(); |
||||
|
||||
// True because it maybeMatches with potential argument subtypes
|
||||
assertThat(takesSpringAnnotatedArgument2.matches( |
||||
ProcessesSpringAnnotatedParameters.class.getMethod("takesNoAnnotatedParameters", TestBean.class, BeanA.class), |
||||
ProcessesSpringAnnotatedParameters.class)).isTrue(); |
||||
|
||||
assertThat(takesSpringAnnotatedArgument2.matches( |
||||
ProcessesSpringAnnotatedParameters.class.getMethod("takesNoAnnotatedParameters", TestBean.class, BeanA.class), |
||||
ProcessesSpringAnnotatedParameters.class, new TestBean(), new BeanA())).isFalse(); |
||||
} |
||||
|
||||
@Test |
||||
public void testAnnotationOnMethodArgumentsWithWildcards() throws Exception { |
||||
String expression = "execution(* *(*, @(test..*) *))"; |
||||
AspectJExpressionPointcut takesSpringAnnotatedArgument2 = new AspectJExpressionPointcut(); |
||||
takesSpringAnnotatedArgument2.setExpression(expression); |
||||
|
||||
assertThat(takesSpringAnnotatedArgument2.matches(getAge, TestBean.class)).isFalse(); |
||||
assertThat(takesSpringAnnotatedArgument2.matches( |
||||
HasTransactionalAnnotation.class.getMethod("foo"), HasTransactionalAnnotation.class)).isFalse(); |
||||
assertThat(takesSpringAnnotatedArgument2.matches( |
||||
HasTransactionalAnnotation.class.getMethod("bar", String.class), HasTransactionalAnnotation.class)).isFalse(); |
||||
assertThat(takesSpringAnnotatedArgument2.matches(BeanA.class.getMethod("setName", String.class), BeanA.class)).isFalse(); |
||||
assertThat(takesSpringAnnotatedArgument2.matches(BeanA.class.getMethod("getAge"), BeanA.class)).isFalse(); |
||||
assertThat(takesSpringAnnotatedArgument2.matches(BeanA.class.getMethod("setName", String.class), BeanA.class)).isFalse(); |
||||
|
||||
assertThat(takesSpringAnnotatedArgument2.matches( |
||||
ProcessesSpringAnnotatedParameters.class.getMethod("takesAnnotatedParameters", TestBean.class, SpringAnnotated.class), |
||||
ProcessesSpringAnnotatedParameters.class)).isTrue(); |
||||
assertThat(takesSpringAnnotatedArgument2.matches( |
||||
ProcessesSpringAnnotatedParameters.class.getMethod("takesNoAnnotatedParameters", TestBean.class, BeanA.class), |
||||
ProcessesSpringAnnotatedParameters.class)).isFalse(); |
||||
} |
||||
|
||||
|
||||
public static class HasGeneric { |
||||
|
||||
public void setFriends(List<TestBean> friends) { |
||||
} |
||||
public void setEnemies(List<TestBean> enemies) { |
||||
} |
||||
public void setPartners(List<?> partners) { |
||||
} |
||||
public void setPhoneNumbers(List<String> numbers) { |
||||
} |
||||
} |
||||
|
||||
|
||||
public static class ProcessesSpringAnnotatedParameters { |
||||
|
||||
public void takesAnnotatedParameters(TestBean tb, SpringAnnotated sa) { |
||||
} |
||||
|
||||
public void takesNoAnnotatedParameters(TestBean tb, BeanA tb3) { |
||||
} |
||||
} |
||||
|
||||
|
||||
@Tx |
||||
public static class HasTransactionalAnnotation { |
||||
|
||||
public void foo() { |
||||
} |
||||
public Object bar(String foo) { |
||||
throw new UnsupportedOperationException(); |
||||
} |
||||
} |
||||
|
||||
|
||||
@EmptySpringAnnotation |
||||
public static class SpringAnnotated { |
||||
|
||||
public void foo() { |
||||
} |
||||
} |
||||
|
||||
|
||||
interface IBeanA { |
||||
|
||||
@Tx |
||||
int getAge(); |
||||
} |
||||
|
||||
|
||||
static class BeanA implements IBeanA { |
||||
|
||||
@SuppressWarnings("unused") |
||||
private String name; |
||||
|
||||
private int age; |
||||
|
||||
public void setName(String name) { |
||||
this.name = name; |
||||
} |
||||
|
||||
@Tx |
||||
@Override |
||||
public int getAge() { |
||||
return age; |
||||
} |
||||
} |
||||
|
||||
|
||||
@Tx |
||||
static class BeanB { |
||||
|
||||
@SuppressWarnings("unused") |
||||
private String name; |
||||
|
||||
public void setName(String name) { |
||||
this.name = name; |
||||
} |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue