// 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.listeners.NullMessageListener;
import fi.jumi.core.api.*;
import fi.jumi.core.config.*;
import fi.jumi.core.stdout.OutputCapturer;
import org.apache.commons.io.output.NullOutputStream;
import org.junit.*;
import org.junit.rules.Timeout;
import java.io.PrintStream;
import java.util.concurrent.*;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
public class SuiteFactoryTest {
@Rule
public final Timeout timeout = new Timeout(1000);
private DaemonConfigurationBuilder daemon = new DaemonConfigurationBuilder();
private SuiteFactory factory;
private void createSuiteFactory() {
factory = new SuiteFactory(daemon.freeze(), new OutputCapturer(), new PrintStream(new NullOutputStream()), new NullMessageListener());
factory.configure(new SuiteConfiguration());
}
@After
public void tearDown() {
if (factory != null) {
factory.close();
}
}
@Test
public void sets_the_context_class_loader_for_test_threads() throws InterruptedException {
createSuiteFactory();
factory.start(new NullSuiteListener());
BlockingQueue<ClassLoader> spy = new LinkedBlockingQueue<>();
factory.testThreadPool.execute(() -> {
spy.add(Thread.currentThread().getContextClassLoader());
});
ClassLoader contextClassLoader = spy.take();
assertThat(contextClassLoader, is(factory.testClassLoader));
}
@Test
public void reports_uncaught_exceptions_from_actors_as_internal_errors() throws InterruptedException {
createSuiteFactory();
BlockingQueue<String> spy = new LinkedBlockingQueue<>();
factory.start(new NullSuiteListener() {
@Override
public void onInternalError(String message, StackTrace cause) {
spy.add(message);
}
});
ActorThread actorThread = factory.actors.startActorThread();
ActorRef<Runnable> dummyActor = actorThread.bindActor(Runnable.class, () -> {
throw new RuntimeException("dummy exception");
});
dummyActor.tell().run();
assertThat(spy.take(), startsWith("Uncaught exception in thread jumi-actor-"));
}
@Test
public void test_thread_pool_uses_the_specified_number_of_threads() {
daemon.setTestThreadsCount(3);
createSuiteFactory();
ThreadPoolExecutor testThreadPool = (ThreadPoolExecutor) factory.testThreadPool;
assertThat(testThreadPool.getMaximumPoolSize(), is(3));
}
}