blob: 479d8c789b28e11463364b5d30e574bc6672e067 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2015 IBM 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:
* IBM - Initial API and implementation
* Alexander Kurtakov <akurtako@redhat.com> - Bug 459343
*******************************************************************************/
package org.eclipse.core.tests.resources;
import java.util.HashMap;
import java.util.Map;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.internal.events.BuildCommand;
import org.eclipse.core.internal.resources.Project;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.tests.internal.builders.CustomTriggerBuilder;
/**
* Tests protocol of IProjectDescription and other specified behavior
* that relates to the project description.
*/
public class IProjectDescriptionTest extends ResourceTest {
public static Test suite() {
return new TestSuite(IProjectDescriptionTest.class);
}
public IProjectDescriptionTest() {
super();
}
public IProjectDescriptionTest(String name) {
super(name);
}
public void testDescriptionConstant() {
assertEquals("1.0", ".project", IProjectDescription.DESCRIPTION_FILE_NAME);
}
/**
* Tests that setting the build spec preserves any instantiated builder.
*/
public void testBuildSpecBuilder() throws Exception {
Project project = (Project) getWorkspace().getRoot().getProject("ProjectTBSB");
ensureExistsInWorkspace(project, true);
project.refreshLocal(IResource.DEPTH_INFINITE, null);
IFile descriptionFile = project.getFile(IProjectDescription.DESCRIPTION_FILE_NAME);
assertTrue("1.0", descriptionFile.exists());
// Add a builder to the build command.
IProjectDescription desc = project.getDescription();
ICommand command = desc.newCommand();
command.setBuilderName(CustomTriggerBuilder.BUILDER_NAME);
desc.setBuildSpec(new ICommand[] {command});
project.setDescription(desc, null);
project.build(IncrementalProjectBuilder.FULL_BUILD, null);
// Get a non-cloned version of the project desc build spec, and check for the builder
assertTrue("2.0", ((BuildCommand) project.internalGetDescription().getBuildSpec(false)[0]).getBuilders() != null);
// Now reset the build command. The builder shouldn't disappear.
desc = project.getDescription();
desc.setBuildSpec(new ICommand[] {command});
project.setDescription(desc, null);
// builder should still be there
assertTrue("3.0", ((BuildCommand) project.internalGetDescription().getBuildSpec(false)[0]).getBuilders() != null);
}
/**
* Tests that the description file is not dirtied if the description has not actually
* changed.
*/
public void testDirtyDescription() {
IProject project = getWorkspace().getRoot().getProject("Project");
IProject target1 = getWorkspace().getRoot().getProject("target1");
IProject target2 = getWorkspace().getRoot().getProject("target2");
ensureExistsInWorkspace(project, true);
IFile descriptionFile = project.getFile(IProjectDescription.DESCRIPTION_FILE_NAME);
assertTrue("1.0", descriptionFile.exists());
long timestamp = descriptionFile.getLocalTimeStamp();
try {
//wait a bit to ensure that timestamp granularity does not
//spoil our test
Thread.sleep(1000);
} catch (InterruptedException e1) {
fail("1.99", e1);
}
try {
IProjectDescription description = project.getDescription();
description.setBuildSpec(description.getBuildSpec());
description.setComment(description.getComment());
description.setDynamicReferences(description.getDynamicReferences());
description.setLocation(description.getLocation());
description.setName(description.getName());
description.setNatureIds(description.getNatureIds());
description.setReferencedProjects(description.getReferencedProjects());
project.setDescription(description, IResource.NONE, null);
} catch (CoreException e) {
fail("2.99", e);
}
//the timestamp should be the same
assertEquals("2.0", timestamp, descriptionFile.getLocalTimeStamp());
//adding a dynamic reference should not dirty the file
try {
IProjectDescription description = project.getDescription();
description.setDynamicReferences(new IProject[] {target1, target2});
project.setDescription(description, IResource.NONE, null);
} catch (CoreException e) {
fail("3.99", e);
}
assertEquals("2.1", timestamp, descriptionFile.getLocalTimeStamp());
}
/**
* Tests that the description file is dirtied if the description has actually
* changed. This is a regression test for bug 64128.
*/
public void testDirtyBuildSpec() {
IProject project = getWorkspace().getRoot().getProject("Project");
IFile projectDescription = project.getFile(IProjectDescription.DESCRIPTION_FILE_NAME);
ensureExistsInWorkspace(project, true);
String key = "key";
String value1 = "value1";
String value2 = "value2";
try {
IProjectDescription description = project.getDescription();
ICommand newCommand = description.newCommand();
Map<String, String> args = new HashMap<>();
args.put(key, value1);
newCommand.setArguments(args);
description.setBuildSpec(new ICommand[] {newCommand});
project.setDescription(description, IResource.NONE, null);
} catch (CoreException e) {
fail("1.99", e);
}
//changing a build command argument should dirty the description file
long modificationStamp = projectDescription.getModificationStamp();
try {
IProjectDescription description = project.getDescription();
ICommand command = description.getBuildSpec()[0];
Map<String, String> args = command.getArguments();
args.put(key, value2);
command.setArguments(args);
description.setBuildSpec(new ICommand[] {command});
project.setDescription(description, IResource.NONE, null);
} catch (CoreException e) {
fail("2.99", e);
}
assertTrue("3.0", modificationStamp != projectDescription.getModificationStamp());
}
public void testDynamicProjectReferences() {
IProject target1 = getWorkspace().getRoot().getProject("target1");
IProject target2 = getWorkspace().getRoot().getProject("target2");
ensureExistsInWorkspace(target1, true);
ensureExistsInWorkspace(target2, true);
IProject project = getWorkspace().getRoot().getProject("project");
ensureExistsInWorkspace(project, true);
IProjectDescription description = null;
try {
description = project.getDescription();
} catch (CoreException e) {
fail("1.0", e);
}
description.setReferencedProjects(new IProject[] {target1});
description.setDynamicReferences(new IProject[] {target2});
try {
project.setDescription(description, getMonitor());
} catch (CoreException e) {
fail("2.0", e);
}
IProject[] refs = null;
try {
refs = project.getReferencedProjects();
} catch (CoreException e2) {
fail("2.99", e2);
}
assertEquals("2.1", 2, refs.length);
assertEquals("2.2", target1, refs[0]);
assertEquals("2.3", target2, refs[1]);
assertEquals("2.4", 1, target1.getReferencingProjects().length);
assertEquals("2.5", 1, target2.getReferencingProjects().length);
//get references for a non-existent project
try {
getWorkspace().getRoot().getProject("DoesNotExist").getReferencedProjects();
fail("3.0");
} catch (CoreException e1) {
//should fail
}
}
/**
* Tests IProjectDescription project references
*/
public void testProjectReferences() {
IProject target = getWorkspace().getRoot().getProject("Project1");
ensureExistsInWorkspace(target, true);
IProject project = getWorkspace().getRoot().getProject("Project2");
ensureExistsInWorkspace(project, true);
try {
project.open(getMonitor());
} catch (CoreException e) {
fail("0.0", e);
}
IProjectDescription description = null;
try {
description = project.getDescription();
} catch (CoreException e) {
fail("1.0", e);
}
description.setReferencedProjects(new IProject[] {target});
try {
project.setDescription(description, getMonitor());
} catch (CoreException e) {
fail("2.0", e);
}
assertEquals("2.1", 1, target.getReferencingProjects().length);
//get references for a non-existent project
try {
getWorkspace().getRoot().getProject("DoesNotExist").getReferencedProjects();
fail("3.0");
} catch (CoreException e1) {
//should fail
}
//get referencing projects for a non-existent project
IProject[] refs = getWorkspace().getRoot().getProject("DoesNotExist2").getReferencingProjects();
assertEquals("4.0", 0, refs.length);
}
}