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.

WeavingURLClassLoaderTest.java 20KB

12 years ago
12 years ago
14 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
14 years ago
14 years ago
14 years ago
12 years ago
14 years ago
14 years ago
14 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550
  1. /* *******************************************************************
  2. * Copyright (c) 2004 IBM Corporation
  3. * All rights reserved.
  4. * This program and the accompanying materials are made available
  5. * under the terms of the Eclipse Public License v1.0
  6. * which accompanies this distribution and is available at
  7. * http://www.eclipse.org/legal/epl-v10.html
  8. *
  9. * Contributors:
  10. * Matthew Webster initial implementation
  11. * ******************************************************************/
  12. package org.aspectj.weaver.loadtime;
  13. import java.io.File;
  14. import java.lang.reflect.InvocationTargetException;
  15. import java.lang.reflect.Method;
  16. import java.net.URL;
  17. import java.util.Enumeration;
  18. import java.util.Properties;
  19. import junit.framework.TestCase;
  20. import org.aspectj.bridge.AbortException;
  21. import org.aspectj.testing.util.TestUtil.TestError;
  22. import org.aspectj.util.FileUtil;
  23. import org.aspectj.weaver.BcweaverTests;
  24. import org.aspectj.weaver.tools.WeavingAdaptor;
  25. /**
  26. * @author websterm
  27. *
  28. */
  29. public class WeavingURLClassLoaderTest extends TestCase {
  30. private final static String ASPECTJRT = "../runtime/bin";
  31. private final static String CLASSES_JAR = BcweaverTests.TESTDATA_PATH + "/ltw-classes.jar";
  32. private final static String WOVEN_JAR = BcweaverTests.TESTDATA_PATH + "/ltw-woven.jar";
  33. private final static String JUNK_JAR = BcweaverTests.TESTDATA_PATH + "/ltw-junk.jar";
  34. private final static String ADVICE_ASPECTS = BcweaverTests.TESTDATA_PATH + "/ltw-aspects.jar";
  35. private final static String DW_ADVICE_ASPECTS = BcweaverTests.TESTDATA_PATH + "/ltw-dwaspects.jar";
  36. private final static String DE_ADVICE_ASPECTS = BcweaverTests.TESTDATA_PATH + "/ltw-deaspects.jar";
  37. private final static String AROUNDCLOSURE_ASPECTS = BcweaverTests.TESTDATA_PATH + "/ltw-acaspects.jar";
  38. private final static String ITD_ASPECTS = BcweaverTests.TESTDATA_PATH + "/ltw-itdaspects.jar";
  39. private final static String PER_ASPECTS = BcweaverTests.TESTDATA_PATH + "/ltw-peraspects.jar";
  40. private final static String TEST_BASE = BcweaverTests.TESTDATA_PATH + "/WeavingURLClassLoaderTest/builtLibs";
  41. private final static String NULL = "null";
  42. private Properties savedProperties;
  43. public WeavingURLClassLoaderTest(String name) {
  44. super(name);
  45. }
  46. public void testLoadClass() {
  47. setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH, "");
  48. setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH, CLASSES_JAR);
  49. WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader());
  50. try {
  51. Class<?> clazz = loader.loadClass("LTWHelloWorld");
  52. invokeMain(clazz, new String[] {});
  53. } catch (Exception ex) {
  54. fail(ex.toString());
  55. }
  56. }
  57. /*
  58. * We won't get an exception because the aspect path is empty and there is no aop.xml file so the weaver will be disabled and no
  59. * reweaving will take place
  60. */
  61. public void testLoadWovenClass() {
  62. setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH, "");
  63. setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH, WOVEN_JAR);
  64. WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader());
  65. try {
  66. Class<?> clazz = loader.loadClass("LTWHelloWorld");
  67. invokeMain(clazz, new String[] { "LTWAspect" });
  68. } catch (Exception ex) {
  69. fail(ex.toString());
  70. }
  71. }
  72. public void testGarbageName() {
  73. setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH, "");
  74. setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH, WOVEN_JAR);
  75. WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader());
  76. try {
  77. loader.loadClass("[Lorg.springframework.webflow.config.FlowLocation;Editor");
  78. } catch (ClassNotFoundException cnfe) {
  79. // success!
  80. } catch (Exception ex) {
  81. fail(ex.toString());
  82. }
  83. }
  84. /*
  85. * We get an exception because the class was not built reweavable
  86. */
  87. public void testWeaveWovenClass() {
  88. setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH, ADVICE_ASPECTS);
  89. setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH, ADVICE_ASPECTS + File.pathSeparator + WOVEN_JAR);
  90. WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader());
  91. try {
  92. loader.loadClass("LTWHelloWorld");
  93. fail("Expecting org.aspectj.bridge.AbortException");
  94. } catch (Exception ex) {
  95. assertTrue("Expecting org.aspectj.bridge.AbortException caught " + ex, (ex instanceof AbortException));
  96. }
  97. }
  98. public void testWeavingURLClassLoader() {
  99. URL classes = FileUtil.getFileURL(new File(CLASSES_JAR));
  100. URL aspectjrt = FileUtil.getFileURL(new File(ASPECTJRT));
  101. URL aspects = FileUtil.getFileURL(new File(ADVICE_ASPECTS));
  102. URL[] classURLs = new URL[] { aspects, classes, aspectjrt };
  103. URL[] aspectURLs = new URL[] { aspects };
  104. WeavingURLClassLoader loader = new WeavingURLClassLoader(classURLs, aspectURLs, getClass().getClassLoader());
  105. try {
  106. Class<?> clazz = loader.loadClass("LTWHelloWorld");
  107. invokeMain(clazz, new String[] { "LTWAspect" });
  108. } catch (Exception ex) {
  109. fail(ex.toString());
  110. }
  111. }
  112. public void testWeaveAdvice() {
  113. setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH, ADVICE_ASPECTS);
  114. setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH, ADVICE_ASPECTS + File.pathSeparator + CLASSES_JAR
  115. + File.pathSeparator + ASPECTJRT);
  116. WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader());
  117. try {
  118. Class<?> clazz = loader.loadClass("LTWHelloWorld");
  119. invokeMain(clazz, new String[] { "LTWAspect" });
  120. } catch (Exception ex) {
  121. fail(ex.toString());
  122. }
  123. }
  124. public void testWeaveAdviceWithVerbose() {
  125. setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH, ADVICE_ASPECTS);
  126. setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH, ADVICE_ASPECTS + File.pathSeparator + CLASSES_JAR
  127. + File.pathSeparator + ASPECTJRT);
  128. setSystemProperty(WeavingAdaptor.WEAVING_ADAPTOR_VERBOSE, "true");
  129. WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader());
  130. try {
  131. Class<?> clazz = loader.loadClass("LTWHelloWorld");
  132. invokeMain(clazz, new String[] { "LTWAspect" });
  133. } catch (Exception ex) {
  134. fail(ex.toString());
  135. }
  136. }
  137. public void testWeaveAdviceWithWeaveInfo() {
  138. setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH, ADVICE_ASPECTS);
  139. setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH, ADVICE_ASPECTS + File.pathSeparator + CLASSES_JAR
  140. + File.pathSeparator + ASPECTJRT);
  141. setSystemProperty(WeavingAdaptor.SHOW_WEAVE_INFO_PROPERTY, "true");
  142. WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader());
  143. try {
  144. Class<?> clazz = loader.loadClass("LTWHelloWorld");
  145. invokeMain(clazz, new String[] { "LTWAspect" });
  146. } catch (Exception ex) {
  147. fail(ex.toString());
  148. }
  149. }
  150. public void testWeaveDeclareWarningAdvice() {
  151. setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH, DW_ADVICE_ASPECTS);
  152. setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH, DW_ADVICE_ASPECTS + File.pathSeparator + CLASSES_JAR);
  153. WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader());
  154. try {
  155. Class<?> clazz = loader.loadClass("LTWHelloWorld");
  156. invokeMain(clazz, new String[] {});
  157. } catch (Exception ex) {
  158. fail(ex.toString());
  159. }
  160. }
  161. public void testWeaveDeclareErrorAdvice() {
  162. setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH, DE_ADVICE_ASPECTS);
  163. setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH, DE_ADVICE_ASPECTS + File.pathSeparator + CLASSES_JAR);
  164. WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader());
  165. try {
  166. Class<?> clazz = loader.loadClass("LTWHelloWorld");
  167. invokeMain(clazz, new String[] {});
  168. fail("Expecting org.aspectj.bridge.AbortException");
  169. } catch (Exception ex) {
  170. assertTrue("Expecting org.aspectj.bridge.AbortException caught " + ex, (ex instanceof AbortException));
  171. }
  172. }
  173. public void testWeaveAroundClosure() {
  174. setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH, AROUNDCLOSURE_ASPECTS);
  175. setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH, AROUNDCLOSURE_ASPECTS + File.pathSeparator + CLASSES_JAR
  176. + File.pathSeparator + ASPECTJRT);
  177. WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader());
  178. try {
  179. Class<?> clazz = loader.loadClass("LTWHelloWorld");
  180. invokeMain(clazz, new String[] { "LTWAroundClosure" });
  181. } catch (Exception ex) {
  182. fail(ex.toString());
  183. }
  184. }
  185. public void testWeavingITD() {
  186. URL classes = FileUtil.getFileURL(new File(CLASSES_JAR));
  187. URL aspectjrt = FileUtil.getFileURL(new File(ASPECTJRT));
  188. URL aspects = FileUtil.getFileURL(new File(ITD_ASPECTS));
  189. URL[] classURLs = new URL[] { aspects, classes, aspectjrt };
  190. URL[] aspectURLs = new URL[] { aspects };
  191. WeavingURLClassLoader loader = new WeavingURLClassLoader(classURLs, aspectURLs, getClass().getClassLoader());
  192. try {
  193. Class<?> clazz = loader.loadClass("LTWHelloWorld");
  194. invokeMain(clazz, new String[] { "LTWInterfaceITD", "LTWFieldITD", "LTWMethodITD" });
  195. } catch (Exception ex) {
  196. ex.printStackTrace();
  197. // throw new RuntimeException("Failed!", ex);
  198. fail(ex.toString());
  199. // } finally {
  200. // System.exit(0);
  201. }
  202. }
  203. public void testWeavingPer() {
  204. URL classes = FileUtil.getFileURL(new File(CLASSES_JAR));
  205. URL aspectjrt = FileUtil.getFileURL(new File(ASPECTJRT));
  206. URL aspects = FileUtil.getFileURL(new File(PER_ASPECTS));
  207. URL[] classURLs = new URL[] { aspects, classes, aspectjrt };
  208. URL[] aspectURLs = new URL[] { aspects };
  209. WeavingURLClassLoader loader = new WeavingURLClassLoader(classURLs, aspectURLs, getClass().getClassLoader());
  210. try {
  211. Class<?> clazz = loader.loadClass("LTWHelloWorld");
  212. invokeMain(clazz, new String[] { "LTWPerthis" });
  213. } catch (Exception ex) {
  214. fail(ex.toString());
  215. }
  216. }
  217. public void testWeavingAspects() {
  218. URL classes = FileUtil.getFileURL(new File(CLASSES_JAR));
  219. URL aspectjrt = FileUtil.getFileURL(new File(ASPECTJRT));
  220. URL aspects1 = FileUtil.getFileURL(new File(ADVICE_ASPECTS));
  221. URL aspects2 = FileUtil.getFileURL(new File(AROUNDCLOSURE_ASPECTS));
  222. URL aspects3 = FileUtil.getFileURL(new File(ITD_ASPECTS));
  223. URL aspects4 = FileUtil.getFileURL(new File(PER_ASPECTS));
  224. URL[] classURLs = new URL[] { aspects1, aspects2, aspects3, aspects4, classes, aspectjrt };
  225. URL[] aspectURLs = new URL[] { aspects1, aspects2, aspects3, aspects4 };
  226. WeavingURLClassLoader loader = new WeavingURLClassLoader(classURLs, aspectURLs, getClass().getClassLoader());
  227. try {
  228. Class<?> clazz = loader.loadClass("LTWHelloWorld");
  229. invokeMain(clazz, new String[] { "LTWAspect", "LTWAroundClosure", "LTWPerthis", "LTWInterfaceITD", "LTWFieldITD",
  230. "LTWMethodITD", "LTWPerthis" });
  231. } catch (Exception ex) {
  232. fail(ex.toString());
  233. }
  234. }
  235. public void testJunkJar() {
  236. File junkJar = new File(JUNK_JAR);
  237. assertFalse(junkJar + " should not exist", junkJar.exists());
  238. URL classes = FileUtil.getFileURL(junkJar);
  239. URL[] classURLs = new URL[] { classes };
  240. URL[] aspectURLs = new URL[] {};
  241. WeavingURLClassLoader loader = new WeavingURLClassLoader(classURLs, aspectURLs, getClass().getClassLoader());
  242. try {
  243. loader.loadClass("LTWHelloWorld");
  244. fail("Expecting java.lang.ClassNotFoundException");
  245. } catch (Exception ex) {
  246. assertTrue("Expecting java.lang.ClassNotFoundException caught " + ex, (ex instanceof ClassNotFoundException));
  247. }
  248. }
  249. public void testJunkAspectJar() {
  250. File junkJar = new File(JUNK_JAR);
  251. assertFalse(junkJar + " should not exist", junkJar.exists());
  252. URL aspects = FileUtil.getFileURL(junkJar);
  253. URL[] classURLs = new URL[] { aspects };
  254. URL[] aspectURLs = new URL[] { aspects };
  255. try {
  256. new WeavingURLClassLoader(classURLs, aspectURLs, getClass().getClassLoader());
  257. fail("Expecting org.aspectj.bridge.AbortException");
  258. } catch (Exception ex) {
  259. assertTrue("Expecting org.aspectj.bridge.AbortException caught " + ex,
  260. (ex instanceof org.aspectj.bridge.AbortException));
  261. }
  262. }
  263. public void testAddURL() {
  264. URL classes = FileUtil.getFileURL(new File(CLASSES_JAR));
  265. URL aspectjrt = FileUtil.getFileURL(new File(ASPECTJRT));
  266. URL aspects = FileUtil.getFileURL(new File(ADVICE_ASPECTS));
  267. URL[] classURLs = new URL[] { aspects, aspectjrt };
  268. URL[] aspectURLs = new URL[] { aspects };
  269. WeavingURLClassLoader loader = new WeavingURLClassLoader(classURLs, aspectURLs, getClass().getClassLoader());
  270. loader.addURL(classes);
  271. try {
  272. Class<?> clazz = loader.loadClass("LTWHelloWorld");
  273. invokeMain(clazz, new String[] { "LTWAspect" });
  274. } catch (Exception ex) {
  275. fail(ex.toString());
  276. }
  277. }
  278. public void testParentChild() {
  279. URL classes = FileUtil.getFileURL(new File(CLASSES_JAR));
  280. URL aspectjrt = FileUtil.getFileURL(new File(ASPECTJRT));
  281. URL aspects = FileUtil.getFileURL(new File(ADVICE_ASPECTS));
  282. URL[] classURLs = new URL[] { aspects, aspectjrt };
  283. URL[] aspectURLs = new URL[] { aspects };
  284. WeavingURLClassLoader parent = new WeavingURLClassLoader(classURLs, aspectURLs, getClass().getClassLoader());
  285. classURLs = new URL[] { classes };
  286. aspectURLs = new URL[] {};
  287. WeavingURLClassLoader child = new WeavingURLClassLoader(classURLs, aspectURLs, parent);
  288. try {
  289. Class<?> clazz = child.loadClass("LTWHelloWorld");
  290. invokeMain(clazz, new String[] { "LTWAspect" });
  291. } catch (Exception ex) {
  292. fail(ex.toString());
  293. }
  294. }
  295. /*
  296. * Aspects on ASPECTPATH but missing from CLASSPATH
  297. */
  298. public void testIncompletePath() {
  299. setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH, ADVICE_ASPECTS);
  300. setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH, CLASSES_JAR);
  301. WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader());
  302. try {
  303. Class<?> clazz = loader.loadClass("LTWHelloWorld");
  304. invokeMain(clazz, new String[] { "LTWAspect" });
  305. fail("Expecting java.lang.NoClassDefFoundError");
  306. } catch (Exception ex) {
  307. // Expecting: java.lang.NoClassDefFoundError: LTWAspect
  308. String m = ex.getMessage();
  309. if (-1 == m.indexOf("java.lang.NoClassDefFoundError")) {
  310. fail("Expecting java.lang.NoClassDefFoundError but caught " + ex);
  311. }
  312. }
  313. }
  314. /*
  315. * Ensure package object is correct
  316. */
  317. public void testPackage() {
  318. setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH, "");
  319. setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH, CLASSES_JAR);
  320. WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader());
  321. try {
  322. Class<?> clazz = loader.loadClass("ltw.LTWPackageTest");
  323. invokeMain(clazz, new String[] {});
  324. Package pakkage = clazz.getPackage();
  325. assertTrue("Expected 'ltw' got " + pakkage, (pakkage != null));
  326. } catch (Exception ex) {
  327. fail(ex.toString());
  328. }
  329. }
  330. public void testZipAspects() {
  331. try {
  332. doTestZipAspects(TEST_BASE + "/aspect.zip");
  333. } catch (Error ex) {
  334. failWithException(ex);
  335. } catch (Exception ex) {
  336. failWithException(ex);
  337. }
  338. }
  339. public void testJarAspects() {
  340. try {
  341. doTestZipAspects(TEST_BASE + "/aspect.jar");
  342. } catch (Error ex) {
  343. failWithException(ex);
  344. } catch (Exception ex) {
  345. failWithException(ex);
  346. }
  347. }
  348. /** PR#106736 */
  349. public void testClassAspects() {
  350. try {
  351. doTestZipAspects(TEST_BASE + "/classes");
  352. } catch (Error ex) {
  353. failWithException(ex);
  354. } catch (Exception ex) {
  355. failWithException(ex);
  356. }
  357. }
  358. public void testZipJarAspectsTest() {
  359. try {
  360. doTestZipAspectsTest();
  361. // bug: doTestZipAspects("") attempts to load packag.Aspect?
  362. fail("expected error to be thrown");
  363. } catch (InvocationTargetException ex) {
  364. // expecting error
  365. assertTrue(ex.getTargetException() instanceof Error);
  366. } catch (RuntimeException ex) {
  367. // expecting error
  368. String message = ex.getMessage();
  369. // expecting error - seems to be wrapped wrong
  370. if (-1 == message.indexOf("around advice")) {
  371. failWithException(ex);
  372. }
  373. } catch (Error ex) {
  374. failWithException(ex);
  375. } catch (Exception ex) {
  376. failWithException(ex);
  377. }
  378. }
  379. public void testWeavingURLClassLoaderOddJars() throws Exception {
  380. URL classes = FileUtil.getFileURL(new File(TEST_BASE + "/test.jar/main.file"));
  381. URL aspectjrt = FileUtil.getFileURL(new File(ASPECTJRT));
  382. URL aspects = FileUtil.getFileURL(new File(TEST_BASE + "/aspectNoExt"));
  383. URL[] classURLs = new URL[] { aspects, classes, aspectjrt };
  384. URL[] aspectURLs = new URL[] { aspects };
  385. WeavingURLClassLoader loader = new WeavingURLClassLoader(classURLs, aspectURLs, getClass().getClassLoader());
  386. Class<?> clazz = loader.loadClass("packag.Main");
  387. invokeMain(clazz, new String[] {});
  388. }
  389. public void testWeavingURLClassLoaderMissingJars() throws Exception {
  390. try {
  391. URL classes = FileUtil.getFileURL(new File(TEST_BASE + "/test.jar/main.file"));
  392. URL aspectjrt = FileUtil.getFileURL(new File(ASPECTJRT));
  393. URL aspects = FileUtil.getFileURL(new File(TEST_BASE + "/MissingFile"));
  394. URL[] classURLs = new URL[] { aspects, classes, aspectjrt };
  395. URL[] aspectURLs = new URL[] { aspects };
  396. WeavingURLClassLoader loader = new WeavingURLClassLoader(classURLs, aspectURLs, getClass().getClassLoader());
  397. Class<?> clazz = loader.loadClass("packag.Main");
  398. invokeMain(clazz, new String[] {});
  399. fail("Should reject bad aspect MissingFile");
  400. } catch (AbortException ae) {
  401. assertTrue("Unexpected cause: " + ae.getMessage(), ae.getMessage().indexOf("bad aspect library") != -1);
  402. }
  403. }
  404. private void doTestZipAspects(String aspectLib) throws Exception {
  405. File classZip = new File(TEST_BASE + "/main.zip");
  406. File zipLib = new File(aspectLib);
  407. URL classes = FileUtil.getFileURL(classZip);
  408. URL aspectjrt = FileUtil.getFileURL(new File(ASPECTJRT));
  409. URL aspects = FileUtil.getFileURL(zipLib);
  410. URL[] classURLs = new URL[] { aspects, classes, aspectjrt };
  411. URL[] aspectURLs = new URL[] { aspects };
  412. ClassLoader parent = getClass().getClassLoader();
  413. WeavingURLClassLoader loader = new WeavingURLClassLoader(classURLs, aspectURLs, parent);
  414. Class<?> clazz = loader.loadClass("packag.Main");
  415. invokeMain(clazz, new String[] {});
  416. // throws Error unless advice applies
  417. }
  418. private void doTestZipAspectsTest() throws Exception {
  419. URL classes = FileUtil.getFileURL(new File(TEST_BASE + "/main.zip"));
  420. URL aspectjrt = FileUtil.getFileURL(new File(ASPECTJRT));
  421. URL[] classURLs = new URL[] { classes, aspectjrt };
  422. ClassLoader parent = getClass().getClassLoader();
  423. WeavingURLClassLoader loader = new WeavingURLClassLoader(classURLs, new URL[] {}, parent);
  424. Class<?> clazz = loader.loadClass("packag.Main");
  425. invokeMain(clazz, new String[] {});
  426. // throws Error because advice does not apply
  427. }
  428. private void failWithException(Throwable t) {
  429. throw new TestError(t.getMessage(), t);
  430. }
  431. public static void invokeMain(Class clazz, String[] args) {
  432. Class<?>[] paramTypes = new Class[1];
  433. paramTypes[0] = args.getClass();
  434. try {
  435. Method method = clazz.getDeclaredMethod("main", paramTypes);
  436. Object[] params = new Object[1];
  437. params[0] = args;
  438. method.invoke(null, params);
  439. } catch (InvocationTargetException ex) {
  440. Throwable targetException = ex.getTargetException();
  441. if (targetException instanceof RuntimeException) {
  442. throw (RuntimeException) ex.getTargetException();
  443. } else {
  444. throw new RuntimeException(ex.getTargetException().toString());
  445. }
  446. } catch (Exception ex) {
  447. throw new RuntimeException(ex.toString());
  448. }
  449. }
  450. private void setSystemProperty(String key, String value) {
  451. Properties systemProperties = System.getProperties();
  452. copyProperty(key, systemProperties, savedProperties);
  453. systemProperties.setProperty(key, value);
  454. }
  455. private static void copyProperty(String key, Properties from, Properties to) {
  456. String value = from.getProperty(key, NULL);
  457. to.setProperty(key, value);
  458. }
  459. protected void setUp() throws Exception {
  460. super.setUp();
  461. savedProperties = new Properties();
  462. }
  463. protected void tearDown() throws Exception {
  464. super.tearDown();
  465. /* Restore system properties */
  466. Properties systemProperties = System.getProperties();
  467. for (Enumeration<Object> enu = savedProperties.keys(); enu.hasMoreElements();) {
  468. String key = (String) enu.nextElement();
  469. String value = savedProperties.getProperty(key);
  470. if (value == NULL) {
  471. systemProperties.remove(key);
  472. } else {
  473. systemProperties.setProperty(key, value);
  474. }
  475. }
  476. }
  477. }