/*
* Copyright 2004-2015 the Seasar Foundation and the Others.
*
* 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
*
* http://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.seasar.framework.aop.javassist;
import java.math.BigDecimal;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javassist.CannotCompileException;
import javassist.CtClass;
import javassist.CtField;
import junit.framework.TestCase;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.seasar.framework.aop.InterType;
import org.seasar.framework.aop.interceptors.AbstractInterceptor;
/**
* @author koichik
*/
public class AspectWeaverTest extends TestCase {
/**
* @throws Exception
*/
public void testGetEnhancedClassName() throws Exception {
AspectWeaver weaver = new AspectWeaver(Object.class, null);
String name1 = weaver.getEnhancedClassName();
assertTrue("1", name1
.startsWith("$$java.lang.Object$$EnhancedByS2AOP$$"));
assertTrue("2", name1.endsWith("_0"));
String name2 = weaver.getEnhancedClassName();
assertTrue("3", name2
.startsWith("$$java.lang.Object$$EnhancedByS2AOP$$"));
assertTrue("4", name2.endsWith("_1"));
weaver = new AspectWeaver(AspectWeaverTest.class, null);
String name3 = weaver.getEnhancedClassName();
assertTrue(
"5",
name3
.startsWith("org.seasar.framework.aop.javassist.AspectWeaverTest$$EnhancedByS2AOP$$"));
assertTrue("6", name3.endsWith("_0"));
}
/**
* @throws Exception
*/
public void testGetMethodInvocationClassName() throws Exception {
AspectWeaver weaver = new AspectWeaver(Object.class, null);
String name1 = weaver.getMethodInvocationClassName(Object.class
.getMethod("hashCode", null));
assertTrue("1", name1
.startsWith("$$java.lang.Object$$EnhancedByS2AOP$$"));
assertTrue("2", name1.endsWith("hashCode$$0"));
}
/**
* @throws Exception
*/
public void testSetInterceptor() throws Exception {
AspectWeaver weaver = new AspectWeaver(OrdinalMethods.class, null);
for (int i = 1; i <= 10; ++i) {
weaver.setInterceptors(
OrdinalMethods.class.getMethod("test" + i, null),
new MethodInterceptor[0]);
}
weaver.setInterceptors(OrdinalMethods.class.getMethod("test", null),
new MethodInterceptor[0]);
}
/**
* @throws Exception
*/
public void testGenerateFromInterface() throws Exception {
AspectWeaver weaver = new AspectWeaver(Runnable.class, null);
weaver.setInterceptors(Runnable.class.getDeclaredMethod("run", null),
new MethodInterceptor[0]);
Class clazz = weaver.generateClass();
clazz.getDeclaredMethod("run", null);
try {
clazz.getDeclaredMethod("run"
+ AspectWeaver.SUFFIX_INVOKE_SUPER_METHOD, null);
fail("3");
} catch (NoSuchMethodException expected) {
}
}
/**
* @throws Exception
*/
public void testGenerateFromConcreteClass() throws Exception {
AspectWeaver weaver = new AspectWeaver(ArrayList.class, null);
weaver.setInterceptors(ArrayList.class.getDeclaredMethod("size", null),
new MethodInterceptor[0]);
Class clazz = weaver.generateClass();
clazz.getDeclaredMethod("size", null);
clazz.getDeclaredMethod(AspectWeaver.PREFIX_ENHANCED_CLASS + "size"
+ AspectWeaver.SUFFIX_INVOKE_SUPER_METHOD, null);
}
/**
* @throws Exception
*/
public void testGenerateFromAbstractClass() throws Exception {
AspectWeaver weaver = new AspectWeaver(AbstractList.class, null);
weaver.setInterceptors(AbstractList.class.getDeclaredMethod("clear",
null), new MethodInterceptor[0]);
weaver.setInterceptors(List.class.getDeclaredMethod("size", null),
new MethodInterceptor[0]);
Class clazz = weaver.generateClass();
clazz.getDeclaredMethod("clear", null);
clazz.getDeclaredMethod(AspectWeaver.PREFIX_ENHANCED_CLASS + "clear"
+ AspectWeaver.SUFFIX_INVOKE_SUPER_METHOD, null);
clazz.getDeclaredMethod("size", null);
try {
clazz.getDeclaredMethod("size"
+ AspectWeaver.SUFFIX_INVOKE_SUPER_METHOD, null);
fail("3");
} catch (NoSuchMethodException expected) {
}
}
/**
* @throws Exception
*/
public void testInterType() throws Exception {
AspectWeaver weaver = new AspectWeaver(Foo.class, null);
weaver.setInterTypes(new InterType[] { new FieldInterType() });
Class clazz = weaver.generateClass();
assertNotNull("1", clazz.getDeclaredField("test"));
}
/**
* @throws Exception
*/
public void testReturnNumber() throws Exception {
AspectWeaver weaver = new AspectWeaver(Collection.class, null);
weaver.setInterceptors(
Collection.class.getDeclaredMethod("size", null),
new MethodInterceptor[] { new ReturnBigDecimalInterceptor() });
Class clazz = weaver.generateClass();
Collection coll = (Collection) clazz.newInstance();
assertEquals("1", 100, coll.size());
}
/**
* @throws Exception
*/
public void testReturnNumberNull() throws Exception {
AspectWeaver weaver = new AspectWeaver(Collection.class, null);
weaver.setInterceptors(
Collection.class.getDeclaredMethod("size", null),
new MethodInterceptor[] { new ReturnNullInterceptor() });
Class clazz = weaver.generateClass();
Collection coll = (Collection) clazz.newInstance();
assertEquals("1", 0, coll.size());
}
/**
* @throws Exception
*/
public void testReturnBooleanNull() throws Exception {
AspectWeaver weaver = new AspectWeaver(Collection.class, null);
weaver.setInterceptors(Collection.class.getDeclaredMethod("isEmpty",
null), new MethodInterceptor[] { new ReturnNullInterceptor() });
Class clazz = weaver.generateClass();
Collection coll = (Collection) clazz.newInstance();
assertFalse("1", coll.isEmpty());
}
/**
*
*/
public static class Foo {
}
/**
*
*/
public static class ReturnBigDecimalInterceptor extends AbstractInterceptor {
private static final long serialVersionUID = -3444509695408031219L;
public Object invoke(MethodInvocation arg0) throws Throwable {
return new BigDecimal("100");
}
}
/**
*
*/
public static class ReturnNullInterceptor extends AbstractInterceptor {
private static final long serialVersionUID = 4724885819473955866L;
public Object invoke(MethodInvocation arg0) throws Throwable {
return null;
}
}
/**
*
*/
public static class FieldInterType implements InterType {
public void introduce(Class targetClass, CtClass enhancedClass) {
try {
enhancedClass.addField(new CtField(CtClass.booleanType, "test",
enhancedClass));
} catch (CannotCompileException e) {
throw new RuntimeException(e);
}
}
}
/**
*
*/
public static class OrdinalMethods {
/**
*
*/
public void test1() {
};
/**
*
*/
public void test2() {
};
/**
*
*/
public void test3() {
};
/**
*
*/
public void test4() {
};
/**
*
*/
public void test5() {
};
/**
*
*/
public void test6() {
};
/**
*
*/
public void test7() {
};
/**
*
*/
public void test8() {
};
/**
*
*/
public void test9() {
};
/**
*
*/
public void test10() {
};
/**
*
*/
public void test() {
};
}
}