/******************************************************************************* * Copyright (c) 2006, 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.core.tests.resources; import junit.framework.Test; import junit.framework.TestSuite; import org.eclipse.core.filesystem.*; import org.eclipse.core.resources.*; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Path; import org.eclipse.core.tests.internal.filesystem.bogus.BogusFileSystem; import org.eclipse.core.tests.internal.filesystem.ram.MemoryFileSystem; import org.eclipse.core.tests.internal.filesystem.ram.MemoryTree; /** * Tests behaviour of manipulating linked resources that are not linked into * the local file system. */ public class NonLocalLinkedResourceTest extends ResourceTest { private int nextFolder = 0; public static Test suite() { return new TestSuite(NonLocalLinkedResourceTest.class); } public NonLocalLinkedResourceTest() { } public NonLocalLinkedResourceTest(String name) { super(name); } /** * Creates a folder in the test file system with the given name */ protected IFileStore createFolderStore(String name) { IFileSystem system = getFileSystem(); IFileStore store = system.getStore(Path.ROOT.append(name)); try { store.mkdir(EFS.NONE, getMonitor()); } catch (CoreException e) { fail("createFolderStore", e); } return store; } protected IFileSystem getFileSystem() { try { return EFS.getFileSystem(MemoryFileSystem.SCHEME_MEMORY); } catch (CoreException e) { fail("Test file system missing", e); } //can't get here return null; } @Override protected IFileStore getTempStore() { IFileSystem system = getFileSystem(); IFileStore store; do { store = system.getStore(Path.ROOT.append(Integer.toString(nextFolder++))); } while (store.fetchInfo().exists()); return store; } @Override protected void tearDown() throws Exception { MemoryTree.TREE.deleteAll(); super.tearDown(); } public void testCopyFile() { IFileStore sourceStore = createFolderStore("source"); IFileStore destinationStore = createFolderStore("destination"); IProject project = getWorkspace().getRoot().getProject("project"); IFolder source = project.getFolder("source"); IFolder destination = project.getFolder("destination"); IFile sourceFile = source.getFile("file.txt"); IFile destinationFile = destination.getFile(sourceFile.getName()); IFile localFile = project.getFile(sourceFile.getName()); //setup initial resources ensureExistsInWorkspace(project, true); try { source.createLink(sourceStore.toURI(), IResource.NONE, getMonitor()); destination.createLink(destinationStore.toURI(), IResource.NONE, getMonitor()); sourceFile.create(getRandomContents(), IResource.NONE, getMonitor()); } catch (CoreException e) { fail("0.99", e); } //copy to linked destination should succeed try { sourceFile.copy(destinationFile.getFullPath(), IResource.NONE, getMonitor()); } catch (CoreException e) { fail("1.0", e); } //copy to local destination should succeed try { sourceFile.copy(localFile.getFullPath(), IResource.NONE, getMonitor()); } catch (CoreException e) { fail("2.0", e); } //copy from local to non local ensureDoesNotExistInWorkspace(destinationFile); //copy from local to non local try { localFile.copy(destinationFile.getFullPath(), IResource.NONE, getMonitor()); } catch (CoreException e) { fail("3.0", e); } //copy to self should fail try { localFile.copy(localFile.getFullPath(), IResource.NONE, getMonitor()); fail("4.0"); } catch (CoreException e) { //should fail } } public void testCopyFolder() { IFileStore sourceStore = createFolderStore("source"); IProject project = getWorkspace().getRoot().getProject("project"); IFolder parentFolder = project.getFolder("parent"); IFolder source = parentFolder.getFolder("source"); IFolder destination = project.getFolder("destination"); //setup initial resources ensureExistsInWorkspace(project, true); try { parentFolder.create(IResource.NONE, true, getMonitor()); source.createLink(sourceStore.toURI(), IResource.NONE, getMonitor()); } catch (CoreException e) { fail("0.99", e); } //shallow copy to destination should succeed try { source.copy(destination.getFullPath(), IResource.SHALLOW, getMonitor()); } catch (CoreException e) { fail("1.0", e); } assertTrue("1.1", destination.exists()); //deep copy to destination should succeed try { destination.delete(IResource.NONE, getMonitor()); source.copy(destination.getFullPath(), IResource.NONE, getMonitor()); } catch (CoreException e) { fail("2.0", e); } assertTrue("2.1", destination.exists()); //should fail when destination is occupied try { source.copy(destination.getFullPath(), IResource.NONE, getMonitor()); fail("3.0"); } catch (CoreException e) { //should fail } //copy to self should fail try { source.copy(source.getFullPath(), IResource.NONE, getMonitor()); fail("4.0"); } catch (CoreException e) { //should fail } } public void testMoveFile() { IFileStore sourceStore = createFolderStore("source"); IFileStore destinationStore = createFolderStore("destination"); IProject project = getWorkspace().getRoot().getProject("project"); IFolder source = project.getFolder("source"); IFolder destination = project.getFolder("destination"); IFile sourceFile = source.getFile("file.txt"); IFile destinationFile = destination.getFile(sourceFile.getName()); IFile localFile = project.getFile(sourceFile.getName()); //setup initial resources ensureExistsInWorkspace(project, true); try { source.createLink(sourceStore.toURI(), IResource.NONE, getMonitor()); destination.createLink(destinationStore.toURI(), IResource.NONE, getMonitor()); sourceFile.create(getRandomContents(), IResource.NONE, getMonitor()); } catch (CoreException e) { fail("0.99", e); } //move to linked destination should succeed try { sourceFile.move(destinationFile.getFullPath(), IResource.NONE, getMonitor()); } catch (CoreException e) { fail("1.0", e); } //move back to source location //move to linked destination should succeed try { destinationFile.move(sourceFile.getFullPath(), IResource.NONE, getMonitor()); } catch (CoreException e) { fail("1.1", e); } //move to local destination should succeed try { sourceFile.move(localFile.getFullPath(), IResource.NONE, getMonitor()); } catch (CoreException e) { fail("2.0", e); } //movefrom local to non local try { localFile.move(destinationFile.getFullPath(), IResource.NONE, getMonitor()); } catch (CoreException e) { fail("3.0", e); } //copy to self should fail try { localFile.copy(localFile.getFullPath(), IResource.NONE, getMonitor()); fail("4.0"); } catch (CoreException e) { //should fail } } // Test for Bug 342060 - Renaming a project failing with custom EFS public void test342060() { IFileStore sourceStore = createBogusFolderStore("source"); IFileStore destinationStore = createBogusFolderStore("destination"); IProject project = getWorkspace().getRoot().getProject("project"); IFolder source = project.getFolder("source"); IFolder destination = project.getFolder("destination"); IFile sourceFile = source.getFile("file.txt"); //setup initial resources ensureExistsInWorkspace(project, true); try { source.createLink(sourceStore.toURI(), IResource.NONE, getMonitor()); destination.createLink(destinationStore.toURI(), IResource.NONE, getMonitor()); sourceFile.create(getRandomContents(), IResource.NONE, getMonitor()); } catch (CoreException e) { fail("0.99", e); } //move to linked destination should succeed try { project.move(Path.fromPortableString("movedProject"), IResource.NONE, getMonitor()); } catch (CoreException e) { fail("1.0", e); } } protected IFileStore createBogusFolderStore(String name) { IFileSystem system = getBogusFileSystem(); IFileStore store = system.getStore(Path.ROOT.append(name)); try { store.mkdir(EFS.NONE, getMonitor()); } catch (CoreException e) { fail("createFolderStore", e); } return store; } protected IFileSystem getBogusFileSystem() { try { return EFS.getFileSystem(BogusFileSystem.SCHEME_BOGUS); } catch (CoreException e) { fail("Test file system missing", e); } //can't get here return null; } }