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.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996
  1. /* *******************************************************************
  2. * Copyright (c) 1999-2001 Xerox Corporation,
  3. * 2002 Palo Alto Research Center, Incorporated (PARC)
  4. * 2003 Contributors.
  5. * 2005 Contributors
  6. * All rights reserved.
  7. * This program and the accompanying materials are made available
  8. * under the terms of the Common Public License v1.0
  9. * which accompanies this distribution and is available at
  10. * http://www.eclipse.org/legal/cpl-v10.html
  11. *
  12. * Contributors:
  13. * Xerox/PARC initial implementation
  14. * IBM ongoing maintenance
  15. * ******************************************************************/
  16. package org.aspectj.tools.ant.taskdefs;
  17. import java.io.BufferedReader;
  18. import java.io.File;
  19. import java.io.FileFilter;
  20. import java.io.FileReader;
  21. import java.io.IOException;
  22. import java.io.PrintStream;
  23. import java.util.Arrays;
  24. import java.util.jar.JarEntry;
  25. import java.util.jar.JarFile;
  26. import junit.framework.TestCase;
  27. import org.apache.tools.ant.BuildException;
  28. import org.apache.tools.ant.Location;
  29. import org.apache.tools.ant.Project;
  30. import org.apache.tools.ant.types.Path;
  31. import org.apache.tools.ant.types.selectors.FilenameSelector;
  32. import org.aspectj.bridge.IMessage;
  33. import org.aspectj.bridge.IMessageHolder;
  34. import org.aspectj.bridge.MessageHandler;
  35. import org.aspectj.bridge.MessageUtil;
  36. import org.aspectj.util.FileUtil;
  37. import org.aspectj.util.LangUtil;
  38. /**
  39. * AjcTask test cases.
  40. * Please put new ones with others between ------- comments.
  41. *
  42. * Some API tests, but mostly functional tests driving
  43. * the task execute using data in ../taskdefs/testdata.
  44. * This will re-run in forked mode for any nonfailing
  45. * compile if aspectjtools-dist is built into
  46. * ../aj-build/dist/tools/lib/aspectjtools.jar.
  47. */
  48. public class AjcTaskTest extends TestCase {
  49. private static final Class NO_EXCEPTION = null;
  50. private static final String NOFILE = "NOFILE";
  51. private static final File tempDir;
  52. private static final String aspectjtoolsJar;
  53. private static final String testdataDir;
  54. private static final StringBuffer MESSAGES = new StringBuffer();
  55. /** accept writable .class files */
  56. private static FileFilter PICK_CLASS_FILES;
  57. static {
  58. tempDir = new File("IncrementalAjcTaskTest-temp");
  59. String toolsPath = "../aj-build/dist/tools/lib/aspectjtools.jar";
  60. File toolsjar = new File(toolsPath);
  61. if (toolsjar.canRead()) {
  62. aspectjtoolsJar = toolsjar.getAbsolutePath();
  63. } else {
  64. aspectjtoolsJar = null;
  65. String s =
  66. "AjcTaskTest not forking - build aspectjtools-dist to get "
  67. + toolsPath;
  68. System.out.println(s);
  69. }
  70. File dir = new File("../taskdefs/testdata");
  71. if (dir.canRead() && dir.isDirectory()) {
  72. testdataDir = dir.getAbsolutePath();
  73. } else {
  74. testdataDir = null;
  75. }
  76. PICK_CLASS_FILES = new FileFilter() {
  77. public boolean accept(File file) {
  78. return (
  79. (null != file)
  80. && file.isFile()
  81. && file.canWrite()
  82. && file.getPath().endsWith(".class"));
  83. }
  84. };
  85. }
  86. /**
  87. * Check that aspectjtools are found on the classpath,
  88. * reporting any errors to System.err.
  89. *
  90. * Run multiple times with different classpaths.
  91. * This should find variants
  92. * aspectjtools.jar,
  93. * aspectj-tools.jar,
  94. * aspectj-tools-1.1.jar, and
  95. * aspectjtools-1.0.6.jar
  96. * but not
  97. * aspectjrt.jar or
  98. * aspectj/tools.jar.
  99. * XXX use testing aspect to stub out
  100. * <code>System.getProperty("java.class.path")</code>
  101. * @param args a String[], first is expected path, if any
  102. */
  103. public static void main(String[] args) {
  104. java.io.File toolsjar = AjcTask.findAspectjtoolsJar();
  105. if ((null == args) || (0 == args.length)) {
  106. if (null != toolsjar) {
  107. System.err.println("FAIL - not expected: " + toolsjar);
  108. }
  109. } else if ("-help".equals(args[0])) {
  110. System.out.println(
  111. "java "
  112. + AjcTaskTest.class.getName()
  113. + " <expectedPathToAspectjtoolsJar>");
  114. } else if (null == toolsjar) {
  115. System.err.println("FAIL - expected: " + args[0]);
  116. } else {
  117. String path = toolsjar.getAbsolutePath();
  118. if (!path.equals(args[0])) {
  119. System.err.println(
  120. "FAIL - expected: " + args[0] + " actual: " + path);
  121. }
  122. }
  123. }
  124. public static void collectMessage(String s) {
  125. MESSAGES.append(s);
  126. }
  127. private static void deleteTempDir() {
  128. if ((null != tempDir) && tempDir.exists()) {
  129. FileUtil.deleteContents(tempDir);
  130. tempDir.delete();
  131. // when tempDir not used...
  132. if (null != testdataDir) {
  133. File dataDir = new File(testdataDir);
  134. if (dataDir.canRead()) {
  135. FileUtil.deleteContents(dataDir, PICK_CLASS_FILES, false);
  136. }
  137. }
  138. }
  139. }
  140. private static final File getTempDir() {
  141. return tempDir;
  142. }
  143. public AjcTaskTest(String name) {
  144. super(name);
  145. }
  146. public void tearDown() {
  147. deleteTempDir();
  148. MESSAGES.setLength(0);
  149. }
  150. private void checkRun(AjcTask task, String exceptionString) {
  151. try {
  152. task.execute();
  153. assertTrue(null == exceptionString);
  154. } catch (BuildException e) {
  155. if (null == exceptionString) {
  156. assertTrue("unexpected " + e.getMessage(), false);
  157. } else {
  158. String m = e.getMessage();
  159. if (null == m) {
  160. assertTrue("not " + exceptionString, false);
  161. } else if (-1 == m.indexOf(exceptionString)) {
  162. assertEquals(exceptionString, e.getMessage());
  163. }
  164. }
  165. }
  166. }
  167. private void checkContains(String[] cmd, String option, boolean contains) {
  168. for (int i = 0; i < cmd.length; i++) {
  169. if (option.equals(cmd[i])) {
  170. if (contains) {
  171. return;
  172. } else {
  173. assertTrue(
  174. "not expecting " + option + " in " + Arrays.asList(cmd),
  175. false);
  176. }
  177. }
  178. }
  179. if (contains) {
  180. assertTrue(
  181. "expecting " + option + " in " + Arrays.asList(cmd),
  182. false);
  183. }
  184. }
  185. protected AjcTask getTask(String input) {
  186. return getTask(input, getTempDir());
  187. }
  188. protected AjcTask getTask(String input, File destDir) {
  189. AjcTask task = new AjcTask();
  190. Project p = new Project();
  191. task.setProject(p);
  192. if (null != destDir) {
  193. task.setDestdir(destDir);
  194. }
  195. if (NOFILE.equals(input)) {
  196. // add nothing
  197. } else if (input.endsWith(".lst")) {
  198. if (-1 != input.indexOf(",")) {
  199. throw new IllegalArgumentException(
  200. "lists not supported: " + input);
  201. } else if (null == testdataDir) {
  202. throw new Error("testdata not found - run in ../taskdefs");
  203. } else {
  204. String path = testdataDir + File.separator + input;
  205. task.setArgfiles(new Path(task.getProject(), path));
  206. }
  207. } else if ((input.endsWith(".java") || input.endsWith(".aj"))) {
  208. FilenameSelector fns = new FilenameSelector();
  209. fns.setName(input);
  210. task.addFilename(fns);
  211. } else {
  212. String path = testdataDir + File.separator + input;
  213. task.setSourceRoots(new Path(task.getProject(), path));
  214. }
  215. task.setClasspath(new Path(p, "../lib/test/aspectjrt.jar"));
  216. return task;
  217. }
  218. /** used in testMessageHolderClassName */
  219. public static class InfoHolder extends MessageHandler {
  220. public InfoHolder() {
  221. }
  222. public boolean handleMessage(IMessage message) {
  223. if (0 == IMessage.INFO.compareTo(message.getKind())) {
  224. AjcTaskTest.collectMessage(message.getMessage());
  225. }
  226. return true;
  227. }
  228. }
  229. /** used in testMessageHolderClassName */
  230. public static class Holder extends MessageHandler {
  231. public Holder() {
  232. }
  233. public boolean handleMessage(IMessage message) {
  234. IMessage.Kind kind = message.getKind();
  235. if (IMessage.ERROR.isSameOrLessThan(kind)) {
  236. String m = kind.toString();
  237. AjcTaskTest.collectMessage(m.substring(0, 1));
  238. }
  239. return true;
  240. }
  241. }
  242. // ------------------------------------------------------
  243. // ------------------------------------------------------
  244. // ------------------------------------------------------
  245. // ------------------------------------------------------
  246. // ------------------------------------------------------
  247. // ------------------------------------------------------
  248. // Start of test cases
  249. public void testNullDestDir() {
  250. AjcTask task = getTask(NOFILE, null);
  251. String[] cmd = task.makeCommand();
  252. for (int i = 0; i < cmd.length; i++) {
  253. assertTrue(!"-d".equals(cmd[i]));
  254. }
  255. }
  256. public void testOutputRequirement() {
  257. AjcTask task = getTask("default.lst");
  258. checkRun(task, null);
  259. // copyInJars now just emits warning b/c unused
  260. task = getTask("default.lst", null);
  261. task.setCopyInjars(true);
  262. checkRun(task, null);
  263. // sourceRootCopyFilter requires destDir
  264. task = getTask("default.lst", null);
  265. task.setSourceRootCopyFilter("**/*.java");
  266. checkRun(task, "sourceRoot");
  267. }
  268. public void testSourceRootCopyFilter() {
  269. // sourceRootCopyFilter works..
  270. File destDir = getTempDir();
  271. assertTrue(
  272. "unable to create " + destDir,
  273. destDir.canRead() || destDir.mkdirs());
  274. AjcTask task = getTask("sourceroot", destDir);
  275. task.setSourceRootCopyFilter("doNotCopy,**/*.txt");
  276. File file = new File(destDir, "Default.java").getAbsoluteFile();
  277. assertTrue(file + ".canRead() prematurely", !file.canRead());
  278. checkRun(task, null);
  279. // got expected resources
  280. assertTrue(file + ".canRead() failed", file.canRead());
  281. File pack = new File(destDir, "pack");
  282. file = new File(pack, "Pack.java").getAbsoluteFile();
  283. assertTrue(file + ".canRead() failed", file.canRead());
  284. file = new File(pack, "includeme").getAbsoluteFile();
  285. assertTrue(file + ".canRead() failed", file.canRead());
  286. // didn't get unexpected resources
  287. file = new File(pack, "something.txt");
  288. assertTrue(file + ".canRead() passed", !file.canRead());
  289. file = new File(destDir, "doNotCopy");
  290. assertTrue(file + ".canRead() passed", !file.canRead());
  291. file = new File(destDir, "skipTxtFiles.txt");
  292. assertTrue(file + ".canRead() passed", !file.canRead());
  293. }
  294. public void testInpathDirCopyFilter() {
  295. // inpathDirCopyFilter works with output directory
  296. File destDir = getTempDir();
  297. assertTrue(
  298. "unable to create " + destDir,
  299. destDir.canRead() || destDir.mkdirs());
  300. AjcTask task = getTask(NOFILE, destDir);
  301. Project p = task.getProject();
  302. Path indirs = new Path(p);
  303. File dir = new File(testdataDir, "inpathDirs").getAbsoluteFile();
  304. indirs.addExisting(new Path(p, new File(dir, "inpathDirOne").getAbsolutePath()));
  305. indirs.addExisting(new Path(p, new File(dir, "inpathDirTwo").getAbsolutePath()));
  306. task.setInpath(indirs);
  307. task.setInpathDirCopyFilter("doNotCopy,**/*.txt");
  308. File file = new File(destDir, "Default.java").getAbsoluteFile();
  309. assertTrue(file + ".canRead() prematurely", !file.canRead());
  310. checkRun(task, null);
  311. // got expected resources
  312. File pack = new File(destDir, "pack");
  313. file = new File(pack, "includeme").getAbsoluteFile();
  314. assertTrue(file + ".canRead() failed", file.canRead());
  315. file = new File(pack, "Pack.class").getAbsoluteFile();
  316. assertTrue(file + ".canRead() failed", file.canRead());
  317. file = new File(destDir, "copyMe.htm").getAbsoluteFile();
  318. assertTrue(file + ".canRead() failed", file.canRead());
  319. file = new File(destDir, "Default.class").getAbsoluteFile();
  320. assertTrue(file + ".canRead() failed", file.canRead());
  321. // didn't get unexpected resources
  322. file = new File(pack, "something.txt");
  323. assertTrue(file + ".canRead() passed", !file.canRead());
  324. file = new File(destDir, "doNotCopy");
  325. assertTrue(file + ".canRead() passed", !file.canRead());
  326. file = new File(destDir, "skipTxtFiles.txt");
  327. assertTrue(file + ".canRead() passed", !file.canRead());
  328. }
  329. public void testInpathDirCopyFilterWithJar() throws IOException {
  330. checkInpathCopy("testInpathDirCopyFilterWithJar-out.jar");
  331. }
  332. // test resource copying for oddball jar files that don't end in .jar
  333. public void testInpathDirCopyFilterWithOddjar() throws IOException {
  334. checkInpathCopy("testInpathDirCopyFilterWithJar-outJarFile");
  335. }
  336. private void checkInpathCopy(String outjarFileStr) throws IOException {
  337. // inpathDirCopyFilter works with output jar
  338. File destDir = getTempDir();
  339. assertTrue(
  340. "unable to create " + destDir,
  341. destDir.canRead() || destDir.mkdirs());
  342. AjcTask task = getTask(NOFILE, null);
  343. File destJar = new File(destDir, outjarFileStr);
  344. task.setOutjar(destJar);
  345. Project p = task.getProject();
  346. Path indirs = new Path(p);
  347. File dir = new File(testdataDir, "inpathDirs").getAbsoluteFile();
  348. indirs.addExisting(new Path(p, new File(dir, "inpathDirOne").getAbsolutePath()));
  349. indirs.addExisting(new Path(p, new File(dir, "inpathDirTwo").getAbsolutePath()));
  350. task.setInpath(indirs);
  351. task.setInpathDirCopyFilter("doNotCopy,**/*.txt,**/*.class");
  352. checkRun(task, null);
  353. JarFile jarFile = new JarFile(destJar);
  354. String[] expected = {"copyMe.htm", "pack/includeme",
  355. "pack/Pack.class", "Default.class"};
  356. String[] unexpected = {"doNotCopy", "skipTxtFiles.txt", "pack/something.txt"};
  357. for (int i = 0; i < expected.length; i++) {
  358. JarEntry entry = jarFile.getJarEntry(expected[i]);
  359. assertTrue(expected[i] + " not found", null != entry);
  360. }
  361. for (int i = 0; i < unexpected.length; i++) {
  362. JarEntry entry = jarFile.getJarEntry(unexpected[i]);
  363. assertTrue(unexpected[i] + " found", null == entry);
  364. }
  365. }
  366. public void testInpathDirCopyFilterError() {
  367. // inpathDirCopyFilter fails with no output directory or jar iff specified
  368. AjcTask task = getTask(NOFILE, null);
  369. Project p = task.getProject();
  370. Path indirs = new Path(p);
  371. File dir = new File(testdataDir, "inpathDirs").getAbsoluteFile();
  372. indirs.addExisting(new Path(p, new File(dir, "inpathDirOne").getAbsolutePath()));
  373. indirs.addExisting(new Path(p, new File(dir, "inpathDirTwo").getAbsolutePath()));
  374. task.setInpath(indirs);
  375. task.setInpathDirCopyFilter("doNotCopy,**/*.txt,**/*.class");
  376. // expecting error
  377. checkRun(task, "inpathDirCopyFilter");
  378. }
  379. // this test method submitted by patch from Andrew Huff (IBM)
  380. // verifies that the log attribute of AjcTask writes output to the given log file
  381. public void testLoggingMode() {
  382. AjcTask task = getTask("default.lst");
  383. task.setFailonerror(false);
  384. File logFile = new File("testLogFile1.txt");
  385. String s = logFile.getAbsolutePath();
  386. logFile.delete();
  387. long initialLength = logFile.length();
  388. task.setLog(logFile);
  389. runTest(task,null,null);
  390. long newLength = logFile.length();
  391. assertTrue(newLength > initialLength);
  392. logFile.delete();
  393. }
  394. public void testCommandEditor() {
  395. String className = VerboseCommandEditor.class.getName();
  396. System.setProperty(AjcTask.COMMAND_EDITOR_NAME, className);
  397. assertEquals(
  398. className,
  399. System.getProperty(AjcTask.COMMAND_EDITOR_NAME));
  400. AjcTask task = getTask(NOFILE);
  401. task.setCommandEditor(new VerboseCommandEditor());
  402. String[] cmd = task.makeCommand();
  403. assertEquals(VerboseCommandEditor.VERBOSE, cmd[0]);
  404. task = getTask(NOFILE);
  405. task.setCommandEditorClass(VerboseCommandEditor.class.getName());
  406. cmd = task.makeCommand();
  407. assertEquals(VerboseCommandEditor.VERBOSE, cmd[0]);
  408. }
  409. // public void testStaticCommandEditor() {
  410. // // XXX need to test COMMAND_EDITOR, but can't require property when run
  411. // }
  412. public void testLimitTo() {
  413. int numArgs = 100;
  414. String arg = "123456789";
  415. String[] args = new String[numArgs];
  416. for (int i = 0; i < args.length; i++) {
  417. args[i] = arg;
  418. }
  419. // no limit
  420. int max = numArgs * (arg.length() + 1);
  421. Location location = new Location("AjcTaskTest.java");
  422. String[] newArgs = AjcTask.GuardedCommand.limitTo(args, max, location);
  423. assertTrue("same", args == newArgs);
  424. // limited - read file and verify arguments
  425. max--;
  426. newArgs = AjcTask.GuardedCommand.limitTo(args, max, location);
  427. assertTrue("not same", args != newArgs);
  428. assertTrue("not null", null != newArgs);
  429. String label = "newArgs " + Arrays.asList(newArgs);
  430. assertTrue("size 2" + label, 2 == newArgs.length);
  431. assertEquals("-argfile", newArgs[0]);
  432. File file = new File(newArgs[1]);
  433. assertTrue("readable newArgs[1]" + label, file.canRead());
  434. FileReader fin = null;
  435. try {
  436. fin = new FileReader(file);
  437. BufferedReader reader = new BufferedReader(fin);
  438. String line;
  439. int i = 0;
  440. while (null != (line = reader.readLine())) {
  441. assertEquals(i + ": ", args[i++], line);
  442. }
  443. assertEquals("num entries", i, args.length);
  444. } catch (IOException e) {
  445. assertTrue("IOException " + e.getMessage(), false);
  446. } finally {
  447. if (null != fin) {
  448. try {
  449. fin.close();
  450. } catch (IOException e) {
  451. // ignore
  452. }
  453. }
  454. file.delete();
  455. }
  456. }
  457. public void testFindAspectjtoolsJar() {
  458. File toolsJar = AjcTask.findAspectjtoolsJar();
  459. if (null != toolsJar) {
  460. assertNull("tools jar found?: " + toolsJar, toolsJar);
  461. }
  462. // not found when unit testing b/c not on system classpath
  463. // so just checking for exceptions.
  464. // XXX need aspect to stub out System.getProperty(..)
  465. }
  466. public void testMessageHolderClassName() {
  467. AjcTask task = getTask("compileError.lst");
  468. task.setFailonerror(false);
  469. MESSAGES.setLength(0);
  470. runTest(
  471. task,
  472. null,
  473. MessageHolderChecker.ONE_ERROR,
  474. Holder.class.getName());
  475. String result = MESSAGES.toString();
  476. MESSAGES.setLength(0);
  477. assertEquals("messages", "e", result);
  478. }
  479. // TODO skipped test - works locally but not on build machine?
  480. public void skip_testMessageHolderClassWithDoneSignal() {
  481. AjcTask task = getTask("default.lst");
  482. task.setFailonerror(false);
  483. String DONE = "This is a unique message, not confused with others.";
  484. task.setXDoneSignal(DONE);
  485. MESSAGES.setLength(0);
  486. runTest(
  487. task,
  488. null,
  489. MessageHolderChecker.INFOS,
  490. InfoHolder.class.getName());
  491. final String result = MESSAGES.toString();
  492. String temp = new String(result);
  493. MESSAGES.setLength(0);
  494. if (!temp.endsWith(DONE)) {
  495. if (temp.length() > 20) {
  496. temp = "..." + temp.substring(temp.length()-20, temp.length());
  497. }
  498. assertTrue(DONE + " is not suffix of \"" + temp + "\"", false);
  499. }
  500. // exactly one such message
  501. temp = new String(result);
  502. temp = temp.substring(0, temp.length()-DONE.length());
  503. if (temp.endsWith(DONE)) {
  504. temp = new String(result);
  505. if (temp.length() > 20) {
  506. temp = "..." + temp.substring(temp.length()-20, temp.length());
  507. }
  508. assertTrue(DONE + " signalled twice: \"" + temp + "\"", false);
  509. }
  510. }
  511. public void testDefaultListForkedNoTools() {
  512. AjcTask task = getTask("default.lst");
  513. task.setFork(true);
  514. boolean passed = false;
  515. try {
  516. runTest(task, BuildException.class, MessageHolderChecker.NONE);
  517. passed = true;
  518. } finally {
  519. if (!passed) {
  520. String m =
  521. "AjcTaskTest.testDefaultListForkedNoTools()"
  522. + " fails if aspectjtools.jar is on the classpath";
  523. System.err.println(m);
  524. }
  525. }
  526. }
  527. public void testDefaultListForkedIncremental() {
  528. AjcTask task = getTask("default.lst");
  529. task.setFork(true);
  530. task.setIncremental(true);
  531. runTest(task, BuildException.class, MessageHolderChecker.NONE);
  532. }
  533. /** failonerror should default to true, unlike other booleans */
  534. public void testCompileErrorFailOnErrorDefault() {
  535. AjcTask task = getTask("compileError.lst");
  536. final PrintStream serr = System.err;
  537. try {
  538. System.setErr(new PrintStream(new java.io.ByteArrayOutputStream()));
  539. runTest(task, BuildException.class, MessageHolderChecker.ONE_ERROR);
  540. } finally {
  541. System.setErr(serr);
  542. }
  543. }
  544. public void testCompileErrorListDefaultHolder() {
  545. AjcTask task = getTask("compileError.lst");
  546. final PrintStream serr = System.err;
  547. try {
  548. System.setErr(new PrintStream(new java.io.ByteArrayOutputStream()));
  549. task.execute();
  550. fail("expected BuildException from failed compile by default");
  551. } catch (BuildException t) {
  552. // ok
  553. } finally {
  554. System.setErr(serr);
  555. deleteTempDir();
  556. }
  557. }
  558. public void testDefaultList() {
  559. AjcTask task = getTask("default.lst");
  560. runTest(task, NO_EXCEPTION, MessageHolderChecker.INFOS);
  561. }
  562. public void testCompileErrorList() {
  563. AjcTask task = getTask("compileError.lst");
  564. task.setFailonerror(false);
  565. runTest(task, NO_EXCEPTION, MessageHolderChecker.ONE_ERROR);
  566. }
  567. public void testShowWeaveInfo() {
  568. AjcTask task = getTask("showweaveinfo.lst");
  569. task.setShowWeaveInfo(true);
  570. MessageHandler mh = new MessageHandler(false);
  571. mh.dontIgnore(IMessage.WEAVEINFO);
  572. MessageHolderChecker mhc = new MessageHolderChecker(0,0,0,0,MessageHolderChecker.IGNORE);
  573. mhc.weaveinfos = 2; // Expect 2 weaving messages
  574. runTest(task,NO_EXCEPTION,mhc);
  575. mhc.weaveinfos = MessageHolderChecker.IGNORE;
  576. }
  577. public void testCompileWarningList() {
  578. AjcTask task = getTask("compileWarning.lst");
  579. runTest(task, NO_EXCEPTION, MessageHolderChecker.ONE_WARNING);
  580. }
  581. public void testNoSuchFileList() {
  582. AjcTask task = getTask("NoSuchFile.lst");
  583. task.setFailonerror(false);
  584. runTest(task, NO_EXCEPTION, MessageHolderChecker.ONE_ERROR_ONE_ABORT);
  585. }
  586. public void testVersions() {
  587. String[] inputs = AjcTask.TARGET_INPUTS;
  588. for (int i = 0; i < inputs.length; i++) {
  589. AjcTask task = getTask(NOFILE);
  590. task.setTarget(inputs[i]);
  591. String[] cmd = task.makeCommand();
  592. checkContains(cmd, "-target", true);
  593. checkContains(cmd, inputs[i], true);
  594. }
  595. inputs = AjcTask.SOURCE_INPUTS;
  596. for (int i = 0; i < inputs.length; i++) {
  597. AjcTask task = getTask(NOFILE);
  598. task.setSource(inputs[i]);
  599. String[] cmd = task.makeCommand();
  600. checkContains(cmd, "-source", true);
  601. checkContains(cmd, inputs[i], true);
  602. }
  603. inputs = AjcTask.COMPLIANCE_INPUTS;
  604. for (int i = 0; i < inputs.length; i++) {
  605. AjcTask task = getTask(NOFILE);
  606. task.setCompliance(inputs[i]);
  607. String[] cmd = task.makeCommand();
  608. checkContains(cmd, inputs[i], true);
  609. }
  610. }
  611. public void testClasspath() {
  612. AjcTask task = getTask(NOFILE);
  613. String[] cmd = task.makeCommand();
  614. checkContains(cmd, "-bootclasspath", false);
  615. String classpath = null;
  616. for (int i = 0; i < cmd.length; i++) {
  617. if ("-classpath".equals(cmd[i])) {
  618. classpath = cmd[i + 1];
  619. break;
  620. }
  621. }
  622. assertTrue(
  623. "expecting aspectj in classpath",
  624. (-1 != classpath.indexOf("aspectjrt.jar")));
  625. }
  626. // ---------------------------------------- sourcefile
  627. // XXX need to figure out how to specify files directly programmatically
  628. // public void testDefaultFile() {
  629. // AjcTask task = getTask("testdata/Default.java");
  630. // runTest(task, NO_EXCEPTION, MessageHolderChecker.INFOS);
  631. // }
  632. public void testNoFile() {
  633. AjcTask task = getTask(NOFILE);
  634. task.setFailonerror(false);
  635. runTest(task, NO_EXCEPTION, MessageHolderChecker.ONE_ERROR_ONE_ABORT);
  636. }
  637. public void testCompileErrorFile() {
  638. AjcTask task = getTask("compileError.lst");
  639. task.setFailonerror(false);
  640. runTest(task, NO_EXCEPTION, MessageHolderChecker.ONE_ERROR);
  641. }
  642. public void testCompileWarningFile() {
  643. AjcTask task = getTask("compileWarning.lst");
  644. task.setFailonerror(false);
  645. runTest(task, NO_EXCEPTION, MessageHolderChecker.ONE_WARNING);
  646. }
  647. public void testNoSuchFile() {
  648. AjcTask task = getTask("NoSuchFile.lst");
  649. task.setFailonerror(false);
  650. runTest(task, NO_EXCEPTION, MessageHolderChecker.ONE_ERROR_ONE_ABORT);
  651. }
  652. public void testDefaultFileComplete() {
  653. AjcTask task = getTask("default.lst");
  654. task.setDebugLevel("none");
  655. task.setDeprecation(true);
  656. task.setFailonerror(false);
  657. task.setNoExit(true); // ok to override Ant?
  658. task.setNoImportError(true);
  659. task.setNowarn(true);
  660. task.setXTerminateAfterCompilation(true);
  661. task.setPreserveAllLocals(true);
  662. task.setProceedOnError(true);
  663. task.setReferenceInfo(true);
  664. task.setSource("1.3");
  665. task.setTarget("1.1");
  666. task.setTime(true);
  667. task.setVerbose(true);
  668. task.setXlint("info");
  669. runTest(task, NO_EXCEPTION, MessageHolderChecker.INFOS);
  670. }
  671. public void testXOptions() {
  672. String[] xopts = new String[] {
  673. "serializableAspects",
  674. "lazyTjp",
  675. "reweavable",
  676. "reweavable:compress",
  677. "noInline"
  678. };
  679. for (int i = 0; i < xopts.length; i++) {
  680. AjcTask task = getTask(NOFILE);
  681. task.setX(xopts[i]);
  682. String[] cmd = task.makeCommand();
  683. checkContains(cmd,"-X" + xopts[i],true);
  684. }
  685. }
  686. public void testOutxml () {
  687. File destDir = getTempDir();
  688. assertTrue(
  689. "unable to create " + destDir,
  690. destDir.canRead() || destDir.mkdirs());
  691. AjcTask task = getTask("showweaveinfo.lst",destDir);
  692. task.setOutxml(true);
  693. checkRun(task,null);
  694. File outxmlFile = new File(destDir,"META-INF/aop.xml");
  695. assertTrue("META-INF/aop.xml missing",outxmlFile.exists());
  696. }
  697. public void testOutxmlFile () {
  698. String customName = "custom/aop.xml";
  699. File destDir = getTempDir();
  700. assertTrue(
  701. "unable to create " + destDir,
  702. destDir.canRead() || destDir.mkdirs());
  703. AjcTask task = getTask("showweaveinfo.lst",destDir);
  704. task.setOutxmlfile(customName);
  705. checkRun(task,null);
  706. File outxmlFile = new File(destDir,customName);
  707. assertTrue(customName + " missing",outxmlFile.exists());
  708. }
  709. // End of test cases
  710. // ------------------------------------------------------
  711. // ------------------------------------------------------
  712. // ------------------------------------------------------
  713. // ------------------------------------------------------
  714. // ------------------------------------------------------
  715. // ------------------------------------------------------
  716. protected void runTest(
  717. AjcTask task,
  718. Class exceptionType,
  719. MessageHolderChecker checker,
  720. String messageHolderClass) {
  721. task.setMessageHolderClass(messageHolderClass);
  722. runTest(task, exceptionType, checker, (MessageHandler) null);
  723. }
  724. protected void runTest(
  725. AjcTask task,
  726. Class exceptionType,
  727. MessageHolderChecker checker) {
  728. MessageHandler holder = new MessageHandler();
  729. task.setMessageHolder(holder);
  730. runTest(task, exceptionType, checker, holder);
  731. }
  732. protected void runTest(
  733. AjcTask task,
  734. Class exceptionType,
  735. MessageHolderChecker checker,
  736. MessageHandler holder) {
  737. Throwable thrown = null;
  738. // re-run forked iff tools.jar and expect to pass
  739. boolean rerunForked =
  740. ((null != aspectjtoolsJar)
  741. && (null == exceptionType)
  742. && ((null == checker) || !checker.expectFail()));
  743. String label = "same-vm ";
  744. while (true) { // same vm, then perhaps forked
  745. try {
  746. task.execute();
  747. } catch (Throwable t) {
  748. thrown = t;
  749. } finally {
  750. deleteTempDir();
  751. }
  752. if (null == exceptionType) {
  753. if (null != thrown) {
  754. assertTrue(label + "thrown: " + render(thrown), false);
  755. }
  756. } else if (null == thrown) {
  757. assertTrue(
  758. label + "expected " + exceptionType.getName(),
  759. false);
  760. } else if (!(exceptionType.isAssignableFrom(thrown.getClass()))) {
  761. assertTrue(
  762. label
  763. + "expected "
  764. + exceptionType.getName()
  765. + " got "
  766. + render(thrown),
  767. false);
  768. }
  769. if (null != holder) {
  770. if (null == checker) {
  771. checker = MessageHolderChecker.NONE;
  772. }
  773. checker.check(holder, label);
  774. }
  775. if (!rerunForked) {
  776. break;
  777. } else {
  778. label = "other-vm ";
  779. rerunForked = false;
  780. // can't reset without losing values...
  781. task.setFork(true);
  782. task.setFailonerror(true);
  783. task.setForkclasspath(
  784. new Path(task.getProject(), aspectjtoolsJar));
  785. }
  786. }
  787. }
  788. protected String render(Throwable thrown) {
  789. return LangUtil.renderException(thrown);
  790. }
  791. static class MessageHolderChecker { // XXX export to testing-utils
  792. /** use as value to ignore results */
  793. static int IGNORE = Integer.MIN_VALUE;
  794. static MessageHolderChecker NONE =
  795. new MessageHolderChecker(0, 0, 0, 0, 0);
  796. /** any number (0+) of info messages */
  797. static MessageHolderChecker INFOS =
  798. new MessageHolderChecker(0, 0, 0, 0, IGNORE);
  799. /** one error, any number of info messages */
  800. static MessageHolderChecker ONE_ERROR =
  801. new MessageHolderChecker(0, 0, 1, 0, IGNORE);
  802. static MessageHolderChecker ONE_ERROR_ONE_ABORT =
  803. new MessageHolderChecker(1, 0, 1, 0, IGNORE);
  804. /** one warning, any number of info messages */
  805. static MessageHolderChecker ONE_WARNING =
  806. new MessageHolderChecker(0, 0, 0, 1, IGNORE);
  807. int aborts, fails, errors, warnings, infos;
  808. int weaveinfos;
  809. public MessageHolderChecker(
  810. int aborts,
  811. int fails,
  812. int errors,
  813. int warnings,
  814. int infos) {
  815. this.aborts = aborts;
  816. this.fails = fails;
  817. this.errors = errors;
  818. this.warnings = warnings;
  819. this.infos = infos;
  820. this.weaveinfos = IGNORE;
  821. }
  822. public boolean expectFail() {
  823. return (0 < (aborts + fails + errors));
  824. }
  825. public void check(IMessageHolder holder, String label) {
  826. boolean failed = true;
  827. try {
  828. check(holder, aborts, IMessage.ABORT);
  829. check(holder, fails, IMessage.FAIL);
  830. check(holder, errors, IMessage.ERROR);
  831. check(holder, warnings, IMessage.WARNING);
  832. check(holder, infos, IMessage.INFO);
  833. check(holder, weaveinfos, IMessage.WEAVEINFO);
  834. failed = false;
  835. } finally {
  836. if (failed) {
  837. MessageUtil.print(System.err, holder, label + "failed?");
  838. }
  839. }
  840. }
  841. private void check(
  842. IMessageHolder holder,
  843. int num,
  844. IMessage.Kind kind) {
  845. if (num != IGNORE) {
  846. int actual = holder.numMessages(kind, false);
  847. if (num != actual) {
  848. if (actual > 0) {
  849. MessageUtil.print(
  850. System.err,
  851. holder,
  852. kind + " expected " + num + " got " + actual);
  853. }
  854. assertEquals(kind.toString(), num, actual);
  855. }
  856. }
  857. }
  858. }
  859. }
  860. class SnoopingCommandEditor implements ICommandEditor {
  861. private static final String[] NONE = new String[0];
  862. String[] lastCommand;
  863. public String[] editCommand(String[] command) {
  864. lastCommand = (String[]) LangUtil.safeCopy(command, NONE);
  865. return command;
  866. }
  867. public String[] lastCommand() {
  868. return (String[]) LangUtil.safeCopy(lastCommand, NONE);
  869. }
  870. }
  871. class VerboseCommandEditor implements ICommandEditor {
  872. public static final String VERBOSE = "-verbose";
  873. public String[] editCommand(String[] command) {
  874. for (int i = 0; i < command.length; i++) {
  875. if (VERBOSE.equals(command[i])) {
  876. return command;
  877. }
  878. }
  879. String[] result = new String[1 + command.length];
  880. result[0] = VERBOSE;
  881. System.arraycopy(result, 1, command, 0, command.length);
  882. return result;
  883. }
  884. }
  885. class AppendingCommandEditor implements ICommandEditor {
  886. private static String[] NONE = new String[0];
  887. public static ICommandEditor VERBOSE =
  888. new AppendingCommandEditor(new String[] { "-verbose" }, NONE);
  889. public static ICommandEditor INVALID =
  890. new AppendingCommandEditor(NONE, new String[] { "-invalidOption" });
  891. final String[] prefix;
  892. final String[] suffix;
  893. public AppendingCommandEditor(String[] prefix, String[] suffix) {
  894. this.prefix = prefix;
  895. this.suffix = suffix;
  896. }
  897. public String[] editCommand(String[] command) {
  898. int len = command.length + prefix.length + suffix.length;
  899. String[] result = new String[len];
  900. System.arraycopy(result, 0, prefix, 0, prefix.length);
  901. System.arraycopy(result, prefix.length, command, 0, command.length);
  902. System.arraycopy(
  903. result,
  904. prefix.length + command.length,
  905. suffix,
  906. 0,
  907. suffix.length);
  908. return result;
  909. }
  910. }