blob: 3c5852c9f4ccd948503238d7435d4674cbd01932 [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 junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.internal.resources.BuildConfiguration;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.tests.resources.ResourceTest;
/**
* Test project variant references
*/
public class ProjectReferencesTest extends ResourceTest {
public static Test suite() {
return new TestSuite(ProjectReferencesTest.class);
}
private IProject project0;
private IProject project1;
private IProject project2;
private IProject project3;
private IBuildConfiguration project0v0;
private IBuildConfiguration project0v1;
private IBuildConfiguration project1v0;
private IBuildConfiguration project1v1;
private IBuildConfiguration project2v0;
private IBuildConfiguration project3v0;
private IBuildConfiguration project3v1;
private String bc0 = "Variant0";
private String bc1 = "Variant1";
private String nonExistentBC = "foo";
public ProjectReferencesTest(String name) {
super(name);
}
@Override
public void setUp() throws Exception {
project0 = getWorkspace().getRoot().getProject("ProjectReferencesTest_p0");
project1 = getWorkspace().getRoot().getProject("ProjectReferencesTest_p1");
project2 = getWorkspace().getRoot().getProject("ProjectReferencesTest_p2");
project3 = getWorkspace().getRoot().getProject("ProjectReferencesTest_p3");
ensureExistsInWorkspace(new IProject[] {project0, project1, project2, project3}, true);
setUpVariants(project0);
setUpVariants(project1);
setUpVariants(project2);
setUpVariants(project3);
project0v0 = new BuildConfiguration(project0, bc0);
project0v1 = new BuildConfiguration(project0, bc1);
project1v0 = new BuildConfiguration(project1, bc0);
project1v1 = new BuildConfiguration(project1, bc1);
project2v0 = new BuildConfiguration(project2, bc0);
project3v0 = new BuildConfiguration(project3, bc0);
project3v1 = new BuildConfiguration(project3, bc1);
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
// clean-up resources
project0.delete(true, null);
project1.delete(true, null);
project2.delete(true, null);
project3.delete(true, null);
}
/**
* Returns a reference to the active build configuration
* @param project
* @return
*/
private IBuildConfiguration getRef(IProject project) {
return new BuildConfiguration(project, null);
}
/**
* Create 2 build configurations bc0 and bc1 on each project
* @param project
* @throws CoreException
*/
private void setUpVariants(IProject project) throws CoreException {
IProjectDescription desc = project.getDescription();
desc.setBuildConfigs(new String[] {bc0, bc1});
project.setDescription(desc, getMonitor());
}
public void testAddReferencesToNonExistantConfigs() throws CoreException {
IProjectDescription desc = project0.getDescription();
assertFalse("1.0", project0.hasBuildConfig(nonExistentBC));
desc.setBuildConfigReferences(nonExistentBC, new IBuildConfiguration[] {project1v0});
project0.setDescription(desc, getMonitor());
assertFalse("2.0", project0.hasBuildConfig(nonExistentBC));
assertEquals("3.1", new IBuildConfiguration[0], desc.getBuildConfigReferences(nonExistentBC));
try {
project0.getReferencedBuildConfigs(nonExistentBC, true);
fail("3.2");
} catch (CoreException e) {
}
}
/**
* Tests that setting re-setting build configurations doesn't perturb the existing
* configuration level references.
*
* Removing a build configuration removes associated build configuration references
* @throws CoreException
*/
public void testChangingBuildConfigurations() throws CoreException {
IProjectDescription desc = project0.getDescription();
IBuildConfiguration[] refs = new IBuildConfiguration[] {project0v1, project1v0};
IBuildConfiguration[] refs2 = new IBuildConfiguration[] {project1v1, project1v0};
// Set some references
desc.setBuildConfigReferences(project0v0.getName(), refs);
desc.setBuildConfigReferences(project0v1.getName(), refs2);
project0.setDescription(desc, getMonitor());
// Check build configa
desc = project0.getDescription();
assertEquals("1.0", refs, desc.getBuildConfigReferences(project0v0.getName()));
assertEquals("1.1", refs2, desc.getBuildConfigReferences(project0v1.getName()));
// Resetting the build configs doesn't change anything
desc.setBuildConfigs(new String[] {project0v0.getName(), project0v1.getName()});
project0.setDescription(desc, getMonitor());
desc = project0.getDescription();
assertEquals("2.0", refs, desc.getBuildConfigReferences(project0v0.getName()));
assertEquals("2.1", refs2, desc.getBuildConfigReferences(project0v1.getName()));
// Removing a build configuration removes the references
desc.setBuildConfigs(new String[] {project0v0.getName()});
project0.setDescription(desc, getMonitor());
desc = project0.getDescription();
assertEquals("3.0", refs, desc.getBuildConfigReferences(project0v0.getName()));
assertEquals("3.1", new IBuildConfiguration[0], desc.getBuildConfigReferences(project0v1.getName()));
// Re-adding a build configuration doesn't make references re-appear
desc.setBuildConfigs(new String[] {project0v0.getName()});
project0.setDescription(desc, getMonitor());
desc = project0.getDescription();
assertEquals("4.0", refs, desc.getBuildConfigReferences(project0v0.getName()));
assertEquals("4.1", new IBuildConfiguration[0], desc.getBuildConfigReferences(project0v1.getName()));
}
/**
* Tests that setting build configuration level dynamic references
* trumps the project level dynamic references when it comes to order.
* @throws CoreException
*/
public void testMixedProjectAndBuildConfigRefs() throws CoreException {
// Set project variant references
IProjectDescription desc = project0.getDescription();
desc.setDynamicReferences(new IProject[] {project1, project3});
project0.setDescription(desc, getMonitor());
// Check getters
desc = project0.getDescription();
assertEquals("1.1", new IProject[] {project1, project3}, desc.getDynamicReferences());
assertEquals("1.2", new IBuildConfiguration[] {}, desc.getBuildConfigReferences(project0v0.getName()));
assertEquals("1.3", new IBuildConfiguration[] {}, desc.getBuildConfigReferences(project0v1.getName()));
assertEquals("1.4", new IBuildConfiguration[] {project1.getActiveBuildConfig(), project3.getActiveBuildConfig()}, project0.getReferencedBuildConfigs(project0v0.getName(), false));
assertEquals("1.5", new IBuildConfiguration[] {project1.getActiveBuildConfig(), project3.getActiveBuildConfig()}, project0.getReferencedBuildConfigs(project0v1.getName(), false));
// Now set dynamic references on config1
desc.setBuildConfigReferences(project0v0.getName(), new IBuildConfiguration[] {project3v1, project2v0, project1v0});
project0.setDescription(desc, getMonitor());
// Check references
// This is deterministic as config0 is listed first, so we expect its config order to trump cofig1's
desc = project0.getDescription();
assertEquals("2.1", new IProject[] {project1, project3}, desc.getDynamicReferences());
assertEquals("2.2", new IBuildConfiguration[] {project3v1, project2v0, project1v0}, desc.getBuildConfigReferences(project0v0.getName()));
// Now at the project leve
assertEquals("2.3", new IBuildConfiguration[] {project3v1, project2v0, project1v0, project3v0}, project0.getReferencedBuildConfigs(project0v0.getName(), false));
assertEquals("2.4", new IBuildConfiguration[] {project1.getActiveBuildConfig(), project3.getActiveBuildConfig()}, project0.getReferencedBuildConfigs(project0v1.getName(), false));
}
public void testSetAndGetProjectReferences() throws CoreException {
// Set project references
IProjectDescription desc = project0.getDescription();
desc.setReferencedProjects(new IProject[] {project3, project1});
desc.setDynamicReferences(new IProject[] {project1, project2});
project0.setDescription(desc, getMonitor());
desc = project1.getDescription();
desc.setReferencedProjects(new IProject[] {project0});
desc.setDynamicReferences(new IProject[] {});
project1.setDescription(desc, getMonitor());
desc = project2.getDescription();
desc.setReferencedProjects(new IProject[] {});
desc.setDynamicReferences(new IProject[] {});
project2.setDescription(desc, getMonitor());
desc = project3.getDescription();
desc.setReferencedProjects(new IProject[] {});
desc.setDynamicReferences(new IProject[] {project0});
project3.setDescription(desc, getMonitor());
// Test getters
desc = project0.getDescription();
assertEquals("1.0", new IProject[] {project3, project1}, desc.getReferencedProjects());
assertEquals("1.1", new IProject[] {project1, project2}, desc.getDynamicReferences());
assertEquals("1.3", new IBuildConfiguration[] {}, desc.getBuildConfigReferences(bc0));
assertEquals("2.0", new IProject[] {project3, project1, project2}, project0.getReferencedProjects());
assertEquals("2.1", new IProject[] {project1, project3}, project0.getReferencingProjects());
assertEquals("2.2", new IBuildConfiguration[] {project3v0, project1v0, project2v0}, project0.getReferencedBuildConfigs(project0v0.getName(), true));
}
public void testSetAndGetProjectConfigReferences() throws CoreException {
// Set project variant references
IProjectDescription desc = project0.getDescription();
// 1 static reference
desc.setReferencedProjects(new IProject[] {project1});
// 1 dynamic project-level reference
desc.setDynamicReferences(new IProject[] {project3});
// config level references
desc.setBuildConfigReferences(bc0, new IBuildConfiguration[] {project2v0, project1v0});
desc.setBuildConfigReferences(bc1, new IBuildConfiguration[] {project2v0});
project0.setDescription(desc, getMonitor());
desc = project1.getDescription();
desc.setReferencedProjects(new IProject[] {project0});
desc.setBuildConfigReferences(bc0, new IBuildConfiguration[] {project0v1});
desc.setBuildConfigReferences(bc1, new IBuildConfiguration[] {});
project1.setDescription(desc, getMonitor());
desc = project3.getDescription();
desc.setBuildConfigReferences(bc0, new IBuildConfiguration[] {project0v1});
desc.setBuildConfigReferences(bc1, new IBuildConfiguration[] {});
project3.setDescription(desc, getMonitor());
// Check getters
desc = project0.getDescription();
assertEquals("1.0", new IProject[] {project1}, desc.getReferencedProjects());
assertEquals("1.1", new IProject[] {project3}, desc.getDynamicReferences());
assertEquals("1.3", new IBuildConfiguration[] {project2v0, project1v0}, desc.getBuildConfigReferences(bc0));
assertEquals("1.5", new IBuildConfiguration[] {project2v0}, desc.getBuildConfigReferences(bc1));
assertEquals("2.0", new IProject[] {project2, project1, project3}, project0.getReferencedProjects());
assertEquals("2.1", new IProject[] {project1, project3}, project0.getReferencingProjects());
assertEquals("2.2", new IBuildConfiguration[] {project2v0, project1v0, project3.getActiveBuildConfig()}, project0.getReferencedBuildConfigs(project0v0.getName(), true));
assertEquals("2.3", new IBuildConfiguration[] {project2v0, project1.getActiveBuildConfig(), project3.getActiveBuildConfig()}, project0.getReferencedBuildConfigs(project0v1.getName(), true));
}
public void testReferencesToActiveConfigs() throws CoreException {
IProjectDescription desc = project0.getDescription();
desc.setBuildConfigReferences(bc0, new IBuildConfiguration[] {getRef(project1)});
project0.setDescription(desc, getMonitor());
assertEquals("1.0", new IBuildConfiguration[] {getRef(project1)}, desc.getBuildConfigReferences(bc0));
assertEquals("1.1", new IBuildConfiguration[] {project1v0}, project0.getReferencedBuildConfigs(project0v0.getName(), true));
}
}