/* * 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.util; import javassist.*; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; /** * @author emeroad */ public class JavaAssistUtilsTest { private static final String TEST_CLASS_NAME = "com.navercorp.pinpoint.profiler.util.JavaAssistUtilsTest"; private final Logger logger = LoggerFactory.getLogger(JavaAssistUtilsTest.class.getName()); private ClassPool pool; @Before public void setUp() throws Exception { pool = new ClassPool(); pool.appendSystemPath(); } @Test public void testGetParameterDescription() throws Exception { CtClass ctClass = pool.get("java.lang.String"); CtMethod substring = ctClass.getDeclaredMethod("substring", new CtClass[]{CtClass.intType}); String ctDescription = JavaAssistUtils.getParameterDescription(substring.getParameterTypes()); logger.debug(ctDescription); String clsDescription = JavaAssistUtils.getParameterDescription(new Class[]{int.class}); logger.debug(clsDescription); Assert.assertEquals(ctDescription, clsDescription); } @Test public void javaArraySize() { Assert.assertEquals(JavaAssistUtils.getJavaObjectArraySize(""), 0); Assert.assertEquals(JavaAssistUtils.getJavaObjectArraySize("[]"), 1); Assert.assertEquals(JavaAssistUtils.getJavaObjectArraySize("[][][]"), 3); Assert.assertEquals(JavaAssistUtils.getJavaObjectArraySize("int"), 0); Assert.assertEquals(JavaAssistUtils.getJavaObjectArraySize("int[]"), 1); Assert.assertEquals(JavaAssistUtils.getJavaObjectArraySize("int[][][]"), 3); Assert.assertEquals(JavaAssistUtils.getJavaObjectArraySize("java.lang.String"), 0); Assert.assertEquals(JavaAssistUtils.getJavaObjectArraySize("java.lang.String[][]"), 2); } @Test public void javaClassNameToObjectName() { // primitives Assert.assertEquals("boolean", JavaAssistUtils.javaClassNameToObjectName(boolean.class.getName())); Assert.assertEquals("byte", JavaAssistUtils.javaClassNameToObjectName(byte.class.getName())); Assert.assertEquals("char", JavaAssistUtils.javaClassNameToObjectName(char.class.getName())); Assert.assertEquals("double", JavaAssistUtils.javaClassNameToObjectName(double.class.getName())); Assert.assertEquals("float", JavaAssistUtils.javaClassNameToObjectName(float.class.getName())); Assert.assertEquals("int", JavaAssistUtils.javaClassNameToObjectName(int.class.getName())); Assert.assertEquals("short", JavaAssistUtils.javaClassNameToObjectName(short.class.getName())); // wrappers Assert.assertEquals("java.lang.Integer", JavaAssistUtils.javaClassNameToObjectName(Integer.class.getName())); Assert.assertEquals("java.lang.String", JavaAssistUtils.javaClassNameToObjectName(String.class.getName())); // classes Assert.assertEquals("java.util.List", JavaAssistUtils.javaClassNameToObjectName(List.class.getName())); Assert.assertEquals("java.util.ArrayList", JavaAssistUtils.javaClassNameToObjectName(new ArrayList<Integer>().getClass().getName())); // arrays Assert.assertEquals("boolean[]", JavaAssistUtils.javaClassNameToObjectName(boolean[].class.getName())); Assert.assertEquals("byte[]", JavaAssistUtils.javaClassNameToObjectName(byte[].class.getName())); Assert.assertEquals("java.lang.String[]", JavaAssistUtils.javaClassNameToObjectName(String[].class.getName())); // inner/nested classes Assert.assertEquals( this.getClass().getName() + "$1", JavaAssistUtils.javaClassNameToObjectName(new Comparable<Long>() { @Override public int compareTo(Long o) { return 0; } }.getClass().getName())); class SomeComparable implements Comparable<Long> { @Override public int compareTo(Long o) { return 0; } } SomeComparable inner = new SomeComparable(); Assert.assertEquals( this.getClass().getName() + "$1SomeComparable", JavaAssistUtils.javaClassNameToObjectName(inner.getClass().getName())); // assume nothing else is defined in this class Assert.assertEquals( this.getClass().getName() + "$1SomeComparable[]", JavaAssistUtils.javaClassNameToObjectName(new SomeComparable[] {inner}.getClass().getName())); Assert.assertEquals("java.util.Map$Entry", JavaAssistUtils.javaClassNameToObjectName(Map.Entry.class.getName())); Assert.assertEquals("java.util.Map$Entry[]", JavaAssistUtils.javaClassNameToObjectName(Map.Entry[].class.getName())); } @Test public void toJvmSignature() { Assert.assertEquals(JavaAssistUtils.toJvmSignature("int"), "I"); Assert.assertEquals(JavaAssistUtils.toJvmSignature("int[]"), "[I"); Assert.assertEquals(JavaAssistUtils.toJvmSignature("int[][][]"), "[[[I"); Assert.assertEquals(JavaAssistUtils.toJvmSignature("void"), "V"); Assert.assertEquals(JavaAssistUtils.toJvmSignature("java.lang.String"), "Ljava/lang/String;"); Assert.assertEquals(JavaAssistUtils.toJvmSignature("java.lang.String[][]"), "[[Ljava/lang/String;"); try { Assert.assertEquals(JavaAssistUtils.toJvmSignature(""), ""); Assert.fail("empty string"); } catch (Exception ignore) { } try { Assert.assertEquals(JavaAssistUtils.toJvmSignature(null), null); Assert.fail("null"); } catch (Exception ignore) { } } @Test public void javaTypeToJvmSignature() { Assert.assertEquals(JavaAssistUtils.javaTypeToJvmSignature(new String[]{}), "()"); Assert.assertEquals(JavaAssistUtils.javaTypeToJvmSignature(new String[]{"int"}), "(I)"); Assert.assertEquals(JavaAssistUtils.javaTypeToJvmSignature(new String[]{"int", "double"}), "(ID)"); Assert.assertEquals(JavaAssistUtils.javaTypeToJvmSignature( new String[]{"byte", "float", "short"}), "(BFS)"); Assert.assertEquals(JavaAssistUtils.javaTypeToJvmSignature(new String[]{"java.lang.String"}), "(Ljava/lang/String;)"); Assert.assertEquals(JavaAssistUtils.javaTypeToJvmSignature(new String[]{"java.lang.String", "long"}), "(Ljava/lang/String;J)"); Assert.assertEquals(JavaAssistUtils.javaTypeToJvmSignature(new String[]{"long", "java.lang.Object", "boolean"}), "(JLjava/lang/Object;Z)"); Assert.assertEquals(JavaAssistUtils.javaTypeToJvmSignature(new String[]{"char", "long", "java.lang.Object", "boolean"}), "(CJLjava/lang/Object;Z)"); } @Test public void javaTypeToJvmSignatureReturnType() { Assert.assertEquals(JavaAssistUtils.javaTypeToJvmSignature(new String[]{}, "void"), "()V"); Assert.assertEquals(JavaAssistUtils.javaTypeToJvmSignature(new String[]{"int"}, "int"), "(I)I"); Assert.assertEquals(JavaAssistUtils.javaTypeToJvmSignature(new String[]{"int", "double"}, "double"), "(ID)D"); Assert.assertEquals(JavaAssistUtils.javaTypeToJvmSignature( new String[]{"byte", "float", "short"}, "float"), "(BFS)F"); Assert.assertEquals(JavaAssistUtils.javaTypeToJvmSignature(new String[]{"java.lang.String"}, "java.lang.String"), "(Ljava/lang/String;)Ljava/lang/String;"); Assert.assertEquals(JavaAssistUtils.javaTypeToJvmSignature(new String[]{"java.lang.String", "long"}, "long"), "(Ljava/lang/String;J)J"); Assert.assertEquals(JavaAssistUtils.javaTypeToJvmSignature(new String[]{"long", "java.lang.Object", "boolean"}, "boolean"), "(JLjava/lang/Object;Z)Z"); Assert.assertEquals(JavaAssistUtils.javaTypeToJvmSignature(new String[]{"char", "long", "java.lang.Object", "boolean"}, "java.lang.Object"), "(CJLjava/lang/Object;Z)Ljava/lang/Object;"); } @Test public void testParseParameterDescriptor() throws Exception { Assert.assertArrayEquals(JavaAssistUtils.parseParameterSignature("()V"), new String[]{}); Assert.assertArrayEquals(JavaAssistUtils.parseParameterSignature("(I)I"), new String[]{"int"}); Assert.assertArrayEquals(JavaAssistUtils.parseParameterSignature("(ID)I"), new String[]{"int", "double"}); Assert.assertArrayEquals(JavaAssistUtils.parseParameterSignature("(BFS)I"), new String[]{"byte", "float", "short"}); Assert.assertArrayEquals(JavaAssistUtils.parseParameterSignature("(Ljava/lang/String;)I"), new String[]{"java.lang.String"}); Assert.assertArrayEquals(JavaAssistUtils.parseParameterSignature("(Ljava/lang/String;J)I"), new String[]{"java.lang.String", "long"}); Assert.assertArrayEquals(JavaAssistUtils.parseParameterSignature("(JLjava/lang/Object;Z)I"), new String[]{"long", "java.lang.Object", "boolean"}); Assert.assertArrayEquals(JavaAssistUtils.parseParameterSignature("(CJLjava/lang/Object;Z)I"), new String[]{"char", "long", "java.lang.Object", "boolean"}); } @Test public void testParseParameterDescriptor_array() throws Exception { Assert.assertArrayEquals(JavaAssistUtils.parseParameterSignature("([I)I"), new String[]{"int[]"}); Assert.assertArrayEquals(JavaAssistUtils.parseParameterSignature("([IJ)I"), new String[]{"int[]", "long"}); Assert.assertArrayEquals(JavaAssistUtils.parseParameterSignature("([J[I)I"), new String[]{"long[]", "int[]"}); Assert.assertArrayEquals(JavaAssistUtils.parseParameterSignature("([Ljava/lang/String;)"), new String[]{"java.lang.String[]"}); Assert.assertArrayEquals(JavaAssistUtils.parseParameterSignature("(Ljava/lang/String;[[J)"), new String[]{"java.lang.String", "long[][]"}); Assert.assertArrayEquals(JavaAssistUtils.parseParameterSignature("(Ljava/lang/Object;[[Ljava/lang/String;)"), new String[]{"java.lang.Object", "java.lang.String[][]"}); Assert.assertArrayEquals(JavaAssistUtils.parseParameterSignature("([[[Ljava/lang/String;)"), new String[]{"java.lang.String[][][]"}); Assert.assertArrayEquals(JavaAssistUtils.parseParameterSignature("([[[I)"), new String[]{"int[][][]"}); } public void getLineNumber_testAPI(String params) { } @Test public void testGetLineNumber() throws Exception { // pool.appendClassPath(new ClassClassPath(AbstractHttpClient.class)); CtClass ctClass = pool.get("com.navercorp.pinpoint.profiler.util.JavaAssistUtilsTest"); CtClass params = pool.get("java.lang.String"); // non-javadoc, see interface HttpClient // public synchronized final HttpParams getParams() { // if (defaultParams == null) { // defaultParams = createHttpParams(); // } // return defaultParams; // } CtMethod setParams = ctClass.getDeclaredMethod("getLineNumber_testAPI", new CtClass[]{params}); int lineNumber = JavaAssistUtils.getLineNumber(setParams); logger.debug("line:{}", lineNumber); logger.debug(setParams.getName()); logger.debug(setParams.getLongName()); String[] paramName = JavaAssistUtils.getParameterVariableName(setParams); logger.debug(Arrays.toString(paramName)); Assert.assertEquals(paramName.length, 1); Assert.assertEquals(paramName[0], "params"); String[] parameterType = JavaAssistUtils.parseParameterSignature(setParams.getSignature()); String[] parameterType2 = JavaAssistUtils.getParameterType(setParams.getParameterTypes()); logger.debug(Arrays.toString(parameterType)); Assert.assertArrayEquals(parameterType, parameterType2); String s = ApiUtils.mergeParameterVariableNameDescription(parameterType, paramName); logger.debug(s); } public void testVariableNameError1_testAPI(boolean autoCommitFlag) { logger.debug("testVariableNameError1_testAPI test api"); } @Test public void testVariableNameError1() throws Exception { CtClass ctClass = pool.get(TEST_CLASS_NAME); CtMethod setParams = ctClass.getDeclaredMethod("testVariableNameError1_testAPI", new CtClass[]{CtClass.booleanType}); int lineNumber = JavaAssistUtils.getLineNumber(setParams); logger.debug("line:{}", lineNumber); logger.debug(setParams.getName()); logger.debug(setParams.getLongName()); String[] paramName = JavaAssistUtils.getParameterVariableName(setParams); logger.debug(Arrays.toString(paramName)); Assert.assertEquals(paramName.length, 1); Assert.assertEquals(paramName[0], "autoCommitFlag"); String[] parameterType = JavaAssistUtils.parseParameterSignature(setParams.getSignature()); String[] parameterType2 = JavaAssistUtils.getParameterType(setParams.getParameterTypes()); logger.debug(Arrays.toString(parameterType)); Assert.assertArrayEquals(parameterType, parameterType2); String s = ApiUtils.mergeParameterVariableNameDescription(parameterType, paramName); logger.debug(s); } public void testVariableNameError2_testAPI(String sql) { logger.debug("testVariableNameError1_testAPI test api"); } @Test public void testVariableNameError2() throws Exception { CtClass ctClass = pool.get(TEST_CLASS_NAME); CtClass params = pool.get("java.lang.String"); CtMethod setParams = ctClass.getDeclaredMethod("testVariableNameError2_testAPI", new CtClass[]{params}); int lineNumber = JavaAssistUtils.getLineNumber(setParams); logger.debug(setParams.getName()); logger.debug(setParams.getLongName()); String[] paramName = JavaAssistUtils.getParameterVariableName(setParams); logger.debug(Arrays.toString(paramName)); Assert.assertEquals(paramName.length, 1); Assert.assertEquals(paramName[0], "sql"); String[] parameterType = JavaAssistUtils.parseParameterSignature(setParams.getSignature()); String[] parameterType2 = JavaAssistUtils.getParameterType(setParams.getParameterTypes()); logger.debug(Arrays.toString(parameterType)); Assert.assertArrayEquals(parameterType, parameterType2); String s = ApiUtils.mergeParameterVariableNameDescription(parameterType, paramName); logger.debug(s); } @Test public void testGetParameterDescription2() throws Exception { String clsDescription = JavaAssistUtils.getParameterDescription(new Class[]{String.class, Integer.class}); logger.debug(clsDescription); Assert.assertEquals("(java.lang.String, java.lang.Integer)", clsDescription); } }