blob: 99789a0ceaebf8517a7f84a9ccea9a76918786fb [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2008 BEA Systems, Inc. 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:
* BEA Systems, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.apt.pluggable.tests;
import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.util.Map;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jdt.apt.core.internal.util.FactoryContainer;
import org.eclipse.jdt.apt.core.internal.util.FactoryPath;
import org.eclipse.jdt.apt.core.internal.util.FactoryContainer.FactoryType;
import org.eclipse.jdt.apt.core.util.AptConfig;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.tests.builder.BuilderTests;
import org.eclipse.jdt.core.tests.util.Util;
public class TestBase extends BuilderTests
{
protected static final String JAVA_16_COMPLIANCE = "1.6";
protected String _projectName;
protected static int _projectSerial = 0; // used to create unique project names, to avoid resource deletion problems
public TestBase(String name) {
super(name);
}
/**
* Extract lib/annotations.jar from the test bundle and add it to the specified project
*/
private static void addAnnotationJar(IJavaProject jproj) throws Exception {
final String resName = "lib/annotations.jar"; // name in bundle
final String libName = resName; // name in destination project
InputStream is = null;
URL resURL = Apt6TestsPlugin.thePlugin().getBundle().getEntry(resName);
is = resURL.openStream();
IPath projPath = jproj.getPath();
IProject proj = jproj.getProject();
IFile libFile = proj.getFile(libName);
env.addFolder(projPath, "lib");
if (libFile.exists()) {
libFile.setContents(is, true, false, null);
} else {
libFile.create(is, true, null);
}
env.addLibrary(projPath, libFile.getFullPath(), null, null);
}
/**
* Create a java project with java libraries and test annotations on classpath
* (compiler level is 1.6). Use "src" as source folder and "bin" as output folder. APT
* is not enabled.
*
* @param projectName
* @return a java project that has been added to the current workspace.
* @throws Exception
*/
protected static IJavaProject createJavaProject(final String projectName) throws Exception
{
IPath projectPath = env.addProject(projectName, JAVA_16_COMPLIANCE);
env.addExternalJars(projectPath, Util.getJavaClassLibs());
// remove old package fragment root so that names don't collide
env.removePackageFragmentRoot(projectPath, ""); //$NON-NLS-1$
env.addPackageFragmentRoot(projectPath, "src"); //$NON-NLS-1$
env.setOutputFolder(projectPath, "bin"); //$NON-NLS-1$
final IJavaProject javaProj = env.getJavaProject(projectPath);
addAnnotationJar(javaProj);
return javaProj;
}
/**
* Ensure that there are no Java 5 processors on the factory path, as they can cause
* units to be multiply compiled, which can mess up tests that expect a certain number
* of compilations to occur.
* @param jproj the project whose factory path will be edited
* @throws CoreException
*/
protected void disableJava5Factories(IJavaProject jproj) throws CoreException {
FactoryPath fp = (FactoryPath) AptConfig.getFactoryPath(jproj);
for (Map.Entry<FactoryContainer, FactoryPath.Attributes> entry : fp.getAllContainers().entrySet()) {
if (entry.getKey().getType() == FactoryType.PLUGIN) {
String id = entry.getKey().getId();
if (!Apt6TestsPlugin.PLUGIN_ID.equals(id)) {
fp.disablePlugin(id);
}
}
}
AptConfig.setFactoryPath(jproj, fp);
}
/**
* Verify that an expected file exists within a project.
* @param fileName the filename relative to the project root.
*/
protected void expectingFile(IProject proj, String fileName) throws Exception
{
IPath path = proj.getLocation().append(fileName);
File file = new File(path.toOSString());
assertTrue("Expected file " + fileName + " was missing from project", file != null && file.exists());
}
/**
* Verify that an expected file exists within a project.
* @param fileName the filename relative to the project root.
*/
protected void expectingNoFile(IProject proj, String fileName) throws Exception
{
IPath path = proj.getLocation().append(fileName);
File file = new File(path.toOSString());
boolean exists = file.exists();
// work around a timing bug in some versions of JRE 1.6 on Linux:
// Before assuming the test has failed, wait half a second and try again.
// This delay is not encountered when the test is passing normally.
if (exists) {
Thread.sleep(500);
exists = file.exists();
}
assertTrue("File " + fileName + " was expected to not exist", file == null || !exists);
}
@Override
protected void setUp() throws Exception
{
super.setUp();
env.setAutoBuilding(false);
_projectName = String.format("testproj%04d", ++_projectSerial);
}
}