Browse Source

Tests for AjcTaskCompileCommmand adapter

tags/V1_1_0
wisberg 21 years ago
parent
commit
e5436c850f

+ 270
- 0
testing/testsrc/org/aspectj/testing/taskdefs/AjcTaskCompileCommandTest.java View File

@@ -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))
+ ")";
}
}

Loading…
Cancel
Save