mirror of https://github.com/sbt/sbt.git
parent
e5af0fe0e9
commit
6936ca024e
|
|
@ -246,7 +246,7 @@ final public class ForkMain {
|
||||||
if (framework == null)
|
if (framework == null)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
final ArrayList<TaskDef> filteredTests = new ArrayList<TaskDef>();
|
final ArrayList<TaskDef> filteredTests = new ArrayList<>();
|
||||||
for (final Fingerprint testFingerprint : framework.fingerprints()) {
|
for (final Fingerprint testFingerprint : framework.fingerprints()) {
|
||||||
for (final TaskDef test : tests) {
|
for (final TaskDef test : tests) {
|
||||||
// TODO: To pass in correct explicitlySpecified and selectors
|
// TODO: To pass in correct explicitlySpecified and selectors
|
||||||
|
|
@ -258,12 +258,7 @@ final public class ForkMain {
|
||||||
final Task[] tasks = runner.tasks(filteredTests.toArray(new TaskDef[filteredTests.size()]));
|
final Task[] tasks = runner.tasks(filteredTests.toArray(new TaskDef[filteredTests.size()]));
|
||||||
logDebug(os, "Runner for " + framework.getClass().getName() + " produced " + tasks.length + " initial tasks for " + filteredTests.size() + " tests.");
|
logDebug(os, "Runner for " + framework.getClass().getName() + " produced " + tasks.length + " initial tasks for " + filteredTests.size() + " tests.");
|
||||||
|
|
||||||
Thread callDoneOnShutdown = new Thread() {
|
Thread callDoneOnShutdown = new Thread(() -> runner.done());
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
runner.done();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
Runtime.getRuntime().addShutdownHook(callDoneOnShutdown);
|
Runtime.getRuntime().addShutdownHook(callDoneOnShutdown);
|
||||||
|
|
||||||
runTestTasks(executor, tasks, loggers, os);
|
runTestTasks(executor, tasks, loggers, os);
|
||||||
|
|
@ -278,14 +273,14 @@ final public class ForkMain {
|
||||||
|
|
||||||
private void runTestTasks(final ExecutorService executor, final Task[] tasks, final Logger[] loggers, final ObjectOutputStream os) {
|
private void runTestTasks(final ExecutorService executor, final Task[] tasks, final Logger[] loggers, final ObjectOutputStream os) {
|
||||||
if( tasks.length > 0 ) {
|
if( tasks.length > 0 ) {
|
||||||
final List<Future<Task[]>> futureNestedTasks = new ArrayList<Future<Task[]>>();
|
final List<Future<Task[]>> futureNestedTasks = new ArrayList<>();
|
||||||
for( final Task task : tasks ) {
|
for( final Task task : tasks ) {
|
||||||
futureNestedTasks.add(runTest(executor, task, loggers, os));
|
futureNestedTasks.add(runTest(executor, task, loggers, os));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note: this could be optimized further, we could have a callback once a test finishes that executes immediately the nested tasks
|
// Note: this could be optimized further, we could have a callback once a test finishes that executes immediately the nested tasks
|
||||||
// At the moment, I'm especially interested in JUnit, which doesn't have nested tasks.
|
// At the moment, I'm especially interested in JUnit, which doesn't have nested tasks.
|
||||||
final List<Task> nestedTasks = new ArrayList<Task>();
|
final List<Task> nestedTasks = new ArrayList<>();
|
||||||
for( final Future<Task[]> futureNestedTask : futureNestedTasks ) {
|
for( final Future<Task[]> futureNestedTask : futureNestedTasks ) {
|
||||||
try {
|
try {
|
||||||
nestedTasks.addAll( Arrays.asList(futureNestedTask.get()));
|
nestedTasks.addAll( Arrays.asList(futureNestedTask.get()));
|
||||||
|
|
@ -298,28 +293,25 @@ final public class ForkMain {
|
||||||
}
|
}
|
||||||
|
|
||||||
private Future<Task[]> runTest(final ExecutorService executor, final Task task, final Logger[] loggers, final ObjectOutputStream os) {
|
private Future<Task[]> runTest(final ExecutorService executor, final Task task, final Logger[] loggers, final ObjectOutputStream os) {
|
||||||
return executor.submit(new Callable<Task[]>() {
|
return executor.submit(() -> {
|
||||||
@Override
|
ForkEvent[] events;
|
||||||
public Task[] call() {
|
Task[] nestedTasks;
|
||||||
ForkEvent[] events;
|
final TaskDef taskDef = task.taskDef();
|
||||||
Task[] nestedTasks;
|
try {
|
||||||
final TaskDef taskDef = task.taskDef();
|
final Collection<ForkEvent> eventList = new ConcurrentLinkedDeque<>();
|
||||||
try {
|
final EventHandler handler = new EventHandler() { public void handle(final Event e){ eventList.add(new ForkEvent(e)); } };
|
||||||
final Collection<ForkEvent> eventList = new ConcurrentLinkedDeque<ForkEvent>();
|
logDebug(os, " Running " + taskDef);
|
||||||
final EventHandler handler = new EventHandler() { public void handle(final Event e){ eventList.add(new ForkEvent(e)); } };
|
nestedTasks = task.execute(handler, loggers);
|
||||||
logDebug(os, " Running " + taskDef);
|
if(nestedTasks.length > 0 || eventList.size() > 0)
|
||||||
nestedTasks = task.execute(handler, loggers);
|
logDebug(os, " Produced " + nestedTasks.length + " nested tasks and " + eventList.size() + " events.");
|
||||||
if(nestedTasks.length > 0 || eventList.size() > 0)
|
events = eventList.toArray(new ForkEvent[eventList.size()]);
|
||||||
logDebug(os, " Produced " + nestedTasks.length + " nested tasks and " + eventList.size() + " events.");
|
|
||||||
events = eventList.toArray(new ForkEvent[eventList.size()]);
|
|
||||||
}
|
|
||||||
catch (final Throwable t) {
|
|
||||||
nestedTasks = new Task[0];
|
|
||||||
events = new ForkEvent[] { testError(os, taskDef, "Uncaught exception when running " + taskDef.fullyQualifiedName() + ": " + t.toString(), t) };
|
|
||||||
}
|
|
||||||
writeEvents(os, taskDef, events);
|
|
||||||
return nestedTasks;
|
|
||||||
}
|
}
|
||||||
|
catch (final Throwable t) {
|
||||||
|
nestedTasks = new Task[0];
|
||||||
|
events = new ForkEvent[] { testError(os, taskDef, "Uncaught exception when running " + taskDef.fullyQualifiedName() + ": " + t.toString(), t) };
|
||||||
|
}
|
||||||
|
writeEvents(os, taskDef, events);
|
||||||
|
return nestedTasks;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue