blob: 0f57cc112be8041322d3ded0bf0fc2d993e51dc1 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2012 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
*******************************************************************************/
package org.eclipse.core.tests.resources.regression;
import java.io.IOException;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.tests.resources.ResourceTest;
/**
* Tests regression of bug 44106. In this case deleting a file which was a
* symbolic link on Linux actually deleted the files that it pointed too rather
* than just the link itself.
*
* Also tests bug 174492, which is a similar bug except the KEEP_HISTORY
* flag is used when the resource is deleted from the workspace.
*/
public class Bug_044106 extends ResourceTest {
public static Test suite() {
return new TestSuite(Bug_044106.class);
}
public Bug_044106() {
super();
}
public Bug_044106(String name) {
super(name);
}
private void createSymLink(String target, String local) {
try {
Process p = Runtime.getRuntime().exec("/bin/ln -s " + target + " " + local);
p.waitFor();
} catch (IOException e) {
fail("1.0", e);
} catch (InterruptedException e) {
fail("1.1", e);
}
}
/**
* Tests various permutations of the bug.
* @param deleteFlags The option flags to use when deleting the resource.
*/
public void doTestDeleteLinkedFile(int deleteFlags) {
// create the file/folder that we are going to link to
IFileStore linkDestFile = getTempStore();
createFileInFileSystem(linkDestFile);
assertTrue("0.1", linkDestFile.fetchInfo().exists());
// create some resources in the workspace
IProject project = getWorkspace().getRoot().getProject(getUniqueString());
ensureExistsInWorkspace(project, true);
// link in the folder
String target = new java.io.File(linkDestFile.toURI()).getAbsolutePath();
IFile linkedFile = project.getFile("linkedFile");
String local = linkedFile.getLocation().toOSString();
createSymLink(target, local);
assertExistsInFileSystem("1.2", linkedFile);
// do a refresh and ensure that the resources are in the workspace
try {
project.refreshLocal(IResource.DEPTH_INFINITE, getMonitor());
} catch (CoreException e) {
fail("2.0", e);
}
assertExistsInWorkspace("2.1", linkedFile);
// delete the file
try {
linkedFile.delete(deleteFlags, getMonitor());
} catch (CoreException e) {
fail("3.0", e);
}
// ensure that the folder and file weren't deleted in the filesystem
assertDoesNotExistInWorkspace("4.0", linkedFile);
assertTrue("4.1", linkDestFile.fetchInfo().exists());
}
/**
* Tests the various permutations of the bug
* @param deleteParent if true, the link's parent is deleted, otherwise the link
* is deleted
* @param deleteFlags The flags to use on the resource deletion call
*/
public void doTestDeleteLinkedFolder(IFolder linkedFolder, boolean deleteParent, int deleteFlags) {
if (!Platform.getOS().equals(Platform.OS_LINUX)) {
return;
}
IFileStore linkDestLocation = getTempStore();
IFileStore linkDestFile = linkDestLocation.getChild(getUniqueString());
createFileInFileSystem(linkDestFile);
assertTrue("0.1", linkDestLocation.fetchInfo().exists());
assertTrue("0.2", linkDestFile.fetchInfo().exists());
// create some resources in the workspace
ensureExistsInWorkspace(linkedFolder.getParent(), true);
// link in the folder
String target = new java.io.File(linkDestLocation.toURI()).getAbsolutePath();
IFile linkedFile = linkedFolder.getFile(linkDestFile.getName());
String local = linkedFolder.getLocation().toOSString();
createSymLink(target, local);
assertExistsInFileSystem("1.2", linkedFolder);
assertExistsInFileSystem("1.3", linkedFile);
// do a refresh and ensure that the resources are in the workspace
try {
linkedFolder.getProject().refreshLocal(IResource.DEPTH_INFINITE, getMonitor());
} catch (CoreException e) {
fail("2.0", e);
}
assertExistsInWorkspace("2.1", linkedFolder);
assertExistsInWorkspace("2.2", linkedFile);
// delete the folder or project
try {
if (deleteParent) {
linkedFolder.getParent().delete(deleteFlags, getMonitor());
} else {
linkedFolder.delete(deleteFlags, getMonitor());
}
} catch (CoreException e) {
fail("3.0", e);
}
// ensure that the folder and file weren't deleted in the filesystem
assertDoesNotExistInWorkspace("4.0", linkedFolder);
assertDoesNotExistInWorkspace("4.1", linkedFile);
assertTrue("4.2", linkDestLocation.fetchInfo().exists());
assertTrue("4.3", linkDestFile.fetchInfo().exists());
}
public void testDeleteLinkedFile() {
if (!Platform.getOS().equals(Platform.OS_LINUX)) {
return;
}
doTestDeleteLinkedFile(IResource.NONE);
}
public void testDeleteLinkedFolder() {
if (!Platform.getOS().equals(Platform.OS_LINUX)) {
return;
}
IProject project = getWorkspace().getRoot().getProject(getUniqueString());
IFolder linkedFolder = project.getFolder("linkedFolder");
doTestDeleteLinkedFolder(linkedFolder, false, IResource.NONE);
}
public void testDeleteLinkedResourceInProject() {
if (!Platform.getOS().equals(Platform.OS_LINUX)) {
return;
}
IProject project = getWorkspace().getRoot().getProject(getUniqueString());
IFolder linkedFolder = project.getFolder("linkedFolder");
doTestDeleteLinkedFolder(linkedFolder, true, IResource.NONE);
}
public void testDeleteLinkedFileKeepHistory() {
if (!Platform.getOS().equals(Platform.OS_LINUX)) {
return;
}
doTestDeleteLinkedFile(IResource.KEEP_HISTORY);
}
public void testDeleteLinkedFolderParentKeepHistory() {
if (!Platform.getOS().equals(Platform.OS_LINUX)) {
return;
}
IProject project = getWorkspace().getRoot().getProject(getUniqueString());
IFolder parent = project.getFolder("parent");
IFolder linkedFolder = parent.getFolder("linkedFolder");
doTestDeleteLinkedFolder(linkedFolder, true, IResource.KEEP_HISTORY);
}
public void testDeleteLinkedFolderKeepHistory() {
if (!Platform.getOS().equals(Platform.OS_LINUX)) {
return;
}
IProject project = getWorkspace().getRoot().getProject(getUniqueString());
IFolder linkedFolder = project.getFolder("linkedFolder");
doTestDeleteLinkedFolder(linkedFolder, false, IResource.KEEP_HISTORY);
}
public void testDeleteLinkedResourceInProjectKeepHistory() {
if (!Platform.getOS().equals(Platform.OS_LINUX)) {
return;
}
IProject project = getWorkspace().getRoot().getProject(getUniqueString());
IFolder linkedFolder = project.getFolder("linkedFolder");
doTestDeleteLinkedFolder(linkedFolder, true, IResource.KEEP_HISTORY);
}
}