1 /* 2 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 /* 25 * @test MethodMatcherTest 26 * @library /testlibrary /test/lib 27 * @run main ClassFileInstaller sun.hotspot.WhiteBox 28 * sun.hotspot.WhiteBox$WhiteBoxPermission 29 * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI MethodMatcherTest 30 * @summary Testing of compiler/MethodMatcher 31 * @bug 8135068 32 */ 33 34 import java.lang.reflect.Method; 35 import java.util.ArrayList; 36 37 import sun.hotspot.WhiteBox; 38 39 public class MethodMatcherTest { 40 41 /** Instance of WhiteBox */ 42 protected static final WhiteBox WHITE_BOX = WhiteBox.getWhiteBox(); 43 44 Method helper; 45 Method getDate; 46 Method inner; 47 Method toString; 48 49 static final int MATCH = 1; 50 static final int NO_MATCH = 0; 51 static final int PARSING_FAILURE = -1; 52 53 public MethodMatcherTest() { 54 } 55 56 public void test() throws Exception { 57 // instantiate before calling getMethod on innerHelper 58 TestCases testCases = new TestCases(); 59 60 helper = getMethod(MethodMatcherTest.class, "helper"); 61 getDate = getMethod(java.util.Date.class, "getDate"); 62 inner = getMethod(TestCases.class, "innerHelper"); 63 toString = getMethod(String.class, "toString"); 64 65 testCases.add(helper, "pool/sub/Klass.method(I[Ljava/lang/String;Ljava/lang/Integer;[B[[D)V", NO_MATCH); 66 67 // These should be improved to parsing failed in the future 68 testCases.add(helper, "*Klass*,*$method*::", NO_MATCH); 69 testCases.add(helper, "*Klass *+*", NO_MATCH); 70 testCases.add(helper, "*Klass*::*method*", NO_MATCH); 71 72 testCases.add(helper, "*,**", PARSING_FAILURE); 73 testCases.add(helper, "*,*(I[Ljava/lang/String;Lj]ava/lang/Integer;[B[[D)V", PARSING_FAILURE); 74 testCases.add(helper, "*,*)method*.", PARSING_FAILURE); 75 testCases.add(helper, "{pool.subpack.Klass}* *", PARSING_FAILURE); 76 testCases.add(helper, "*Klass met]hod/", PARSING_FAILURE); 77 testCases.add(helper, "pool::su@%b::Klass* *)method.", PARSING_FAILURE); 78 testCases.add(helper, "0pool/sub/Klass,*{method}*.(I[Ljava/lang/String;Lj]ava/lang/Integer;[B[[D)V", PARSING_FAILURE); 79 testCases.add(helper, "*Klass nonexistent::)(I[Ljava/lang/String;Ljava/lang/Integer;[B[[D)V", PARSING_FAILURE); 80 testCases.add(helper, "pool,su]b,Klass*,*)method*/", PARSING_FAILURE); 81 testCases.add(helper, "_pool,sub,Klass*,met@%hod,(0)V", PARSING_FAILURE); 82 83 testCases.add(helper, "*.*", MATCH); 84 testCases.add(helper, "MethodMatcherTest.*", MATCH); 85 testCases.add(helper, "MethodMatcherTest.helper", MATCH); 86 testCases.add(helper, "MethodMatcherTest.helper()", MATCH); 87 testCases.add(helper, "MethodMatcherTest.helper()V", MATCH); 88 testCases.add(helper, "MethodMatcherTest.helper()V;", NO_MATCH); 89 testCases.add(helper, "MethodMatcherTest.helper()I", NO_MATCH); 90 testCases.add(helper, "MethodMatcherTest.helperX", NO_MATCH); 91 testCases.add(helper, "MethodMatcherTestX.helper;", NO_MATCH); 92 testCases.add(helper, "abc.*", NO_MATCH); 93 testCases.add(helper, "*.abc", NO_MATCH); 94 95 testCases.add(getDate, "*.*", MATCH); 96 testCases.add(getDate, "*.getDate", MATCH); 97 testCases.add(getDate, "java/util/Date.getDate", MATCH); 98 testCases.add(getDate, "java/util/Date.*", MATCH); 99 100 testCases.add(inner, "*.*", MATCH); 101 testCases.add(inner, "MethodMatcherTest$TestCases.innerHelper", MATCH); 102 testCases.add(inner, "MethodMatcherTest*.innerHelper", MATCH); 103 testCases.add(inner, "MethodMatcherTest$*.innerHelper", MATCH); 104 testCases.add(inner, "*$TestCases.innerHelper", MATCH); 105 testCases.add(inner, "*TestCases.innerHelper", MATCH); 106 testCases.add(inner, "TestCases.innerHelper", NO_MATCH); 107 testCases.add(inner, "MethodMatcherTest.innerHelper", NO_MATCH); 108 109 testCases.add(toString, "*.*", MATCH); 110 testCases.add(toString, "java/lang/String.toString", MATCH); 111 testCases.add(toString, "java.lang.String::toString", MATCH); 112 113 testCases.add(toString, "java/lang/String::toString", PARSING_FAILURE); 114 testCases.add(toString, "java.lang/String::toString", PARSING_FAILURE); 115 testCases.add(toString, "java.lang/String.toString", PARSING_FAILURE); 116 testCases.add(toString, "java::lang::String::toString", PARSING_FAILURE); 117 118 testCases.add(toString, "java/lang/String.toString(*)", PARSING_FAILURE); 119 testCases.add(toString, "java/lang/String.toString(L*", PARSING_FAILURE); 120 testCases.add(toString, "java/lang/String.toString*(lsd)l", NO_MATCH); 121 testCases.add(toString, "java/lang/String.toString(lsd)l", NO_MATCH); 122 testCases.add(toString, "java/lang/String.toString (", MATCH); 123 testCases.add(toString, "java/lang/String.toString ()", MATCH); 124 testCases.add(toString, "java/lang/String.toString ()L", MATCH); 125 testCases.add(toString, "java/lang/String.toString ()Lj", MATCH); 126 testCases.add(toString, "java/lang/String.toString ()Ls", NO_MATCH); 127 testCases.add(toString, "java/lang/String.toString*(", MATCH); 128 testCases.add(toString, "java/lang/String.toString* (", MATCH); 129 testCases.add(toString, "java/lang/String.toString*(;", NO_MATCH); 130 testCases.add(toString, "java/lang/String.toString*();sf", NO_MATCH); 131 testCases.add(toString, "java/lang/String.toString*()Ljava/lang/String;", MATCH); 132 testCases.add(toString, "java/lang/String.toString()Ljava/lang/String;", MATCH); 133 testCases.add(toString, "java/lang/String.toString ()Ljava/lang/String;", MATCH); 134 testCases.add(toString, "java/lang/String.toString ()Ljava/lang/String", MATCH); 135 testCases.add(toString, "java/lang/String.toString ()L", MATCH); 136 testCases.add(toString, "java/lang/String.toString ()I;", NO_MATCH); 137 138 testCases.add(toString, "*Internal.*", NO_MATCH); 139 testCases.add(toString, "*Internal.**", PARSING_FAILURE); 140 testCases.add(toString, "*Internal.***", PARSING_FAILURE); 141 testCases.add(toString, "*Internal.*a**", PARSING_FAILURE); 142 testCases.add(toString, "*Internal.**a*", PARSING_FAILURE); 143 144 testCases.add(toString, "java.lang.String::<init>(Ljava/lang/String;)V", NO_MATCH); 145 testCases.add(toString, "java.lang.String::<clinit>(Ljava/lang/String;)V", NO_MATCH); 146 testCases.add(toString, "java.lang.String::<init(Ljava/lang/String;)V", PARSING_FAILURE); 147 testCases.add(toString, "java.lang.String::init>(Ljava/lang/String;)V", PARSING_FAILURE); 148 149 testCases.add(toString, "java/lang/String.toString()Ljava/lang/String;", MATCH); 150 testCases.add(toString, "java/lang/Str<ing.toString()Ljava/lang/String;", PARSING_FAILURE); 151 testCases.add(toString, "java/lang/Str>ing.toString()Ljava/lang/String;", PARSING_FAILURE); 152 testCases.add(toString, "java/lang/<init>.toString()Ljava/lang/String;", PARSING_FAILURE); 153 testCases.add(toString, "java/lang/<clinit>.toString()Ljava/lang/String;", PARSING_FAILURE); 154 155 int failures = 0; 156 for (TestCase t : testCases) { 157 System.out.println("Test case: " + t.pattern); 158 if (!t.test()) { 159 failures++; 160 System.out.println(" * FAILED"); 161 } 162 } 163 if (failures != 0) { 164 throw new Exception("There where " + failures + " failures in this test"); 165 } 166 } 167 168 public static void main(String... args) throws Exception { 169 MethodMatcherTest test = new MethodMatcherTest(); 170 test.test(); 171 } 172 173 public void helper() { 174 175 } 176 177 private static Method getMethod(Class klass, String name, Class<?>... parameterTypes) { 178 try { 179 return klass.getDeclaredMethod(name, parameterTypes); 180 } catch (NoSuchMethodException | SecurityException e) { 181 throw new RuntimeException("exception on getting method Helper." + name, e); 182 } 183 } 184 185 class TestCase { 186 String pattern; 187 Method testTarget; 188 int expectedResult; 189 190 public TestCase(Method testTarget, String pattern, int expectedResult) { 191 this.testTarget = testTarget; 192 this.pattern = pattern; 193 this.expectedResult = expectedResult; 194 } 195 196 public String resultAsStr(int errorCode) { 197 switch (errorCode) { 198 case PARSING_FAILURE: 199 return "Parsing failed"; 200 case NO_MATCH: 201 return "No match"; 202 case MATCH: 203 return "Match"; 204 default: 205 return "Unknown error"; 206 } 207 } 208 209 boolean test() { 210 int result = WHITE_BOX.matchesMethod(testTarget, pattern); 211 if (result != expectedResult) { 212 System.out 213 .println("FAIL Wrong result, Got: " + resultAsStr(result) + "\n TestCase: " + this.toString()); 214 return false; 215 } 216 return true; 217 } 218 219 @Override 220 public String toString() { 221 return "Method: '" + testTarget.toString() + "' Pattern: '" + pattern + "' Expected: " 222 + resultAsStr(expectedResult); 223 } 224 225 public void innerHelper() { 226 } 227 } 228 229 class TestCases extends ArrayList<TestCase> { 230 private static final long serialVersionUID = 1L; 231 232 public boolean add(Method testTarget, String pattern, int expectedResult) { 233 return super.add(new TestCase(testTarget, pattern, expectedResult)); 234 } 235 236 public void innerHelper() { 237 } 238 } 239 }