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.

JvstTest.java 43KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150
  1. package javassist;
  2. import junit.framework.*;
  3. import java.io.FileInputStream;
  4. import java.lang.reflect.Method;
  5. import javassist.bytecode.*;
  6. import javassist.expr.*;
  7. import javassist.runtime.*;
  8. @SuppressWarnings({"rawtypes","unused", "resource"})
  9. public class JvstTest extends JvstTestRoot {
  10. public static boolean java9;
  11. static {
  12. //javassist.bytecode.MethodInfo.doPreverify = true;
  13. java9 = javassist.bytecode.ClassFile.MAJOR_VERSION
  14. >= javassist.bytecode.ClassFile.JAVA_9;
  15. }
  16. public JvstTest(String name) {
  17. super(name);
  18. }
  19. public void testConfig() {
  20. // is the value of PATH correct?
  21. assertTrue("not found " + PATH, new java.io.File(PATH).exists());
  22. }
  23. public void testLoader() throws Exception {
  24. Loader loader = new Loader(sloader);
  25. loader.delegateLoadingOf("test1.");
  26. assertEquals(loader.loadClass("test1.Cflow").getClassLoader(),
  27. loader.getParent());
  28. assertEquals(loader.loadClass("javassist.Loader").getClassLoader(),
  29. loader.getParent());
  30. assertEquals(loader.loadClass("javassist.CtClass").getClassLoader(),
  31. loader);
  32. }
  33. public void testDefreeze() throws Exception {
  34. CtClass cc = sloader.get("test1.Freeze");
  35. cc.stopPruning(true);
  36. cc.addInterface(sloader.get("java.io.Serializable"));
  37. assertTrue(!cc.isFrozen());
  38. cc.writeFile();
  39. assertTrue(cc.isFrozen());
  40. cc.defrost();
  41. assertTrue(!cc.isFrozen());
  42. }
  43. public void testClassPath() throws Exception {
  44. ClassPool pool = new ClassPool(null);
  45. ClassPath cp1 = pool.appendClassPath("d1");
  46. ClassPath cp2 = pool.appendClassPath("d2");
  47. ClassPath cp3 = pool.appendClassPath("d3");
  48. ClassPath cp4 = pool.appendClassPath("d4");
  49. print(pool.toString());
  50. pool.removeClassPath(cp3);
  51. print(pool.toString());
  52. pool.removeClassPath(cp4);
  53. print(pool.toString());
  54. pool.removeClassPath(cp2);
  55. print(pool.toString());
  56. pool.removeClassPath(cp1);
  57. assertTrue("[class path: ]".equals(pool.toString()));
  58. }
  59. public void testSubtype() throws Exception {
  60. CtClass cc = sloader.get("test1.Subtype");
  61. assertTrue(cc.subtypeOf(cc));
  62. assertTrue(cc.subtypeOf(sloader.get("test1.SubtypeA")));
  63. assertTrue(cc.subtypeOf(sloader.get("test1.SubtypeB")));
  64. assertTrue(cc.subtypeOf(sloader.get("test1.SubtypeC")));
  65. assertTrue(cc.subtypeOf(sloader.get("java.lang.Object")));
  66. assertTrue(!cc.subtypeOf(sloader.get("java.lang.String")));
  67. }
  68. public void testClassPoolGet() throws Exception {
  69. ClassPool pool = ClassPool.getDefault();
  70. CtClass cc = pool.makeClass("test1.Point");
  71. CtClass cc1 = pool.get("test1.Point"); // cc1 is identical to cc.
  72. cc.setName("test1.Pair");
  73. CtClass cc2 = pool.get("test1.Pair"); // cc2 is identical to cc.
  74. CtClass cc3 = pool.get("test1.Point"); // cc3 is not identical to cc.
  75. assertTrue(cc == cc1);
  76. assertTrue(cc == cc2);
  77. assertTrue(cc != cc3);
  78. assertEquals("test1.Pair", cc.getName());
  79. assertEquals("test1.Point", cc3.getName());
  80. }
  81. public static long testFieldInitHash;
  82. /* test CodeIterator.insertExGap().
  83. * The result of this test is checked again by JvstTest3#testFieldInitAgain().
  84. */
  85. public void testFieldInit() throws Exception {
  86. CtClass cc = sloader.get("test1.FieldInit");
  87. CtField f1 = new CtField(CtClass.intType, "f1", cc);
  88. cc.addField(f1, CtField.Initializer.byCall(cc, "get"));
  89. CtField f2 = CtField.make("public int f2 = 3;", cc);
  90. cc.addField(f2);
  91. CtField f3 = CtField.make("public int f3;", cc);
  92. cc.addField(f3);
  93. CtField f4 = CtField.make("public int f4 = this.f2 + 3;", cc);
  94. cc.addField(f4);
  95. CtField fi = CtField.make("public test1.FieldInit.FI fi = new test1.FieldInit.FI(this);", cc);
  96. cc.addField(fi);
  97. testFieldInitHash = f1.hashCode();
  98. cc.writeFile();
  99. Object obj = make(cc.getName());
  100. int value = obj.getClass().getField("counter").getInt(obj);
  101. assertEquals(1, value);
  102. int value2 = obj.getClass().getField("f2").getInt(obj);
  103. assertEquals(3, value2);
  104. int value3 = obj.getClass().getField("f3").getInt(obj);
  105. assertEquals(0, value3);
  106. int value4 = obj.getClass().getField("f4").getInt(obj);
  107. assertEquals(6, value4);
  108. Object obfi = obj.getClass().getField("fi").get(obj);
  109. assertTrue(obfi.getClass().getField("fi").get(obfi) == obj);
  110. }
  111. /* test CodeIterator.insertExGap().
  112. */
  113. public void testFieldInit2() throws Exception {
  114. CtClass cc = sloader.get("test1.FieldInit2");
  115. CtField f = new CtField(CtClass.intType, "f1", cc);
  116. cc.addField(f, CtField.Initializer.byCall(cc, "get"));
  117. cc.writeFile();
  118. try {
  119. Object obj = make(cc.getName());
  120. fail();
  121. }
  122. catch (Exception e) {
  123. print("testFieldInit2: catch");
  124. }
  125. }
  126. public static CtMethod testCalleeBeforeMethod;
  127. public static long testCalleeBeforeMethod2;
  128. /* The test result is checked again by JvstTest3#testCalleeBeforeAgain().
  129. */
  130. public void testCalleeBefore() throws Exception {
  131. CtClass cc = sloader.get("test1.CalleeBefore");
  132. CtMethod m1 = cc.getDeclaredMethod("m1");
  133. m1.insertBefore("{ int k = 1; p = k; }");
  134. CtMethod m2 = cc.getDeclaredMethod("m2");
  135. testCalleeBeforeMethod = m1;
  136. testCalleeBeforeMethod2 = m2.getMethodInfo2().hashCode();
  137. m2.insertBefore("{ int k = 3; q = k; }");
  138. CtConstructor[] cons = cc.getDeclaredConstructors();
  139. for (int i = 0; i < cons.length; ++i) {
  140. MethodInfo minfo = cons[i].getMethodInfo();
  141. CodeAttribute ca = minfo.getCodeAttribute();
  142. CodeIterator iterator = ca.iterator();
  143. if (cons[i].getParameterTypes().length == 0) {
  144. assertTrue(iterator.skipThisConstructor() >= 0);
  145. assertTrue(iterator.skipSuperConstructor() < 0);
  146. assertTrue(iterator.skipConstructor() >= 0);
  147. }
  148. else {
  149. assertTrue(iterator.skipThisConstructor() < 0);
  150. assertTrue(iterator.skipSuperConstructor() >= 0);
  151. assertTrue(iterator.skipConstructor() >= 0);
  152. }
  153. cons[i].insertBeforeBody("{ int k = 1; counter += k; }");
  154. }
  155. cc.writeFile();
  156. Object obj = make(cc.getName());
  157. assertEquals(0, invoke(obj, "getr"));
  158. assertEquals(17, invoke(obj, "test"));
  159. }
  160. public void testCalleeAfter() throws Exception {
  161. CtClass cc = sloader.get("test1.CalleeAfter");
  162. CtMethod m1 = cc.getDeclaredMethod("m1");
  163. m1.insertAfter("{ int k = 1; $_ = $_ + k; }", false);
  164. CtMethod m2 = cc.getDeclaredMethod("m2");
  165. m2.insertAfter("{ char k = 1; $_ = $_ + k; }", false);
  166. CtConstructor[] cons = cc.getDeclaredConstructors();
  167. cons[0].insertAfter("{ ++p; $_ = ($r)null; }", false);
  168. cc.writeFile();
  169. Object obj = make(cc.getName());
  170. assertEquals(15, invoke(obj, "test"));
  171. }
  172. public void testCalleeAfter2() throws Exception {
  173. CtClass cc = sloader.get("test1.CalleeAfter2");
  174. CtMethod m1 = cc.getDeclaredMethod("m1");
  175. m1.insertAfter("$_ = 7; $_ = ($r)k1(0);", false);
  176. CtMethod m2 = cc.getDeclaredMethod("m2");
  177. m2.insertAfter("$_ = ($r)k2(0);", false);
  178. CtMethod m3 = cc.getDeclaredMethod("m3");
  179. m3.insertAfter("$_ = ($r)k3(0);", false);
  180. CtMethod m4 = cc.getDeclaredMethod("m4");
  181. try {
  182. m4.insertAfter("$_ = ($r)1;", false);
  183. assertTrue(false);
  184. }
  185. catch (CannotCompileException e) {
  186. }
  187. CtMethod m5 = cc.getDeclaredMethod("m5");
  188. m5.insertAfter("$_ = ($r)k5(0);", false);
  189. cc.writeFile();
  190. Object obj = make(cc.getName());
  191. assertEquals(17, invoke(obj, "test"));
  192. }
  193. public void testCalleeAfter3() throws Exception {
  194. CtClass cc = sloader.get("test1.CalleeAfter3");
  195. CtMethod m1 = cc.getDeclaredMethod("m1");
  196. m1.insertAfter("value++;", true);
  197. CtMethod m2 = cc.getDeclaredMethod("m2");
  198. m2.insertAfter("value++;", true);
  199. CtMethod m3 = cc.getDeclaredMethod("m3");
  200. m3.insertAfter("value++;", true);
  201. CtMethod m4 = cc.getDeclaredMethod("m4");
  202. m4.insertAfter("value++;", true);
  203. cc.writeFile();
  204. Object obj = make(cc.getName());
  205. assertEquals(22, invoke(obj, "test"));
  206. }
  207. public void testCalleeCatch() throws Exception {
  208. CtClass cc = sloader.get("test1.CalleeCatch");
  209. CtMethod m1 = cc.getDeclaredMethod("m1");
  210. m1.addCatch("{ System.out.println($e); return p; }",
  211. sloader.get("java.lang.Exception"));
  212. cc.writeFile();
  213. Object obj = make(cc.getName());
  214. assertEquals(3, invoke(obj, "test"));
  215. }
  216. public void testSuperclass() throws Exception {
  217. CtClass cc = sloader.get("java.lang.Object");
  218. assertEquals(null, cc.getSuperclass());
  219. }
  220. public void testProceed() throws Exception {
  221. CtClass cc = sloader.get("test1.Proceed");
  222. CtMethod m1 = CtNewMethod.make(
  223. "public int m1() { return $proceed(3); }",
  224. cc, "this", "k1");
  225. CtMethod m2 = CtNewMethod.make(
  226. "public int m2() { return $proceed(3); }",
  227. cc, "another", "k2");
  228. CtMethod m3 = CtNewMethod.make(
  229. "public int q(int i) { return p($1 + 1, $$); }", cc);
  230. cc.addMethod(m1);
  231. cc.addMethod(m2);
  232. cc.addMethod(m3);
  233. CtMethod m4 = CtNewMethod.make(
  234. "public int q2() { return q(4); }", cc);
  235. cc.addMethod(m4);
  236. cc.writeFile();
  237. Object obj = make(cc.getName());
  238. assertEquals(3, invoke(obj, "m1"));
  239. assertEquals(4, invoke(obj, "m2"));
  240. assertEquals(9, invoke(obj, "q2"));
  241. }
  242. public void testProceed2() throws Exception {
  243. CtClass cc = sloader.get("test1.Proceed2");
  244. CtMethod m1 = cc.getDeclaredMethod("k1");
  245. m1.instrument(new ExprEditor() {
  246. public void edit(MethodCall m) throws CannotCompileException {
  247. m.replace("{ $_ = $proceed($$); }");
  248. }
  249. public void edit(NewExpr m) throws CannotCompileException {
  250. m.replace("{ $_ = $proceed($$); }");
  251. }
  252. public void edit(FieldAccess m) throws CannotCompileException {
  253. m.replace("{ $_ = $proceed($$); }");
  254. }
  255. public void edit(Instanceof i) throws CannotCompileException {
  256. i.replace("{ $_ = $proceed($$); }");
  257. }
  258. public void edit(Cast c) throws CannotCompileException {
  259. c.replace("{ $_ = $proceed($$); }");
  260. }
  261. });
  262. CtMethod m2 = cc.getDeclaredMethod("k2");
  263. m2.instrument(new ExprEditor() {
  264. public void edit(MethodCall m) throws CannotCompileException {
  265. m.replace("{ $proceed(); }");
  266. }
  267. public void edit(NewExpr m) throws CannotCompileException {
  268. m.replace("{ $_ = $proceed(); }");
  269. }
  270. public void edit(FieldAccess m) throws CannotCompileException {
  271. if (m.isReader())
  272. m.replace("{ $_ = $proceed(); }");
  273. else
  274. m.replace("{ $proceed($$); }");
  275. }
  276. });
  277. cc.writeFile();
  278. Object obj = make(cc.getName());
  279. assertEquals(2, invoke(obj, "k1"));
  280. }
  281. public void testProceed3() throws Exception {
  282. CtClass cc = sloader.get("test1.Proceed3");
  283. CtMethod m1 = cc.getDeclaredMethod("p");
  284. CtMethod m2 = CtNewMethod.copy(m1, cc, null);
  285. m1.setName(m1.getName() + "_orig");
  286. m2.setBody("{ return $proceed($1 + 1); }", "this", m1.getName());
  287. cc.addMethod(m2);
  288. cc.writeFile();
  289. Object obj = make(cc.getName());
  290. assertEquals(4, invoke(obj, "k1"));
  291. }
  292. public void testSetBody() throws Exception {
  293. CtClass cc = sloader.get("test1.SetBody");
  294. CtMethod m1 = cc.getDeclaredMethod("m1");
  295. m1.setBody("{ int i = $1 * $2; return i; }");
  296. CtMethod m2 = cc.getDeclaredMethod("m2");
  297. m2.setBody("System.out.println(\"setbody: \" + $1);");
  298. CtMethod m3 = cc.getDeclaredMethod("m3");
  299. try {
  300. m3.setBody("value = 1; System.out.println(\"setbody: \" + $1);");
  301. fail();
  302. }
  303. catch (CannotCompileException e) {
  304. // System.err.println(e);
  305. }
  306. CtConstructor cons
  307. = new CtConstructor(new CtClass[] { CtClass.intType }, cc);
  308. cons.setBody(null);
  309. cc.addConstructor(cons);
  310. cc.writeFile();
  311. Object obj = make(cc.getName());
  312. assertEquals(12, invoke(obj, "run"));
  313. }
  314. public void testSetStaticConsBody() throws Exception {
  315. CtClass cc = sloader.get("test1.StaticConsBody");
  316. CtConstructor cons = cc.getClassInitializer();
  317. cons.setBody(null);
  318. cons = cc.getConstructors()[0];
  319. cons.setBody(null);
  320. cc.writeFile();
  321. Object obj = make(cc.getName());
  322. assertEquals(0, invoke(obj, "run"));
  323. }
  324. public void testSetConsBody() throws Exception {
  325. CtClass superClazz = sloader.get("java.io.File");
  326. CtClass cc = sloader.makeClass("test1.SetConsBody");
  327. cc.setSuperclass(superClazz);
  328. CtConstructor constructor = new CtConstructor(new CtClass[0], cc);
  329. constructor.setBody("super(\"MyFile\");");
  330. cc.addConstructor(constructor);
  331. constructor = new CtConstructor(new CtClass[] { CtClass.intType },
  332. cc);
  333. constructor.setBody("{ super(\"MyFile\"); }");
  334. cc.addConstructor(constructor);
  335. cc.addMethod(CtNewMethod.make(CtClass.voidType, "m1",
  336. null, null, null, cc));
  337. cc.addMethod(CtNewMethod.make(CtClass.intType, "m2",
  338. null, null, null, cc));
  339. cc.addMethod(CtNewMethod.make(CtClass.byteType, "m3",
  340. null, null, null, cc));
  341. cc.addMethod(CtNewMethod.make(CtClass.longType, "m4",
  342. null, null, null, cc));
  343. cc.addMethod(CtNewMethod.make(CtClass.floatType, "m5",
  344. null, null, null, cc));
  345. cc.addMethod(CtNewMethod.make(CtClass.doubleType, "m6",
  346. null, null, null, cc));
  347. cc.addMethod(CtNewMethod.make(sloader.get("int[]"), "m7",
  348. null, null, null, cc));
  349. cc.addMethod(CtNewMethod.make(
  350. "public int run() {"
  351. + " return (int)(m2() + m3() + m4() + m5() + m6() + 3); }", cc));
  352. cc.writeFile();
  353. Object obj = make(cc.getName());
  354. assertEquals(3, invoke(obj, "run"));
  355. }
  356. public void testEmptyBody() throws Exception {
  357. String[] methods = { "m1", "m2", "m3", "m4" };
  358. boolean[] results = { true, false, false, false, true };
  359. boolean[] cResults = { true, true, false, false, false, true };
  360. CtClass cc = sloader.get("test1.EmptyBody");
  361. for (int i = 0; i < methods.length; ++i) {
  362. CtMethod m = cc.getDeclaredMethod(methods[i]);
  363. assertEquals(results[i], m.isEmpty());
  364. }
  365. CtConstructor[] cons = cc.getDeclaredConstructors();
  366. for (int j = 0; j < cons.length; ++j)
  367. assertEquals(cResults[j], cons[j].isEmpty());
  368. }
  369. public void testExprEditor() throws Exception {
  370. CtClass cc = sloader.get("test1.ExprEdit");
  371. CtMethod m1 = cc.getDeclaredMethod("k0");
  372. m1.instrument(new ExprEditor() {
  373. public void edit(MethodCall m) throws CannotCompileException {
  374. if (m.getClassName().equals("test1.ExprEdit")) {
  375. String name = m.getMethodName();
  376. if (name.equals("k1") || name.equals("k2")) {
  377. try {
  378. CtMethod cm = m.getMethod();
  379. print(cm.getParameterTypes()[0].getName());
  380. print(cm.getReturnType().getName());
  381. }
  382. catch (NotFoundException e) {
  383. throw new CannotCompileException(e);
  384. }
  385. m.replace("{ ++$1; $_ = $proceed($$); }");
  386. }
  387. else if (name.equals("k3"))
  388. m.replace("{ ++$1; $proceed($$); }");
  389. }
  390. }
  391. });
  392. cc.writeFile();
  393. Object obj = make(cc.getName());
  394. assertEquals(12, invoke(obj, "k0"));
  395. }
  396. public void testExprEditor2() throws Exception {
  397. CtClass cc = sloader.get("test1.ExprEdit2");
  398. CtMethod m1 = cc.getDeclaredMethod("k1");
  399. m1.instrument(new ExprEditor() {
  400. public void edit(FieldAccess m) throws CannotCompileException {
  401. if (m.getClassName().equals("test1.ExprEdit2")) {
  402. String name = m.getFieldName();
  403. try {
  404. CtField cf = m.getField();
  405. print(cf.getType().getName());
  406. print("file: " + m.getFileName());
  407. print("line: " + m.getLineNumber());
  408. }
  409. catch (NotFoundException e) {
  410. throw new CannotCompileException(e);
  411. }
  412. if (name.equals("df"))
  413. if (m.isReader())
  414. m.replace("{ $_ = $proceed() + 1; }");
  415. else
  416. m.replace("{ $proceed($1 + 1); }");
  417. else if (name.equals("sf"))
  418. if (m.isReader())
  419. m.replace("{ $_ = $proceed() + 2; }");
  420. else
  421. m.replace("{ $proceed($1 + 2); }");
  422. }
  423. }
  424. });
  425. cc.writeFile();
  426. Object obj = make(cc.getName());
  427. assertEquals(16, invoke(obj, "k1"));
  428. }
  429. public void testExprEditor3() throws Exception {
  430. CtClass cc = sloader.get("test1.ExprEdit3");
  431. CtMethod m1 = cc.getDeclaredMethod("k1");
  432. m1.instrument(new ExprEditor() {
  433. public void edit(NewExpr m) throws CannotCompileException {
  434. System.out.println("new " + m.getClassName());
  435. try {
  436. CtConstructor cc = m.getConstructor();
  437. print(cc.getParameterTypes()[0].getName());
  438. }
  439. catch (NotFoundException e) {
  440. throw new CannotCompileException(e);
  441. }
  442. if (m.getClassName().equals("test1.ExprEdit3")) {
  443. m.replace("{ ++$2; $_ = $proceed($$); }");
  444. }
  445. }
  446. });
  447. cc.writeFile();
  448. Object obj = make(cc.getName());
  449. assertEquals(4, invoke(obj, "k1"));
  450. }
  451. public void testExprEditor4() throws Exception {
  452. CtClass cc = sloader.get("test1.ExprEdit4");
  453. CtMethod m1 = cc.getDeclaredMethod("k1");
  454. m1.instrument(new ExprEditor() {
  455. public void edit(NewExpr m) throws CannotCompileException {
  456. System.out.println("new " + m.getClassName());
  457. if (m.getClassName().equals("test1.ExprEdit4"))
  458. m.replace("$_ = null;");
  459. }
  460. public void edit(MethodCall m) throws CannotCompileException {
  461. if (m.getClassName().equals("test1.ExprEdit4"))
  462. m.replace("{}");
  463. }
  464. });
  465. cc.writeFile();
  466. Object obj = make(cc.getName());
  467. assertEquals(1, invoke(obj, "k1"));
  468. }
  469. public void testExprEditor5() throws Exception {
  470. CtClass cc = sloader.get("test1.ExprEdit5");
  471. CtMethod m1 = cc.getDeclaredMethod("k1");
  472. m1.instrument(new ExprEditor() {
  473. public void edit(NewExpr m) throws CannotCompileException {
  474. m.replace("{ $_ = $proceed($$, \"test\"); }");
  475. }
  476. });
  477. cc.writeFile();
  478. Object obj = make(cc.getName());
  479. assertEquals(1, invoke(obj, "k1"));
  480. }
  481. public void testExprEditor6() throws Exception {
  482. CtClass cc = sloader.get("test1.ExprEdit6");
  483. cc.instrument(new ExprEditor() {
  484. public void edit(MethodCall m) throws CannotCompileException {
  485. assertTrue(m.where().getName().equals("k1"));
  486. m.replace("$_ = 3;");
  487. }
  488. });
  489. cc.writeFile();
  490. Object obj = make(cc.getName());
  491. assertEquals(3, invoke(obj, "k1"));
  492. }
  493. public void testExprEditor7() throws Exception {
  494. CtClass cc = sloader.get("test1.ExprEdit7");
  495. cc.instrument(new ExprEditor() {
  496. public void edit(Instanceof i) throws CannotCompileException {
  497. i.replace("{ this.c1 = $type; $_ = !$proceed($1); }");
  498. }
  499. public void edit(Cast c) throws CannotCompileException {
  500. c.replace("{ this.c2 = $type; $_ = ($r)$1; }");
  501. }
  502. });
  503. cc.writeFile();
  504. Object obj = make(cc.getName());
  505. assertEquals(7, invoke(obj, "k1"));
  506. }
  507. public void testExprEditor8() throws Exception {
  508. CtClass cc = sloader.get("test1.ExprEdit8");
  509. cc.instrument(new ExprEditor() {
  510. public void edit(ConstructorCall c) throws CannotCompileException {
  511. assertTrue(c.isSuper());
  512. c.replace("{ $_ = $proceed($$); value = 7; }");
  513. }
  514. });
  515. cc.writeFile();
  516. Object obj = make(cc.getName());
  517. assertEquals(7, invoke(obj, "k1"));
  518. }
  519. public void testCflow() throws Exception {
  520. CtClass cc = sloader.get("test1.Cflow");
  521. CtMethod m1 = cc.getDeclaredMethod("k1");
  522. m1.useCflow("cflow1");
  523. m1.insertBefore("System.out.println(\"$cflow1: \" + $cflow(cflow1));");
  524. m1.insertAfter("System.out.println(\"*$cflow1: \" + $cflow(cflow1));",
  525. true);
  526. CtMethod m2 = cc.getDeclaredMethod("k2");
  527. m2.useCflow("test1.t.cflow2");
  528. m2.insertBefore(
  529. "System.out.println(\"$cflow2: \" + $cflow(test1.t.cflow2));");
  530. CtMethod m3 = cc.getDeclaredMethod("fact");
  531. m3.useCflow("fact");
  532. m3.insertBefore("if ($cflow(fact) == 0)"
  533. + " System.out.println(\"fact \" + $1);");
  534. cc.writeFile();
  535. Object obj = make(cc.getName());
  536. assertEquals(1, invoke(obj, "run"));
  537. assertEquals(120, invoke(obj, "run2"));
  538. }
  539. public void testSigType() throws Exception {
  540. CtClass cc = sloader.get("test1.SigType");
  541. CtMethod m1 = cc.getDeclaredMethod("k1");
  542. m1.insertBefore("{ Class[] p = $sig; $1 += p.length; }");
  543. m1.insertAfter("System.out.println(\"testSigType: \""
  544. + " + $type.getName());", false);
  545. CtMethod m2 = cc.getDeclaredMethod("k2");
  546. m2.instrument(new ExprEditor() {
  547. public void edit(FieldAccess m) throws CannotCompileException {
  548. m.replace("{ $_ = $proceed($$) + $type.getName().length(); }");
  549. }
  550. public void edit(MethodCall m) throws CannotCompileException {
  551. m.replace("{ $_ = $proceed($$) + $sig.length; }");
  552. }
  553. });
  554. cc.writeFile();
  555. Object obj = make(cc.getName());
  556. assertEquals(19, invoke(obj, "run"));
  557. }
  558. public void testDollarClass() throws Exception {
  559. CtClass cc = sloader.get("test1.DollarClass");
  560. CtMethod m1 = cc.getDeclaredMethod("k1");
  561. m1.insertBefore("{ $1 += $class.getName().length(); }");
  562. CtMethod m2 = cc.getDeclaredMethod("k2");
  563. m2.instrument(new ExprEditor() {
  564. public void edit(MethodCall m) throws CannotCompileException {
  565. m.replace("{ $_ = $class.getName().length(); }");
  566. }
  567. });
  568. m2.insertBefore("{ $1 += $class.getName().length(); }");
  569. cc.writeFile();
  570. Object obj = make(cc.getName());
  571. assertEquals(58, invoke(obj, "run"));
  572. }
  573. public void testHandler() throws Exception {
  574. CtClass cc = sloader.get("test1.Handler");
  575. CtMethod m1 = cc.getDeclaredMethod("m1");
  576. m1.instrument(new ExprEditor() {
  577. public void edit(Handler h) throws CannotCompileException {
  578. try {
  579. print(h.getType().getName());
  580. h.insertBefore(
  581. "{ p = (($r)$1).getClass().getName().length()"
  582. + "+ $type.getName().length(); }");
  583. }
  584. catch (NotFoundException e) {
  585. throw new CannotCompileException(e);
  586. }
  587. }
  588. });
  589. cc.writeFile();
  590. Object obj = make(cc.getName());
  591. assertEquals(("java.lang.IndexOutOfBoundsException".length()
  592. + "java.lang.ClassNotFoundException".length())
  593. * 2 + 1,
  594. invoke(obj, "test"));
  595. }
  596. public void testInterface() throws Exception {
  597. String className = "test1.NewInterface";
  598. ClassPool pool = ClassPool.getDefault();
  599. CtClass targetCtClass = pool.get(className);
  600. CtClass ctInterface
  601. = pool.makeInterface(className + "2");
  602. CtMethod[] ctMethods = targetCtClass.getDeclaredMethods();
  603. for (int i = 0;i < ctMethods.length; i++) {
  604. String code = Modifier.toString(ctMethods[i].getModifiers())
  605. + " " + ctMethods[i].getReturnType().getName()
  606. + " " + ctMethods[i].getName() + "();";
  607. System.out.println(code);
  608. CtMethod m = CtNewMethod.make(code, ctInterface);
  609. ctInterface.addMethod(m);
  610. }
  611. targetCtClass.addInterface(ctInterface);
  612. targetCtClass.stopPruning(true);
  613. targetCtClass.writeFile();
  614. ctInterface.stopPruning(true);
  615. ctInterface.writeFile();
  616. ctInterface.toClass();
  617. targetCtClass.toClass();
  618. }
  619. public void testDispatch() throws Exception {
  620. CtClass cc = sloader.get("test1.Dispatch");
  621. CtMethod m1 = cc.getDeclaredMethod("run");
  622. m1.insertAfter("$_ += f(new Object[1]);");
  623. cc.writeFile();
  624. Object obj = make(cc.getName());
  625. assertEquals(7, invoke(obj, "run"));
  626. }
  627. public void testMakeClass()throws Exception {
  628. CtClass cc = sloader.makeClass(
  629. new FileInputStream(PATH + "test1/MakeClass.class"));
  630. assertEquals("test1.MakeClass", cc.getName());
  631. assertEquals(cc, sloader.get(cc.getName()));
  632. cc.toBytecode();
  633. assertTrue(cc.isFrozen());
  634. try {
  635. cc = sloader.makeClass(
  636. new FileInputStream(PATH + "test1/MakeClass.class"));
  637. assertTrue(false);
  638. }
  639. catch (RuntimeException e) {
  640. print(e.getMessage());
  641. }
  642. }
  643. public void testMakeMethod() throws Exception {
  644. CtClass cc = sloader.makeClass("test1.MakeMethod");
  645. cc.addField(new CtField(CtClass.intType, "i", cc));
  646. String cons_body = "{ i = 3; }";
  647. CtConstructor cons = CtNewConstructor.make(null, null,
  648. cons_body, cc);
  649. cc.addConstructor(cons);
  650. CtMethod m = CtNewMethod.make(CtClass.intType, "run", null, null,
  651. "{ return i; }", cc);
  652. cc.addMethod(m);
  653. cc.writeFile();
  654. Object obj = make(cc.getName());
  655. assertEquals(3, invoke(obj, "run"));
  656. }
  657. public void testDesc() throws Exception {
  658. Class[] sig;
  659. assertEquals(int.class, Desc.getType("I"));
  660. assertEquals(String.class, Desc.getType("Ljava/lang/String;"));
  661. assertEquals(String[].class, Desc.getType("[Ljava/lang/String;"));
  662. assertEquals(int[].class, Desc.getType("[I"));
  663. sig = Desc.getParams("()V");
  664. assertEquals(0, sig.length);
  665. sig = Desc.getParams("(I)V");
  666. assertEquals(int.class, sig[0]);
  667. assertEquals(1, sig.length);
  668. sig = Desc.getParams("(IJ)V");
  669. assertEquals(long.class, sig[1]);
  670. assertEquals(2, sig.length);
  671. sig = Desc.getParams("(Ljava/lang/String;)V");
  672. assertEquals(String.class, sig[0]);
  673. assertEquals(1, sig.length);
  674. sig = Desc.getParams("([Ljava/lang/String;I)V");
  675. assertEquals(String[].class, sig[0]);
  676. assertEquals(2, sig.length);
  677. sig = Desc.getParams("(Ljava/lang/String;[Ljava/lang/String;)V");
  678. assertEquals(String[].class, sig[1]);
  679. assertEquals(2, sig.length);
  680. }
  681. public void testCast() throws Exception {
  682. CtClass cc = sloader.makeClass("test1.CastTest");
  683. StringBuffer src = new StringBuffer();
  684. src.append("public void test(java.lang.String[] strValues)\n");
  685. src.append("{\n");
  686. src.append("\tObject[] values = new Object[2];");
  687. src.append("\tvalues[0] = strValues;");
  688. src.append("\tvalues[1] = strValues;");
  689. src.append("\tstrValues = (String[])values[0];");
  690. src.append("}\n");
  691. CtMethod m = CtNewMethod.make(src.toString(), cc);
  692. }
  693. static final long svUID = 6006955401253799668L;
  694. public void testSerialVUID() throws Exception {
  695. CtClass cc = sloader.get("test1.MySerializableClass");
  696. assertEquals(svUID, SerialVersionUID.calculateDefault(cc));
  697. SerialVersionUID.setSerialVersionUID(cc);
  698. cc.writeFile();
  699. }
  700. public void testInvokeInt() throws Exception {
  701. CtClass cc = sloader.get("test1.InvokeInt");
  702. CtMethod m1 = cc.getDeclaredMethod("check");
  703. m1.instrument(new ExprEditor() {
  704. public void edit(MethodCall m) throws CannotCompileException {
  705. m.replace("$_ = $proceed($$) + k(1);");
  706. }
  707. });
  708. cc.writeFile();
  709. Object obj = make(cc.getName());
  710. assertEquals(6, invoke(obj, "run"));
  711. }
  712. public void testSubtypeOf() throws Exception {
  713. testSubtypeOf2("java.lang.Object", "int", false);
  714. testSubtypeOf2("int[]", "java.lang.Object", true);
  715. testSubtypeOf2("int[]", "java.lang.Cloneable", true);
  716. testSubtypeOf2("java.lang.Object", "int[]", false);
  717. testSubtypeOf2("java.lang.Integer", "java.lang.Number", true);
  718. testSubtypeOf2("java.lang.Number", "java.lang.Integer", false);
  719. testSubtypeOf2("java.lang.Integer[]", "java.lang.Number[]", true);
  720. testSubtypeOf2("java.lang.Number[]", "java.lang.Integer[]", false);
  721. testSubtypeOf2("java.lang.Integer", "java.io.Serializable", true);
  722. testSubtypeOf2("java.lang.Integer", "java.lang.Object", true);
  723. }
  724. private void testSubtypeOf2(String s, String t, boolean b)
  725. throws Exception
  726. {
  727. assertTrue(sloader.get(s).subtypeOf(sloader.get(t)) == b);
  728. }
  729. public void testMakeInterface() throws Exception {
  730. CtClass cc = sloader.makeInterface("test1.MkInterface");
  731. CtMethod m = CtNewMethod.make("public abstract void ready();", cc);
  732. cc.addMethod(m);
  733. cc.writeFile();
  734. // cloader.loadClass(cc.getName());
  735. java.io.File genDir = new java.io.File(".");
  736. java.net.URLClassLoader ucl = new java.net.URLClassLoader(
  737. new java.net.URL[] { genDir.toURI().toURL() }, null);
  738. Class intf = ucl.loadClass("test1.MkInterface");
  739. }
  740. public void testCodeConv() throws Exception {
  741. CtClass cc = sloader.get("test1.CodeConv");
  742. CtClass pc = sloader.get("test1.CodeConvP");
  743. CodeConverter conv = new CodeConverter();
  744. conv.replaceFieldRead(pc.getDeclaredField("a1"), cc, "getA1");
  745. conv.replaceFieldRead(pc.getDeclaredField("a2"), cc, "getA2");
  746. conv.redirectFieldAccess(pc.getDeclaredField("a3"), cc, "a4");
  747. conv.replaceFieldWrite(pc.getDeclaredField("b1"), cc, "putB1");
  748. cc.instrument(conv);
  749. cc.writeFile();
  750. Object obj = make(cc.getName());
  751. assertEquals(51, invoke(obj, "run"));
  752. }
  753. public void testTryCatch() throws Exception {
  754. CtClass cc = sloader.get("test1.TryCatch");
  755. CtMethod m1 = cc.getDeclaredMethod("m1");
  756. m1.instrument(new ExprEditor() {
  757. public void edit(MethodCall m) throws CannotCompileException {
  758. m.replace(
  759. "try { doit(); }"
  760. + "catch(NullPointerException e){ init(); doit(); }");
  761. }
  762. });
  763. final String src =
  764. "try { doit(); }"
  765. + "catch(NullPointerException e){ init(); doit(); return a; }";
  766. CtMethod p1 = cc.getDeclaredMethod("p1");
  767. p1.insertAfter(src, true);
  768. cc.writeFile();
  769. Object obj = make(cc.getName());
  770. assertEquals(4, invoke(obj, "run"));
  771. Object obj2 = make(cc.getName());
  772. assertEquals(4, invoke(obj2, "p1"));
  773. }
  774. private CtClass[] throwablesList = null;
  775. public void testGetThrowables() throws Exception {
  776. CtClass cc = sloader.get("test1.GetThrowables");
  777. CtMethod m1 = cc.getDeclaredMethod("run");
  778. m1.instrument(new ExprEditor() {
  779. public void edit(MethodCall m) throws CannotCompileException {
  780. throwablesList = m.mayThrow();
  781. }
  782. });
  783. System.out.println(throwablesList[0].getName());
  784. System.out.println(throwablesList[1].getName());
  785. assertEquals(2, throwablesList.length);
  786. }
  787. public void testArrayAccess() throws Exception {
  788. CtClass cc = sloader.get("test1.ArrayAccess");
  789. CtMethod m1 = cc.getDeclaredMethod("test");
  790. m1.insertBefore("{ ia[0] += 1; iaa[1] = iaa[0]; }");
  791. cc.writeFile();
  792. Object obj = make(cc.getName());
  793. assertEquals(8, invoke(obj, "test"));
  794. }
  795. public void testClinit() throws Exception {
  796. CtClass cc = sloader.get("test1.Clinit");
  797. CtConstructor clinit = cc.getClassInitializer();
  798. assertTrue(clinit != null);
  799. try {
  800. clinit.insertBeforeBody(";");
  801. assertTrue(false);
  802. }
  803. catch (CannotCompileException e) {
  804. print(e.toString());
  805. assertEquals("class initializer", e.getReason());
  806. }
  807. CtConstructor[] init = cc.getConstructors();
  808. assertEquals(1, init.length);
  809. clinit.insertAfter("j += 1;");
  810. cc.writeFile();
  811. Object obj = make(cc.getName());
  812. assertEquals(457, invoke(obj, "run"));
  813. }
  814. public void testClinit2() throws Exception {
  815. CtClass cc = sloader.get("test1.Clinit2");
  816. CtConstructor clinit = cc.makeClassInitializer();
  817. clinit.insertAfter("j = 7;");
  818. cc.writeFile();
  819. Object obj = make(cc.getName());
  820. assertEquals(7, invoke(obj, "run"));
  821. }
  822. // by yamazaki
  823. public void testCondExpr() throws Exception {
  824. CtClass cc = sloader.makeClass("test1.CondExpr");
  825. CtMethod methodM = new CtMethod(CtClass.intType, "m",
  826. new CtClass[]{ CtClass.intType }, cc);
  827. methodM.setModifiers(methodM.getModifiers() | Modifier.STATIC);
  828. methodM.setBody("{if($1 <= 0) return 1; else return 0;}");
  829. cc.addMethod(methodM);
  830. cc.writeFile();
  831. Object obj = make(cc.getName());
  832. assertEquals(0, invoke(obj, "m", 3));
  833. }
  834. // by yamazaki
  835. public void testCondExpr2() throws Exception {
  836. CtClass cc = sloader.makeClass("test1.CondExpr2");
  837. CtMethod methodM = new CtMethod(CtClass.intType, "m",
  838. new CtClass[]{ CtClass.intType }, cc);
  839. methodM.setModifiers(methodM.getModifiers() | Modifier.STATIC);
  840. methodM.setBody("{return ($1 <= 0) ? 1 : (m($1 - 1) * $1);}");
  841. cc.addMethod(methodM);
  842. cc.writeFile();
  843. Object obj = make(cc.getName());
  844. assertEquals(6, invoke(obj, "m", 3));
  845. }
  846. // by yamazaki
  847. public void testCondExpr3() throws Exception {
  848. CtClass cc = sloader.makeClass("test1.CondExpr3");
  849. CtMethod methodM = CtNewMethod.make(
  850. "public abstract int m(int i);", cc);
  851. CtMethod methodN = CtNewMethod.make(
  852. "public abstract int n(int i);", cc);
  853. cc.addMethod(methodM);
  854. cc.addMethod(methodN);
  855. methodM.setBody("{return ($1 <= 0) ? 1 : (n($1 - 1) * $1);}");
  856. methodN.setBody("{return m($1);}");
  857. cc.setModifiers(cc.getModifiers() & ~Modifier.ABSTRACT);
  858. cc.writeFile();
  859. Object obj = make(cc.getName());
  860. assertEquals(6, invoke(obj, "m", 3));
  861. }
  862. public void testDelegator() throws Exception {
  863. CtClass cc = sloader.get("test1.Delegator");
  864. assertEquals("test1.SuperDelegator", cc.getSuperclass().getName());
  865. CtMethod f = sloader.getMethod("test1.SuperDelegator", "f");
  866. CtMethod g = sloader.getMethod("test1.SuperDelegator", "g");
  867. cc.addMethod(CtNewMethod.delegator(f, cc));
  868. cc.addMethod(CtNewMethod.delegator(g, cc));
  869. cc.writeFile();
  870. Object obj = make(cc.getName());
  871. assertEquals(15, invoke(obj, "run"));
  872. }
  873. public void testSetName() throws Exception {
  874. CtClass cc = sloader.get("test1.SetName");
  875. CtMethod m0 = cc.getDeclaredMethod("foo");
  876. cc.setName("test1.SetName2");
  877. assertEquals(cc, sloader.get("test1.SetName2"));
  878. assertEquals("foo(Ltest1/SetName2;)", m0.getStringRep());
  879. CtClass cc2 = sloader.makeClass("test1.SetName3");
  880. CtMethod m = CtNewMethod.make(
  881. "public int m(test1.SetName2 obj) { return ((test1.SetName2)obj).i; }",
  882. cc2);
  883. cc2.addMethod(m);
  884. cc.writeFile();
  885. cc2.writeFile();
  886. }
  887. public void testFieldModifier() throws Exception {
  888. CtClass cc = sloader.get("test1.FieldMod");
  889. CtField f = cc.getField("text");
  890. f.setModifiers(Modifier.PUBLIC);
  891. f = cc.getField("i");
  892. f.setName("j");
  893. cc.writeFile();
  894. Object obj = make(cc.getName());
  895. assertEquals(java.lang.reflect.Modifier.PUBLIC,
  896. obj.getClass().getField("text").getModifiers());
  897. assertTrue(obj.getClass().getField("j") != null);
  898. }
  899. public void testToString() throws Exception {
  900. System.out.println(sloader.get("test1.FieldMod"));
  901. System.out.println(sloader.get("java.lang.Object"));
  902. }
  903. public void testPackage() throws Exception {
  904. Object obj = new Loader().loadClass("test1.Pac").getConstructor().newInstance();
  905. assertEquals(1, invoke(obj, "run"));
  906. }
  907. public void testHoward() throws Exception {
  908. String head =
  909. "public Object lookup() throws java.rmi.RemoteException ";
  910. String src =
  911. "{ if (_remote != null) return _remote;"
  912. + " test1.HowardHome h = (test1.HowardHome)lookup(\"Howard\");"
  913. + " try { _remote = h.create(); }"
  914. + " catch (java.io.IOException e) { throw new java.rmi.RemoteException(e.getMessage(), e); }"
  915. + " return _remote; }";
  916. String src2 =
  917. "public void lookup2() {"
  918. + " try {}"
  919. + " catch (java.io.IOException e) { throw new Exception(e); }"
  920. + "}";
  921. CtClass cc = sloader.get("test1.Howard");
  922. CtMethod m = CtNewMethod.make(head + src, cc);
  923. cc.addMethod(m);
  924. try {
  925. CtMethod m2 = CtNewMethod.make(src2, cc);
  926. cc.addMethod(m2);
  927. assertTrue(false);
  928. }
  929. catch (CannotCompileException e) {}
  930. m = new CtMethod(sloader.get("java.lang.Object"),
  931. "lookup3", null, cc);
  932. m.setBody(src);
  933. m.setModifiers(Modifier.PUBLIC);
  934. m.setExceptionTypes(new CtClass[] {
  935. sloader.get("java.rmi.RemoteException") });
  936. cc.addMethod(m);
  937. cc.writeFile();
  938. Object target = make(cc.getName());
  939. Method mth = target.getClass().getMethod("lookup", new Class[0]);
  940. Object res = mth.invoke(target, new Object[0]);
  941. assertEquals("howard4", res);
  942. mth = target.getClass().getMethod("lookup3", new Class[0]);
  943. res = mth.invoke(target, new Object[0]);
  944. assertEquals("howard4", res);
  945. }
  946. public void testLoop() throws Exception {
  947. CtClass cc = sloader.makeClass("test1.Loop");
  948. CtMethod m = CtNewMethod.make(
  949. "public int run(int i) { int k = 0;"
  950. + "while (true) { if (k++ > 10) return i; } }",
  951. cc);
  952. cc.addMethod(m);
  953. cc.writeFile();
  954. Object obj = make(cc.getName());
  955. assertEquals(3, invoke(obj, "run", 3));
  956. }
  957. public static Test suite() {
  958. TestSuite suite = new TestSuite("Javassist Tests");
  959. suite.addTestSuite(JvstTest.class);
  960. suite.addTestSuite(JvstTest2.class);
  961. suite.addTestSuite(JvstTest3.class);
  962. suite.addTestSuite(JvstTest4.class);
  963. suite.addTestSuite(JvstTest5.class);
  964. suite.addTestSuite(LoaderTestByRandall.class);
  965. suite.addTestSuite(javassist.bytecode.BytecodeTest.class);
  966. suite.addTestSuite(javassist.bytecode.StackMapTest.class);
  967. suite.addTestSuite(javassist.compiler.CompTest.class);
  968. suite.addTestSuite(javassist.SetterTest.class);
  969. suite.addTestSuite(javassist.bytecode.InsertGap0.class);
  970. suite.addTestSuite(javassist.tools.reflect.LoaderTest.class);
  971. suite.addTestSuite(testproxy.ProxyTester.class);
  972. suite.addTestSuite(testproxy.ProxyFactoryPerformanceTest.class); // remove?
  973. suite.addTestSuite(javassist.proxyfactory.ProxyFactoryTest.class);
  974. suite.addTestSuite(javassist.proxyfactory.Tester.class);
  975. suite.addTestSuite(javassist.HotswapTest.class);
  976. suite.addTestSuite(test.javassist.proxy.ProxySerializationTest.class);
  977. suite.addTestSuite(test.javassist.convert.ArrayAccessReplaceTest.class);
  978. suite.addTestSuite(test.javassist.proxy.JASSIST113RegressionTest.class);
  979. suite.addTestSuite(test.javassist.proxy.JBPAPP9257Test.class);
  980. suite.addTestSuite(test.javassist.proxy.ProxyCacheGCTest.class); // remvoe?
  981. suite.addTestSuite(test.javassist.proxy.ProxyFactoryCompatibilityTest.class);
  982. suite.addTestSuite(test.javassist.proxy.ProxySerializationTest.class);
  983. suite.addTestSuite(test.javassist.proxy.ProxySimpleTest.class);
  984. suite.addTestSuite(test.javassist.bytecode.analysis.AnalyzerTest.class);
  985. suite.addTestSuite(test.javassist.convert.ArrayAccessReplaceTest.class);
  986. suite.addTestSuite(test.javassist.bytecode.analysis.DomTreeTest.class);
  987. return suite;
  988. }
  989. }