/******************************************************************************* * 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); } }