blob: 25f2020a6266a2e06fb9338db5fc7f610dac9a7f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2014 BEA Systems, Inc. and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* BEA Systems, Inc. - initial API and implementation
* Jesper Steen Moller - Bug 412150 [1.8] [compiler] Enable reflected parameter names during annotation processing
*******************************************************************************/
package org.eclipse.jdt.apt.pluggable.tests;
import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.util.Map;
import javax.lang.model.SourceVersion;
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.FactoryContainer.FactoryType;
import org.eclipse.jdt.apt.core.internal.util.FactoryPath;
import org.eclipse.jdt.apt.core.util.AptConfig;
import org.eclipse.jdt.core.IClasspathAttribute;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.tests.builder.BuilderTests;
import org.eclipse.jdt.core.tests.util.Util;
import org.eclipse.jdt.internal.core.ClasspathEntry;
import junit.framework.Test;
public class TestBase extends BuilderTests
{
protected static final String JAVA_16_COMPLIANCE = "1.6";
protected static final String JAVA_18_COMPLIANCE = "1.8";
protected static final String JAVA_9_COMPLIANCE = "9";
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);
}
public static Test suite() {
throw new IllegalStateException("This is a base test class whose suite() method must not be called.\n"
+ "This exception is thrown to avoid running org.eclipse.jdt.core.tests.builder.BuilderTests#suite() twice.");
}
/**
* Extract lib/annotations.jar from the test bundle and add it to the specified project
*/
private static void addAnnotationJar(IJavaProject jproj, boolean addToModulePath) 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);
}
if (addToModulePath) {
IClasspathAttribute[] attributes = { JavaCore.newClasspathAttribute(IClasspathAttribute.MODULE, "true") };
env.addEntry(projPath, JavaCore.newLibraryEntry(libFile.getFullPath(), null, null,
ClasspathEntry.NO_ACCESS_RULES, attributes, false));
} else {
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, false);
return javaProj;
}
/**
* Create a java project with java libraries and test annotations on classpath
* (compiler level is 1.8). 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 createJava8Project(final String projectName) throws Exception {
// Note, make sure this is run only with a JRE 8 and above.
IPath projectPath = env.addProject(projectName, JAVA_18_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);
javaProj.getProject().getFolder("prebuilt").create(true, true, null);
javaProj.getProject().getFolder("prebuilt").getFolder("p").create(true, true, null);
env.addClassFolder(projectPath, projectPath.append("prebuilt"), true);
addAnnotationJar(javaProj, false);
return javaProj;
}
/**
* Create a java project with java libraries and test annotations on modulepath
* (compiler level is 1.9). 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 createJava9Project(final String projectName) throws Exception {
// Note, make sure this is run only with a JRE 9 and above.
IPath projectPath = env.addProject(projectName, JAVA_9_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, true);
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);
}
public boolean canRunJava9() {
try {
SourceVersion.valueOf("RELEASE_9");
} catch(IllegalArgumentException iae) {
return false;
}
return true;
}
}