blob: 85ac83136081c47250351ae035a9fc298ba5442b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2017 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.internal.localstore;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.filesystem.IFileInfo;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.internal.resources.*;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.core.tests.internal.filesystem.bug440110.Bug440110FileSystem;
//
public class FileSystemResourceManagerTest extends LocalStoreTest implements ICoreConstants {
public FileSystemResourceManagerTest() {
super();
}
public FileSystemResourceManagerTest(String name) {
super(name);
}
@Override
public String[] defineHierarchy() {
return new String[] {"/Folder1/", "/Folder1/File1", "/Folder1/Folder2/", "/Folder1/Folder2/File2", "/Folder1/Folder2/Folder3/"};
}
public static Test suite() {
return new TestSuite(FileSystemResourceManagerTest.class);
}
public void testBug440110() throws URISyntaxException, CoreException {
String projectName = getUniqueString();
IWorkspace workspace = getWorkspace();
IProject project = workspace.getRoot().getProject(projectName);
IProjectDescription projectDescription = workspace.newProjectDescription(projectName);
projectDescription.setLocationURI(new URI(Bug440110FileSystem.SCHEME + "://" + projectName));
project.create(projectDescription, null);
project.open(null);
assertEquals("0.1", Bug440110FileSystem.SCHEME, project.getLocationURI().getScheme());
IFolder folder = project.getFolder("folder");
folder.create(true, true, null);
assertEquals("0.2", Bug440110FileSystem.SCHEME, folder.getLocationURI().getScheme());
Bug440110FileSystem.clearFetchedFileTree();
folder.refreshLocal(IResource.DEPTH_ZERO, null);
assertFalse("1.0", Bug440110FileSystem.hasFetchedFileTree());
Bug440110FileSystem.clearFetchedFileTree();
folder.refreshLocal(IResource.DEPTH_ONE, null);
assertTrue("2.0", Bug440110FileSystem.hasFetchedFileTree());
Bug440110FileSystem.clearFetchedFileTree();
folder.refreshLocal(IResource.DEPTH_INFINITE, null);
assertTrue("3.0", Bug440110FileSystem.hasFetchedFileTree());
}
/**
*/
public void testContainerFor() throws Throwable {
/* test null parameter */
try {
getLocalManager().containerForLocation(null);
fail("1.1");
} catch (RuntimeException e) {
// expected
}
/* test normal conditions under default mapping */
// project/target
Path path = new Path("target");
IFolder folder = projects[0].getFolder(path);
IPath location = projects[0].getLocation().append(path);
IFolder testFolder = (IFolder) getLocalManager().containerForLocation(location);
assertTrue("2.1", folder.equals(testFolder));
// project/folder/target
path = new Path("folder/target");
folder = projects[0].getFolder(path);
location = projects[0].getLocation().append(path);
testFolder = (IFolder) getLocalManager().containerForLocation(location);
assertTrue("2.2", folder.equals(testFolder));
// project/folder/folder/target
path = new Path("folder/folder/target");
folder = projects[0].getFolder(path);
location = projects[0].getLocation().append(path);
testFolder = (IFolder) getLocalManager().containerForLocation(location);
assertTrue("2.3", folder.equals(testFolder));
/* non-existent location */
testFolder = (IFolder) getLocalManager().containerForLocation(new Path("../this/path/must/not/exist"));
assertTrue("3.1", testFolder == null);
}
/**
* this test should move to FileTest
*/
public void testCreateFile() throws Throwable {
/* initialize common objects */
IProject project = projects[0];
File file = (File) project.getFile("foo");
/* common contents */
String originalContent = "this string should not be equal the other";
/* create file with flag false */
try {
file.create(getContents(originalContent), false, null);
} catch (CoreException e) {
fail("1.1", e);
}
assertTrue("1.2", file.exists());
assertTrue("1.3", file.isLocal(IResource.DEPTH_ZERO));
assertEquals("1.4", file.getStore().fetchInfo().getLastModified(), file.getResourceInfo(false, false).getLocalSyncInfo());
try {
assertTrue("1.5", compareContent(getContents(originalContent), getLocalManager().read(file, true, null)));
} catch (CoreException e) {
fail("1.6", e);
}
}
/**
*/
public void testFileFor() throws Throwable {
/* test null parameter */
try {
getLocalManager().fileForLocation(null);
fail("1.1");
} catch (RuntimeException e) {
// expected
}
/* test normal conditions under default mapping */
// project/file
Path path = new Path("file");
IFile file = projects[0].getFile(path);
IPath location = projects[0].getLocation().append(path);
IFile testFile = getLocalManager().fileForLocation(location);
assertTrue("2.1", file.equals(testFile));
// project/folder/file
path = new Path("folder/file");
file = projects[0].getFile(path);
location = projects[0].getLocation().append(path);
testFile = getLocalManager().fileForLocation(location);
assertTrue("2.2", file.equals(testFile));
// project/folder/folder/file
path = new Path("folder/folder/file");
file = projects[0].getFile(path);
location = projects[0].getLocation().append(path);
testFile = getLocalManager().fileForLocation(location);
assertTrue("2.3", file.equals(testFile));
/* non-existent location */
testFile = getLocalManager().fileForLocation(new Path("../this/path/must/not/exist"));
assertTrue("7.1", testFile == null);
}
public void testIsLocal() throws Throwable {
/* initialize common objects */
final IProject project = projects[0];
// create resources
IResource[] resources = buildResources(project, defineHierarchy());
ensureExistsInWorkspace(resources, true);
ensureDoesNotExistInFileSystem(resources);
// exists
assertTrue("1.0", project.isLocal(IResource.DEPTH_INFINITE)); // test
// test the depth parameter
final IFolder folder = project.getFolder("Folder1");
IWorkspaceRunnable operation = monitor -> {
IResource[] members = folder.members();
for (IResource member : members) {
((Resource) member).getResourceInfo(false, true).clear(M_LOCAL_EXISTS);
}
};
getWorkspace().run(operation, null);
assertTrue("2.0", project.isLocal(IResource.DEPTH_ONE));
assertTrue("3.0", folder.isLocal(IResource.DEPTH_ZERO));
assertTrue("4.0", !folder.isLocal(IResource.DEPTH_INFINITE));
// remove the trash
ensureDoesNotExistInWorkspace(project);
}
/**
* Scenario:
* 1 solution
* 3 projects
*/
public void testLocationFor() throws Throwable {
/* test project */
IPath location = projects[0].getLocation();
assertTrue("2.1", location.equals(getLocalManager().locationFor(projects[0])));
assertTrue("2.2", location.equals(getWorkspace().getRoot().getLocation().append(projects[0].getName())));
}
/**
* Scenario:
* 1 solution
* 3 projects
*/
public void testResourcePathFor() throws Throwable {
///* test null parameter */
//try {
//getLocalManager().resourcePathFor(null);
//fail("1.1");
//} catch (RuntimeException e) {
//} catch (CoreException e) {
//fail("1.2", e);
//}
///* test normal conditions under default mapping */
//// project/file
//Path path = new Path("file");
//IFile file = projects[0].getFile(path);
//IPath location = projects[0].getLocation().append(path);
//IPath testPath = getLocalManager().resourcePathFor(location);
//assert("2.1", file.getFullPath().equals(testPath));
//// project/folder/file
//path = new Path("folder/file");
//file = projects[0].getFile(path);
//location = projects[0].getLocation().append(path);
//testPath = getLocalManager().resourcePathFor(location);
//assert("2.2", file.getFullPath().equals(testPath));
//// project/folder/folder/file
//path = new Path("folder/folder/file");
//file = projects[0].getFile(path);
//location = projects[0].getLocation().append(path);
//testPath = getLocalManager().resourcePathFor(location);
//assert("2.3", file.getFullPath().equals(testPath));
}
public void testSynchronizeProject() throws Throwable {
/* test DEPTH parameter */
/* DEPTH_ZERO */
IFile file = projects[0].getFile("file");
ensureExistsInFileSystem(file);
projects[0].refreshLocal(IResource.DEPTH_ZERO, null);
assertTrue("1.1", !file.exists());
/* DEPTH_ONE */
IFolder folder = projects[0].getFolder("folder");
IFolder subfolder = folder.getFolder("subfolder");
IFile subfile = folder.getFile("subfile");
ensureExistsInFileSystem(folder);
ensureExistsInFileSystem(subfolder);
ensureExistsInFileSystem(subfile);
projects[0].refreshLocal(IResource.DEPTH_ONE, null);
assertTrue("2.1", file.exists());
assertTrue("2.2", folder.exists());
assertTrue("2.3", !subfolder.exists());
assertTrue("2.4", !subfile.exists());
/* DEPTH_INFINITE */
projects[0].refreshLocal(IResource.DEPTH_INFINITE, null);
assertTrue("3.1", file.exists());
assertTrue("3.2", folder.exists());
assertTrue("3.3", subfolder.exists());
assertTrue("3.4", subfile.exists());
/* closed project */
file = projects[0].getFile("closed");
projects[0].close(null);
ensureExistsInFileSystem(file);
projects[0].open(null);
assertTrue("4.1", !file.exists());
projects[0].refreshLocal(IResource.DEPTH_INFINITE, null);
assertTrue("4.2", file.exists());
/* refreshing an inexisting project should do nothing */
getWorkspace().getRoot().getProject("inexistingProject").refreshLocal(IResource.DEPTH_INFINITE, null);
}
public void testWriteFile() {
/* initialize common objects */
IProject project = projects[0];
IFile file = project.getFile("foo");
ensureExistsInWorkspace(file, true);
/* common contents */
String originalContent = "this string should not be equal the other";
String anotherContent = "and this string should not... well, you know...";
InputStream original;
InputStream another;
/* write file for the first time */
original = getContents(originalContent);
try {
write(file, original, true, null);
} catch (CoreException e) {
fail("1.0", e);
}
original = getContents(originalContent);
try {
assertTrue("1.1", compareContent(original, getLocalManager().read(file, true, null)));
} catch (CoreException e) {
fail("1.2", e);
}
/* test the overwrite parameter (false) */
another = getContents(anotherContent);
try {
write(file, another, false, null);
} catch (CoreException e) {
fail("2.0", e);
}
another = getContents(anotherContent);
try {
assertTrue("2.1", compareContent(another, getLocalManager().read(file, true, null)));
} catch (CoreException e) {
fail("2.2", e);
}
/* test the overwrite parameter (true) */
original = getContents(originalContent);
try {
write(file, original, true, null);
} catch (CoreException e) {
fail("3.0", e);
}
original = getContents(originalContent);
try {
assertTrue("3.1", compareContent(original, getLocalManager().read(file, true, null)));
} catch (CoreException e) {
fail("3.2", e);
}
/* test the overwrite parameter (false) */
ensureOutOfSync(file);
another = getContents(anotherContent);
try {
write(file, another, false, null);
fail("4.0");
} catch (CoreException e) {
// expected
}
try {
file.setContents(another, false, false, null);
fail("4.3");
} catch (CoreException e) {
// expected
}
try {
file.setContents(another, true, false, null);
} catch (CoreException e) {
fail("4.4", e);
}
/* test the overwrite parameter (false) */
ensureDoesNotExistInFileSystem(file);
another = getContents(anotherContent);
try {
write(file, another, false, null);
fail("5.0");
} catch (CoreException e) {
// expected
}
/* remove trash */
ensureDoesNotExistInWorkspace(project);
}
public void testWriteFolder() throws Throwable {
/* initialize common objects */
IProject project = projects[0];
IFolder folder = project.getFolder("foo");
ensureExistsInWorkspace(folder, true);
boolean ok;
/* existing file on destination */
ensureDoesNotExistInFileSystem(folder);
IFile file = project.getFile("foo");
ensureExistsInFileSystem(file);
/* force = true */
ok = false;
try {
write(folder, true, null);
} catch (CoreException e) {
ok = true;
}
assertTrue("1.1", ok);
/* force = false */
ok = false;
try {
write(folder, false, null);
} catch (CoreException e) {
ok = true;
}
assertTrue("1.2", ok);
ensureDoesNotExistInFileSystem(file);
/* existing folder on destination */
ensureExistsInFileSystem(folder);
/* force = true */
write(folder, true, null);
assertTrue("2.1", folder.getLocation().toFile().isDirectory());
/* force = false */
ok = false;
try {
write(folder, false, null);
} catch (CoreException e) {
ok = true;
}
assertTrue("2.2", ok);
ensureDoesNotExistInFileSystem(folder);
/* inexisting resource on destination */
/* force = true */
write(folder, true, null);
assertTrue("3.1", folder.getLocation().toFile().isDirectory());
ensureDoesNotExistInFileSystem(folder);
/* force = false */
write(folder, false, null);
assertTrue("3.1", folder.getLocation().toFile().isDirectory());
}
/**
* 1.2 - write a project with default local location
* 2.1 - delete project's local location
*/
public void testWriteProject() throws Throwable {
/* initialize common objects */
final IProject project = projects[0];
IFile dotProject = project.getFile(IProjectDescription.DESCRIPTION_FILE_NAME);
final IFileStore fileStore = ((Resource) project).getStore();
// create project and then delete from file system
// wrap in runnable to prevent snapshot from occurring in the middle.
getWorkspace().run((IWorkspaceRunnable) monitor -> {
ensureDoesNotExistInFileSystem(project);
assertTrue("2.1", !fileStore.fetchInfo().isDirectory());
//write project in a runnable, otherwise tree will be locked
((Project) project).writeDescription(IResource.FORCE);
}, null);
assertTrue("2.2", fileStore.fetchInfo().isDirectory());
long lastModified = ((Resource) dotProject).getStore().fetchInfo().getLastModified();
assertEquals("2.3", lastModified, ((Resource) project).getResourceInfo(false, false).getLocalSyncInfo());
}
protected void write(final IFile file, final InputStream contents, final boolean force, IProgressMonitor monitor) throws CoreException {
IWorkspaceRunnable operation = pm -> {
int flags = force ? IResource.FORCE : IResource.NONE;
IFileInfo info = ((Resource) file).getStore().fetchInfo();
getLocalManager().write(file, contents, info, flags, false, null);
};
getWorkspace().run(operation, null);
}
protected void write(final IFolder folder, final boolean force, IProgressMonitor monitor) throws CoreException {
IWorkspaceRunnable operation = pm -> getLocalManager().write(folder, force, null);
getWorkspace().run(operation, null);
}
}