diff options
Diffstat (limited to 'ant/org.eclipse.ant.tests.ui/test plugin/org/eclipse/ant/tests/ui/testplugin/AbstractAntUITest.java')
-rw-r--r-- | ant/org.eclipse.ant.tests.ui/test plugin/org/eclipse/ant/tests/ui/testplugin/AbstractAntUITest.java | 483 |
1 files changed, 483 insertions, 0 deletions
diff --git a/ant/org.eclipse.ant.tests.ui/test plugin/org/eclipse/ant/tests/ui/testplugin/AbstractAntUITest.java b/ant/org.eclipse.ant.tests.ui/test plugin/org/eclipse/ant/tests/ui/testplugin/AbstractAntUITest.java new file mode 100644 index 000000000..e6cc8391f --- /dev/null +++ b/ant/org.eclipse.ant.tests.ui/test plugin/org/eclipse/ant/tests/ui/testplugin/AbstractAntUITest.java @@ -0,0 +1,483 @@ +/******************************************************************************* + * Copyright (c) 2003, 2009 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.ant.tests.ui.testplugin; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import junit.framework.TestCase; + +import org.eclipse.ant.internal.ui.AntUIPlugin; +import org.eclipse.ant.internal.ui.IAntUIPreferenceConstants; +import org.eclipse.ant.internal.ui.model.AntModel; +import org.eclipse.ant.tests.ui.editor.support.TestLocationProvider; +import org.eclipse.ant.tests.ui.editor.support.TestProblemRequestor; +import org.eclipse.core.externaltools.internal.IExternalToolConstants; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IFolder; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.debug.core.DebugEvent; +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.model.IProcess; +import org.eclipse.jdt.core.IJavaProject; +import org.eclipse.jdt.core.JavaCore; +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.BadPositionCategoryException; +import org.eclipse.jface.text.Document; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.IDocumentPartitioner; +import org.eclipse.jface.text.ITypedRegion; +import org.eclipse.jface.text.Position; +import org.eclipse.swt.graphics.Color; +import org.eclipse.ui.console.IHyperlink; +import org.eclipse.ui.internal.console.ConsoleHyperlinkPosition; +import org.eclipse.ui.internal.console.IOConsolePartition; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +/** + * Abstract Ant UI test class + */ +public abstract class AbstractAntUITest extends TestCase { + + public static String ANT_EDITOR_ID= "org.eclipse.ant.ui.internal.editor.AntEditor"; + + private IDocument currentDocument; + + /** + * Constructor + * @param name + */ + public AbstractAntUITest(String name) { + super(name); + } + + /** + * Returns the {@link IFile} for the given build file name + * @param buildFileName + * @return the associated {@link IFile} for the given build file name + */ + protected IFile getIFile(String buildFileName) { + return getProject().getFolder("buildfiles").getFile(buildFileName); + } + + /** + * Returns the {@link File} for the given build file name + * @param buildFileName + * @return the {@link File} for the given build file name + */ + protected File getBuildFile(String buildFileName) { + IFile file = getIFile(buildFileName); + assertTrue("Could not find build file named: " + buildFileName, file.exists()); + return file.getLocation().toFile(); + } + + /* (non-Javadoc) + * @see junit.framework.TestCase#setUp() + */ + protected void setUp() throws Exception { + super.setUp(); + assertProject(); + } + + /** + * Asserts that the testing project has been setup in the test workspace + * @throws Exception + * + * @since 3.5 + */ + public static void assertProject() throws Exception { + IProject pro = ResourcesPlugin.getWorkspace().getRoot().getProject(ProjectHelper.PROJECT_NAME); + if (!pro.exists()) { + // create project and import build files and support files + IProject project = ProjectHelper.createProject(ProjectHelper.PROJECT_NAME); + IFolder folder = ProjectHelper.addFolder(project, "buildfiles"); + ProjectHelper.addFolder(project, "launchConfigurations"); + File root = AntUITestPlugin.getDefault().getFileInPlugin(ProjectHelper.TEST_BUILDFILES_DIR); + ProjectHelper.importFilesFromDirectory(root, folder.getFullPath(), null); + + ProjectHelper.createLaunchConfigurationForBoth("echoing"); + ProjectHelper.createLaunchConfigurationForBoth("102282"); + ProjectHelper.createLaunchConfigurationForBoth("74840"); + ProjectHelper.createLaunchConfigurationForBoth("failingTarget"); + ProjectHelper.createLaunchConfiguration("build"); + ProjectHelper.createLaunchConfiguration("bad"); + ProjectHelper.createLaunchConfiguration("importRequiringUserProp"); + ProjectHelper.createLaunchConfigurationForSeparateVM("echoPropertiesSepVM", "echoProperties"); + ProjectHelper.createLaunchConfigurationForSeparateVM("extensionPointSepVM", null); + ProjectHelper.createLaunchConfigurationForSeparateVM("extensionPointTaskSepVM", null); + ProjectHelper.createLaunchConfigurationForSeparateVM("extensionPointTypeSepVM", null); + ProjectHelper.createLaunchConfigurationForSeparateVM("input", null); + ProjectHelper.createLaunchConfigurationForSeparateVM("environmentVar", null); + + ProjectHelper.createLaunchConfigurationForBoth("breakpoints"); + ProjectHelper.createLaunchConfigurationForBoth("debugAntCall"); + ProjectHelper.createLaunchConfigurationForBoth("96022"); + ProjectHelper.createLaunchConfigurationForBoth("macrodef"); + ProjectHelper.createLaunchConfigurationForBoth("85769"); + + ProjectHelper.createLaunchConfiguration("big", ProjectHelper.PROJECT_NAME + "/buildfiles/performance/build.xml"); + + //do not show the Ant build failed error dialog + AntUIPlugin.getDefault().getPreferenceStore().setValue(IAntUIPreferenceConstants.ANT_ERROR_DIALOG, false); + } + } + + /** + * Returns the 'AntUITests' project. + * + * @return the test project + */ + protected static IProject getProject() { + return ResourcesPlugin.getWorkspace().getRoot().getProject(ProjectHelper.PROJECT_NAME); + } + + /** + * Returns the underlying {@link IDocument} for the given file name + * @param fileName + * @return the underlying {@link IDocument} for the given file name + */ + protected IDocument getDocument(String fileName) { + File file = getBuildFile(fileName); + InputStream in; + try { + in = new FileInputStream(file); + } catch (FileNotFoundException e) { + return null; + } + String initialContent= getStreamContentAsString(in); + return new Document(initialContent); + } + + /** + * Returns the contents of the given {@link InputStream} as a {@link String} + * @param inputStream + * @return the {@link InputStream} as a {@link String} + */ + protected String getStreamContentAsString(InputStream inputStream) { + InputStreamReader reader; + try { + reader = new InputStreamReader(inputStream, ResourcesPlugin.getEncoding()); + } catch (UnsupportedEncodingException e) { + AntUIPlugin.log(e); + return ""; //$NON-NLS-1$ + } + BufferedReader tempBufferedReader = new BufferedReader(reader); + + return getReaderContentAsString(tempBufferedReader); + } + + /** + * Returns the contents of the given {@link BufferedReader} as a {@link String} + * @param bufferedReader + * @return the contents of the given {@link BufferedReader} as a {@link String} + */ + protected String getReaderContentAsStringNew(BufferedReader bufferedReader) { + StringBuffer result = new StringBuffer(); + try { + char[] readBuffer= new char[2048]; + int n= bufferedReader.read(readBuffer); + while (n > 0) { + result.append(readBuffer, 0, n); + n= bufferedReader.read(readBuffer); + } + } catch (IOException e) { + AntUIPlugin.log(e); + return null; + } + + return result.toString(); + } + + /** + * Returns the contents of the given {@link BufferedReader} as a {@link String} + * @param bufferedReader + * @return the contents of the given {@link BufferedReader} as a {@link String} + */ + protected String getReaderContentAsString(BufferedReader bufferedReader) { + StringBuffer result = new StringBuffer(); + try { + String line= bufferedReader.readLine(); + + while(line != null) { + if(result.length() != 0) { + result.append(System.getProperty("line.separator")); //$NON-NLS-1$ + } + result.append(line); + line = bufferedReader.readLine(); + } + } catch (IOException e) { + AntUIPlugin.log(e); + return null; + } + + return result.toString(); + } + + /** + * Returns the {@link AntModel} for the given file name + * @param fileName + * @return the {@link AntModel} for the given file name + */ + protected AntModel getAntModel(String fileName) { + currentDocument= getDocument(fileName); + AntModel model= new AntModel(currentDocument, new TestProblemRequestor(), new TestLocationProvider(getBuildFile(fileName))); + model.reconcile(); + return model; + } + + /** + * @return the current {@link IDocument} context + */ + public IDocument getCurrentDocument() { + return currentDocument; + } + + /** + * Allows the current {@link IDocument} context to be set. This method accepts <code>null</code> + * @param currentDocument + */ + public void setCurrentDocument(IDocument currentDocument) { + this.currentDocument = currentDocument; + } + + /** + * Launches the Ant build with the build file name (no extension). + * + * @param buildFileName the ant build file name + */ + protected void launch(String buildFileName) throws CoreException { + ILaunchConfiguration config = getLaunchConfiguration(buildFileName); + assertNotNull("Could not locate launch configuration for " + buildFileName, config); + launchAndTerminate(config, 20000); + } + + /** + * Launches the Ant build with the build file name (no extension). + * + * @param buildFileName the build file + * @param arguments the ant arguments + */ + protected void launch(String buildFileName, String arguments) throws CoreException { + ILaunchConfiguration config = getLaunchConfiguration(buildFileName); + assertNotNull("Could not locate launch configuration for " + buildFileName, config); + ILaunchConfigurationWorkingCopy copy= config.getWorkingCopy(); + copy.setAttribute(IExternalToolConstants.ATTR_TOOL_ARGUMENTS, arguments); + launchAndTerminate(copy, 20000); + } + + /** + * Launches the Ant build in debug output mode with the build file name (no extension). + * + * @param mainTypeName the program to launch + * @return thread in which the first suspend event occurred + */ + protected void launchWithDebug(String buildFileName) throws CoreException { + ILaunchConfiguration config = getLaunchConfiguration(buildFileName); + assertNotNull("Could not locate launch configuration for " + buildFileName, config); + ILaunchConfigurationWorkingCopy copy= config.getWorkingCopy(); + copy.setAttribute(IExternalToolConstants.ATTR_TOOL_ARGUMENTS, "-debug"); + launchAndTerminate(copy, 10000); + } + + /** + * Returns the launch configuration for the given build file + * + * @param buildFileName build file to launch + * @see ProjectCreationDecorator + */ + protected ILaunchConfiguration getLaunchConfiguration(String buildFileName) { + IFile file = getJavaProject().getProject().getFolder("launchConfigurations").getFile(buildFileName + ".launch"); + ILaunchConfiguration config = getLaunchManager().getLaunchConfiguration(file); + assertTrue("Could not find launch configuration for " + buildFileName, config.exists()); + return config; + } + + /** + * Returns the content of the specified file as <code>String</code>. + */ + protected String getFileContentAsString(File aFile) throws FileNotFoundException { + InputStream stream = new FileInputStream(aFile); + InputStreamReader reader = new InputStreamReader(stream); + BufferedReader bufferedReader = new BufferedReader(reader); + + return getReaderContentAsString(bufferedReader); + } + + /** + * @return a new SAX parser instrance + */ + protected SAXParser getSAXParser() { + SAXParser parser = null; + try { + parser = SAXParserFactory.newInstance().newSAXParser(); + } catch (ParserConfigurationException e) { + AntUIPlugin.log(e); + } catch (SAXException e) { + AntUIPlugin.log(e); + } + return parser; + } + + + /** + * Parses the given input stream with the given parser using the given handler + * @param stream + * @param parser + * @param handler + * @param editedFile + */ + protected void parse(InputStream stream, SAXParser parser, DefaultHandler handler, File editedFile) { + InputSource inputSource= new InputSource(stream); + if (editedFile != null) { + //needed for resolving relative external entities + inputSource.setSystemId(editedFile.getAbsolutePath()); + } + + try { + parser.parse(inputSource, handler); + } catch (SAXException e) { + } catch (IOException e) { + } + } + + /** + * Returns the launch manager + * + * @return launch manager + */ + public static ILaunchManager getLaunchManager() { + return DebugPlugin.getDefault().getLaunchManager(); + } + + /** + * Returns the 'AntUITests' project. + * + * @return the test project + */ + public static IJavaProject getJavaProject() { + return JavaCore.create( getProject()); + } + + /** + * Launches the given configuration and waits for the terminated event or the length of the given timeout, + * whichever comes first + * @param config + * @param timeout + * @throws CoreException + */ + protected void launchAndTerminate(ILaunchConfiguration config, int timeout) throws CoreException { + DebugEventWaiter waiter= new DebugElementKindEventWaiter(DebugEvent.TERMINATE, IProcess.class); + waiter.setTimeout(timeout); + + Object terminatee = launchAndWait(config, waiter); + assertNotNull("Program did not terminate.", terminatee); + assertTrue("terminatee is not an IProcess", terminatee instanceof IProcess); + IProcess process = (IProcess) terminatee; + boolean terminated = process.isTerminated(); + assertTrue("process is not terminated", terminated); + } + + /** + * Launches the given configuration and waits for an event. Returns the + * source of the event. If the event is not received, the launch is + * terminated and an exception is thrown. + * + * @param configuration the configuration to launch + * @param waiter the event waiter to use + * @return Object the source of the event + * @exception Exception if the event is never received. + */ + protected Object launchAndWait(ILaunchConfiguration configuration, DebugEventWaiter waiter) throws CoreException { + ILaunch launch = configuration.launch(ILaunchManager.RUN_MODE, null); + Object suspendee= waiter.waitForEvent(); + if (suspendee == null) { + try { + launch.terminate(); + } catch (CoreException e) { + e.printStackTrace(); + fail("Program did not suspend, and unable to terminate launch."); + } + } + assertNotNull("Program did not suspend, launch terminated.", suspendee); + boolean terminated = launch.isTerminated(); + assertTrue("launch did not terminate", terminated); + if (terminated && !ConsoleLineTracker.isClosed()) { + ConsoleLineTracker.waitForConsole(); + } + assertTrue("Console is not closed", ConsoleLineTracker.isClosed()); + return suspendee; + } + + /** + * Returns the {@link IHyperlink} at the given offset on the given document, + * or <code>null</code> if there is no {@link IHyperlink} at that offset on the document. + * @param offset + * @param doc + * @return the {@link IHyperlink} at the given offset on the given document or <code>null</code> + */ + protected IHyperlink getHyperlink(int offset, IDocument doc) { + if (offset >= 0 && doc != null) { + Position[] positions = null; + try { + positions = doc.getPositions(ConsoleHyperlinkPosition.HYPER_LINK_CATEGORY); + } catch (BadPositionCategoryException ex) { + // no links have been added + return null; + } + for (int i = 0; i < positions.length; i++) { + Position position = positions[i]; + if (offset >= position.getOffset() && offset <= (position.getOffset() + position.getLength())) { + return ((ConsoleHyperlinkPosition)position).getHyperLink(); + } + } + } + return null; + } + + /** + * Returns the {@link Color} at the given offset on the given document, + * or <code>null</code> if there is no {@link Color} at that offset on the document. + * @param offset + * @param doc + * @return the {@link Color} at the given offset on the given document or <code>null</code> + */ + protected Color getColorAtOffset(int offset, IDocument document) throws BadLocationException { + if (document != null) { + IDocumentPartitioner partitioner = document.getDocumentPartitioner(); + if (partitioner != null) { + ITypedRegion[] regions= partitioner.computePartitioning(offset, document.getLineInformationOfOffset(offset).getLength()); + if (regions.length > 0) { + IOConsolePartition partition = (IOConsolePartition)regions[0]; + return partition.getColor(); + } + } + } + return null; + } +}
\ No newline at end of file |