// 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.test; import fi.jumi.launcher.JumiBootstrap; import org.apache.commons.io.output.NullWriter; import org.junit.*; import org.junit.rules.*; import sample.*; import java.io.*; import java.lang.reflect.Field; import static fi.jumi.core.util.ReflectionUtil.getFieldValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; import static org.mockito.Mockito.*; public class JumiBootstrapTest { @Rule public final ExpectedException thrown = ExpectedException.none().handleAssertionErrors(); @Rule public final Timeout timeout = Timeouts.forEndToEndTest(); private final StringBuilder out = new StringBuilder(); @Test public void runs_tests_with_current_classpath() throws Exception { JumiBootstrap bootstrap = new JumiBootstrap().setTextUiOutput(out); bootstrap.suite.setTestClasses(OnePassingTest.class); bootstrap.runSuite(); String out = this.out.toString(); assertThat("should show test results", out, containsString("Pass: 2")); assertThat("should hide passing tests by default", out, not(containsString("OnePassingTest"))); } @Test public void reports_failures_by_throwing_AssertionError() throws Exception { JumiBootstrap bootstrap = new JumiBootstrap().setTextUiOutput(out); bootstrap.suite.setTestClasses(OneFailingTest.class); thrown.expect(AssertionError.class); thrown.expectMessage("There were test failures"); bootstrap.runSuite(); } @Test public void can_debug_the_daemons_actor_messages() throws Exception { ByteArrayOutputStream daemonOutput = new ByteArrayOutputStream(); JumiBootstrap bootstrap = new JumiBootstrap().setTextUiOutput(out).enableDebugMode(daemonOutput); bootstrap.suite.setTestClasses(OnePassingTest.class); bootstrap.runSuite(); assertThat(daemonOutput.toString(), containsString("[jumi-actor-1]")); } @Test public void will_not_close_stderr_when_debug_output_is_enabled() throws Exception { PrintStream originalErr = System.err; try { ByteArrayOutputStream printed = new ByteArrayOutputStream(); PrintStream spiedErr = spy(new PrintStream(printed)); System.setErr(spiedErr); JumiBootstrap bootstrap = new JumiBootstrap(); bootstrap.suite.setTestClasses(OnePassingTest.class); bootstrap.daemon.setIdleTimeout(0); // we want the daemon process to exit quickly bootstrap.setTextUiOutput(new NullWriter()); bootstrap.enableDebugMode(); // <-- the thing we are testing bootstrap.runSuite(); Thread.sleep(50); // wait for the daemon process to exit, and our printer thread to notice it assertThat("this test has a problem; daemon printed nothing", printed.size(), is(not(0))); verify(spiedErr, never()).close(); // <-- the thing we are testing } finally { System.setErr(originalErr); } } // configuration @Test public void passing_tests_are_hidden_by_default() { JumiBootstrap bootstrap = new JumiBootstrap(); assertThat(getFieldValue(bootstrap, "passingTestsVisible"), is((Object) false)); } @Test public void passing_tests_can_be_made_visible() { JumiBootstrap bootstrap = new JumiBootstrap().setPassingTestsVisible(true); assertThat(getFieldValue(bootstrap, "passingTestsVisible"), is((Object) true)); } @Test public void output_defaults_to_stdout() { JumiBootstrap bootstrap = new JumiBootstrap(); assertThat(getFieldValue(bootstrap, "textUiOutput"), is((Object) System.out)); } @Test public void debug_output_is_disabled_by_default() { JumiBootstrap bootstrap = new JumiBootstrap(); assertThat(getFieldValue(bootstrap, "daemonOutput").getClass().getSimpleName(), is("NullOutputStream")); assertThat(bootstrap.daemon.getLogActorMessages(), is(false)); } @Test public void debug_output_defaults_to_stderr_when_enabled() throws Exception { JumiBootstrap bootstrap = new JumiBootstrap().enableDebugMode(); assertThat(getDaemonOutput(bootstrap), is((Object) System.err)); assertThat(bootstrap.daemon.getLogActorMessages(), is(true)); } private static Object getDaemonOutput(JumiBootstrap bootstrap) throws Exception { Object out = getFieldValue(bootstrap, "daemonOutput"); // JumiBootstrap wraps System.err into a CloseShieldOutputStream, so this code will unwrap it FilterOutputStream wrapper = (FilterOutputStream) out; Field f = FilterOutputStream.class.getDeclaredField("out"); f.setAccessible(true); return f.get(wrapper); } }