// 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.ipc;
import fi.jumi.actors.*;
import fi.jumi.actors.eventizers.dynamic.DynamicEventizerProvider;
import fi.jumi.actors.listeners.*;
import fi.jumi.core.Timeouts;
import fi.jumi.core.api.SuiteListener;
import fi.jumi.core.config.*;
import fi.jumi.core.ipc.api.CommandListener;
import fi.jumi.core.ipc.channel.*;
import fi.jumi.core.ipc.dirs.*;
import fi.jumi.core.ipc.encoding.SuiteListenerEncoding;
import fi.jumi.core.util.TestingExecutor;
import org.junit.*;
import org.junit.rules.*;
import java.io.IOException;
import java.nio.file.Path;
import java.util.concurrent.Future;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.mockito.Mockito.*;
public class IpcCommunicationTest {
@Rule
public final Timeout timeout = Timeouts.forUnitTest();
@Rule
public final TemporaryFolder tempDir = new TemporaryFolder();
@Rule
public final TestingExecutor executor = new TestingExecutor();
private DaemonDir daemonDir;
private CommandDir commandDir;
private ActorThread actorThread;
@Before
public void setup() throws IOException {
daemonDir = new DaemonDir(tempDir.getRoot().toPath());
commandDir = daemonDir.createCommandDir();
Actors actors = new MultiThreadedActors(
executor,
new DynamicEventizerProvider(),
new CrashEarlyFailureHandler(),
new NullMessageListener()
);
actorThread = actors.startActorThread();
}
@Test
public void launcher_tells_daemon_to_runTests_and_daemon_replies() throws Exception {
SuiteConfiguration expectedSuiteConfiguration = new SuiteConfigurationBuilder()
.addJvmOptions("-some-options")
.freeze();
executor.execute(new CommandsDirectoryObserver(daemonDir, executor, actorThread, new CommandListener() {
@Override
public void runTests(SuiteConfiguration suiteConfiguration, ActorRef<SuiteListener> suiteListener) {
// this happens on daemon side
assertThat(suiteConfiguration, is(expectedSuiteConfiguration));
suiteListener.tell().onSuiteStarted();
suiteListener.tell().onSuiteFinished();
}
@Override
public void shutdown() {
}
}));
IpcCommandSender sender = new IpcCommandSender(commandDir, executor);
Future<Path> suiteResults = sender.runTests(expectedSuiteConfiguration);
sender.close();
SuiteListener suiteListener = mock(SuiteListener.class);
IpcReaders.decodeAll(IpcChannel.reader(suiteResults.get(), SuiteListenerEncoding::new), suiteListener);
verify(suiteListener).onSuiteStarted();
verify(suiteListener).onSuiteFinished();
verifyNoMoreInteractions(suiteListener);
}
}