summaryrefslogtreecommitdiffstats
path: root/testing/testsrc
diff options
context:
space:
mode:
Diffstat (limited to 'testing/testsrc')
-rw-r--r--testing/testsrc/org/aspectj/testing/taskdefs/AjcTaskCompileCommandTest.java270
1 files changed, 270 insertions, 0 deletions
diff --git a/testing/testsrc/org/aspectj/testing/taskdefs/AjcTaskCompileCommandTest.java b/testing/testsrc/org/aspectj/testing/taskdefs/AjcTaskCompileCommandTest.java
new file mode 100644
index 000000000..5883505ec
--- /dev/null
+++ b/testing/testsrc/org/aspectj/testing/taskdefs/AjcTaskCompileCommandTest.java
@@ -0,0 +1,270 @@
+/* *******************************************************************
+ * Copyright (c) 2003 Contributors.
+ * All rights reserved.
+ * This program and the accompanying materials are made available
+ * under the terms of the Common Public License v1.0
+ * which accompanies this distribution and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * Wes Isberg initial implementation
+ * ******************************************************************/
+
+package org.aspectj.testing.taskdefs;
+
+import java.io.File;
+import java.util.ArrayList;
+
+import org.aspectj.bridge.*;
+import org.aspectj.bridge.MessageHandler;
+import org.aspectj.util.*;
+import org.aspectj.util.LangUtil;
+
+import junit.framework.TestCase;
+
+
+/**
+ * Test AjcTaskCompileCommand adapter.
+ * This assumes it is run from a peer directory of the
+ * taskdefs module, which contains the target files.
+ */
+public class AjcTaskCompileCommandTest extends TestCase {
+ static boolean loggedWarning = false;
+ static ArrayList tempFiles = new ArrayList();
+
+ private static File getClassesDir() {
+ File tempDir = FileUtil.getTempDir("AjcTaskCompileCommandTest-classes");
+ tempFiles.add(tempDir);
+ return tempDir;
+ }
+
+ private static void addCommonArgs(ArrayList list) {
+ list.add("-d");
+ list.add(getClassesDir().getAbsolutePath());
+ list.add("-classpath");
+ list.add(new File("../lib/test/aspectjrt.jar").getAbsolutePath());
+ }
+
+ static boolean doWait(IMessageHolder holder, int seconds, int timeout) {
+ return AjcTaskCompileCommand
+ .waitUntilMessagesQuiet(holder, seconds, timeout);
+ }
+
+ public AjcTaskCompileCommandTest(String name) {
+ super(name);
+ }
+
+ public void testWaitUntilMessagesQuiet_InputErrors() {
+ MessageHandler mhandler = new MessageHandler();
+ assertFalse(doWait(mhandler, 0, 10));
+ assertFalse(doWait(mhandler, 10, 0));
+ assertFalse(doWait(mhandler, 1, 1));
+ assertFalse(doWait(mhandler, 10, 1));
+ boolean thrown = false;
+ try {
+ doWait(null, 1, 10);
+ } catch (IllegalArgumentException e) {
+ thrown = true;
+ }
+ assertTrue("no exception thrown", thrown);
+ }
+
+ public void testDefault() {
+ runSimpleTest("../taskdefs/testdata/Default.java", 0);
+ }
+
+ public void testDefaultList() {
+ runSimpleTest("../taskdefs/testdata/default.lst", 0);
+ }
+
+ public void testCompileErrorList() {
+ runSimpleTest("../taskdefs/testdata/compileError.lst", 1);
+ }
+
+
+ public void testWaitUntilMessagesQuiet_1_2() {
+ checkWait(1, 2, 0, 0);
+ }
+
+ public void testWaitUntilMessagesQuiet_1_10() {
+ checkWait(1, 10, 0, 0);
+ }
+
+ public void testWaitUntilMessagesQuiet_8_10() {
+ checkWait(8, 10, 0, 0);
+ }
+
+ // XXX two async tests might fail if adder thread starved
+
+ public void testWaitUntilMessagesQuiet_1_10_4_1() {
+ checkWait(1, 10, 4, 1);
+ }
+
+ public void testWaitUntilMessagesQuiet_8_10_2_1() {
+ checkWait(8, 20, 2, 1);
+ }
+
+ void runSimpleTest(String path, int expectedErrors) {
+ File file = new File(path);
+ assertTrue(path, file.canRead());
+ ArrayList list = new ArrayList();
+ addCommonArgs(list);
+ if (path.endsWith(".lst")) {
+ list.add("-argfile");
+ list.add(file.getAbsolutePath());
+ } else if (FileUtil.hasSourceSuffix(path)) {
+ list.add(file.getAbsolutePath());
+ } else {
+ assertTrue("unrecognized file: " + path, false);
+ return;
+ }
+ runTest(list, expectedErrors);
+ }
+
+ void runTest(ArrayList args, int expectedErrors) {
+ AjcTaskCompileCommand command =
+ new AjcTaskCompileCommand();
+ MessageHandler handler = new MessageHandler();
+ String[] parms = (String[]) args.toArray(new String[0]);
+ boolean result = command.runCommand(parms, handler);
+ final boolean fail = (result == (0 == expectedErrors));
+ if (fail) {
+ String m = "expected " + (fail ? "fail" : "pass");
+ assertTrue(m + ": " + args, false);
+ }
+ }
+
+ void checkWait(final int seconds, final int timeout, int toAdd, int addInterval) {
+ final String testCase = "checkWait(seconds="
+ + seconds + ", timeout=" + timeout;
+ final MessageHandler mhandler = new MessageHandler();
+ final long startTime = System.currentTimeMillis();
+ final long testTimeout = startTime + (timeout * 2000l);
+ final boolean result;
+ if (0 == toAdd) { // do no-adds synchronously
+ result = doWait(mhandler, seconds, timeout);
+ assertTrue("result " + testCase, result);
+ } else {
+ if (!loggedWarning) {
+ System.out.println("warning - test will fail if adder thread starved");
+ loggedWarning = true;
+ }
+ final MessageAdder adder
+ = new MessageAdder(mhandler, toAdd, addInterval);
+ final String label = testCase + " wait(" + toAdd + ", " + addInterval + ")";
+ class Result {
+ boolean result;
+ Thread addedThread;
+ }
+ final Result waitResult = new Result();
+ Thread testThread = new Thread( new Runnable() {
+ public void run() {
+ waitResult.addedThread
+ = new Thread(adder, label + "-child");
+ waitResult.addedThread.start();
+ waitResult.result =
+ AjcTaskCompileCommandTest.doWait(mhandler, seconds, timeout);
+ }
+ }, label);
+
+ testThread.start();
+
+ try {
+ testThread.join(testTimeout - startTime);
+ } catch (InterruptedException e) {
+ // ignore
+ }
+ try {
+ if (null != waitResult.addedThread) {
+ long wait = testTimeout - System.currentTimeMillis();
+ if (0 < wait) {
+ waitResult.addedThread.join(wait);
+ }
+ }
+ } catch (InterruptedException e) {
+ // ignore
+ }
+ result = waitResult.result;
+ int added = adder.getNumAdded();
+ assertEquals(testCase + " added", added, toAdd);
+ if (!result) {
+ assertTrue(testCase + " result " + adder, false);
+ }
+ }
+ long endTime = System.currentTimeMillis();
+ long elapsed = endTime - startTime;
+ assertTrue(seconds + " seconds: " + elapsed, elapsed >= (seconds*1000));
+ assertTrue(timeout + " timeout: " + elapsed, elapsed <= (timeout*1000));
+ }
+
+}
+
+class MessageAdder implements Runnable {
+ /** 30-second max test */
+ public static long MAX_MILLIS = 1000 * 30;
+ public boolean stop;
+ public boolean wait;
+
+ private final IMessageHolder messages;
+ private final int numToAdd;
+ private final int interval;
+ private int numAdded;
+
+ /**
+ * @param holder the IMessageHolder to add to
+ * @param num the int number of messages to add
+ * @param interval the int seconds between messages added
+ */
+ MessageAdder(IMessageHolder holder, int num, int interval) {
+ LangUtil.throwIaxIfNull(holder, "holder");
+ LangUtil.throwIaxIfFalse(num > 0, "numToAdd: " + num);
+ LangUtil.throwIaxIfFalse(interval > 0, "interval: " + interval);
+ LangUtil.throwIaxIfFalse(num*interval*1000 < MAX_MILLIS, "too long");
+ this.messages = holder;
+ this.numToAdd = num;
+ this.interval = interval;
+ }
+
+ public void run() {
+ final long waitBetweenAdds = interval * 1000l;
+ long curTime = System.currentTimeMillis();
+ final long timeout = curTime + MAX_MILLIS;
+ final Thread thread = Thread.currentThread();
+ int numAdded = 0;
+ while (!stop && (timeout > curTime)
+ && (numAdded < numToAdd)) {
+ long targetTime = curTime + waitBetweenAdds;
+ while (!stop && (curTime < timeout)
+ && (curTime < targetTime)) {
+ try {
+ thread.sleep(targetTime - curTime);
+ } catch (InterruptedException e) {
+ // ignore
+ }
+ curTime = System.currentTimeMillis();
+ }
+ if (!stop && (curTime < timeout)) {
+ MessageUtil.info(messages, "time is " + curTime);
+ numAdded++;
+ }
+ }
+ this.numAdded = numAdded;
+ }
+ int getNumAdded() {
+ return numAdded;
+ }
+
+ public String toString() {
+ return "MessageAdder("
+ + "numAdded=" + numAdded
+ + ", numToAdd=" + numToAdd
+ + ", interval=" + interval
+ + ", stop=" + stop
+ + ", wait=" + wait
+ + ", numMessages="
+ + (null == messages
+ ? 0
+ : messages.numMessages(null, true))
+ + ")";
+ }
+} \ No newline at end of file