You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ClasspathManagerTestCase.java 9.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. /* *******************************************************************
  2. * Copyright (c) 2019 Contributors
  3. * All rights reserved.
  4. * This program and the accompanying materials are made available
  5. * under the terms of the Eclipse Public License v 2.0
  6. * which accompanies this distribution and is available at
  7. * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt
  8. * ******************************************************************/
  9. package org.aspectj.weaver.bcel;
  10. import java.io.File;
  11. import java.io.IOException;
  12. import java.util.ArrayList;
  13. import java.util.Arrays;
  14. import java.util.List;
  15. import java.util.regex.Pattern;
  16. import org.aspectj.apache.bcel.classfile.ClassFormatException;
  17. import org.aspectj.apache.bcel.classfile.ClassParser;
  18. import org.aspectj.apache.bcel.classfile.JavaClass;
  19. import org.aspectj.bridge.AbortException;
  20. import org.aspectj.bridge.IMessage;
  21. import org.aspectj.bridge.IMessage.Kind;
  22. import org.aspectj.bridge.IMessageHandler;
  23. import org.aspectj.util.LangUtil;
  24. import org.aspectj.weaver.TypeFactory;
  25. import org.aspectj.weaver.UnresolvedType;
  26. import org.aspectj.weaver.bcel.ClassPathManager.ClassFile;
  27. import junit.framework.TestCase;
  28. /**
  29. * Should run these tests 3 times on each JDK level (8, 9, 11). On each one 3 of the
  30. * tests should pass indicating that JDK can successfully access system types in
  31. * each JDK level.
  32. *
  33. * @author Andy Clement
  34. */
  35. public class ClasspathManagerTestCase extends TestCase {
  36. // Works on my machine where all jvms under ~/jvms
  37. private static String java18_rtjar = findJvm("j.*18.*","rt.jar");
  38. private static String java9_jrtfsjar = findJvm("j.*9.*","jrt-fs.jar");;
  39. private static String java11_jrtfsjar = findJvm("j.*11.*","jrt-fs.jar");;
  40. private static String findJvm(String pattern, String jar) {
  41. String start = System.getProperty("user.home")+"/jvms";
  42. if (new File(start).isDirectory()) {
  43. for (File f : new File(start).listFiles()) {
  44. if (f.isDirectory() && Pattern.matches(pattern, f.getName())) {
  45. File result = walk(f, jar);
  46. if (result != null) {
  47. System.out.println("For " + pattern + " found " + result.getAbsolutePath());
  48. return result.getAbsolutePath();
  49. }
  50. }
  51. }
  52. }
  53. return null;
  54. }
  55. private static File walk(File dir, String jar) {
  56. File[] fs = dir.listFiles();
  57. if (fs!=null) {
  58. for (File f: fs) {
  59. if (f.getName().equals(jar)) {
  60. return f;
  61. } else if (f.isDirectory()) {
  62. File s = walk(f, jar);
  63. if (s!=null) {
  64. return s;
  65. }
  66. }
  67. }
  68. }
  69. return null;
  70. }
  71. public void testInstructions() {
  72. System.out.println(
  73. "This test is mostly for stand-alone usage (rename 'xtest*' to 'test*'), " +
  74. "as it needs execution on multiple JDK levels"
  75. );
  76. }
  77. /**
  78. * See <a href="https://github.com/eclipse-aspectj/aspectj/issues/306">GitHub issue 306</a>
  79. */
  80. public void testUnfoundClassPerformance() {
  81. final int ROUNDS = 10_000;
  82. final int MAX_TIME = 500;
  83. List<String> classPath = Arrays.asList(System.getProperty("java.class.path").split(File.pathSeparator));
  84. //System.out.println(classPath);
  85. ClassPathManager classPathManager = new ClassPathManager(classPath, null);
  86. UnresolvedType unresolvedType = TypeFactory.createTypeFromSignature("Ljava/lang/String;");
  87. long startTime = System.currentTimeMillis();
  88. for (int i = 0; i < ROUNDS; i++)
  89. classPathManager.find(unresolvedType);
  90. long duration = System.currentTimeMillis() - startTime;
  91. assertTrue(
  92. String.format("Duration for %d rounds should be < %d ms, but was %d ms", ROUNDS, MAX_TIME, duration),
  93. duration < MAX_TIME
  94. );
  95. }
  96. public void xtestSanity18accessing18RTJAR() throws IOException {
  97. if (LangUtil.getVmVersion()>8) fail("Must be Java 8");
  98. List<String> classpath = new ArrayList<>();
  99. classpath.add(java18_rtjar);
  100. ClassPathManager cpm = new ClassPathManager(classpath, new MH());
  101. ClassFile t = cpm.find(UnresolvedType.forSignature("Ljava/lang/Object;"));
  102. assertNotNull(t);
  103. }
  104. public void xtestJava18accessing11JRT() throws ClassFormatException, IOException {
  105. if (LangUtil.getVmVersion()>8) fail("Must be Java 8");
  106. List<String> classpath = new ArrayList<>();
  107. classpath.add(java11_jrtfsjar);
  108. ClassPathManager cpm = new ClassPathManager(classpath, new MH());
  109. ClassFile t = cpm.find(UnresolvedType.forSignature("Ljava/lang/String;"));
  110. assertNotNull(t);
  111. ClassParser classParser = new ClassParser(t.getInputStream(),t.getPath());
  112. JavaClass clazz = classParser.parse();
  113. // isBlank() exists on Java 11
  114. long c = Arrays.asList(clazz.getMethods()).stream().filter(m -> m.getName().equals("isBlank")).count();
  115. assertEquals(1,c);
  116. }
  117. public void xtestJava18accessing19JRT() throws ClassFormatException, IOException {
  118. if (LangUtil.getVmVersion()>8) fail("Must be Java 8");
  119. List<String> classpath = new ArrayList<>();
  120. classpath.add(java9_jrtfsjar);
  121. ClassPathManager cpm = new ClassPathManager(classpath, new MH());
  122. ClassFile t = cpm.find(UnresolvedType.forSignature("Ljava/lang/String;"));
  123. assertNotNull(t);
  124. ClassParser classParser = new ClassParser(t.getInputStream(),t.getPath());
  125. JavaClass clazz = classParser.parse();
  126. // isBlank() exists on Java 11, but not on Java9
  127. long c = Arrays.asList(clazz.getMethods()).stream().filter(m -> m.getName().equals("isBlank")).count();
  128. assertEquals(0,c);
  129. }
  130. public void xtestSanity19accessing18RTJAR() throws IOException {
  131. assertEquals(9.0,LangUtil.getVmVersion());
  132. List<String> classpath = new ArrayList<>();
  133. classpath.add(java18_rtjar);
  134. ClassPathManager cpm = new ClassPathManager(classpath, new MH());
  135. ClassFile t = cpm.find(UnresolvedType.forSignature("Ljava/lang/Object;"));
  136. assertNotNull(t);
  137. }
  138. public void xtestJava19accessing11JRT() throws ClassFormatException, IOException {
  139. assertEquals(9.0,LangUtil.getVmVersion());
  140. List<String> classpath = new ArrayList<>();
  141. classpath.add(java11_jrtfsjar);
  142. ClassPathManager cpm = new ClassPathManager(classpath, new MH());
  143. ClassFile t = cpm.find(UnresolvedType.forSignature("Ljava/lang/String;"));
  144. assertNotNull(t);
  145. ClassParser classParser = new ClassParser(t.getInputStream(),t.getPath());
  146. JavaClass clazz = classParser.parse();
  147. // isBlank() exists on Java 11
  148. long c = Arrays.asList(clazz.getMethods()).stream().filter(m -> m.getName().equals("isBlank")).count();
  149. assertEquals(1,c);
  150. }
  151. public void xtestJava19accessing19JRT() throws ClassFormatException, IOException {
  152. assertEquals(9.0,LangUtil.getVmVersion());
  153. List<String> classpath = new ArrayList<>();
  154. classpath.add(java9_jrtfsjar);
  155. ClassPathManager cpm = new ClassPathManager(classpath, new MH());
  156. ClassFile t = cpm.find(UnresolvedType.forSignature("Ljava/lang/String;"));
  157. assertNotNull(t);
  158. ClassParser classParser = new ClassParser(t.getInputStream(),t.getPath());
  159. JavaClass clazz = classParser.parse();
  160. // isBlank() exists on Java 11, but not on Java9
  161. long c = Arrays.asList(clazz.getMethods()).stream().filter(m -> m.getName().equals("isBlank")).count();
  162. assertEquals(0,c);
  163. }
  164. public void xtestSanity11accessing18RTJAR() throws IOException {
  165. assertEquals(11.0,LangUtil.getVmVersion());
  166. List<String> classpath = new ArrayList<>();
  167. classpath.add(java18_rtjar);
  168. ClassPathManager cpm = new ClassPathManager(classpath, new MH());
  169. ClassFile t = cpm.find(UnresolvedType.forSignature("Ljava/lang/Object;"));
  170. assertNotNull(t);
  171. }
  172. public void xtestJava11accessing11JRT() throws ClassFormatException, IOException {
  173. assertEquals(11.0,LangUtil.getVmVersion());
  174. List<String> classpath = new ArrayList<>();
  175. classpath.add(java11_jrtfsjar);
  176. ClassPathManager cpm = new ClassPathManager(classpath, new MH());
  177. ClassFile t = cpm.find(UnresolvedType.forSignature("Ljava/lang/String;"));
  178. assertNotNull(t);
  179. ClassParser classParser = new ClassParser(t.getInputStream(),t.getPath());
  180. JavaClass clazz = classParser.parse();
  181. // isBlank() exists on Java 11
  182. long c = Arrays.asList(clazz.getMethods()).stream().filter(m -> m.getName().equals("isBlank")).count();
  183. assertEquals(1,c);
  184. }
  185. public void xtestJava11accessing19JRT() throws ClassFormatException, IOException {
  186. assertEquals(11.0,LangUtil.getVmVersion());
  187. List<String> classpath = new ArrayList<>();
  188. classpath.add(java9_jrtfsjar);
  189. ClassPathManager cpm = new ClassPathManager(classpath, new MH());
  190. ClassFile t = cpm.find(UnresolvedType.forSignature("Ljava/lang/String;"));
  191. assertNotNull(t);
  192. ClassParser classParser = new ClassParser(t.getInputStream(),t.getPath());
  193. JavaClass clazz = classParser.parse();
  194. // isBlank() exists on Java 11, but not on Java9
  195. long c = Arrays.asList(clazz.getMethods()).stream().filter(m -> m.getName().equals("isBlank")).count();
  196. assertEquals(0,c);
  197. }
  198. static class MH implements IMessageHandler {
  199. @Override
  200. public boolean handleMessage(IMessage message) throws AbortException {
  201. System.out.println(message);
  202. return false;
  203. }
  204. @Override
  205. public boolean isIgnoring(Kind kind) {
  206. return false;
  207. }
  208. @Override
  209. public void dontIgnore(Kind kind) {
  210. }
  211. @Override
  212. public void ignore(Kind kind) {
  213. }
  214. }
  215. }