package com.codeaffine.extras.launch.internal.dialog;
import static org.assertj.core.api.Assertions.assertThat;
import static org.eclipse.debug.core.ILaunchManager.RUN_MODE;
import static org.junit.Assert.fail;
import java.util.concurrent.atomic.AtomicBoolean;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.StructuredSelection;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import com.codeaffine.extras.launch.internal.Images;
import com.codeaffine.extras.launch.internal.dialog.TerminateLaunchesAction.TerminateLaunchesJob;
import com.codeaffine.extras.launch.test.LaunchConfigRule;
public class TerminateLaunchesActionPDETest {
@Rule
public final LaunchConfigRule launchConfigRule = new LaunchConfigRule();
private TerminateLaunchesJobListener terminateLaunchesJobListener;
private TerminateLaunchesAction action;
@Before
public void setUp() {
terminateLaunchesJobListener = new TerminateLaunchesJobListener();
Job.getJobManager().addJobChangeListener( terminateLaunchesJobListener);
action = new TerminateLaunchesAction();
}
@After
public void tearDown() {
Job.getJobManager().removeJobChangeListener( terminateLaunchesJobListener);
}
@Test
public void testGetId() {
assertThat( action.getId() ).isEqualTo( TerminateLaunchesAction.ID );
}
@Test
public void testGetText() {
String text = action.getText();
assertThat( text ).isNotEmpty();
}
@Test
public void testGetImageDescriptor() {
ImageDescriptor imageDescriptor = action.getImageDescriptor();
assertThat( imageDescriptor ).isEqualTo( Images.getImageDescriptor( Images.TERMINATE_ALL ) );
}
@Test
public void testInitialEnablement() {
assertThat( action.isEnabled() ).isFalse();
}
@Test
public void testInitialSelection() {
assertThat( action.getSelection().isEmpty() ).isTrue();
}
@Test
public void testSetSelectionWithArbitraryObject() {
action.setSelection( new StructuredSelection( new Object() ) );
assertThat( action.isEnabled() ).isFalse();
}
@Test
public void testSetSelectionToLaunchConfig() throws CoreException {
action.setSelection( new StructuredSelection( launchConfigRule.createPublicLaunchConfig() ) );
assertThat( action.isEnabled() ).isFalse();
}
@Test
public void testSetSelectionToRunningLaunchConfig() throws CoreException {
ILaunchConfiguration launchConfig = createRunningLaunchConfig();
action.setSelection( new StructuredSelection( launchConfig ) );
assertThat( action.isEnabled() ).isTrue();
}
@Test
public void testSetSelectionToMultipleRunningLaunchConfigs() throws CoreException {
ILaunchConfiguration launchConfig1 = createRunningLaunchConfig();
ILaunchConfiguration launchConfig2 = createRunningLaunchConfig();
action.setSelection( new StructuredSelection( new Object[] { launchConfig1, launchConfig2 } ) );
assertThat( action.isEnabled() ).isTrue();
}
@Test
public void testSetSelectionToMixedSelection() throws CoreException {
ILaunchConfiguration launchConfig = createRunningLaunchConfig();
action.setSelection( new StructuredSelection( new Object[] { launchConfig, new Object() } ) );
assertThat( action.isEnabled() ).isTrue();
}
@Test
public void testRun() throws Exception {
ILaunch launch = runLaunchConfig();
action.setSelection( new StructuredSelection( launch.getLaunchConfiguration() ) );
action.run();
waitForTerminateLaunchesJob();
assertThat( launch.isTerminated() ).isTrue();
}
@Test
public void testRunWithMultipleLaunches() throws Exception {
ILaunchConfiguration launchConfig = launchConfigRule.createPublicLaunchConfig().doSave();
ILaunch launch1 = launchConfig.launch( RUN_MODE, null );
ILaunch launch2 = launchConfig.launch( RUN_MODE, null );
action.setSelection( new StructuredSelection( launchConfig ) );
action.run();
waitForTerminateLaunchesJob();
assertThat( launch1.isTerminated() ).isTrue();
assertThat( launch2.isTerminated() ).isTrue();
}
@Test
public void testRunWithMultipleLaunchConfigs() throws Exception {
ILaunch launch1 = runLaunchConfig();
ILaunch launch2 = runLaunchConfig();
ILaunchConfiguration launchConfig1 = launch1.getLaunchConfiguration();
ILaunchConfiguration launchConfig2 = launch2.getLaunchConfiguration();
action.setSelection( new StructuredSelection( new Object[] { launchConfig1, launchConfig2 } ) );
action.run();
waitForTerminateLaunchesJob();
assertThat( launch1.isTerminated() ).isTrue();
assertThat( launch2.isTerminated() ).isTrue();
}
private void waitForTerminateLaunchesJob() throws OperationCanceledException, InterruptedException {
long start = System.currentTimeMillis();
while( !terminateLaunchesJobListener.isJobDone() ) {
if( System.currentTimeMillis() - start > 10000 ) {
fail( "Timed out while waiting for TerminateLaunchesJob to finish" );
}
Job.getJobManager().join( TerminateLaunchesJob.FAMILY, null );
}
}
private ILaunchConfiguration createRunningLaunchConfig() throws CoreException {
return runLaunchConfig().getLaunchConfiguration();
}
private ILaunch runLaunchConfig() throws CoreException {
ILaunchConfiguration launchConfig = launchConfigRule.createPublicLaunchConfig().doSave();
return launchConfig.launch( RUN_MODE, null );
}
private class TerminateLaunchesJobListener extends JobChangeAdapter {
final AtomicBoolean jobDone;
TerminateLaunchesJobListener() {
jobDone = new AtomicBoolean();
}
boolean isJobDone() {
return jobDone.get();
}
@Override
public void done( IJobChangeEvent event ) {
if( event.getJob() instanceof TerminateLaunchesJob ) {
jobDone.set( true );
}
}
}
}