blob: 8d7eb2bcbadcfca9bad09dfafedb4e1c85e02bd0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2017 IBM Corporation 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:
* IBM Corporation - initial API and implementation
* James Blackburn (Broadcom Corp.) - ongoing development
*******************************************************************************/
package org.eclipse.core.tests.internal.alias;
import java.net.URI;
import java.util.Arrays;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.internal.resources.*;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.core.tests.internal.filesystem.wrapper.WrapperFileSystem;
import org.eclipse.core.tests.resources.ResourceTest;
/**
* Tests basic API methods in the face of aliased resources, and ensures that
* nothing is ever out of sync.
*/
public class BasicAliasTest extends ResourceTest {
//resource handles (p=project, f=folder, l=file)
private IProject pNoOverlap;
private IProject pOverlap;
private IProject pLinked;
private IFolder fOverlap;
private IFile lChildOverlap;
private IFile lOverlap;
private IFolder fLinked;
private IFolder fLinkOverlap1;
private IFolder fLinkOverlap2;
private IFile lLinked;
private IFile lChildLinked;
private IPath linkOverlapLocation;
public static Test suite() {
return new TestSuite(BasicAliasTest.class);
// TestSuite suite = new TestSuite();
// suite.addTest(new BasicAliasTest("testDeepLink"));
// suite.addTest(new BasicAliasTest("testCreateDeleteLink"));
// return suite;
}
public BasicAliasTest() {
super();
}
public BasicAliasTest(String name) {
super(name);
}
/**
* Asserts that the two given resources are duplicates in the file system.
* Asserts that both have same location, and same members. Also asserts
* that both resources are in sync with the file system. The resource names
* in the tree may be different. The resources may not necessarily exist.
*/
public void assertOverlap(String message, IResource resource1, IResource resource2) {
String errMsg = message + resource1.getFullPath().toString();
assertEquals(errMsg + "(location)", resource1.getLocation(), resource2.getLocation());
assertTrue(errMsg + "(sync)", resource1.isSynchronized(IResource.DEPTH_ZERO));
assertTrue(errMsg + "(sync)", resource2.isSynchronized(IResource.DEPTH_ZERO));
IResource[] children1 = null;
IResource[] children2 = null;
try {
children1 = getSortedChildren(resource1);
children2 = getSortedChildren(resource2);
} catch (CoreException e) {
fail(errMsg, e);
}
assertEquals(errMsg + "(child count)", children1.length, children2.length);
for (int i = 0; i < children2.length; i++) {
assertOverlap(message, children1[i], children2[i]);
}
}
/**
* Returns the children of the given resource, sorted in a consistent
* alphabetical order.
*/
private IResource[] getSortedChildren(IResource resource) throws CoreException {
if (!(resource instanceof IContainer)) {
return new IResource[0];
}
IResource[] children = ((IContainer) resource).members();
Arrays.sort(children, (arg0, arg1) -> arg0.getFullPath().toString().compareTo(arg1.getFullPath().toString()));
return children;
}
@Override
protected void setUp() throws Exception {
super.setUp();
IWorkspaceRoot root = getWorkspace().getRoot();
//project with no overlap
pNoOverlap = root.getProject("NoOverlap");
ensureExistsInWorkspace(pNoOverlap, true);
ensureExistsInWorkspace(buildResources(pNoOverlap, new String[] {"/1/", "/1/1", "/1/2", "/2/", "/2/1"}), true);
//project with overlap
pOverlap = root.getProject("Overlap");
ensureExistsInWorkspace(pOverlap, true);
fOverlap = pOverlap.getFolder("fOverlap");
IFolder f2 = pOverlap.getFolder("F2");
lOverlap = f2.getFile("lOverlap");
lChildOverlap = fOverlap.getFile("lChildOverlap");
ensureExistsInWorkspace(new IResource[] {fOverlap, f2, lOverlap, lChildOverlap}, true);
//create some other random child elements
ensureExistsInWorkspace(buildResources(pOverlap, new String[] {"/1/", "/1/1", "/1/2"}), true);
ensureExistsInWorkspace(buildResources(f2, new String[] {"/1/", "/1/1", "/1/2"}), true);
ensureExistsInWorkspace(buildResources(fOverlap, new String[] {"/1/", "/1/1", "/1/2"}), true);
//create links
pLinked = root.getProject("LinkProject");
ensureExistsInWorkspace(pLinked, true);
fLinked = pLinked.getFolder("LinkedFolder");
fLinkOverlap1 = pLinked.getFolder("LinkOverlap1");
fLinkOverlap2 = pLinked.getFolder("LinkOverlap2");
lLinked = pLinked.getFile("LinkedFile");
lChildLinked = fLinked.getFile(lChildOverlap.getName());
fLinked.createLink(fOverlap.getLocation(), IResource.NONE, null);
lLinked.createLink(lOverlap.getLocation(), IResource.NONE, null);
ensureExistsInWorkspace(lChildLinked, true);
ensureExistsInWorkspace(buildResources(pLinked, new String[] {"/a/", "/a/a", "/a/b"}), true);
ensureExistsInWorkspace(buildResources(fLinked, new String[] {"/a/", "/a/a", "/a/b"}), true);
linkOverlapLocation = getRandomLocation();
linkOverlapLocation.toFile().mkdirs();
fLinkOverlap1.createLink(linkOverlapLocation, IResource.NONE, null);
fLinkOverlap2.createLink(linkOverlapLocation, IResource.NONE, null);
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
Workspace.clear(linkOverlapLocation.toFile());
}
/**
* This tests regression of bug 32785. In this bug, moving a linked folder,
* then copying a linked folder, resulted in the alias table having a stale entry
*/
public void testBug32785() {
IProject project = pNoOverlap;
IFolder link = project.getFolder("Source");
IFile child = link.getFile("Child.txt");
IPath location = getRandomLocation();
location.toFile().mkdirs();
try {
try {
link.createLink(location, IResource.NONE, getMonitor());
ensureExistsInWorkspace(child, getRandomContents());
} catch (CoreException e) {
fail("1.99", e);
}
//move the link (rename)
IFolder movedLink = project.getFolder("MovedLink");
try {
link.move(movedLink.getFullPath(), IResource.SHALLOW, getMonitor());
} catch (CoreException e) {
fail("2.99", e);
}
assertTrue("3.0", !link.exists());
assertTrue("3.1", movedLink.exists());
assertEquals("3.2", location, movedLink.getLocation());
assertTrue("3.3", movedLink.isSynchronized(IResource.DEPTH_INFINITE));
//now copy the moved link
IFolder copiedLink = project.getFolder("CopiedLink");
try {
movedLink.copy(copiedLink.getFullPath(), IResource.SHALLOW, getMonitor());
} catch (CoreException e) {
fail("3.99", e);
}
assertTrue("4.0", !link.exists());
assertTrue("4.1", movedLink.exists());
assertTrue("4.2", copiedLink.exists());
assertEquals("4.3", location, movedLink.getLocation());
assertEquals("4.4", location, copiedLink.getLocation());
assertTrue("4.5", movedLink.isSynchronized(IResource.DEPTH_INFINITE));
assertTrue("4.6", copiedLink.isSynchronized(IResource.DEPTH_INFINITE));
} finally {
Workspace.clear(location.toFile());
}
}
/**
* Regression test for bug 156082. A project has aliases to multiple
* other projects, but the other projects don't overlap each other. I.e.,
* Project Top overlaps Sub1 and Sub2, but Sub1 and Sub2 do not overlap each other.
*/
public void testBug156082() {
IProject top = getWorkspace().getRoot().getProject("Bug156082_Top");
IProject sub1 = getWorkspace().getRoot().getProject("Bug156082_Sub1");
IProject sub2 = getWorkspace().getRoot().getProject("Bug156082_Sub2");
ensureExistsInWorkspace(top, true);
IProjectDescription desc1 = getWorkspace().newProjectDescription(sub1.getName());
desc1.setLocation(top.getLocation().append(sub1.getName()));
IProjectDescription desc2 = getWorkspace().newProjectDescription(sub2.getName());
desc2.setLocation(top.getLocation().append(sub2.getName()));
try {
sub1.create(desc1, getMonitor());
sub1.open(getMonitor());
sub2.create(desc2, getMonitor());
sub2.open(getMonitor());
} catch (CoreException e) {
fail("0.99", e);
}
IFile sub2File = sub2.getFile("file.txt");
IFile topFile = top.getFolder(sub2.getName()).getFile(sub2File.getName());
ensureExistsInWorkspace(sub2File, getRandomContents());
assertTrue("1.0", topFile.exists());
}
/**
* Regression test for bug 198571. Device ids should be respected by the comparator
* used in the locations map of AliasManager.
*/
public void testBug198571() {
if (!isWindows()) {
return;
}
/* look for the adequate environment */
String[] devices = findAvailableDevices();
if (devices[0] == null || devices[1] == null) {
return;
}
String location = getUniqueString();
IProject testProject1 = getWorkspace().getRoot().getProject(location + "1");
IProject testProject2 = getWorkspace().getRoot().getProject(location + "2");
// the projects have the same segments but different id
IProjectDescription desc1 = getWorkspace().newProjectDescription(testProject1.getName());
IPath location1 = new Path(devices[0] + location);
assertTrue("0.1", !location1.toFile().exists());
desc1.setLocation(location1);
IProjectDescription desc2 = getWorkspace().newProjectDescription(testProject2.getName());
IPath location2 = new Path(devices[1] + location);
assertTrue("0.2", !location2.toFile().exists());
desc2.setLocation(location2);
try {
try {
testProject1.create(desc1, getMonitor());
testProject1.open(getMonitor());
testProject2.create(desc2, getMonitor());
testProject2.open(getMonitor());
} catch (CoreException e) {
fail("1.0", e);
}
final AliasManager aliasManager = ((Workspace) getWorkspace()).getAliasManager();
//force AliasManager to restart (simulates a shutdown/startup)
aliasManager.startup(null);
// new folder in one of the projects
IFolder folder = testProject2.getFolder("NewFolder");
ensureExistsInFileSystem(folder);
try {
testProject2.refreshLocal(IResource.DEPTH_INFINITE, null);
IResource[] resources = aliasManager.computeAliases(folder, ((Folder) folder).getStore());
assertNull(resources);
} catch (CoreException e) {
fail("2.0", e);
}
} finally {
//make sure we don't leave behind a mess on the test machine
clear(EFS.getLocalFileSystem().getStore(location1));
clear(EFS.getLocalFileSystem().getStore(location2));
}
}
private void replaceProject(IProject project, URI newLocation) throws CoreException {
IProjectDescription projectDesc = project.getDescription();
projectDesc.setLocationURI(newLocation);
project.move(projectDesc, IResource.REPLACE, null);
}
public void testBug256837() {
final AliasManager aliasManager = ((Workspace) getWorkspace()).getAliasManager();
//force AliasManager to restart (simulates a shutdown/startup)
aliasManager.startup(null);
IWorkspaceRoot root = getWorkspace().getRoot();
IProject p1 = root.getProject(getUniqueString());
IProject p2 = root.getProject(getUniqueString());
ensureExistsInWorkspace(new IResource[] {p1, p2}, true);
IFileStore tempStore = null;
try {
tempStore = getTempStore();
tempStore.mkdir(EFS.NONE, getMonitor());
} catch (CoreException e1) {
fail("1.0", e1);
}
try {
replaceProject(p2, WrapperFileSystem.getWrappedURI(p2.getLocationURI()));
} catch (CoreException e) {
fail("2.0", e);
}
IFolder link2TempFolder = p1.getFolder("link2TempFolder");
try {
link2TempFolder.createLink(tempStore.toURI(), IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("3.0", e);
}
// change the location of p2 project to the temp folder
try {
replaceProject(p2, tempStore.toURI());
} catch (CoreException e) {
fail("4.0", e);
}
// now p2 and link2TempFolder should be aliases
IResource[] resources = aliasManager.computeAliases(link2TempFolder, ((Folder) link2TempFolder).getStore());
assertEquals("5.0", 1, resources.length);
assertEquals("6.0", p2, resources[0]);
resources = aliasManager.computeAliases(p2, ((Project) p2).getStore());
assertEquals("7.0", 1, resources.length);
assertEquals("8.0", link2TempFolder, resources[0]);
}
public void testBug258987() {
// Create the directory to which you will link. The directory needs a single file.
IFileStore dirStore = getTempStore();
try {
dirStore.mkdir(EFS.NONE, getMonitor());
} catch (CoreException e) {
fail("1.0", e);
}
assertTrue("2.0", dirStore.fetchInfo().exists());
assertTrue("3.0", dirStore.fetchInfo().isDirectory());
IFileStore childStore = dirStore.getChild("child");
createFileInFileSystem(childStore);
assertTrue("4.0", childStore.fetchInfo().exists());
// Create and open the first project. Project links to the directory.
IProject project1 = ResourcesPlugin.getWorkspace().getRoot().getProject("project1");
IFolder folder1 = null;
try {
project1.create(getMonitor());
project1.open(getMonitor());
folder1 = project1.getFolder("subdir");
folder1.createLink(dirStore.toURI(), IResource.REPLACE, getMonitor());
} catch (CoreException e) {
fail("5.0", e);
}
// Create and open the second project. It also links to the directory.
IProject project2 = ResourcesPlugin.getWorkspace().getRoot().getProject("project2");
IFolder folder2 = null;
try {
project2.create(getMonitor());
project2.open(getMonitor());
folder2 = project2.getFolder("subdir");
folder2.createLink(dirStore.toURI(), IResource.REPLACE, getMonitor());
} catch (CoreException e) {
fail("6.0", e);
}
// Close the second project.
try {
project2.close(getMonitor());
} catch (CoreException e) {
fail("7.0", e);
}
// Since project2 is closed, folder2 should not be an alias for folder1 anymore
IResource[] resources = ((Workspace) getWorkspace()).getAliasManager().computeAliases(folder1, ((Folder) folder1).getStore());
assertNull("8.0", resources);
}
public void testCloseOpenProject() {
//close the project and make sure aliases in that project are no longer updated
try {
pOverlap.close(getMonitor());
IFile linkFile = fLinked.getFile("ChildFile.txt");
linkFile.create(getRandomContents(), IResource.NONE, getMonitor());
IFile closedFile = fOverlap.getFile(linkFile.getName());
assertTrue("1.0", !closedFile.exists());
pOverlap.open(IResource.NONE, getMonitor());
//should a refresh be needed when a project has been changed while it was closed?
pOverlap.refreshLocal(IResource.DEPTH_INFINITE, getMonitor());
assertTrue("1.1", closedFile.exists());
} catch (CoreException e) {
fail("4.99", e);
}
}
/**
* Tests adding a file to a duplicate region by copying.
*/
public void testCopyFile() {
IFile sourceFile = pNoOverlap.getFile("CopySource");
ensureExistsInWorkspace(sourceFile, true);
//file in linked folder
try {
IFile linkDest = fLinked.getFile("CopyDestination");
IFile overlapDest = fOverlap.getFile(linkDest.getName());
sourceFile.copy(linkDest.getFullPath(), IResource.NONE, getMonitor());
assertTrue("1.1", linkDest.exists());
assertTrue("1.2", overlapDest.exists());
assertOverlap("1.3", linkDest, overlapDest);
linkDest.delete(IResource.NONE, getMonitor());
assertTrue("1.4", !linkDest.exists());
assertTrue("1.5", !overlapDest.exists());
assertOverlap("1.6", linkDest, overlapDest);
} catch (CoreException e) {
fail("1.99", e);
}
//duplicate file
try {
IFile linkDest = lLinked;
IFile overlapDest = lOverlap;
//first delete the file, then copy it back
overlapDest.delete(IResource.NONE, getMonitor());
//the link will still exist, but the location won't
assertTrue("2.1", linkDest.exists());
assertTrue("2.2", !overlapDest.exists());
assertTrue("2.3", !linkDest.getLocation().toFile().exists());
assertEquals("2.4", linkDest.getLocation(), overlapDest.getLocation());
sourceFile.copy(overlapDest.getFullPath(), IResource.NONE, getMonitor());
assertTrue("2.4", linkDest.exists());
assertTrue("2.5", overlapDest.exists());
assertOverlap("2.6", linkDest, overlapDest);
} catch (CoreException e) {
fail("2.99", e);
}
//file in duplicate folder
try {
IFile linkDest = fLinked.getFile("CopyDestination");
IFile overlapDest = fOverlap.getFile(linkDest.getName());
sourceFile.copy(overlapDest.getFullPath(), IResource.NONE, getMonitor());
assertTrue("3.1", linkDest.exists());
assertTrue("3.2", overlapDest.exists());
assertOverlap("3.3", linkDest, overlapDest);
overlapDest.delete(IResource.NONE, getMonitor());
assertTrue("3.4", !linkDest.exists());
assertTrue("3.5", !overlapDest.exists());
assertOverlap("3.6", linkDest, overlapDest);
} catch (CoreException e) {
fail("3.99", e);
}
}
public void testCopyFolder() {
IFolder source = pNoOverlap.getFolder("CopyFolder");
ensureExistsInWorkspace(source, true);
IFolder destFolder1 = fLinkOverlap1.getFolder(source.getName());
IFolder destFolder2 = fLinkOverlap2.getFolder(source.getName());
IResource[] allDest = new IResource[] {destFolder1, destFolder2};
assertDoesNotExistInWorkspace("1.0", allDest);
//copy to dest 1
try {
source.copy(destFolder1.getFullPath(), IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("1.1");
}
assertExistsInWorkspace("1.2", allDest);
try {
destFolder2.delete(IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("1.3", e);
}
//copy to dest 2
try {
source.copy(destFolder2.getFullPath(), IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("1.4");
}
assertExistsInWorkspace("1.5", allDest);
try {
destFolder1.delete(IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("1.6", e);
}
}
/**
* Test copying a linked folder into a child of its alias.
*/
public void testCopyToChild() {
//copying link to child should fail
IFolder copyDest = fLinkOverlap1.getFolder("CopyDest");
try {
fLinkOverlap2.copy(copyDest.getFullPath(), IResource.NONE, getMonitor());
fail("1.0");
} catch (CoreException e) {
//should fail
}
//moving link to child should fail
try {
fLinkOverlap2.move(copyDest.getFullPath(), IResource.NONE, getMonitor());
fail("1.0");
} catch (CoreException e) {
//should fail
}
//copy to self should fail
IFolder copyDest2 = fLinkOverlap2.getFolder(copyDest.getName());
try {
copyDest.create(IResource.NONE, true, getMonitor());
} catch (CoreException e) {
fail("1.3");
}
try {
copyDest.copy(copyDest2.getFullPath(), IResource.NONE, getMonitor());
fail("1.0");
} catch (CoreException e) {
//should fail
}
//moving link to self should fail
try {
copyDest.move(copyDest2.getFullPath(), IResource.NONE, getMonitor());
fail("1.0");
} catch (CoreException e) {
//should fail
}
}
public void testCreateDeleteFile() {
//file in linked folder
try {
lChildLinked.delete(IResource.NONE, getMonitor());
assertOverlap("1.1", lChildLinked, lChildOverlap);
lChildLinked.create(getRandomContents(), IResource.NONE, getMonitor());
assertOverlap("1.2", lChildLinked, lChildOverlap);
} catch (CoreException e) {
fail("1.99", e);
}
//duplicate file
try {
lOverlap.delete(IResource.NONE, getMonitor());
assertEquals("2.0", lLinked.getLocation(), lOverlap.getLocation());
assertTrue("2.1", !lOverlap.exists());
assertTrue("2.2", !lOverlap.getLocation().toFile().exists());
assertTrue("2.3", lOverlap.isSynchronized(IResource.DEPTH_INFINITE));
//now the linked resource will still exist but its local contents won't
assertTrue("2.4", lLinked.exists());
assertTrue("2.5", !lLinked.getLocation().toFile().exists());
assertTrue("2.6", lLinked.isSynchronized(IResource.DEPTH_INFINITE));
try {
lLinked.setContents(getRandomContents(), IResource.NONE, getMonitor());
//should fail
fail("2.7");
} catch (CoreException e) {
//should fail
}
lOverlap.create(getRandomContents(), IResource.NONE, getMonitor());
assertOverlap("2.8", lLinked, lOverlap);
} catch (CoreException e) {
fail("2.99", e);
}
//file in duplicate folder
try {
lChildOverlap.delete(IResource.NONE, getMonitor());
assertOverlap("1.1", lChildLinked, lChildOverlap);
lChildOverlap.create(getRandomContents(), IResource.NONE, getMonitor());
assertOverlap("1.2", lChildLinked, lChildOverlap);
} catch (CoreException e) {
fail("3.0", e);
}
}
public void testCreateDeleteFolder() {
//folder in overlapping project
try {
fOverlap.delete(IResource.NONE, getMonitor());
//linked resources don't disappear on deletion of underlying file
assertTrue("1.0", fLinked.exists());
assertTrue("1.1", !fLinked.getLocation().toFile().exists());
fOverlap.create(IResource.NONE, true, getMonitor());
assertOverlap("1.2", fOverlap, fLinked);
} catch (CoreException e) {
fail("1.99", e);
}
//linked folder
try {
fLinked.delete(IResource.NONE, getMonitor());
//deleting a link should not delete file system contents
assertTrue("2.0", fOverlap.exists());
assertTrue("2.1", fOverlap.getLocation().toFile().exists());
fLinked.createLink(fOverlap.getLocation(), IResource.NONE, getMonitor());
assertOverlap("1.4", fOverlap, fLinked);
} catch (CoreException e) {
fail("2.99", e);
}
//child of linked folders
IFolder child1 = fLinkOverlap1.getFolder("LinkChild");
IFolder child2 = fLinkOverlap2.getFolder(child1.getName());
try {
child1.create(IResource.NONE, true, getMonitor());
assertOverlap("3.0", child1, child2);
child1.delete(IResource.NONE, getMonitor());
assertTrue("3.1", !child1.exists());
assertTrue("3.2", !child2.exists());
child2.create(IResource.NONE, true, getMonitor());
assertOverlap("3.3", child1, child2);
child2.delete(IResource.NONE, getMonitor());
assertTrue("3.4", !child1.exists());
assertTrue("3.5", !child2.exists());
} catch (CoreException e) {
fail("3.99", e);
}
}
public void testCreateDeleteLink() {
IFolder folder = pNoOverlap.getFolder("folder");
IFile folderChild = folder.getFile("Child.txt");
IFolder link = pLinked.getFolder("FolderLink");
IFile linkChild = link.getFile(folderChild.getName());
ensureExistsInWorkspace(folder, true);
ensureExistsInWorkspace(folderChild, true);
try {
link.createLink(folder.getLocationURI(), IResource.NONE, getMonitor());
assertTrue("1.0", linkChild.exists());
//manipulate file below overlapping folder and make sure alias under link is updated
folderChild.delete(IResource.NONE, getMonitor());
assertTrue("1.1", !linkChild.exists());
ensureExistsInWorkspace(folderChild, true);
assertTrue("1.2", linkChild.exists());
link.delete(IResource.NONE, getMonitor());
assertTrue("1.3", !linkChild.exists());
} catch (CoreException e) {
fail("1.99", e);
}
}
public void testDeepLink() {
IFolder folder = pNoOverlap.getFolder("folder");
IFile folderChild = folder.getFile("Child.txt");
final IFolder linkParent = pLinked.getFolder("LinkParent");
IFolder link = linkParent.getFolder("FolderLink");
IFile linkChild = link.getFile(folderChild.getName());
ensureExistsInWorkspace(new IResource[] {folder, folderChild, linkParent}, true);
try {
link.createLink(folder.getLocationURI(), IResource.NONE, getMonitor());
assertTrue("1.0", linkChild.exists());
//manipulate file below overlapping folder and make sure alias under link is updated
folderChild.delete(IResource.NONE, getMonitor());
assertTrue("1.1", !linkChild.exists());
ensureExistsInWorkspace(folderChild, true);
assertTrue("1.2", linkChild.exists());
link.delete(IResource.NONE, getMonitor());
assertTrue("1.3", !linkChild.exists());
link.createLink(folder.getLocationURI(), IResource.NONE, getMonitor());
//close and reopen the project and ensure the alias is still updated
link.getProject().close(getMonitor());
link.getProject().open(getMonitor());
folderChild.delete(IResource.NONE, getMonitor());
assertTrue("2.1", !linkChild.exists());
ensureExistsInWorkspace(folderChild, true);
assertTrue("2.2", linkChild.exists());
final AliasManager aliasManager = ((Workspace) getWorkspace()).getAliasManager();
//force AliasManager to restart (simulates a shutdown/startup)
aliasManager.startup(null);
folderChild.delete(IResource.NONE, getMonitor());
assertTrue("3.1", !linkChild.exists());
ensureExistsInWorkspace(folderChild, true);
assertTrue("3.2", linkChild.exists());
//delete the project that contains the links
IFile fileInLinkedProject = pLinked.getFile("fileInLinkedProject.txt");
createFileInFileSystem(((Resource) fileInLinkedProject).getStore(), getRandomContents());
try {
getWorkspace().getRoot().delete(IResource.NONE, getMonitor());
} catch (CoreException e) {
//failure expected here because it is out of sync
}
//ensure aliases are gone (bug 144458)
final IResource[] aliases = aliasManager.computeAliases(folder, ((Folder) folder).getStore());
if (aliases != null) {
fail("Unexpected aliases: " + Arrays.toString(aliases));
}
} catch (CoreException e) {
fail("1.99", e);
}
}
public void testCreateOpenProject() {
//test creating a project whose location is within an existing link
IProject newProject = getWorkspace().getRoot().getProject("createOpenProject");
IProjectDescription desc = getWorkspace().newProjectDescription(newProject.getName());
desc.setLocationURI(fLinkOverlap1.getLocationURI());
try {
newProject.create(desc, getMonitor());
newProject.open(getMonitor());
} catch (CoreException e) {
fail("1.99", e);
}
//.project file should now exist in link
IFile linkChild = fLinkOverlap1.getFile(IProjectDescription.DESCRIPTION_FILE_NAME);
assertTrue("1.0", linkChild.exists());
// TODO more tests
}
public void testDeepCopyLink() {
// TODO
}
public void testDeepMoveLink() {
// TODO
}
public void testDeleteLink() {
//test deletion of a link that overlaps a project location
IFolder linkOnProject = pLinked.getFolder("LinkOnProject");
try {
linkOnProject.createLink(pOverlap.getLocation(), IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("1.0", e);
}
try {
linkOnProject.delete(IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("2.0", e);
}
//deletion of a link should not delete the project that it overlaps
assertTrue("2.1", !linkOnProject.exists());
assertTrue("2.2", pOverlap.exists());
assertTrue("2.3", fOverlap.exists());
}
public void testDeleteProject() {
// TODO
}
/**
* Tests deletion of a project whose location on disk contains
* the location of another project. The nested project should
* be deleted automatically in this case.
*/
public void testDeleteProjectUnderProject() {
IProject parent = getWorkspace().getRoot().getProject("parent");
IProject child = getWorkspace().getRoot().getProject("child");
ensureExistsInWorkspace(parent, true);
IProjectDescription childDesc = getWorkspace().newProjectDescription(child.getName());
childDesc.setLocation(parent.getLocation().append(child.getName()));
try {
child.create(childDesc, getMonitor());
child.open(getMonitor());
} catch (CoreException e) {
fail("1.99", e);
}
IFolder childDirInParent = parent.getFolder(child.getName());
IFile childProjectFileInParent = childDirInParent.getFile(IProjectDescription.DESCRIPTION_FILE_NAME);
assertTrue("1.0", childDirInParent.exists());
assertTrue("1.1", childProjectFileInParent.exists());
//now delete the child and ensure the resources in the parent are gone
try {
child.delete(IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("2.99", e);
}
assertTrue("2.0", !childDirInParent.exists());
assertTrue("2.1", !childProjectFileInParent.exists());
//recreate the child and ensure resources in parent are there
try {
child.create(childDesc, getMonitor());
child.open(getMonitor());
} catch (CoreException e) {
fail("3.99", e);
}
assertTrue("3.0", childDirInParent.exists());
assertTrue("3.1", childProjectFileInParent.exists());
//delete the parent and ensure child is also deleted
try {
parent.delete(IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("4.99", e);
}
assertTrue("4.0", !parent.exists());
assertTrue("4.1", !child.exists());
assertTrue("4.2", !childDirInParent.exists());
assertTrue("4.3", !childProjectFileInParent.exists());
}
public void testDeleteProjectContents() {
//delete the overlapping project - it should delete the children of the linked folder
//but leave the actual links intact in the resource tree
try {
pOverlap.delete(IResource.ALWAYS_DELETE_PROJECT_CONTENT, getMonitor());
} catch (CoreException e) {
fail("1.0", e);
}
assertDoesNotExistInWorkspace("1.1", new IResource[] {pOverlap, fOverlap, lOverlap, lChildOverlap, lChildLinked});
assertDoesNotExistInFileSystem("1.2", new IResource[] {pOverlap, fOverlap, lOverlap, lChildOverlap, lChildLinked, lLinked, fLinked});
assertExistsInWorkspace("1.3", new IResource[] {pLinked, fLinked, lLinked});
}
public void testFileAppendContents() {
//linked file
try {
lLinked.appendContents(getRandomContents(), IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("1.0", e);
}
assertOverlap("1.1", lLinked, lOverlap);
//file in linked folder
try {
lChildLinked.appendContents(getRandomContents(), IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("2.0", e);
}
assertOverlap("2.1", lChildLinked, lChildOverlap);
//duplicate file
try {
lOverlap.appendContents(getRandomContents(), IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("3.0", e);
}
assertOverlap("3.1", lLinked, lOverlap);
//file in duplicate folder
try {
lChildOverlap.appendContents(getRandomContents(), IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("3.0", e);
}
assertOverlap("3.1", lChildLinked, lChildOverlap);
}
public void testFileSetContents() {
//linked file
try {
lLinked.setContents(getRandomContents(), IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("1.0", e);
}
assertOverlap("1.1", lLinked, lOverlap);
//file in linked folder
try {
lChildLinked.setContents(getRandomContents(), IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("2.0", e);
}
assertOverlap("2.1", lChildLinked, lChildOverlap);
//duplicate file
try {
lOverlap.setContents(getRandomContents(), IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("3.0", e);
}
assertOverlap("3.1", lLinked, lOverlap);
//file in duplicate folder
try {
lChildOverlap.setContents(getRandomContents(), IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("3.0", e);
}
assertOverlap("3.1", lChildLinked, lChildOverlap);
}
/**
* Tests moving a file into and out of an overlapping area (similar to
* creation/deletion).
*/
public void testMoveFile() {
IFile destination = pNoOverlap.getFile("MoveDestination");
//file in linked folder
try {
lChildLinked.move(destination.getFullPath(), IResource.NONE, getMonitor());
assertDoesNotExistInWorkspace("1.1", lChildLinked);
assertDoesNotExistInWorkspace("1.2", lChildOverlap);
assertExistsInWorkspace("1.3", destination);
assertOverlap("1.4", lChildLinked, lChildOverlap);
assertTrue("1.5", lChildLinked.isSynchronized(IResource.DEPTH_INFINITE));
assertTrue("1.6", destination.isSynchronized(IResource.DEPTH_INFINITE));
destination.move(lChildLinked.getFullPath(), IResource.NONE, getMonitor());
assertExistsInWorkspace("2.1", lChildLinked);
assertExistsInWorkspace("2.2", lChildOverlap);
assertDoesNotExistInWorkspace("2.3", destination);
assertOverlap("2.4", lChildLinked, lChildOverlap);
} catch (CoreException e) {
fail("1.99", e);
}
//duplicate file
try {
lOverlap.move(destination.getFullPath(), IResource.NONE, getMonitor());
assertDoesNotExistInWorkspace("3.1", lOverlap);
assertExistsInWorkspace("3.2", lLinked);
assertDoesNotExistInFileSystem("3.25", lLinked);
assertExistsInWorkspace("3.3", destination);
assertEquals("3.4", lLinked.getLocation(), lOverlap.getLocation());
assertTrue("3.4.1", lLinked.isSynchronized(IResource.DEPTH_INFINITE));
destination.move(lOverlap.getFullPath(), IResource.NONE, getMonitor());
assertExistsInWorkspace("3.5", lLinked);
assertExistsInWorkspace("3.6", lOverlap);
assertDoesNotExistInWorkspace("3.7", destination);
assertOverlap("3.8", lLinked, lOverlap);
} catch (CoreException e) {
fail("2.99", e);
}
//file in duplicate folder
try {
lChildOverlap.move(destination.getFullPath(), IResource.NONE, getMonitor());
assertDoesNotExistInWorkspace("3.1", lChildLinked);
assertDoesNotExistInWorkspace("3.2", lChildOverlap);
assertExistsInWorkspace("3.3", destination);
assertOverlap("3.4", lChildLinked, lChildOverlap);
destination.move(lChildOverlap.getFullPath(), IResource.NONE, getMonitor());
assertExistsInWorkspace("3.5", lChildLinked);
assertExistsInWorkspace("3.6", lChildOverlap);
assertDoesNotExistInWorkspace("3.7", destination);
assertOverlap("3.8", lChildLinked, lChildOverlap);
} catch (CoreException e) {
fail("3.0", e);
}
}
public void testMoveFolder() {
// TODO
}
public void testShallowCopyLink() {
// TODO
}
public void testShallowMoveLink() {
// TODO
}
public void testShallowDeleteProject() {
// TODO
}
}