/*
* Copyright 2014 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.plugin;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import com.navercorp.pinpoint.bootstrap.config.ProfilerConfig;
import com.navercorp.pinpoint.bootstrap.instrument.InstrumentContext;
import com.navercorp.pinpoint.bootstrap.plugin.monitor.DataSourceMonitorRegistry;
import com.navercorp.pinpoint.profiler.metadata.ApiMetaDataService;
import org.junit.Before;
import org.junit.Test;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import com.navercorp.pinpoint.bootstrap.context.MethodDescriptor;
import com.navercorp.pinpoint.bootstrap.context.TraceContext;
import com.navercorp.pinpoint.bootstrap.instrument.InstrumentClass;
import com.navercorp.pinpoint.bootstrap.instrument.InstrumentMethod;
import com.navercorp.pinpoint.bootstrap.interceptor.Interceptor;
import com.navercorp.pinpoint.bootstrap.plugin.ObjectFactory;
import com.navercorp.pinpoint.exception.PinpointException;
import com.navercorp.pinpoint.profiler.interceptor.factory.AnnotatedInterceptorFactory;
import com.navercorp.pinpoint.profiler.plugin.TestInterceptors.TestInterceptor0;
import com.navercorp.pinpoint.profiler.plugin.TestInterceptors.TestInterceptor1;
import com.navercorp.pinpoint.profiler.plugin.TestInterceptors.TestInterceptor2;
public class AnnotatedInterceptorFactoryTest {
private final ProfilerConfig profilerConfig = mock(ProfilerConfig.class);
private final DataSourceMonitorRegistry dataSourceMonitorRegistry = mock(DataSourceMonitorRegistry.class);
private final ApiMetaDataService apiMetaDataService = mock(ApiMetaDataService.class);
private final InstrumentContext pluginContext = mock(InstrumentContext.class);
private final TraceContext traceContext = mock(TraceContext.class);
private final InstrumentClass instrumentClass = mock(InstrumentClass.class);
private final InstrumentMethod instrumentMethod = mock(InstrumentMethod.class);
private final MethodDescriptor descriptor = mock(MethodDescriptor.class);
@Before
public void setUp() {
reset(traceContext, instrumentClass, instrumentMethod);
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(instrumentMethod.getDescriptor()).thenReturn(descriptor);
}
private AnnotatedInterceptorFactory newAnnotatedInterceptorFactory() {
return new AnnotatedInterceptorFactory(profilerConfig, traceContext, dataSourceMonitorRegistry, apiMetaDataService, pluginContext, false);
}
@Test
public void test0() throws Exception {
AnnotatedInterceptorFactory factory = newAnnotatedInterceptorFactory();
Interceptor interceptor = factory.getInterceptor(getClass().getClassLoader(), TestInterceptor0.class.getName(), null, null, null, instrumentClass, instrumentMethod);
assertEquals(TestInterceptor0.class, interceptor.getClass());
}
@Test
public void test1() throws Exception {
Object[] args = new Object[] { "arg0" };
AnnotatedInterceptorFactory factory = newAnnotatedInterceptorFactory();
Interceptor interceptor = factory.getInterceptor(getClass().getClassLoader(), TestInterceptor0.class.getName(), args, null, null, instrumentClass, instrumentMethod);
assertEquals(TestInterceptor0.class, interceptor.getClass());
assertEquals(args[0], getField(interceptor, "field0"));
}
@Test(expected = PinpointException.class)
public void test2() throws Exception {
Object[] args = new Object[] { 1 };
AnnotatedInterceptorFactory factory = newAnnotatedInterceptorFactory();
factory.getInterceptor(getClass().getClassLoader(), TestInterceptor0.class.getName(), args, null, null, instrumentClass, instrumentMethod);
}
@Test
public void test3() throws Exception {
Object[] args = new Object[] { "arg0", (byte)1, (short)2, (float)3.0 };
AnnotatedInterceptorFactory factory = newAnnotatedInterceptorFactory();
Interceptor interceptor = factory.getInterceptor(getClass().getClassLoader(), TestInterceptor1.class.getName(), args, null, null, instrumentClass, instrumentMethod);
assertEquals(TestInterceptor1.class, interceptor.getClass());
assertEquals(args[0], getField(interceptor, "field0"));
assertEquals(args[1], getField(interceptor, "field1"));
assertEquals(args[2], getField(interceptor, "field2"));
assertEquals(args[3], getField(interceptor, "field3"));
}
@Test
public void test4() throws Exception {
Object[] args = new Object[] { (byte)1, (short)2, (float)3.0, "arg0" };
AnnotatedInterceptorFactory factory = newAnnotatedInterceptorFactory();
Interceptor interceptor = factory.getInterceptor(getClass().getClassLoader(), TestInterceptor1.class.getName(), args, null, null, instrumentClass, instrumentMethod);
assertEquals(TestInterceptor1.class, interceptor.getClass());
assertEquals(args[3], getField(interceptor, "field0"));
assertEquals(args[0], getField(interceptor, "field1"));
assertEquals(args[1], getField(interceptor, "field2"));
assertEquals(args[2], getField(interceptor, "field3"));
}
@Test
public void test5() throws Exception {
Object[] args = new Object[] { (short)2, (float)3.0, "arg0", (byte)1 };
AnnotatedInterceptorFactory factory = newAnnotatedInterceptorFactory();
Interceptor interceptor = factory.getInterceptor(getClass().getClassLoader(), TestInterceptor1.class.getName(), args, null, null, instrumentClass, instrumentMethod);
assertEquals(TestInterceptor1.class, interceptor.getClass());
assertEquals(args[2], getField(interceptor, "field0"));
assertEquals(args[3], getField(interceptor, "field1"));
assertEquals(args[0], getField(interceptor, "field2"));
assertEquals(args[1], getField(interceptor, "field3"));
}
@Test
public void test6() throws Exception {
Object[] args = new Object[] { (float)3.0, (short)2, (byte)1, "arg0" };
AnnotatedInterceptorFactory factory = newAnnotatedInterceptorFactory();
Interceptor interceptor = factory.getInterceptor(getClass().getClassLoader(), TestInterceptor1.class.getName(), args, null, null, instrumentClass, instrumentMethod);
assertEquals(TestInterceptor1.class, interceptor.getClass());
assertEquals(args[3], getField(interceptor, "field0"));
assertEquals(args[2], getField(interceptor, "field1"));
assertEquals(args[1], getField(interceptor, "field2"));
assertEquals(args[0], getField(interceptor, "field3"));
}
@Test(expected=PinpointException.class)
public void test7() throws Exception {
AnnotatedInterceptorFactory factory = newAnnotatedInterceptorFactory();
factory.getInterceptor(getClass().getClassLoader(), TestInterceptor1.class.getName(), null, null, null, instrumentClass, instrumentMethod);
}
@Test(expected=PinpointException.class)
public void test8() throws Exception {
AnnotatedInterceptorFactory factory = newAnnotatedInterceptorFactory();
factory.getInterceptor(getClass().getClassLoader(), TestInterceptor1.class.getName(), null, null, null, instrumentClass, instrumentMethod);
}
@Test
public void test9() throws Exception {
Object[] args = new Object[] { "arg0", 1, 2.0, true, 3L };
AnnotatedInterceptorFactory factory = newAnnotatedInterceptorFactory();
Interceptor interceptor = factory.getInterceptor(getClass().getClassLoader(), TestInterceptor2.class.getName(), args, null, null, instrumentClass, instrumentMethod);
assertEquals(TestInterceptor2.class, interceptor.getClass());
assertEquals(args[0], getField(interceptor, "field0"));
assertEquals(args[1], getField(interceptor, "field1"));
assertEquals(args[2], getField(interceptor, "field2"));
assertEquals(args[3], getField(interceptor, "field3"));
assertEquals(args[4], getField(interceptor, "field4"));
assertSame(descriptor, getField(interceptor, "descriptor"));
assertSame(instrumentClass, getField(interceptor, "targetClass"));
assertSame(instrumentMethod, getField(interceptor, "targetMethod"));
}
@Test
public void test10() throws Exception {
Object[] args = new Object[] { "arg0", 1, 2.0 };
AnnotatedInterceptorFactory factory = newAnnotatedInterceptorFactory();
Interceptor interceptor = factory.getInterceptor(getClass().getClassLoader(), TestInterceptor2.class.getName(), args, null, null, instrumentClass, instrumentMethod);
assertEquals(TestInterceptor2.class, interceptor.getClass());
assertEquals(args[0], getField(interceptor, "field0"));
assertEquals(args[1], getField(interceptor, "field1"));
assertEquals(args[2], getField(interceptor, "field2"));
assertEquals(false, getField(interceptor, "field3"));
assertEquals(0L, getField(interceptor, "field4"));
assertSame(descriptor, getField(interceptor, "descriptor"));
assertSame(instrumentClass, getField(interceptor, "targetClass"));
assertSame(instrumentMethod, getField(interceptor, "targetMethod"));
}
@Test
public void test11() throws Exception {
Object[] args = new Object[] { "arg0", 1 };
AnnotatedInterceptorFactory factory = newAnnotatedInterceptorFactory();
Interceptor interceptor = factory.getInterceptor(getClass().getClassLoader(), TestInterceptor2.class.getName(), args, null, null, instrumentClass, instrumentMethod);
assertEquals(TestInterceptor2.class, interceptor.getClass());
assertEquals(args[0], getField(interceptor, "field0"));
assertEquals(args[1], getField(interceptor, "field1"));
assertEquals(0.0, getField(interceptor, "field2"));
assertEquals(false, getField(interceptor, "field3"));
assertEquals(0L, getField(interceptor, "field4"));
assertSame(descriptor, getField(interceptor, "descriptor"));
assertSame(instrumentClass, getField(interceptor, "targetClass"));
assertSame(instrumentMethod, getField(interceptor, "targetMethod"));
}
@Test
public void test12() throws Exception {
AnnotatedInterceptorFactory factory = newAnnotatedInterceptorFactory();
Interceptor interceptor = factory.getInterceptor(getClass().getClassLoader(), TestInterceptor2.class.getName(), null, null, null, instrumentClass, instrumentMethod);
assertEquals(TestInterceptor2.class, interceptor.getClass());
assertEquals(null, getField(interceptor, "field0"));
assertEquals(0, getField(interceptor, "field1"));
assertEquals(0.0, getField(interceptor, "field2"));
assertEquals(false, getField(interceptor, "field3"));
assertEquals(0L, getField(interceptor, "field4"));
assertSame(descriptor, getField(interceptor, "descriptor"));
assertSame(instrumentClass, getField(interceptor, "targetClass"));
assertSame(instrumentMethod, getField(interceptor, "targetMethod"));
}
@Test
public void test13() throws Exception {
Object[] args = new Object[] { "arg0" };
AnnotatedInterceptorFactory factory = newAnnotatedInterceptorFactory();
Interceptor interceptor = factory.getInterceptor(getClass().getClassLoader(), TestInterceptor2.class.getName(), args, null, null, instrumentClass, instrumentMethod);
assertEquals(TestInterceptor2.class, interceptor.getClass());
assertEquals(args[0], getField(interceptor, "field0"));
assertEquals(0, getField(interceptor, "field1"));
assertEquals(0.0, getField(interceptor, "field2"));
assertEquals(false, getField(interceptor, "field3"));
assertEquals(0L, getField(interceptor, "field4"));
assertSame(descriptor, getField(interceptor, "descriptor"));
assertSame(instrumentClass, getField(interceptor, "targetClass"));
assertNull(getField(interceptor, "targetMethod"));
}
@Test
public void test14() throws Exception {
String arg0 = "arg0";
Object[] args = new Object[] { ObjectFactory.byConstructor("java.lang.String", arg0) };
AnnotatedInterceptorFactory factory = newAnnotatedInterceptorFactory();
Interceptor interceptor = factory.getInterceptor(getClass().getClassLoader(), TestInterceptor0.class.getName(), args, null, null, instrumentClass, instrumentMethod);
assertEquals(TestInterceptor0.class, interceptor.getClass());
assertEquals(arg0, getField(interceptor, "field0"));
}
private Object getField(Object object, String name) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
String methodName = "get" + Character.toUpperCase(name.charAt(0)) + name.substring(1);
Method method = object.getClass().getMethod(methodName);
return method.invoke(object);
}
}