/*
* Copyright 2016 NAVER Corp.
*
* 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 com.navercorp.pinpoint.profiler.instrument;
import com.google.inject.Provider;
import com.google.inject.util.Providers;
import com.navercorp.pinpoint.bootstrap.config.ProfilerConfig;
import com.navercorp.pinpoint.bootstrap.context.TraceContext;
import com.navercorp.pinpoint.bootstrap.instrument.ClassFilters;
import com.navercorp.pinpoint.bootstrap.instrument.InstrumentContext;
import com.navercorp.pinpoint.bootstrap.instrument.InstrumentMethod;
import com.navercorp.pinpoint.bootstrap.instrument.MethodFilters;
import com.navercorp.pinpoint.profiler.context.monitor.DataSourceMonitorRegistryService;
import com.navercorp.pinpoint.profiler.interceptor.registry.DefaultInterceptorRegistryBinder;
import com.navercorp.pinpoint.profiler.interceptor.registry.InterceptorRegistryBinder;
import com.navercorp.pinpoint.profiler.metadata.ApiMetaDataService;
import com.navercorp.pinpoint.profiler.objectfactory.ObjectBinderFactory;
import org.junit.Before;
import org.junit.Test;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.objectweb.asm.tree.ClassNode;
import java.io.InputStream;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
/**
* @author jaehong.kim
*/
public class ASMClassTest {
private final static InterceptorRegistryBinder interceptorRegistryBinder = new DefaultInterceptorRegistryBinder();
private final ProfilerConfig profilerConfig = mock(ProfilerConfig.class);
private final Provider<TraceContext> traceContextProvider = Providers.of(mock(TraceContext.class));
private final DataSourceMonitorRegistryService dataSourceMonitorRegistryService = mock(DataSourceMonitorRegistryService.class);
private final Provider<ApiMetaDataService> apiMetaDataService = Providers.of(mock(ApiMetaDataService.class));
private final InstrumentContext pluginContext = mock(InstrumentContext.class);
private final ObjectBinderFactory objectBinderFactory = new ObjectBinderFactory(profilerConfig, traceContextProvider, dataSourceMonitorRegistryService, apiMetaDataService);
@Before
public void setUp() {
when(pluginContext.injectClass(any(ClassLoader.class), any(String.class))).thenAnswer(new Answer<Class<?>>() {
@Override
public Class<?> answer(InvocationOnMock invocation) throws Throwable {
ClassLoader loader = (ClassLoader) invocation.getArguments()[0];
String name = (String) invocation.getArguments()[1];
return loader.loadClass(name);
}
});
when(pluginContext.getResourceAsStream(any(ClassLoader.class), any(String.class))).thenAnswer(new Answer<InputStream>() {
@Override
public InputStream answer(InvocationOnMock invocation) throws Throwable {
ClassLoader loader = (ClassLoader) invocation.getArguments()[0];
String name = (String) invocation.getArguments()[1];
if(loader == null) {
loader = ClassLoader.getSystemClassLoader();
}
return loader.getResourceAsStream(name);
}
});
}
@Test
public void getSuperClass() throws Exception {
ASMClass clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.BaseClass");
assertEquals("java.lang.Object", clazz.getSuperClass());
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.ExtendedClass");
assertEquals("com.navercorp.pinpoint.profiler.instrument.mock.BaseClass", clazz.getSuperClass());
clazz = getClass("java.lang.Object");
assertEquals(null, clazz.getSuperClass());
}
@Test
public void isInterface() throws Exception {
ASMClass clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.BaseClass");
assertEquals(false, clazz.isInterface());
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.BaseInterface");
assertEquals(true, clazz.isInterface());
}
@Test
public void getName() throws Exception {
ASMClass clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.BaseClass");
assertEquals("com.navercorp.pinpoint.profiler.instrument.mock.BaseClass", clazz.getName());
}
@Test
public void getInterfaces() throws Exception {
ASMClass clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.BaseClass");
assertEquals(0, clazz.getInterfaces().length);
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.BaseInterface");
assertEquals(0, clazz.getInterfaces().length);
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.BaseImplementClass");
assertEquals(1, clazz.getInterfaces().length);
assertEquals("com.navercorp.pinpoint.profiler.instrument.mock.BaseInterface", clazz.getInterfaces()[0]);
}
@Test
public void getDeclaredMethod() throws Exception {
ASMClass clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.ArgsClass");
assertNull(clazz.getDeclaredMethod("notExists"));
assertNotNull(clazz.getDeclaredMethod("arg"));
assertNotNull(clazz.getDeclaredMethod("argByteType", "byte"));
assertNotNull(clazz.getDeclaredMethod("argShortType", "short"));
assertNotNull(clazz.getDeclaredMethod("argIntType", "int"));
assertNotNull(clazz.getDeclaredMethod("argFloatType", "float"));
assertNotNull(clazz.getDeclaredMethod("argDoubleType", "double"));
assertNotNull(clazz.getDeclaredMethod("argBooleanType", "boolean"));
assertNotNull(clazz.getDeclaredMethod("argCharType", "char"));
assertNotNull(clazz.getDeclaredMethod("argByteArrayType", "byte[]"));
assertNotNull(clazz.getDeclaredMethod("argShortArrayType", "short[]"));
assertNotNull(clazz.getDeclaredMethod("argIntArrayType", "int[]"));
assertNotNull(clazz.getDeclaredMethod("argFloatArrayType", "float[]"));
assertNotNull(clazz.getDeclaredMethod("argDoubleArrayType", "double[]"));
assertNotNull(clazz.getDeclaredMethod("argBooleanArrayType", "boolean[]"));
assertNotNull(clazz.getDeclaredMethod("argCharArrayType", "char[]"));
assertNotNull(clazz.getDeclaredMethod("argByteArraysType", "byte[][]"));
assertNotNull(clazz.getDeclaredMethod("argShortArraysType", "short[][]"));
assertNotNull(clazz.getDeclaredMethod("argIntArraysType", "int[][]"));
assertNotNull(clazz.getDeclaredMethod("argFloatArraysType", "float[][]"));
assertNotNull(clazz.getDeclaredMethod("argDoubleArraysType", "double[][]"));
assertNotNull(clazz.getDeclaredMethod("argBooleanArraysType", "boolean[][]"));
assertNotNull(clazz.getDeclaredMethod("argCharArraysType", "char[][]"));
assertNotNull(clazz.getDeclaredMethod("argAllType", "byte", "short", "int", "float", "double", "boolean", "char", "byte[]", "short[]", "int[]", "float[]", "double[]", "boolean[]", "char[]", "byte[][]", "short[][]", "int[][]", "float[][]", "double[][]", "boolean[][]", "char[][]"));
assertNotNull(clazz.getDeclaredMethod("argObject", "java.lang.String", "java.lang.Object", "java.lang.Byte", "java.lang.Short", "java.lang.Integer", "java.lang.Long", "java.lang.Float", "java.lang.Double", "java.lang.Boolean", "java.lang.Character", "java.lang.String[]", "java.lang.Object[]", "java.lang.Byte[]", "java.lang.Short[]", "java.lang.Integer[]", "java.lang.Long[]", "java.lang.Float[]", "java.lang.Double[]", "java.lang.Boolean[]", "java.lang.Character[]", "java.lang.String[][]", "java.lang.Object[][]", "java.lang.Byte[][]", "java.lang.Short[][]", "java.lang.Integer[][]", "java.lang.Long[][]", "java.lang.Float[][]", "java.lang.Double[][]", "java.lang.Boolean[][]", "java.lang.Character[][]"));
assertNotNull(clazz.getDeclaredMethod("argArgs", "java.lang.Object[]"));
assertNotNull(clazz.getDeclaredMethod("argInterface", "java.util.Map", "java.util.Map", "java.util.Map"));
assertNotNull(clazz.getDeclaredMethod("argEnum", "java.lang.Enum"));
assertNotNull(clazz.getDeclaredMethod("argEnumArray", "java.lang.Enum[]"));
assertNotNull(clazz.getDeclaredMethod("argEnumArrays", "java.lang.Enum[][]"));
// find super's method.
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.ExtendedClass");
assertNull(clazz.getDeclaredMethod("base"));
}
@Test
public void getDeclaredMethods() throws Exception {
ASMClass clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.ArgsClass");
List<InstrumentMethod> methods = clazz.getDeclaredMethods();
assertNotNull(methods);
methods = clazz.getDeclaredMethods(MethodFilters.name("arg"));
assertEquals(1, methods.size());
assertEquals("arg", methods.get(0).getName());
}
@Test
public void hasDeclaredMethod() throws Exception {
ASMClass clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.ArgsClass");
assertFalse(clazz.hasDeclaredMethod("notExists"));
assertTrue(clazz.hasDeclaredMethod("arg"));
assertTrue(clazz.hasDeclaredMethod("argByteType", "byte"));
// find super's method.
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.ExtendedClass");
assertFalse(clazz.hasDeclaredMethod("base"));
}
@Test
public void hasMethod() throws Exception {
// find not exists method.
ASMClass clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.ArgsClass");
assertFalse(clazz.hasMethod("notExists"));
// find method.
assertTrue(clazz.hasMethod("arg"));
assertTrue(clazz.hasMethod("argByteType", "byte"));
// find super's method.
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.ExtendedClass");
assertTrue(clazz.hasMethod("base"));
}
@Test
public void hasEnclosingMethod() throws Exception {
ASMClass clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.BaseClass");
assertFalse(clazz.hasEnclosingMethod("notExists"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.NestedClass$3LocalInner");
assertTrue(clazz.hasEnclosingMethod("enclosingMethod", "java.lang.String", "int"));
}
@Test
public void hasConstructor() throws Exception {
ASMClass clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.BaseClass");
assertTrue(clazz.hasConstructor());
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.ExtendedClass");
assertTrue(clazz.hasConstructor());
assertTrue(clazz.hasConstructor("java.lang.String"));
assertFalse(clazz.hasConstructor("java.lang.String", "int", "byte"));
}
@Test
public void hasField() throws Exception {
ASMClass clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.BaseClass");
assertTrue(clazz.hasField("s"));
assertFalse(clazz.hasField("notExists"));
assertTrue(clazz.hasField("b", "boolean"));
assertTrue(clazz.hasField("s", "java.lang.String"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.ExtendedClass");
assertTrue(clazz.hasField("s"));
assertTrue(clazz.hasField("e"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
assertTrue(clazz.hasField("b"));
assertTrue(clazz.hasField("s"));
assertTrue(clazz.hasField("i"));
assertTrue(clazz.hasField("l"));
assertTrue(clazz.hasField("f"));
assertTrue(clazz.hasField("d"));
assertTrue(clazz.hasField("y"));
assertTrue(clazz.hasField("c"));
assertTrue(clazz.hasField("bArray"));
assertTrue(clazz.hasField("sArray"));
assertTrue(clazz.hasField("iArray"));
assertTrue(clazz.hasField("lArray"));
assertTrue(clazz.hasField("fArray"));
assertTrue(clazz.hasField("dArray"));
assertTrue(clazz.hasField("yArray"));
assertTrue(clazz.hasField("cArray"));
assertTrue(clazz.hasField("bArrays"));
assertTrue(clazz.hasField("sArrays"));
assertTrue(clazz.hasField("iArrays"));
assertTrue(clazz.hasField("lArrays"));
assertTrue(clazz.hasField("fArrays"));
assertTrue(clazz.hasField("dArrays"));
assertTrue(clazz.hasField("yArrays"));
assertTrue(clazz.hasField("cArrays"));
assertTrue(clazz.hasField("str"));
assertTrue(clazz.hasField("object"));
assertTrue(clazz.hasField("publicStaticFinalStr"));
assertTrue(clazz.hasField("volatileInt"));
assertTrue(clazz.hasField("transientInt"));
}
@Test
public void addDelegatorMethod() throws Exception {
ASMClass clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.ExtendedClass");
clazz.addDelegatorMethod("base");
assertNotNull(clazz.getDeclaredMethod("base"));
// duplicated.
try {
clazz.addDelegatorMethod("extended");
fail("skip throw exception.");
} catch(Exception ignored) {
}
// not exist.
try {
clazz.addDelegatorMethod("notExist");
fail("skip throw exception.");
} catch(Exception ignored) {
}
clazz.addDelegatorMethod("getInstance");
assertNotNull(clazz.getDeclaredMethod("getInstance"));
}
@Test
public void addField() throws Exception {
ASMClass clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.BaseClass");
clazz.addField("com.navercorp.pinpoint.profiler.instrument.mock.accessor.IntAccessor");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_setTraceInt", "int"));
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_getTraceInt"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.BaseClass");
clazz.addField("com.navercorp.pinpoint.profiler.instrument.mock.accessor.IntArrayAccessor");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_setTraceIntArray", "int[]"));
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_getTraceIntArray"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.BaseClass");
clazz.addField("com.navercorp.pinpoint.profiler.instrument.mock.accessor.IntArraysAccessor");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_setTraceIntArrays", "int[][]"));
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_getTraceIntArrays"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.BaseClass");
clazz.addField("com.navercorp.pinpoint.profiler.instrument.mock.accessor.ObjectAccessor");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_setTraceObject", "java.lang.Object"));
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_getTraceObject"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.BaseClass");
clazz.addField("com.navercorp.pinpoint.profiler.instrument.mock.accessor.ObjectArrayAccessor");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_setTraceObjectArray", "java.lang.Object[]"));
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_getTraceObjectArray"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.BaseClass");
clazz.addField("com.navercorp.pinpoint.profiler.instrument.mock.accessor.ObjectArraysAccessor");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_setTraceObjectArrays", "java.lang.Object[][]"));
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_getTraceObjectArrays"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.BaseClass");
clazz.addField("com.navercorp.pinpoint.profiler.instrument.mock.accessor.PublicStrAccessor");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_setTracePublicStr", "java.lang.String"));
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_getTracePublicStr"));
// skip throw exception.
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.BaseClass");
clazz.addField("com.navercorp.pinpoint.profiler.instrument.mock.accessor.ThrowExceptionAccessor");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_setTraceDefaultStr", "java.lang.String"));
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_getTraceDefaultStr"));
}
@Test
public void addGetter() throws Exception {
// TODO super field.
ASMClass clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.BaseClass");
clazz.addGetter("com.navercorp.pinpoint.profiler.instrument.mock.BaseGetter", "b");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_isB"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addGetter("com.navercorp.pinpoint.profiler.instrument.mock.getter.FieldIntGetter", "i");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_getInt"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addGetter("com.navercorp.pinpoint.profiler.instrument.mock.getter.FieldIntArrayGetter", "iArray");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_getIntArray"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addGetter("com.navercorp.pinpoint.profiler.instrument.mock.getter.FieldObjectGetter", "object");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_getObject"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addGetter("com.navercorp.pinpoint.profiler.instrument.mock.getter.FieldObjectArrayGetter", "objectArray");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_getObjectArray"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addGetter("com.navercorp.pinpoint.profiler.instrument.mock.getter.FieldObjectArraysGetter", "objectArrays");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_getObjectArrays"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addGetter("com.navercorp.pinpoint.profiler.instrument.mock.getter.FieldEnumGetter", "e");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_getEnum"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addGetter("com.navercorp.pinpoint.profiler.instrument.mock.getter.FieldMapGetter", "map");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_getMap"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addGetter("com.navercorp.pinpoint.profiler.instrument.mock.getter.FieldStrMapGetter", "strMap");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_getStrMap"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addGetter("com.navercorp.pinpoint.profiler.instrument.mock.getter.FieldObjectMapGetter", "objectMap");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_getObjectMap"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addGetter("com.navercorp.pinpoint.profiler.instrument.mock.getter.FieldWildcardMapGetter", "wildcardMap");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_getWildcardMap"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addGetter("com.navercorp.pinpoint.profiler.instrument.mock.getter.FieldDefaultStrGetter", "defaultStr");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_getDefaultStr"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addGetter("com.navercorp.pinpoint.profiler.instrument.mock.getter.FieldDefaultStaticStrGetter", "defaultStaticStr");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_getDefaultStaticStr"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addGetter("com.navercorp.pinpoint.profiler.instrument.mock.getter.FieldDefaultStaticFinalStrGetter", "defaultStaticFinalStr");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_getDefaultStaticFinalStr"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addGetter("com.navercorp.pinpoint.profiler.instrument.mock.getter.FieldPrivateStrGetter", "privateStr");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_getPrivateStr"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addGetter("com.navercorp.pinpoint.profiler.instrument.mock.getter.FieldPrivateStaticStrGetter", "privateStaticStr");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_getPrivateStaticStr"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addGetter("com.navercorp.pinpoint.profiler.instrument.mock.getter.FieldPrivateStaticFinalStrGetter", "privateStaticFinalStr");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_getPrivateStaticFinalStr"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addGetter("com.navercorp.pinpoint.profiler.instrument.mock.getter.FieldProtectedStrGetter", "protectedStr");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_getProtectedStr"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addGetter("com.navercorp.pinpoint.profiler.instrument.mock.getter.FieldProtectedStaticStrGetter", "protectedStaticStr");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_getProtectedStaticStr"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addGetter("com.navercorp.pinpoint.profiler.instrument.mock.getter.FieldProtectedStaticFinalStrGetter", "protectedStaticFinalStr");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_getProtectedStaticFinalStr"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addGetter("com.navercorp.pinpoint.profiler.instrument.mock.getter.FieldPublicStrGetter", "publicStr");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_getPublicStr"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addGetter("com.navercorp.pinpoint.profiler.instrument.mock.getter.FieldPublicStaticStrGetter", "publicStaticStr");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_getPublicStaticStr"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addGetter("com.navercorp.pinpoint.profiler.instrument.mock.getter.FieldPublicStaticFinalStrGetter", "publicStaticFinalStr");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_getPublicStaticFinalStr"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addGetter("com.navercorp.pinpoint.profiler.instrument.mock.getter.FieldVolatileIntGetter", "volatileInt");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_getVolatileInt"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addGetter("com.navercorp.pinpoint.profiler.instrument.mock.getter.FieldTransientIntGetter", "transientInt");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_getTransientInt"));
}
@Test
public void addSetter() throws Exception {
ASMClass clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.BaseClass");
clazz.addSetter("com.navercorp.pinpoint.profiler.instrument.mock.BaseSetter", "b");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_setB", "boolean"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addSetter("com.navercorp.pinpoint.profiler.instrument.mock.setter.FieldIntSetter", "i");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_setInt", "int"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addSetter("com.navercorp.pinpoint.profiler.instrument.mock.setter.FieldIntArraySetter", "iArray");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_setIntArray", "int[]"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addSetter("com.navercorp.pinpoint.profiler.instrument.mock.setter.FieldObjectSetter", "object");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_setObject", "java.lang.Object"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addSetter("com.navercorp.pinpoint.profiler.instrument.mock.setter.FieldObjectArraySetter", "objectArray");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_setObjectArray", "java.lang.Object[]"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addSetter("com.navercorp.pinpoint.profiler.instrument.mock.setter.FieldObjectArraysSetter", "objectArrays");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_setObjectArrays", "java.lang.Object[][]"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addSetter("com.navercorp.pinpoint.profiler.instrument.mock.setter.FieldEnumSetter", "e");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_setEnum", "java.lang.Enum"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addSetter("com.navercorp.pinpoint.profiler.instrument.mock.setter.FieldMapSetter", "map");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_setMap", "java.util.Map"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addSetter("com.navercorp.pinpoint.profiler.instrument.mock.setter.FieldStrMapSetter", "strMap");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_setStrMap", "java.util.Map"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addSetter("com.navercorp.pinpoint.profiler.instrument.mock.setter.FieldObjectMapSetter", "objectMap");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_setObjectMap", "java.util.Map"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addSetter("com.navercorp.pinpoint.profiler.instrument.mock.setter.FieldWildcardMapSetter", "wildcardMap");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_setWildcardMap", "java.util.Map"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addSetter("com.navercorp.pinpoint.profiler.instrument.mock.setter.FieldDefaultStrSetter", "defaultStr");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_setDefaultStr", "java.lang.String"));
try {
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addSetter("com.navercorp.pinpoint.profiler.instrument.mock.setter.FieldDefaultStaticStrSetter", "defaultStaticStr");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_setDefaultStaticStr", "java.lang.String"));
fail("can't throw exception");
} catch(Exception ignored) {
}
try {
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addSetter("com.navercorp.pinpoint.profiler.instrument.mock.setter.FieldDefaultFinalStrSetter", "defaultFinalStr");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_setDefaultFinalStr", "java.lang.String"));
fail("can't throw exception");
} catch(Exception ignored) {
}
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addSetter("com.navercorp.pinpoint.profiler.instrument.mock.setter.FieldPrivateStrSetter", "privateStr");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_setPrivateStr", "java.lang.String"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addSetter("com.navercorp.pinpoint.profiler.instrument.mock.setter.FieldProtectedStrSetter", "protectedStr");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_setProtectedStr", "java.lang.String"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addSetter("com.navercorp.pinpoint.profiler.instrument.mock.setter.FieldPublicStrSetter", "publicStr");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_setPublicStr", "java.lang.String"));
try {
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addSetter("com.navercorp.pinpoint.profiler.instrument.mock.setter.FieldPublicFinalStrSetter", "publicFinalStr");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_setPublicFinalStr", "java.lang.String"));
fail("can't throw exception");
} catch(Exception ignored) {
}
// removeFinal is true
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addSetter("com.navercorp.pinpoint.profiler.instrument.mock.setter.FieldPublicFinalStrSetter", "publicFinalStr", true);
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_setPublicFinalStr", "java.lang.String"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addSetter("com.navercorp.pinpoint.profiler.instrument.mock.setter.FieldVolatileIntSetter", "volatileInt");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_setVolatileInt", "int"));
clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.FieldClass");
clazz.addSetter("com.navercorp.pinpoint.profiler.instrument.mock.setter.FieldTransientIntSetter", "transientInt");
assertNotNull(clazz.getDeclaredMethod("_$PINPOINT$_setTransientInt", "int"));
}
@Test
public void addInterceptor() throws Exception {
ASMClass clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.BaseClass");
clazz.addInterceptor("com.navercorp.pinpoint.profiler.instrument.mock.BaseAnnotationInterceptor");
}
@Test
public void getNestedClasses() throws Exception {
ASMClass clazz = getClass("com.navercorp.pinpoint.profiler.instrument.mock.NestedClass");
String targetClassName = "com.navercorp.pinpoint.profiler.instrument.mock.NestedClass$StaticNested";
assertEquals(1, clazz.getNestedClasses(ClassFilters.name(targetClassName)).size());
assertEquals(targetClassName, clazz.getNestedClasses(ClassFilters.name(targetClassName)).get(0).getName());
targetClassName = "com.navercorp.pinpoint.profiler.instrument.mock.NestedClass$InstanceInner";
assertEquals(1, clazz.getNestedClasses(ClassFilters.name(targetClassName)).size());
assertEquals(targetClassName, clazz.getNestedClasses(ClassFilters.name(targetClassName)).get(0).getName());
targetClassName = "com.navercorp.pinpoint.profiler.instrument.mock.NestedClass$1LocalInner";
assertEquals(1, clazz.getNestedClasses(ClassFilters.name(targetClassName)).size());
assertEquals(targetClassName, clazz.getNestedClasses(ClassFilters.name(targetClassName)).get(0).getName());
targetClassName = "com.navercorp.pinpoint.profiler.instrument.mock.NestedClass$1";
assertEquals(1, clazz.getNestedClasses(ClassFilters.name(targetClassName)).size());
assertEquals(targetClassName, clazz.getNestedClasses(ClassFilters.name(targetClassName)).get(0).getName());
// find enclosing method condition.
assertEquals(2, clazz.getNestedClasses(ClassFilters.enclosingMethod("annonymousInnerClass")).size());
// find interface condition.
assertEquals(2, clazz.getNestedClasses(ClassFilters.interfaze("java.util.concurrent.Callable")).size());
// find enclosing method & interface condition.
assertEquals(1, clazz.getNestedClasses(ClassFilters.chain(ClassFilters.enclosingMethod("annonymousInnerClass"), ClassFilters.interfaze("java.util.concurrent.Callable"))).size());
}
private ASMClass getClass(final String targetClassName) throws Exception {
ClassNode classNode = ASMClassNodeLoader.get(targetClassName);
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
return new ASMClass(objectBinderFactory, pluginContext, interceptorRegistryBinder, apiMetaDataService.get(), classLoader, classNode);
}
}