blob: a4738e67d6bae5f6bdb65be09554cbe91900e10d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2015 Broadcom Corporation 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:
* Broadcom Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.core.tests.internal.resources;
import java.util.*;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.resources.*;
import org.eclipse.core.resources.IWorkspace.ProjectOrder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.tests.resources.ResourceTest;
/**
* Test project dynamic references provided by extension point
* <code>org.eclipse.core.resources.builders</code> and dynamicReference
* {@link IDynamicReferenceProvider}
*/
public class ProjectDynamicReferencesTest extends ResourceTest {
private static final String PROJECT_0_NAME = "ProjectDynamicReferencesTest_p0";
private static final IProject[] EMPTY_PROJECTS = new IProject[0];
private static final IBuildConfiguration[] EMPTY_BUILD_CONFIGURATIONS = new IBuildConfiguration[0];
private IProject project0;
private IProject project1;
private IProject project2;
public static Test suite() {
return new TestSuite(ProjectDynamicReferencesTest.class);
}
public ProjectDynamicReferencesTest(String name) {
super(name);
}
@Override
public void setUp() throws Exception {
project0 = getWorkspace().getRoot().getProject(PROJECT_0_NAME);
project1 = getWorkspace().getRoot().getProject("ProjectDynamicReferencesTest_p1");
project2 = getWorkspace().getRoot().getProject("ProjectDynamicReferencesTest_p2");
ensureExistsInWorkspace(new IProject[] { project0, project1, project2 }, true);
addBuilder(project0);
addBuilder(project1);
addBuilder(project2);
}
private static void addBuilder(IProject project) throws CoreException {
IProjectDescription description = project.getDescription();
ICommand command = description.newCommand();
command.setBuilderName(Builder.NAME);
description.setBuildSpec(new ICommand[] {command});
project.setDescription(description, null);
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
DynamicReferenceProvider.clear();
project0.delete(true, null);
project1.delete(true, null);
project2.delete(true, null);
}
public void testReferencedProjects() throws CoreException {
assertEquals("Project0 must not have referenced projects", EMPTY_PROJECTS, project0.getReferencedProjects());
assertEquals("Project1 must not have referenced projects", EMPTY_PROJECTS, project1.getReferencedProjects());
assertEquals("Project2 must not have referenced projects", EMPTY_PROJECTS, project2.getReferencedProjects());
DynamicReferenceProvider.addReference(project0, project1);
assertEquals("Project0 must not have referenced projects", EMPTY_PROJECTS, project0.getReferencedProjects());
assertEquals("Project1 must not have referenced projects", EMPTY_PROJECTS, project1.getReferencedProjects());
assertEquals("Project2 must not have referenced projects", EMPTY_PROJECTS, project2.getReferencedProjects());
clearCache();
assertEquals("Project0 must reference Project1", new IProject[] { project1 }, project0.getReferencedProjects());
assertEquals("Project1 must not have referenced projects", EMPTY_PROJECTS, project1.getReferencedProjects());
assertEquals("Project2 must not have referenced projects", EMPTY_PROJECTS, project2.getReferencedProjects());
DynamicReferenceProvider.addReference(project1, project2);
assertEquals("Project0 must reference Project1", new IProject[] { project1 }, project0.getReferencedProjects());
assertEquals("Project1 must not have referenced projects", EMPTY_PROJECTS, project1.getReferencedProjects());
assertEquals("Project2 must not have referenced projects", EMPTY_PROJECTS, project2.getReferencedProjects());
clearCache();
assertEquals("Project0 must reference Project1", new IProject[] { project1 }, project0.getReferencedProjects());
assertEquals("Project1 must reference Project2", new IProject[] { project2 }, project1.getReferencedProjects());
assertEquals("Project2 must not have referenced projects", EMPTY_PROJECTS, project2.getReferencedProjects());
DynamicReferenceProvider.addReference(project0, project2);
assertEquals("Project0 must reference Project1", new IProject[] { project1 }, project0.getReferencedProjects());
assertEquals("Project1 must reference Project2", new IProject[] { project2 }, project1.getReferencedProjects());
assertEquals("Project2 must not have referenced projects", EMPTY_PROJECTS, project2.getReferencedProjects());
clearCache();
assertEquals("Project0 must reference Project1 and Project2", new IProject[] { project1, project2 },
project0.getReferencedProjects());
assertEquals("Project1 must reference Project2", new IProject[] { project2 },
project1.getReferencedProjects());
assertEquals("Project2 must not have referenced projects", EMPTY_PROJECTS, project2.getReferencedProjects());
}
public void testReferencedBuildConfigs() throws CoreException {
assertEquals("Project0 must not have referenced projects", EMPTY_BUILD_CONFIGURATIONS,
project0.getReferencedBuildConfigs(IBuildConfiguration.DEFAULT_CONFIG_NAME, false));
assertEquals("Project1 must not have referenced projects", EMPTY_BUILD_CONFIGURATIONS,
project1.getReferencedBuildConfigs(IBuildConfiguration.DEFAULT_CONFIG_NAME, false));
assertEquals("Project2 must not have referenced projects", EMPTY_BUILD_CONFIGURATIONS,
project2.getReferencedBuildConfigs(IBuildConfiguration.DEFAULT_CONFIG_NAME, false));
DynamicReferenceProvider.addReference(project0, project1);
DynamicReferenceProvider.addReference(project1, project2);
DynamicReferenceProvider.addReference(project0, project2);
clearCache();
IBuildConfiguration buildConfigProject1 = project1.getBuildConfig(IBuildConfiguration.DEFAULT_CONFIG_NAME);
IBuildConfiguration buildConfigProject2 = project2.getBuildConfig(IBuildConfiguration.DEFAULT_CONFIG_NAME);
assertEquals("Build configuration of Project0 must reference build configuration of project1 and project2",
new IBuildConfiguration[] { buildConfigProject1, buildConfigProject2 },
project0.getReferencedBuildConfigs(IBuildConfiguration.DEFAULT_CONFIG_NAME, false));
assertEquals("Build configuration of Project1 must reference build configuration of Project2",
new IBuildConfiguration[] { buildConfigProject2 },
project1.getReferencedBuildConfigs(IBuildConfiguration.DEFAULT_CONFIG_NAME, false));
assertEquals("Project2 must not have referenced projects", EMPTY_BUILD_CONFIGURATIONS,
project2.getReferencedBuildConfigs(IBuildConfiguration.DEFAULT_CONFIG_NAME, false));
}
public void testReferencingProjects() throws CoreException {
assertEquals("Project0 must not have referencing projects", EMPTY_PROJECTS, project0.getReferencingProjects());
assertEquals("Project1 must not have referencing projects", EMPTY_PROJECTS, project1.getReferencingProjects());
assertEquals("Project2 must not have referencing projects", EMPTY_PROJECTS, project2.getReferencingProjects());
DynamicReferenceProvider.addReference(project0, project1);
assertEquals("Project0 must not have referencing projects", EMPTY_PROJECTS, project0.getReferencingProjects());
assertEquals("Project1 must not have referencing projects", EMPTY_PROJECTS, project1.getReferencingProjects());
assertEquals("Project2 must not have referencing projects", EMPTY_PROJECTS, project2.getReferencingProjects());
clearCache();
assertEquals("Project0 must not have referencing projects", EMPTY_PROJECTS, project0.getReferencingProjects());
assertEquals("Project1 must be referenced by Project0", new IProject[] { project0 },
project1.getReferencingProjects());
assertEquals("Project2 must not have referencing projects", EMPTY_PROJECTS, project2.getReferencingProjects());
DynamicReferenceProvider.addReference(project1, project2);
assertEquals("Project0 must not have referencing projects", EMPTY_PROJECTS, project0.getReferencingProjects());
assertEquals("Project1 must must be referenced by Project0", new IProject[] { project0 },
project1.getReferencingProjects());
assertEquals("Project2 must not have referencing projects", EMPTY_PROJECTS, project2.getReferencingProjects());
clearCache();
assertEquals("Project0 must not have referencing projects", EMPTY_PROJECTS, project0.getReferencingProjects());
assertEquals("Project1 must be referenced by Project0", new IProject[] { project0 },
project1.getReferencingProjects());
assertEquals("Project2 must be referenced by Project1", new IProject[] { project1 },
project2.getReferencingProjects());
DynamicReferenceProvider.addReference(project0, project2);
assertEquals("Project0 must not have referencing projects", EMPTY_PROJECTS, project0.getReferencingProjects());
assertEquals("Project1 must be referenced by Project0", new IProject[] { project0 },
project1.getReferencingProjects());
assertEquals("Project2 must be referenced by Project1", new IProject[] { project1 },
project2.getReferencingProjects());
clearCache();
assertEquals("Project0 must not have referencing projects", EMPTY_PROJECTS, project0.getReferencingProjects());
assertEquals("Project1 must be referenced by Project0", new IProject[] { project0 },
project1.getReferencingProjects());
assertEquals("Project2 must be referenced by Project0 and Project1", new IProject[] { project0, project1 },
project2.getReferencingProjects());
}
public void testComputeProjectOrder() throws CoreException {
IProject[] allProjects = new IProject[] { project0, project1, project2 };
ProjectOrder projectOrder = getWorkspace().computeProjectOrder(allProjects);
assertEquals("Build order not defined, must return projects in default order", allProjects, projectOrder.projects);
assertFalse("No cycles", projectOrder.hasCycles);
DynamicReferenceProvider.addReference(project0, project1);
DynamicReferenceProvider.addReference(project1, project2);
clearCache();
projectOrder = getWorkspace().computeProjectOrder(allProjects);
assertEquals("Build order must be Project2, Project1, Project0",
new IProject[] { project2, project1, project0 }, projectOrder.projects);
assertFalse("No cycles", projectOrder.hasCycles);
DynamicReferenceProvider.clear();
DynamicReferenceProvider.addReference(project1, project0);
DynamicReferenceProvider.addReference(project0, project2);
clearCache();
projectOrder = getWorkspace().computeProjectOrder(allProjects);
assertEquals("Build order must be Project2, Project0, Project1",
new IProject[] { project2, project0, project1 }, projectOrder.projects);
assertFalse("No cycles", projectOrder.hasCycles);
}
public void testBug543776() throws CoreException {
IFile projectFile = project0.getFile(IProjectDescription.DESCRIPTION_FILE_NAME);
String projectDescription = readStringInFileSystem(projectFile);
projectDescription = projectDescription.replace(PROJECT_0_NAME, "anotherName");
ensureExistsInWorkspace(projectFile, projectDescription);
project0.delete(false, true, null);
project0.create(null);
project0.open(null);
assertEquals(PROJECT_0_NAME, project0.getName());
assertEquals("anotherName", project0.getDescription().getName());
DynamicReferenceProvider.addReference(project0, project1);
clearCache();
assertEquals("Project0 must reference Project1", new IProject[] { project1 }, project0.getReferencedProjects());
}
private void clearCache() {
project0.clearCachedDynamicReferences();
project1.clearCachedDynamicReferences();
project2.clearCachedDynamicReferences();
}
public static final class Builder extends IncrementalProjectBuilder {
public static final String NAME = "org.eclipse.core.tests.resources.dynamicProjectReferenceBuilder";
@Override
protected IProject[] build(int kind, Map<String, String> args, IProgressMonitor monitor) throws CoreException {
return null;
}
}
public static final class DynamicReferenceProvider implements IDynamicReferenceProvider
{
private static final Map<IProject, List<IProject>> dependentProjects = new HashMap<>();
@Override
public List<IProject> getDependentProjects(IBuildConfiguration buildConfiguration) throws CoreException {
IProject project = buildConfiguration.getProject();
List<IProject> depProjects = dependentProjects.get(project);
if (depProjects != null) {
return depProjects;
}
return Collections.emptyList();
}
public static void addReference(IProject project, IProject dependentProject) {
List<IProject> depProjects = dependentProjects.computeIfAbsent(project, proj -> new ArrayList<>());
depProjects.add(dependentProject);
}
public static void clear() {
dependentProjects.clear();
}
}
}