// Copyright © 2011-2013, 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.testbench; import fi.jumi.actors.*; import fi.jumi.actors.eventizers.dynamic.DynamicEventizerProvider; import fi.jumi.actors.listeners.*; import fi.jumi.core.api.SuiteListener; import fi.jumi.core.discovery.*; import fi.jumi.core.drivers.*; import fi.jumi.core.events.SuiteListenerEventizer; import fi.jumi.core.results.SuiteEventDemuxer; import fi.jumi.core.runs.RunIdSequence; import fi.jumi.core.stdout.OutputCapturer; import fi.jumi.core.suite.*; import org.apache.commons.io.output.NullOutputStream; import javax.annotation.concurrent.NotThreadSafe; import java.io.PrintStream; import java.util.concurrent.Executor; @NotThreadSafe public class TestBench { /** * Simulates {@link System#out} */ public final PrintStream out; /** * Simulates {@link System#err} */ public final PrintStream err; private final OutputCapturer outputCapturer; private DriverFinder driverFinder = new RunViaAnnotationDriverFinder(); private MessageListener actorsMessageListener = new NullMessageListener(); private FailureHandler actorsFailureHandler = new CrashEarlyFailureHandler(); public TestBench() { outputCapturer = new OutputCapturer(); out = outputCapturer.out(); err = outputCapturer.err(); } public SuiteEventDemuxer run(Class<?>... testClasses) { SuiteEventDemuxer results = new SuiteEventDemuxer(); run(new SuiteListenerEventizer().newFrontend(results), testClasses); return results; } public void run(SuiteListener suiteListener, Class<?>... testClasses) { SingleThreadedActors actors = new SingleThreadedActors( new DynamicEventizerProvider(), actorsFailureHandler, actorsMessageListener ); ActorThread actorThread = actors.startActorThread(); Executor testExecutor = actors.getExecutor(); RunIdSequence runIdSequence = new RunIdSequence(); ClassLoader classLoader = getClass().getClassLoader(); ActorRef<TestFileFinderListener> suiteRunner = actorThread.bindActor(TestFileFinderListener.class, new SuiteRunner( new DriverFactory(suiteListener, actorThread, outputCapturer, driverFinder, runIdSequence, classLoader), suiteListener, actorThread, testExecutor, new PrintStream(new NullOutputStream()) )); suiteListener.onSuiteStarted(); testExecutor.execute(new TestFileFinderRunner(new StubTestFileFinder(testClasses), suiteRunner)); actors.processEventsUntilIdle(); } // setters for changing the defaults public void setDriverFinder(DriverFinder driverFinder) { this.driverFinder = driverFinder; } public void setActorsMessageListener(MessageListener actorsMessageListener) { this.actorsMessageListener = actorsMessageListener; } public void setActorsFailureHandler(FailureHandler actorsFailureHandler) { this.actorsFailureHandler = actorsFailureHandler; } }