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 8.8KB

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.Objects;
  16. import java.util.regex.Pattern;
  17. import org.aspectj.apache.bcel.classfile.ClassFormatException;
  18. import org.aspectj.apache.bcel.classfile.ClassParser;
  19. import org.aspectj.apache.bcel.classfile.JavaClass;
  20. import org.aspectj.bridge.AbortException;
  21. import org.aspectj.bridge.IMessage;
  22. import org.aspectj.bridge.IMessage.Kind;
  23. import org.aspectj.bridge.IMessageHandler;
  24. import org.aspectj.util.LangUtil;
  25. import org.aspectj.weaver.TypeFactory;
  26. import org.aspectj.weaver.UnresolvedType;
  27. import org.aspectj.weaver.bcel.ClassPathManager.ClassFile;
  28. import junit.framework.TestCase;
  29. /**
  30. * Should run these tests 3 times on each JDK level (8, 9, 11). On each one 3 of the tests should pass indicating that
  31. * JDK can successfully access system types in 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 final String java18_rtjar = findJvm("j.*18.*", "rt.jar");
  38. private static final String java9_jrtfsjar = findJvm("j.*9.*", "jrt-fs.jar");
  39. private static final 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 : Objects.requireNonNull(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. return null;
  69. }
  70. public void testInstructions() {
  71. System.out.println(
  72. "This test is mostly for stand-alone usage (rename 'xtest*' to 'test*'), " +
  73. "as it needs execution on multiple JDK levels"
  74. );
  75. }
  76. /**
  77. * See <a href="https://github.com/eclipse-aspectj/aspectj/issues/306">GitHub issue 306</a>
  78. */
  79. public void testUnfoundClassPerformance() {
  80. final int ROUNDS = 10_000;
  81. final int MAX_TIME = 500;
  82. List<String> classPath = Arrays.asList(System.getProperty("java.class.path").split(File.pathSeparator));
  83. //System.out.println(classPath);
  84. ClassPathManager classPathManager = new ClassPathManager(classPath, null);
  85. UnresolvedType unresolvedType = TypeFactory.createTypeFromSignature("Ljava/lang/String;");
  86. long startTime = System.currentTimeMillis();
  87. for (int i = 0; i < ROUNDS; i++)
  88. classPathManager.find(unresolvedType);
  89. long duration = System.currentTimeMillis() - startTime;
  90. assertTrue(
  91. String.format("Duration for %d rounds should be < %d ms, but was %d ms", ROUNDS, MAX_TIME, duration),
  92. duration < MAX_TIME
  93. );
  94. }
  95. public void xtestSanity18accessing18RTJAR() {
  96. if (LangUtil.getVmVersion() > 8)
  97. 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)
  106. fail("Must be Java 8");
  107. List<String> classpath = new ArrayList<>();
  108. classpath.add(java11_jrtfsjar);
  109. ClassPathManager cpm = new ClassPathManager(classpath, new MH());
  110. ClassFile t = cpm.find(UnresolvedType.forSignature("Ljava/lang/String;"));
  111. assertNotNull(t);
  112. ClassParser classParser = new ClassParser(t.getInputStream(), t.getPath());
  113. JavaClass clazz = classParser.parse();
  114. // isBlank() exists on Java 11
  115. long c = Arrays.stream(clazz.getMethods()).filter(m -> m.getName().equals("isBlank")).count();
  116. assertEquals(1, c);
  117. }
  118. public void xtestJava18accessing19JRT() throws ClassFormatException, IOException {
  119. if (LangUtil.getVmVersion() > 8)
  120. fail("Must be Java 8");
  121. List<String> classpath = new ArrayList<>();
  122. classpath.add(java9_jrtfsjar);
  123. ClassPathManager cpm = new ClassPathManager(classpath, new MH());
  124. ClassFile t = cpm.find(UnresolvedType.forSignature("Ljava/lang/String;"));
  125. assertNotNull(t);
  126. ClassParser classParser = new ClassParser(t.getInputStream(), t.getPath());
  127. JavaClass clazz = classParser.parse();
  128. // isBlank() exists on Java 11, but not on Java9
  129. long c = Arrays.stream(clazz.getMethods()).filter(m -> m.getName().equals("isBlank")).count();
  130. assertEquals(0, c);
  131. }
  132. public void xtestSanity19accessing18RTJAR() {
  133. assertEquals(9.0, LangUtil.getVmVersion());
  134. List<String> classpath = new ArrayList<>();
  135. classpath.add(java18_rtjar);
  136. ClassPathManager cpm = new ClassPathManager(classpath, new MH());
  137. ClassFile t = cpm.find(UnresolvedType.forSignature("Ljava/lang/Object;"));
  138. assertNotNull(t);
  139. }
  140. public void xtestJava19accessing11JRT() throws ClassFormatException, IOException {
  141. assertEquals(9.0, LangUtil.getVmVersion());
  142. List<String> classpath = new ArrayList<>();
  143. classpath.add(java11_jrtfsjar);
  144. ClassPathManager cpm = new ClassPathManager(classpath, new MH());
  145. ClassFile t = cpm.find(UnresolvedType.forSignature("Ljava/lang/String;"));
  146. assertNotNull(t);
  147. ClassParser classParser = new ClassParser(t.getInputStream(), t.getPath());
  148. JavaClass clazz = classParser.parse();
  149. // isBlank() exists on Java 11
  150. long c = Arrays.stream(clazz.getMethods()).filter(m -> m.getName().equals("isBlank")).count();
  151. assertEquals(1, c);
  152. }
  153. public void xtestJava19accessing19JRT() throws ClassFormatException, IOException {
  154. assertEquals(9.0, LangUtil.getVmVersion());
  155. List<String> classpath = new ArrayList<>();
  156. classpath.add(java9_jrtfsjar);
  157. ClassPathManager cpm = new ClassPathManager(classpath, new MH());
  158. ClassFile t = cpm.find(UnresolvedType.forSignature("Ljava/lang/String;"));
  159. assertNotNull(t);
  160. ClassParser classParser = new ClassParser(t.getInputStream(), t.getPath());
  161. JavaClass clazz = classParser.parse();
  162. // isBlank() exists on Java 11, but not on Java9
  163. long c = Arrays.stream(clazz.getMethods()).filter(m -> m.getName().equals("isBlank")).count();
  164. assertEquals(0, c);
  165. }
  166. public void xtestSanity11accessing18RTJAR() {
  167. assertEquals(11.0, LangUtil.getVmVersion());
  168. List<String> classpath = new ArrayList<>();
  169. classpath.add(java18_rtjar);
  170. ClassPathManager cpm = new ClassPathManager(classpath, new MH());
  171. ClassFile t = cpm.find(UnresolvedType.forSignature("Ljava/lang/Object;"));
  172. assertNotNull(t);
  173. }
  174. public void xtestJava11accessing11JRT() throws ClassFormatException, IOException {
  175. assertEquals(11.0, LangUtil.getVmVersion());
  176. List<String> classpath = new ArrayList<>();
  177. classpath.add(java11_jrtfsjar);
  178. ClassPathManager cpm = new ClassPathManager(classpath, new MH());
  179. ClassFile t = cpm.find(UnresolvedType.forSignature("Ljava/lang/String;"));
  180. assertNotNull(t);
  181. ClassParser classParser = new ClassParser(t.getInputStream(), t.getPath());
  182. JavaClass clazz = classParser.parse();
  183. // isBlank() exists on Java 11
  184. long c = Arrays.stream(clazz.getMethods()).filter(m -> m.getName().equals("isBlank")).count();
  185. assertEquals(1, c);
  186. }
  187. public void xtestJava11accessing19JRT() throws ClassFormatException, IOException {
  188. assertEquals(11.0, LangUtil.getVmVersion());
  189. List<String> classpath = new ArrayList<>();
  190. classpath.add(java9_jrtfsjar);
  191. ClassPathManager cpm = new ClassPathManager(classpath, new MH());
  192. ClassFile t = cpm.find(UnresolvedType.forSignature("Ljava/lang/String;"));
  193. assertNotNull(t);
  194. ClassParser classParser = new ClassParser(t.getInputStream(), t.getPath());
  195. JavaClass clazz = classParser.parse();
  196. // isBlank() exists on Java 11, but not on Java9
  197. long c = Arrays.stream(clazz.getMethods()).filter(m -> m.getName().equals("isBlank")).count();
  198. assertEquals(0, c);
  199. }
  200. static class MH implements IMessageHandler {
  201. @Override
  202. public boolean handleMessage(IMessage message) throws AbortException {
  203. System.out.println(message);
  204. return false;
  205. }
  206. @Override
  207. public boolean isIgnoring(Kind kind) {
  208. return false;
  209. }
  210. @Override
  211. public void dontIgnore(Kind kind) {}
  212. @Override
  213. public void ignore(Kind kind) {}
  214. }
  215. }