blob: 57f7471016d5eb8c01845b1c059d9ef7fbdfdea7 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 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.filesystem;
import java.io.File;
import java.io.OutputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Date;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.filesystem.*;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.*;
import org.eclipse.core.tests.internal.localstore.LocalStoreTest;
/**
* Basic tests for the IFileStore API
*/
public class FileStoreTest extends LocalStoreTest {
public static Test suite() {
return new TestSuite(FileStoreTest.class);
}
public FileStoreTest() {
super();
}
public FileStoreTest(String name) {
super(name);
}
private IFileStore createDir(IFileStore store, boolean clear) throws CoreException {
if (clear && store.fetchInfo().exists()) {
store.delete(EFS.NONE, null);
}
store.mkdir(EFS.NONE, null);
IFileInfo info = store.fetchInfo();
assertTrue("createDir.1", info.exists());
assertTrue("createDir.1", info.isDirectory());
return store;
}
private IFileStore createDir(String string, boolean clear) throws CoreException {
return createDir(EFS.getFileSystem(EFS.SCHEME_FILE).getStore(new Path(string)), clear);
}
/**
* Tests behavior of IFileStore#fetchInfo when underlying file system
* throws exceptions.
*/
public void testBrokenFetchInfo() {
IFileStore broken = null;
try {
broken = EFS.getStore(new URI("broken://a/b/c"));
} catch (CoreException e) {
fail("0.98", e);
} catch (URISyntaxException e) {
fail("0.99", e);
}
//no-arg fetch info should return non-existent file
IFileInfo info = broken.fetchInfo();
assertTrue("1.0", !info.exists());
//two-arg fetchInfo should throw exception
try {
info = broken.fetchInfo(EFS.NONE, getMonitor());
fail("2.0");
} catch (CoreException e) {
//expected
}
}
private IFileStore getDirFileStore(String path) throws CoreException {
IFileStore store = EFS.getFileSystem(EFS.SCHEME_FILE).getStore(new Path(path));
store.mkdir(EFS.NONE, null);
return store;
}
private IFileStore[] getFileStoresOnTwoVolumes() {
IFileStore[] tempDirs = new IFileStore[2];
for (int i = 99/*c*/; i < 123/*z*/; i++) {
char c = (char) i;
try {
IFileStore store = getDirFileStore(c + ":/temp");
IFileInfo info = store.fetchInfo();
if (info.exists() && info.isDirectory() && !info.getAttribute(EFS.ATTRIBUTE_READ_ONLY)) {
if (tempDirs[0] == null) {
tempDirs[0] = store;
} else {
tempDirs[1] = store;
break; //both temp dirs have been created
}
}
} catch (CoreException e) {//ignore and go to next volume
continue;
}
}
return tempDirs;
}
/**
* Basically this is a test for the Windows Platform.
*/
public void testCopyAcrossVolumes() throws Throwable {
IFileStore[] tempDirectories = getFileStoresOnTwoVolumes();
/* test if we are in the adequate environment */
if (tempDirectories == null || tempDirectories.length < 2 || tempDirectories[0] == null || tempDirectories[1] == null) {
return;
}
/* build scenario */
// create source root folder
IFileStore tempSrc = tempDirectories[0];
/* get the destination folder */
IFileStore tempDest = tempDirectories[1];
// create tree
IFileStore target = tempSrc.getChild("target");
createDir(target, true);
createTree(getTree(target));
/* c:\temp\target -> d:\temp\target */
IFileStore destination = tempDest.getChild("target");
target.copy(destination, EFS.NONE, null);
assertTrue("3.1", verifyTree(getTree(destination)));
destination.delete(EFS.NONE, null);
/* c:\temp\target -> d:\temp\copy of target */
destination = tempDest.getChild("copy of target");
target.copy(destination, EFS.NONE, null);
assertTrue("4.1", verifyTree(getTree(destination)));
destination.delete(EFS.NONE, null);
/* c:\temp\target -> d:\temp\target (but the destination is already a file) */
destination = tempDest.getChild("target");
String anotherContent = "nothing..................gnihton";
createFile(destination, anotherContent);
assertTrue("5.1", !destination.fetchInfo().isDirectory());
try {
target.copy(destination, EFS.NONE, null);
fail("5.2");
} catch (CoreException e) {
//should fail
}
assertTrue("5.3", !verifyTree(getTree(destination)));
destination.delete(EFS.NONE, null);
/* c:\temp\target -> d:\temp\target (but the destination is already a folder */
destination = tempDest.getChild("target");
createDir(destination, true);
target.copy(destination, EFS.NONE, null);
assertTrue("6.2", verifyTree(getTree(destination)));
destination.delete(EFS.NONE, null);
/* remove trash */
target.delete(EFS.NONE, null);
}
public void testCopyDirectory() throws Throwable {
/* build scenario */
IFileStore temp = EFS.getFileSystem(EFS.SCHEME_FILE).getStore(getWorkspace().getRoot().getLocation().append("temp"));
temp.mkdir(EFS.NONE, null);
assertTrue("1.1", temp.fetchInfo().isDirectory());
// create tree
IFileStore target = temp.getChild("target");
target.delete(EFS.NONE, null);
createTree(getTree(target));
/* temp\target -> temp\copy of target */
IFileStore copyOfTarget = temp.getChild("copy of target");
target.copy(copyOfTarget, EFS.NONE, null);
assertTrue("2.1", verifyTree(getTree(copyOfTarget)));
/* remove trash */
target.delete(EFS.NONE, null);
copyOfTarget.delete(EFS.NONE, null);
}
public void testCopyDirectoryParentMissing() throws Throwable {
IFileStore parent = getTempStore();
IFileStore child = parent.getChild("child");
IFileStore existing = getTempStore();
createFile(existing, getRandomString());
//try to copy when parent of destination does not exist
try {
existing.copy(child, EFS.NONE, getMonitor());
fail("1.0");
} catch (CoreException e) {
//should fail
}
//destination should not exist
assertTrue("1.1", !child.fetchInfo().exists());
}
public void testCopyFile() throws Throwable {
/* build scenario */
IFileStore temp = createDir(getWorkspace().getRoot().getLocation().append("temp").toString(), true);
// create target
String content = "this is just a simple content \n to a simple file \n to test a 'simple' copy";
IFileStore target = temp.getChild("target");
target.delete(EFS.NONE, null);
createFile(target, content);
assertTrue("1.3", target.fetchInfo().exists());
assertTrue("1.4", compareContent(getContents(content), target.openInputStream(EFS.NONE, null)));
/* temp\target -> temp\copy of target */
IFileStore copyOfTarget = temp.getChild("copy of target");
target.copy(copyOfTarget, IResource.DEPTH_INFINITE, null);
assertTrue("2.1", compareContent(getContents(content), copyOfTarget.openInputStream(EFS.NONE, null)));
copyOfTarget.delete(EFS.NONE, null);
// We need to know whether or not we can unset the read-only flag
// in order to perform this part of the test.
if (isReadOnlySupported()) {
/* make source read-only and try the copy temp\target -> temp\copy of target */
copyOfTarget = temp.getChild("copy of target");
setReadOnly(target, true);
target.copy(copyOfTarget, IResource.DEPTH_INFINITE, null);
assertTrue("3.1", compareContent(getContents(content), copyOfTarget.openInputStream(EFS.NONE, null)));
// reset read only flag for cleanup
setReadOnly(copyOfTarget, false);
copyOfTarget.delete(EFS.NONE, null);
// reset the read only flag for cleanup
setReadOnly(target, false);
target.delete(EFS.NONE, null);
}
/* copy a big file to test progress monitor */
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 1000; i++) {
sb.append("asdjhasldhaslkfjhasldkfjhasdlkfjhasdlfkjhasdflkjhsdaf");
}
IFileStore bigFile = temp.getChild("bigFile");
createFile(bigFile, sb.toString());
assertTrue("7.1", bigFile.fetchInfo().exists());
assertTrue("7.2", compareContent(getContents(sb.toString()), bigFile.openInputStream(EFS.NONE, null)));
IFileStore destination = temp.getChild("copy of bigFile");
//IProgressMonitor monitor = new LoggingProgressMonitor(System.out);
IProgressMonitor monitor = getMonitor();
bigFile.copy(destination, EFS.NONE, monitor);
assertTrue("7.3", compareContent(getContents(sb.toString()), destination.openInputStream(EFS.NONE, null)));
destination.delete(EFS.NONE, null);
/* take out the trash */
temp.delete(EFS.NONE, null);
}
/**
* Basically this is a test for the Windows Platform.
*/
public void testCopyFileAcrossVolumes() throws Throwable {
IFileStore[] tempDirectories = getFileStoresOnTwoVolumes();
/* test if we are in the adequate environment */
if (tempDirectories == null || tempDirectories.length < 2 || tempDirectories[0] == null || tempDirectories[1] == null) {
return;
}
/* build scenario */
/* get the source folder */
IFileStore tempSrc = tempDirectories[0];
/* get the destination folder */
IFileStore tempDest = tempDirectories[1];
// create target
String content = "this is just a simple content \n to a simple file \n to test a 'simple' copy";
IFileStore target = tempSrc.getChild("target");
target.delete(EFS.NONE, null);
createFile(target, content);
assertTrue("1.3", target.fetchInfo().exists());
assertTrue("1.4", compareContent(getContents(content), target.openInputStream(EFS.NONE, null)));
/* c:\temp\target -> d:\temp\target */
IFileStore destination = tempDest.getChild("target");
target.copy(destination, IResource.DEPTH_INFINITE, null);
assertTrue("3.1", compareContent(getContents(content), destination.openInputStream(EFS.NONE, null)));
destination.delete(EFS.NONE, null);
/* c:\temp\target -> d:\temp\copy of target */
destination = tempDest.getChild("copy of target");
target.copy(destination, IResource.DEPTH_INFINITE, null);
assertTrue("4.1", compareContent(getContents(content), destination.openInputStream(EFS.NONE, null)));
destination.delete(EFS.NONE, null);
/* c:\temp\target -> d:\temp\target (but the destination is already a file */
destination = tempDest.getChild("target");
String anotherContent = "nothing..................gnihton";
createFile(destination, anotherContent);
assertTrue("5.1", !destination.fetchInfo().isDirectory());
target.copy(destination, IResource.DEPTH_INFINITE, null);
assertTrue("5.2", compareContent(getContents(content), destination.openInputStream(EFS.NONE, null)));
destination.delete(EFS.NONE, null);
/* c:\temp\target -> d:\temp\target (but the destination is already a folder */
destination = tempDest.getChild("target");
createDir(destination, true);
assertTrue("6.1", destination.fetchInfo().isDirectory());
boolean ok = false;
try {
target.copy(destination, EFS.NONE, null);
} catch (CoreException e) {
/* test if the input stream inside the copy method was closed */
target.delete(EFS.NONE, null);
createFile(target, content);
ok = true;
}
assertTrue("6.2", ok);
assertTrue("6.3", destination.fetchInfo().isDirectory());
destination.delete(EFS.NONE, null);
/* remove trash */
target.delete(EFS.NONE, null);
}
public void testGetLength() throws Exception {
// evaluate test environment
IPath root = getWorkspace().getRoot().getLocation().append("" + new Date().getTime());
IFileStore temp = createDir(root.toString(), true);
try {
// create common objects
IFileStore target = temp.getChild("target");
// test non-existent file
assertEquals("1.0", EFS.NONE, target.fetchInfo().getLength());
// create empty file
target.openOutputStream(EFS.NONE, null).close();
assertEquals("1.0", 0, target.fetchInfo().getLength());
// add a byte
OutputStream out = target.openOutputStream(EFS.NONE, null);
out.write(5);
out.close();
assertEquals("1.0", 1, target.fetchInfo().getLength());
} finally {
/* remove trash */
temp.delete(EFS.NONE, null);
}
}
public void testGetStat() throws CoreException {
/* evaluate test environment */
IPath root = getWorkspace().getRoot().getLocation().append("" + new Date().getTime());
IFileStore temp = createDir(root.toString(), true);
/* create common objects */
IFileStore target = temp.getChild("target");
long stat;
/* test stat with an non-existing file */
stat = target.fetchInfo().getLastModified();
assertEquals("1.0", EFS.NONE, stat);
/* test stat with an existing folder */
createDir(target, true);
stat = target.fetchInfo().getLastModified();
assertTrue("2.0", EFS.NONE != stat);
/* remove trash */
temp.delete(EFS.NONE, null);
}
public void testMove() throws Throwable {
/* build scenario */
IFileStore tempC = createDir(getWorkspace().getRoot().getLocation().append("temp").toString(), true);
// create target file
IFileStore target = tempC.getChild("target");
String content = "just a content.....tnetnoc a tsuj";
createFile(target, content);
assertTrue("1.3", target.fetchInfo().exists());
// create target tree
IFileStore tree = tempC.getChild("tree");
createDir(tree, true);
createTree(getTree(tree));
/* rename file */
IFileStore destination = tempC.getChild("destination");
target.move(destination, EFS.NONE, null);
assertTrue("2.1", !destination.fetchInfo().isDirectory());
assertTrue("2.2", !target.fetchInfo().exists());
destination.move(target, EFS.NONE, null);
assertTrue("2.3", !target.fetchInfo().isDirectory());
assertTrue("2.4", !destination.fetchInfo().exists());
/* rename file (but destination is already a file) */
String anotherContent = "another content";
createFile(destination, anotherContent);
boolean ok = false;
try {
target.move(destination, EFS.NONE, null);
} catch (CoreException e) {
ok = true;
}
assertTrue("3.1", ok);
assertTrue("3.2", !target.fetchInfo().isDirectory());
destination.delete(EFS.NONE, null);
assertTrue("3.3", !destination.fetchInfo().exists());
/* rename file (but destination is already a folder) */
createDir(destination, true);
try {
target.move(destination, EFS.NONE, null);
} catch (CoreException e) {
ok = true;
}
assertTrue("4.1", ok);
assertTrue("4.2", !target.fetchInfo().isDirectory());
destination.delete(EFS.NONE, null);
assertTrue("4.3", !destination.fetchInfo().exists());
/* rename folder */
destination = tempC.getChild("destination");
tree.move(destination, EFS.NONE, null);
assertTrue("6.1", verifyTree(getTree(destination)));
assertTrue("6.2", !tree.fetchInfo().exists());
destination.move(tree, EFS.NONE, null);
assertTrue("6.3", verifyTree(getTree(tree)));
assertTrue("6.4", !destination.fetchInfo().exists());
/* remove trash */
target.delete(EFS.NONE, null);
tree.delete(EFS.NONE, null);
}
public void testMoveAcrossVolumes() throws Throwable {
IFileStore[] tempDirectories = getFileStoresOnTwoVolumes();
/* test if we are in the adequate environment */
if (tempDirectories == null || tempDirectories.length < 2 || tempDirectories[0] == null || tempDirectories[1] == null) {
return;
}
/* build scenario */
/* get the source folder */
IFileStore tempSrc = tempDirectories[0];
/* get the destination folder */
IFileStore tempDest = tempDirectories[1];
// create target file
IFileStore target = tempSrc.getChild("target");
String content = "just a content.....tnetnoc a tsuj";
createFile(target, content);
assertTrue("1.3", target.fetchInfo().exists());
// create target tree
IFileStore tree = tempSrc.getChild("tree");
createDir(tree, true);
createTree(getTree(tree));
/* move file across volumes */
IFileStore destination = tempDest.getChild("target");
target.move(destination, EFS.NONE, null);
assertTrue("5.1", !destination.fetchInfo().isDirectory());
assertTrue("5.2", !target.fetchInfo().exists());
destination.move(target, EFS.NONE, null);
assertTrue("5.3", !target.fetchInfo().isDirectory());
assertTrue("5.4", !destination.fetchInfo().exists());
/* move folder across volumes */
destination = tempDest.getChild("target");
tree.move(destination, EFS.NONE, null);
assertTrue("9.1", verifyTree(getTree(destination)));
assertTrue("9.2", !tree.fetchInfo().exists());
destination.move(tree, EFS.NONE, null);
assertTrue("9.3", verifyTree(getTree(tree)));
assertTrue("9.4", !destination.fetchInfo().exists());
/* remove trash */
target.delete(EFS.NONE, null);
tree.delete(EFS.NONE, null);
}
public void testMoveDirectoryParentMissing() throws Throwable {
IFileStore parent = getTempStore();
IFileStore child = parent.getChild("child");
IFileStore existing = getTempStore();
createFile(existing, getRandomString());
//try to move when parent of destination does not exist
try {
existing.move(child, EFS.NONE, getMonitor());
fail("1.0");
} catch (CoreException e) {
//should fail
}
//destination should not exist
assertTrue("1.1", !child.fetchInfo().exists());
}
/**
* Tests public API method {@link IFileStore#putInfo(IFileInfo, int, IProgressMonitor)}.
*/
public void testPutInfo() {
IFileStore nonExisting = getTempStore();
//assert that modifying a non-existing store fails
IFileInfo info = nonExisting.fetchInfo();
info.setLastModified(System.currentTimeMillis());
try {
nonExisting.putInfo(info, EFS.SET_LAST_MODIFIED, getMonitor());
fail("1.0");
} catch (CoreException e) {
//expected
}
info = nonExisting.fetchInfo();
info.setAttribute(EFS.ATTRIBUTE_READ_ONLY, false);
try {
nonExisting.putInfo(info, EFS.SET_ATTRIBUTES, getMonitor());
fail("1.1");
} catch (CoreException e) {
//expected
}
}
public void testReadOnly() throws CoreException {
testAttribute(EFS.ATTRIBUTE_READ_ONLY);
}
public void testPermissionsEnabled() {
String os = Platform.getOS();
String arch = Platform.getOSArch();
if (Platform.OS_LINUX.equals(os) || (Platform.OS_SOLARIS.equals(os) && Platform.ARCH_SPARC.equals(arch)) || Platform.OS_MACOSX.equals(os) || Platform.OS_AIX.equals(os)) {
assertTrue(isAttributeSupported(EFS.ATTRIBUTE_OWNER_READ));
assertTrue(isAttributeSupported(EFS.ATTRIBUTE_OWNER_WRITE));
assertTrue(isAttributeSupported(EFS.ATTRIBUTE_OWNER_EXECUTE));
assertTrue(isAttributeSupported(EFS.ATTRIBUTE_GROUP_READ));
assertTrue(isAttributeSupported(EFS.ATTRIBUTE_GROUP_WRITE));
assertTrue(isAttributeSupported(EFS.ATTRIBUTE_GROUP_EXECUTE));
assertTrue(isAttributeSupported(EFS.ATTRIBUTE_OTHER_READ));
assertTrue(isAttributeSupported(EFS.ATTRIBUTE_OTHER_WRITE));
assertTrue(isAttributeSupported(EFS.ATTRIBUTE_OTHER_EXECUTE));
} else {
assertFalse(isAttributeSupported(EFS.ATTRIBUTE_OWNER_READ));
assertFalse(isAttributeSupported(EFS.ATTRIBUTE_OWNER_WRITE));
assertFalse(isAttributeSupported(EFS.ATTRIBUTE_OWNER_EXECUTE));
assertFalse(isAttributeSupported(EFS.ATTRIBUTE_GROUP_READ));
assertFalse(isAttributeSupported(EFS.ATTRIBUTE_GROUP_WRITE));
assertFalse(isAttributeSupported(EFS.ATTRIBUTE_GROUP_EXECUTE));
assertFalse(isAttributeSupported(EFS.ATTRIBUTE_OTHER_READ));
assertFalse(isAttributeSupported(EFS.ATTRIBUTE_OTHER_WRITE));
assertFalse(isAttributeSupported(EFS.ATTRIBUTE_OTHER_EXECUTE));
}
}
public void testPermissions() throws CoreException {
testAttribute(EFS.ATTRIBUTE_OWNER_READ);
testAttribute(EFS.ATTRIBUTE_OWNER_WRITE);
testAttribute(EFS.ATTRIBUTE_OWNER_EXECUTE);
testAttribute(EFS.ATTRIBUTE_GROUP_READ);
testAttribute(EFS.ATTRIBUTE_GROUP_WRITE);
testAttribute(EFS.ATTRIBUTE_GROUP_EXECUTE);
testAttribute(EFS.ATTRIBUTE_OTHER_READ);
testAttribute(EFS.ATTRIBUTE_OTHER_WRITE);
testAttribute(EFS.ATTRIBUTE_OTHER_EXECUTE);
}
private void testAttribute(int attribute) throws CoreException {
if (!isAttributeSupported(attribute)) {
return;
}
IPath root = getWorkspace().getRoot().getLocation().append("" + new Date().getTime());
IFileStore targetFolder = createDir(root.toString(), true);
try {
IFileStore targetFile = targetFolder.getChild("targetFile");
createFileInFileSystem(targetFile);
// file
boolean init = targetFile.fetchInfo().getAttribute(attribute);
setAttribute(targetFile, attribute, !init);
assertTrue("1.2", targetFile.fetchInfo().getAttribute(attribute) != init);
setAttribute(targetFile, attribute, init);
assertTrue("1.4", targetFile.fetchInfo().getAttribute(attribute) == init);
// folder
init = targetFolder.fetchInfo().getAttribute(attribute);
setAttribute(targetFolder, attribute, !init);
assertTrue("2.2", targetFolder.fetchInfo().getAttribute(attribute) != init);
setAttribute(targetFolder, attribute, init);
assertTrue("2.4", targetFolder.fetchInfo().getAttribute(attribute) == init);
} finally {
/* remove trash */
targetFolder.delete(EFS.NONE, null);
}
}
public void testGetFileStore() throws Exception {
// create files
File file = getTempDir().append("test.txt").toFile();
file.createNewFile();
assertTrue("1.0", file.exists());
IFileStore tempStore = createDir(getTempDir().append("temp").toString(), true);
createDir(getTempDir().append("temp/temp2").toString(), true);
file = getTempDir().append("temp/temp2/test.txt").toFile();
file.createNewFile();
assertTrue("2.0", file.exists());
// check the parent reference
IPath relativePath = new Path("../test.txt");
IFileStore relativeStore = tempStore.getFileStore(relativePath);
assertNotNull("3.0", relativeStore);
IFileInfo info = relativeStore.fetchInfo();
assertNotNull("4.0", info);
assertTrue("5.0", info.exists());
// check the parent and self reference
relativePath = new Path(".././test.txt");
relativeStore = tempStore.getFileStore(relativePath);
assertNotNull("6.0", relativeStore);
info = relativeStore.fetchInfo();
assertNotNull("7.0", info);
assertTrue("8.0", info.exists());
// check the a path with no parent and self references
relativePath = new Path("temp2/test.txt");
relativeStore = tempStore.getFileStore(relativePath);
assertNotNull("9.0", relativeStore);
info = relativeStore.fetchInfo();
assertNotNull("10.0", info);
assertTrue("11.0", info.exists());
}
}