/******************************************************************************* * Copyright (c) 2008, 2015 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: * 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); } }