package jetbrains.mps.execution.impl.configurations.tests.inprocess;
/*Generated by MPS */
import jetbrains.mps.MPSLaunch;
import jetbrains.mps.lang.test.runtime.BaseTransformationTest;
import org.apache.log4j.Logger;
import org.apache.log4j.LogManager;
import org.junit.Test;
import jetbrains.mps.lang.test.runtime.BaseTestBody;
import org.jetbrains.mps.openapi.model.SModel;
import jetbrains.mps.smodel.ModuleRepositoryFacade;
import java.util.List;
import jetbrains.mps.baseLanguage.unitTest.execution.client.ITestNodeWrapper;
import jetbrains.mps.execution.impl.configurations.util.JUnitWrapHelper;
import jetbrains.mps.internal.collections.runtime.Sequence;
import org.jetbrains.mps.openapi.model.SNodeReference;
import jetbrains.mps.smodel.SNodePointer;
import jetbrains.mps.baseLanguage.unitTest.execution.client.TestRunState;
import jetbrains.mps.baseLanguage.unitTest.execution.client.TestEventsDispatcher;
import jetbrains.mps.execution.configurations.implementation.plugin.plugin.Executor;
import jetbrains.mps.execution.configurations.implementation.plugin.plugin.JUnitInProcessExecutor;
import jetbrains.mps.lang.test.util.TestInProcessRunState;
import com.intellij.execution.process.ProcessHandler;
import jetbrains.mps.baseLanguage.closures.runtime.Wrappers;
import jetbrains.mps.execution.impl.configurations.tests.commands.CheckTestStateListener;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import java.util.ArrayList;
import jetbrains.mps.execution.api.commands.OutputRedirector;
import jetbrains.mps.baseLanguage.unitTest.execution.client.UnitTestProcessListener;
import java.util.concurrent.CountDownLatch;
import com.intellij.execution.process.ProcessAdapter;
import com.intellij.execution.process.ProcessEvent;
import junit.framework.Assert;
import java.util.concurrent.TimeUnit;
import jetbrains.mps.execution.configurations.implementation.plugin.plugin.FakeProcess;
import com.intellij.execution.ExecutionException;
import com.intellij.util.WaitFor;
@MPSLaunch
public class JUnitInProcessTermination_Test extends BaseTransformationTest {
private static final Logger LOG = LogManager.getLogger(JUnitInProcessTermination_Test.class);
@Test
public void test_terminate() throws Throwable {
initTest("${mps_home}", "r:ff98d12f-bc65-4639-94c3-dee022b33791(jetbrains.mps.execution.impl.configurations.tests.inprocess@tests)", false);
runTest("jetbrains.mps.execution.impl.configurations.tests.inprocess.JUnitInProcessTermination_Test$TestBody", "test_terminate", false);
}
@MPSLaunch
public static class TestBody extends BaseTestBody {
public void test_terminate() throws Exception {
SModel model = new ModuleRepositoryFacade(myProject.getRepository()).getModelByName("jetbrains.mps.execution.impl.configurations.tests.commands.sandbox2@tests");
List<ITestNodeWrapper> wrappedTests = new JUnitWrapHelper(myProject.getModelAccess()).wrapTests(model, Sequence.<SNodeReference>singleton(new SNodePointer("r:bbc844ac-dcda-4460-9717-8eb5d64b4778(jetbrains.mps.execution.impl.configurations.tests.commands.sandbox2@tests)", "6339244025082972090")));
this.startAndTerminate(wrappedTests);
}
public void startAndTerminate(final List<ITestNodeWrapper> testNodes) {
try {
final TestRunState runState = new TestRunState(testNodes, myProject);
TestEventsDispatcher eventsDispatcher = new TestEventsDispatcher(runState);
Executor processExecutor = new JUnitInProcessExecutor(testNodes, eventsDispatcher);
final TestInProcessRunState lightState = JUnitInProcessExecutor.getRunState();
if (LOG.isInfoEnabled()) {
LOG.info("Starting in-process-execution");
}
ProcessHandler process = processExecutor.execute();
final Wrappers._T<CheckTestStateListener> checkListener = new Wrappers._T<CheckTestStateListener>();
myProject.getModelAccess().runReadAction(new Runnable() {
public void run() {
checkListener.value = new CheckTestStateListener(testNodes, ListSequence.fromList(new ArrayList<ITestNodeWrapper>()));
runState.addListener(checkListener.value);
}
});
OutputRedirector.redirect(process, new UnitTestProcessListener(eventsDispatcher));
final int[] exitCode = {-1};
final CountDownLatch latch = new CountDownLatch(1);
process.addProcessListener(new ProcessAdapter() {
@Override
public void processTerminated(ProcessEvent event) {
exitCode[0] = event.getExitCode();
latch.countDown();
}
});
process.startNotify();
this.waitForRunToStart(lightState);
Assert.assertTrue(lightState.isRunning());
process.destroyProcess();
latch.await(10, TimeUnit.SECONDS);
int exitcode = exitCode[0];
if (exitcode != FakeProcess.TERMINATION_CODE) {
Assert.fail("Exit code must be equal to " + FakeProcess.TERMINATION_CODE + ", but " + exitcode);
} else if (exitcode < 0) {
Assert.fail("Process is running for too long");
}
if (!(checkListener.value.getMessages().equals(""))) {
Assert.fail(checkListener.value.getMessages());
}
} catch (ExecutionException e) {
Assert.fail(e.getMessage());
} catch (InterruptedException e) {
Assert.fail(e.getMessage());
}
}
public void waitForRunToStart(final TestInProcessRunState lightState) {
new WaitFor(5 * 1000) {
protected boolean condition() {
return lightState.isRunning();
}
};
}
}
}