| /******************************************************************************* |
| * Copyright (c) 2000, 2013 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jdt.junit.tests; |
| |
| import java.util.ArrayList; |
| |
| import junit.framework.TestCase; |
| |
| import org.eclipse.jdt.junit.launcher.JUnitLaunchShortcut; |
| import org.eclipse.jdt.testplugin.JavaProjectHelper; |
| import org.eclipse.jdt.testplugin.util.DisplayHelper; |
| |
| import org.eclipse.swt.widgets.Display; |
| |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.Path; |
| |
| import org.eclipse.core.resources.IncrementalProjectBuilder; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| |
| import org.eclipse.debug.core.DebugPlugin; |
| import org.eclipse.debug.core.ILaunch; |
| import org.eclipse.debug.core.ILaunchConfiguration; |
| import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; |
| import org.eclipse.debug.core.ILaunchManager; |
| import org.eclipse.debug.core.ILaunchesListener2; |
| |
| import org.eclipse.jdt.core.ICompilationUnit; |
| import org.eclipse.jdt.core.IJavaElement; |
| import org.eclipse.jdt.core.IJavaProject; |
| import org.eclipse.jdt.core.IPackageFragment; |
| import org.eclipse.jdt.core.IPackageFragmentRoot; |
| import org.eclipse.jdt.core.IType; |
| import org.eclipse.jdt.core.JavaModelException; |
| |
| import org.eclipse.jdt.internal.junit.launcher.JUnitLaunchConfigurationConstants; |
| |
| |
| public class AbstractTestRunListenerTest extends TestCase { |
| |
| public static class TestRunLog { |
| private ArrayList<String> fLog; |
| private boolean fIsDone; |
| |
| public TestRunLog() { |
| fLog= new ArrayList<>(); |
| fIsDone= false; |
| } |
| |
| public synchronized int getMessageCount() { |
| return fLog.size(); |
| } |
| |
| public synchronized String[] getLog() { |
| return fLog.toArray(new String[fLog.size()]); |
| } |
| |
| public synchronized void add(String entry) { |
| fLog.add(entry); |
| } |
| |
| public void setDone() { |
| fIsDone= true; |
| } |
| |
| public boolean isDone() { |
| return fIsDone; |
| } |
| } |
| |
| |
| IJavaProject fProject; |
| private boolean fLaunchHasTerminated= false; |
| |
| @Override |
| protected void setUp() throws Exception { |
| fProject= JavaProjectHelper.createJavaProject("TestRunListenerTest", "bin"); |
| // have to set up an 1.3 project to avoid requiring a 5.0 VM |
| JavaProjectHelper.addRTJar13(fProject); |
| JavaProjectHelper.addVariableEntry(fProject, new Path("JUNIT_HOME/junit.jar"), null, null); |
| } |
| |
| @Override |
| protected void tearDown() throws Exception { |
| JavaProjectHelper.delete(fProject); |
| } |
| |
| private static class TestJUnitLaunchShortcut extends JUnitLaunchShortcut { |
| public static ILaunchConfigurationWorkingCopy createConfiguration(IJavaElement element, String testName) throws CoreException { |
| ILaunchConfigurationWorkingCopy copy= new TestJUnitLaunchShortcut().createLaunchConfiguration(element, testName); |
| return copy; |
| } |
| } |
| |
| protected IType createType(String source, String packageName, String typeName) throws CoreException, JavaModelException { |
| IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(fProject, "src"); |
| IPackageFragment pack= root.createPackageFragment(packageName, true, null); |
| ICompilationUnit aTestCaseCU= pack.createCompilationUnit(typeName, source, true, null); |
| IType aTestCase= aTestCaseCU.findPrimaryType(); |
| return aTestCase; |
| } |
| |
| protected void launchJUnit(IJavaElement aTest, String testKindID) throws CoreException { |
| launchJUnit(aTest, testKindID, (String)null); |
| } |
| |
| protected void launchJUnit(IJavaElement aTest, String testKindID, String testName) throws CoreException { |
| ResourcesPlugin.getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, null); |
| |
| ILaunchManager lm = DebugPlugin.getDefault().getLaunchManager(); |
| lm.removeLaunches(lm.getLaunches()); |
| ILaunchesListener2 launchesListener= new ILaunchesListener2() { |
| @Override |
| public void launchesTerminated(ILaunch[] launches) { |
| for (int i= 0; i < launches.length; i++) { |
| if (isJUnitLaunch(launches[i])) |
| fLaunchHasTerminated= true; |
| logLaunch("terminated", launches[i]); |
| } |
| } |
| @Override |
| public void launchesRemoved(ILaunch[] launches) { |
| for (int i= 0; i < launches.length; i++) { |
| if (isJUnitLaunch(launches[i])) |
| fLaunchHasTerminated= true; |
| logLaunch("removed ", launches[i]); |
| } |
| } |
| @Override |
| public void launchesAdded(ILaunch[] launches) { |
| for (int i= 0; i < launches.length; i++) |
| logLaunch("added ", launches[i]); |
| } |
| @Override |
| public void launchesChanged(ILaunch[] launches) { |
| for (int i= 0; i < launches.length; i++) |
| logLaunch("changed ", launches[i]); |
| } |
| private void logLaunch(String action, ILaunch launch) { |
| StringBuffer buf= new StringBuffer(); |
| buf.append(System.currentTimeMillis()).append(" "); |
| buf.append("launch ").append(action).append(": "); |
| ILaunchConfiguration launchConfiguration= launch.getLaunchConfiguration(); |
| if (launchConfiguration != null) { |
| buf.append(launchConfiguration.getName()).append(": "); |
| } |
| buf.append(launch); |
| if (isJUnitLaunch(launch)) { |
| buf.append(" [JUnit]"); |
| } |
| System.out.println(buf); |
| } |
| }; |
| lm.addLaunchListener(launchesListener); |
| |
| ILaunchConfigurationWorkingCopy configuration= TestJUnitLaunchShortcut.createConfiguration(aTest, testName); |
| if (testKindID != null) { |
| configuration.setAttribute(JUnitLaunchConfigurationConstants.ATTR_TEST_RUNNER_KIND, testKindID); |
| } |
| try { |
| configuration.launch(ILaunchManager.RUN_MODE, null); |
| new DisplayHelper() { |
| @Override |
| protected boolean condition() { |
| return fLaunchHasTerminated; |
| } |
| }.waitForCondition(Display.getCurrent(), 30 * 1000, 1000); |
| } finally { |
| lm.removeLaunchListener(launchesListener); |
| lm.removeLaunches(lm.getLaunches()); |
| configuration.delete(); |
| } |
| if (! fLaunchHasTerminated) |
| fail("Launch has not terminated"); |
| } |
| |
| protected String[] launchJUnit(IJavaElement aTest, final TestRunLog log) throws CoreException { |
| return launchJUnit(aTest, null, log); |
| } |
| |
| protected String[] launchJUnit(IJavaElement aTest, String testKindID, final TestRunLog log) throws CoreException { |
| return launchJUnit(aTest, testKindID, null, log); |
| } |
| |
| protected String[] launchJUnit(IJavaElement aTest, String testKindID, String testName, final TestRunLog log) throws CoreException { |
| launchJUnit(aTest, testKindID, testName); |
| |
| boolean success= new DisplayHelper(){ |
| @Override |
| protected boolean condition() { |
| return log.isDone(); |
| } |
| }.waitForCondition(Display.getCurrent(), 15*1000, 100); |
| if (! success) |
| log.add("AbstractTestRunListenerTest#launchJUnit(IJavaElement, TestRunLog) timed out"); |
| return log.getLog(); |
| } |
| |
| private boolean isJUnitLaunch(ILaunch launch) { |
| ILaunchConfiguration config= launch.getLaunchConfiguration(); |
| if (config == null) |
| return false; |
| |
| // test whether the launch defines the JUnit attributes |
| String portStr= launch.getAttribute(JUnitLaunchConfigurationConstants.ATTR_PORT); |
| if (portStr == null) |
| return false; |
| |
| return true; |
| } |
| |
| public static void assertEqualLog(final String[] expectedSequence, String[] logMessages) { |
| StringBuffer actual= new StringBuffer(); |
| for (int i= 0; i < logMessages.length; i++) { |
| actual.append(logMessages[i]).append('\n'); |
| } |
| StringBuffer expected= new StringBuffer(); |
| for (int i= 0; i < expectedSequence.length; i++) { |
| expected.append(expectedSequence[i]).append('\n'); |
| } |
| assertEquals(expected.toString(), actual.toString()); |
| } |
| |
| |
| } |