// Copyright © 2011-2014, Esko Luontola <www.orfjackal.net>
// This software is released under the Apache License 2.0.
// The license text is at http://www.apache.org/licenses/LICENSE-2.0
package fi.jumi.core.suite;
import fi.jumi.actors.*;
import fi.jumi.actors.workers.*;
import fi.jumi.core.api.*;
import fi.jumi.core.discovery.TestFileFinderListener;
import fi.jumi.core.util.Boilerplate;
import javax.annotation.concurrent.NotThreadSafe;
import java.io.PrintStream;
import java.util.concurrent.Executor;
@NotThreadSafe
public class SuiteRunner implements TestFileFinderListener {
private final DriverFactory driverFactory;
private final SuiteListener suiteListener;
private final ActorThread actorThread;
private final PrintStream logOutput;
private final WorkerCounter suiteCompletionMonitor;
// XXX: too many constructor parameters, could we group some of them together?
public SuiteRunner(DriverFactory driverFactory,
SuiteListener suiteListener,
ActorThread actorThread,
Executor testExecutor,
PrintStream logOutput) {
this.driverFactory = driverFactory;
this.suiteListener = suiteListener;
this.actorThread = actorThread;
this.logOutput = logOutput;
this.suiteCompletionMonitor = new WorkerCounter(testExecutor);
}
@Override
public void onTestFileFound(TestFile testFile) {
suiteListener.onTestFileFound(testFile);
@NotThreadSafe
class FireTestFileFinished implements WorkerListener {
// not lambda to show up better in actor logs
@Override
public void onAllWorkersFinished() {
suiteListener.onTestFileFinished(testFile);
}
@Override
public String toString() {
return Boilerplate.toString(getClass(), testFile);
}
}
WorkerCounter testFileCompletionMonitor = new WorkerCounter(new InternalErrorReportingExecutor(suiteCompletionMonitor, suiteListener, logOutput));
testFileCompletionMonitor.execute(driverFactory.createDriverRunner(testFile, testFileCompletionMonitor));
testFileCompletionMonitor.afterPreviousWorkersFinished(asActor(new FireTestFileFinished()));
}
@Override
public void onAllTestFilesFound() {
suiteListener.onAllTestFilesFound();
@NotThreadSafe
class FireSuiteFinished implements WorkerListener {
// not lambda to show up better in actor logs
@Override
public void onAllWorkersFinished() {
suiteListener.onSuiteFinished();
}
@Override
public String toString() {
return Boilerplate.toString(getClass());
}
}
suiteCompletionMonitor.afterPreviousWorkersFinished(asActor(new FireSuiteFinished()));
}
private ActorRef<WorkerListener> asActor(WorkerListener rawActor) {
return actorThread.bindActor(WorkerListener.class, rawActor);
}
@Override
public String toString() {
// TODO: later this class may attract interesting state; then update this to show them in logs
return Boilerplate.toString(getClass());
}
}