blob: e88f6a0ec03abecf6430118d78afdfd67c90ed75 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 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:
* Serge Beauchamp (Freescale Semiconductor) - initial API and implementation
* James Blackburn - Test fix for bug 266712
* IBM - ongoing development
*******************************************************************************/
package org.eclipse.core.tests.resources;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.filesystem.*;
import org.eclipse.core.internal.resources.Workspace;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
/**
* Tests Virtual Folders
*/
public class VirtualFolderTest extends ResourceTest {
protected IProject existingProject;
protected IFolder existingVirtualFolderInExistingProject;
public static Test suite() {
return new TestSuite(VirtualFolderTest.class);
}
public VirtualFolderTest() {
super();
}
public VirtualFolderTest(String name) {
super(name);
}
protected void doCleanup() throws Exception {
ensureExistsInWorkspace(new IResource[] {existingProject}, true);
existingVirtualFolderInExistingProject.create(IResource.VIRTUAL, true, getMonitor());
}
@Override
protected void setUp() throws Exception {
super.setUp();
existingProject = getWorkspace().getRoot().getProject("ExistingProject");
existingVirtualFolderInExistingProject = existingProject.getFolder("existingVirtualFolderInExistingProject");
doCleanup();
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
}
/**
* Tests creating a virtual folder
*/
public void testCreateVirtualFolder() {
IFolder virtualFolder = existingProject.getFolder(getUniqueString());
try {
virtualFolder.create(IResource.VIRTUAL, true, getMonitor());
} catch (CoreException e) {
fail("1.0", e);
}
assertTrue("2.0", virtualFolder.exists());
assertTrue("3.0", virtualFolder.isVirtual());
// delete should succeed
try {
virtualFolder.delete(IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("4.0", e);
}
}
/**
* Tests creating a file under a virtual folder
*/
public void testCreateFileUnderVirtualFolder() {
IFile file = existingVirtualFolderInExistingProject.getFile(getUniqueString());
boolean failed = false;
try {
create(file, true);
fail("1.0");
} catch (CoreException e) {
failed = true;
}
assertTrue("2.0", !file.exists());
assertTrue("3.0", failed);
}
/**
* Tests creating a folder under a virtual folder
*/
public void testCreateFolderUnderVirtualFolder() {
IFolder folder = existingVirtualFolderInExistingProject.getFolder(getUniqueString());
boolean failed = false;
try {
create(folder, true);
fail("1.0");
} catch (CoreException e) {
failed = true;
}
assertTrue("2.0", !folder.exists());
assertTrue("3.0", failed);
}
/**
* Tests creating a virtual folder under a virtual folder
*/
public void testCreateVirtualFolderUnderVirtualFolder() {
IFolder virtualFolder = existingVirtualFolderInExistingProject.getFolder(getUniqueString());
try {
virtualFolder.create(IResource.VIRTUAL, true, null);
} catch (CoreException e) {
fail("1.0", e);
}
assertTrue("2.0", virtualFolder.exists());
assertTrue("3.0", virtualFolder.isVirtual());
// delete should succeed
try {
virtualFolder.delete(IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("4.0", e);
}
}
/**
* Tests creating a linked folder under a virtual folder
*/
public void testCreateLinkedFolderUnderVirtualFolder() {
// get a non-existing location
IPath location = getRandomLocation();
IFolder linkedFolder = existingVirtualFolderInExistingProject.getFolder(getUniqueString());
try {
linkedFolder.createLink(location, IResource.ALLOW_MISSING_LOCAL, getMonitor());
} catch (CoreException e) {
fail("1.0", e);
}
assertTrue("2.0", linkedFolder.exists());
assertEquals("3.0", location, linkedFolder.getLocation());
assertTrue("4.0", !location.toFile().exists());
// getting children should succeed (and be empty)
try {
assertEquals("5.0", 0, linkedFolder.members().length);
} catch (CoreException e) {
fail("6.0", e);
}
// delete should succeed
try {
linkedFolder.delete(IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("7.0", e);
}
}
/**
* Tests creating a linked file under a virtual folder
*/
public void testCreateLinkedFileUnderVirtualFolder() {
// get a non-existing location
IPath location = getRandomLocation();
IFile file = existingVirtualFolderInExistingProject.getFile(getUniqueString());
try {
file.createLink(location, IResource.ALLOW_MISSING_LOCAL, getMonitor());
} catch (CoreException e) {
fail("1.0", e);
}
assertTrue("2.0", file.exists());
assertEquals("3.0", location, file.getLocation());
assertTrue("4.0", !location.toFile().exists());
// delete should succeed
try {
file.delete(IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("5.0", e);
}
}
public void testCopyProjectWithVirtualFolder() {
IPath fileLocation = getRandomLocation();
IPath folderLocation = getRandomLocation();
IFile linkedFile = existingVirtualFolderInExistingProject.getFile(getUniqueString());
IFolder linkedFolder = existingVirtualFolderInExistingProject.getFolder(getUniqueString());
try {
try {
createFileInFileSystem(fileLocation, getRandomContents());
folderLocation.toFile().mkdir();
linkedFolder.createLink(folderLocation, IResource.NONE, getMonitor());
linkedFile.createLink(fileLocation, IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("1.0", e);
}
// copy the project
IProject destinationProject = getWorkspace().getRoot().getProject("CopyTargetProject");
try {
existingProject.copy(destinationProject.getFullPath(), IResource.SHALLOW, getMonitor());
} catch (CoreException e) {
fail("2.0", e);
}
IFile newFile = destinationProject.getFile(linkedFile.getProjectRelativePath());
assertTrue("3.0", newFile.isLinked());
assertEquals("3.1", linkedFile.getLocation(), newFile.getLocation());
assertTrue("3.2", newFile.getParent().isVirtual());
IFolder newFolder = destinationProject.getFolder(linkedFolder.getProjectRelativePath());
assertTrue("4.0", newFolder.isLinked());
assertEquals("4.1", linkedFolder.getLocation(), newFolder.getLocation());
assertTrue("4.2", newFolder.getParent().isVirtual());
// test project deep copy
try {
destinationProject.delete(IResource.NONE, getMonitor());
existingProject.copy(destinationProject.getFullPath(), IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("5.0", e);
}
assertTrue("5.1", newFile.isLinked());
assertEquals("5.2", linkedFile.getLocation(), newFile.getLocation());
assertTrue("5.3", newFile.getParent().isVirtual());
assertTrue("5.4", newFolder.isLinked());
assertEquals("5.5", linkedFolder.getLocation(), newFolder.getLocation());
assertTrue("5.6", newFolder.getParent().isVirtual());
try {
destinationProject.delete(IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("6.0", e);
}
} finally {
Workspace.clear(fileLocation.toFile());
Workspace.clear(folderLocation.toFile());
}
}
public void testMoveProjectWithVirtualFolder() {
IPath fileLocation = getRandomLocation();
IPath folderLocation = getRandomLocation();
IFile file = existingVirtualFolderInExistingProject.getFile(getUniqueString());
IFolder folder = existingVirtualFolderInExistingProject.getFolder(getUniqueString());
IFile childFile = folder.getFile(getUniqueString());
IResource[] oldResources = new IResource[] {existingProject, file, folder, childFile};
try {
assertDoesNotExistInWorkspace("1.0", new IResource[] {folder, file, childFile});
try {
createFileInFileSystem(fileLocation);
folderLocation.toFile().mkdir();
folder.createLink(folderLocation, IResource.NONE, getMonitor());
file.createLink(fileLocation, IResource.NONE, getMonitor());
childFile.create(getRandomContents(), true, getMonitor());
} catch (CoreException e) {
fail("2.0", e);
}
// move the project
IProject destinationProject = getWorkspace().getRoot().getProject("MoveTargetProject");
assertDoesNotExistInWorkspace("3.0", destinationProject);
try {
existingProject.move(destinationProject.getFullPath(), IResource.SHALLOW, getMonitor());
} catch (CoreException e) {
fail("4.0", e);
}
IFile newFile = destinationProject.getFile(file.getProjectRelativePath());
IFolder newFolder = destinationProject.getFolder(folder.getProjectRelativePath());
IFile newChildFile = newFolder.getFile(childFile.getName());
IResource[] newResources = new IResource[] {destinationProject, newFile, newFolder, newChildFile};
assertExistsInWorkspace("5.0", newResources);
assertDoesNotExistInWorkspace("6.1", oldResources);
assertTrue("7.0", existingProject.isSynchronized(IResource.DEPTH_INFINITE));
assertTrue("8.0", destinationProject.isSynchronized(IResource.DEPTH_INFINITE));
assertTrue("9.0", newFile.getParent().isVirtual());
assertTrue("10.0", newFile.isLinked());
assertTrue("11.0", newFolder.isLinked());
assertTrue("12.0", newFolder.getParent().isVirtual());
} finally {
Workspace.clear(fileLocation.toFile());
Workspace.clear(folderLocation.toFile());
}
}
public void testDeleteProjectWithVirtualFolder() {
IFolder virtualFolder = existingProject.getFolder(getUniqueString());
try {
virtualFolder.create(IResource.VIRTUAL, true, null);
existingProject.delete(IResource.NEVER_DELETE_PROJECT_CONTENT, getMonitor());
existingProject.create(getMonitor());
} catch (CoreException e) {
fail("1.0", e);
}
// virtual folder should not exist until the project is open
assertTrue("2.0", !virtualFolder.exists());
try {
existingProject.open(getMonitor());
} catch (CoreException e) {
fail("3.0", e);
}
// virtual folder should now exist
assertTrue("4.0", virtualFolder.exists());
assertTrue("5.0", virtualFolder.isVirtual());
}
public void testDeleteProjectWithVirtualFolderAndLink() {
IPath folderLocation = getRandomLocation();
IFolder virtualFolder = existingProject.getFolder(getUniqueString());
IFolder linkedFolder = virtualFolder.getFolder("a_link");
try {
try {
folderLocation.toFile().mkdir();
virtualFolder.create(IResource.VIRTUAL, true, null);
linkedFolder.createLink(folderLocation, IResource.NONE, getMonitor());
existingProject.delete(IResource.NEVER_DELETE_PROJECT_CONTENT, getMonitor());
existingProject.create(getMonitor());
} catch (CoreException e) {
fail("1.0", e);
}
// virtual folder should not exist until the project is open
assertTrue("2.0", !virtualFolder.exists());
assertTrue("3.0", !linkedFolder.exists());
try {
existingProject.open(getMonitor());
} catch (CoreException e) {
fail("4.0", e);
}
// virtual folder should now exist
assertTrue("5.0", virtualFolder.exists());
assertTrue("6.0", virtualFolder.isVirtual());
// link should now exist
assertTrue("7.0", linkedFolder.exists());
assertTrue("8.0", linkedFolder.isLinked());
assertEquals("9.0", folderLocation, linkedFolder.getLocation());
} finally {
Workspace.clear(folderLocation.toFile());
}
}
public void testLinkedFolderInVirtualFolder_FileStoreURI() {
IPath folderLocation = getRandomLocation();
IFolder folder = existingVirtualFolderInExistingProject.getFolder(getUniqueString());
try {
folder.createLink(folderLocation, IResource.ALLOW_MISSING_LOCAL, getMonitor());
} catch (CoreException e) {
fail("1.0", e);
}
assertTrue("2.0", folder.exists());
assertEquals("3.0", folderLocation, folder.getLocation());
assertTrue("4.0", !folderLocation.toFile().exists());
// Check file store URI for the linked resource
try {
IFileStore fs = EFS.getStore(existingVirtualFolderInExistingProject.getLocationURI());
fs = fs.getChild(folder.getName());
assertNotNull("5.0", fs);
assertNotNull("6.0", fs.toURI());
} catch (CoreException e) {
fail("7.0", e);
}
}
public void testIsVirtual() {
// create a virtual folder
IFolder virtualFolder = existingProject.getFolder(getUniqueString());
try {
virtualFolder.create(IResource.VIRTUAL, true, null);
} catch (CoreException e) {
fail("1.0", e);
}
assertTrue("2.0", virtualFolder.isVirtual());
}
// We should decide what is the proper value returned for Virtual Folders
//
// public void testIsLocal() {
// // create a virtual folder
// IFolder virtualFolder = existingProject.getFolder(getUniqueString());
// try {
// virtualFolder.createGroup(IResource.NONE, null);
// } catch (CoreException e) {
// fail("1.0", e);
// }
// assertTrue("2.0", virtualFolder.isLocal(IResource.DEPTH_INFINITE));
// }
//
// public void testIsSynchronizedforVirtualFolder() {
// // create a virtual folder
// IFolder virtualFolder = existingProject.getFolder(getUniqueString());
// try {
// virtualFolder.createGroup(IResource.NONE, null);
// } catch (CoreException e) {
// fail("1.0", e);
// }
// assertTrue("2.0", virtualFolder.isSynchronized(IResource.DEPTH_INFINITE));
// }
public void testVirtualFolderInLinkedFolder() {
// setup handles
IFolder topFolder = existingProject.getFolder("topFolder");
IFolder linkedFolder = topFolder.getFolder("linkedFolder");
IFolder subFolder = linkedFolder.getFolder("subFolder");
IFolder virtualFolder = subFolder.getFolder("virtualFolder");
IPath linkedFolderLocation = getRandomLocation();
IPath subFolderLocation = linkedFolderLocation.append(subFolder.getName());
try {
try {
// create the structure on disk
linkedFolderLocation.toFile().mkdir();
subFolderLocation.toFile().mkdir();
// create the structure in the workspace
ensureExistsInWorkspace(topFolder, true);
linkedFolder.createLink(linkedFolderLocation, IResource.NONE, getMonitor());
virtualFolder.create(IResource.VIRTUAL, true, getMonitor());
} catch (CoreException e) {
fail("1.0", e);
}
// assert locations
assertEquals("2.0", linkedFolderLocation, linkedFolder.getLocation());
assertEquals("3.0", linkedFolderLocation.append(subFolder.getName()), subFolder.getLocation());
assertTrue("4.0", virtualFolder.isVirtual());
assertTrue("5.0", virtualFolder.getLocation() == null);
// assert URIs
assertEquals("6.0", URIUtil.toURI(linkedFolderLocation), linkedFolder.getLocationURI());
assertEquals("7.0", URIUtil.toURI(subFolderLocation), subFolder.getLocationURI());
// assertTrue("8.0", virtualFolder.getLocationURI() == null);
} finally {
Workspace.clear(subFolderLocation.toFile());
Workspace.clear(linkedFolderLocation.toFile());
}
}
/* Regression for Bug 296470 */
public void testGetVirtualFolderAttributes() {
long timeStamp = existingVirtualFolderInExistingProject.getLocalTimeStamp();
assertEquals("1.0", timeStamp, IResource.NULL_STAMP);
ResourceAttributes attributes = existingVirtualFolderInExistingProject.getResourceAttributes();
assertEquals("1.1", attributes, null);
}
}