blob: 4c9eb711f428cc8377c45a1134ba073bdb676ea2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 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
* Alexander Kurtakov <akurtako@redhat.com> - Bug 459343
* Sergey Prigogin (Google) - [462440] IFile#getContents methods should specify the status codes for its exceptions
*******************************************************************************/
package org.eclipse.core.tests.resources;
import java.io.*;
import java.util.ArrayList;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.core.tests.harness.FussyProgressMonitor;
public class IFileTest extends ResourceTest {
//name of files according to sync category
public static final String DOES_NOT_EXIST = "DoesNotExistFile";
public static final String EXISTING = "ExistingFile";
public static final String LOCAL_ONLY = "LocalOnlyFile";
public static final String OUT_OF_SYNC = "OutOfSyncFile";
// protected static final IProgressMonitor[] PROGRESS_MONITORS = new IProgressMonitor[] {new FussyProgressMonitor(), new CancelingProgressMonitor(), null};
protected static final IProgressMonitor[] PROGRESS_MONITORS = new IProgressMonitor[] {new FussyProgressMonitor(), null};
protected static final Boolean[] TRUE_AND_FALSE = new Boolean[] {Boolean.TRUE, Boolean.FALSE};
public static final String WORKSPACE_ONLY = "WorkspaceOnlyFile";
ArrayList<IFile> allFiles = new ArrayList<>();
ArrayList<IFile> existingFiles = new ArrayList<>();
ArrayList<IFile> localOnlyFiles = new ArrayList<>();
ArrayList<IFile> nonExistingFiles = new ArrayList<>();
ArrayList<IFile> outOfSyncFiles = new ArrayList<>();
IProject[] projects = null;
ArrayList<IFile> workspaceOnlyFiles = new ArrayList<>();
/**
* Sets up the test suite for this class
*/
public static Test suite() {
return new TestSuite(IFileTest.class);
// TestSuite suite = new TestSuite();
// suite.addTest(new IFileTest("testInvalidFileNames"));
// return suite;
}
public IFileTest() {
super();
}
public IFileTest(String name) {
super(name);
}
/**
* Returns true if the given container exists, and is open
* if applicable.
*/
public boolean existsAndOpen(IContainer container) {
if (!container.exists()) {
return false;
}
if (container instanceof IFolder) {
return true;
}
if (container instanceof IProject) {
return ((IProject) container).isOpen();
}
fail("Should not get here in FileTest.existsAndOpen");
return false;
}
/**
* This method creates the necessary resources
* for the FileTests. The interesting files are
* placed in ArrayLists that are members of the class.
*/
protected void generateInterestingFiles() throws CoreException {
IProject[] interestingProjects = interestingProjects();
for (IProject project : interestingProjects) {
//file in project
generateInterestingFiles(project);
//file in non-existent folder
generateInterestingFiles(project.getFolder("NonExistentFolder"));
//file in existent folder
if (project.exists() && project.isOpen()) {
IFolder folder = project.getFolder("ExistingFolder");
folder.create(true, true, getMonitor());
generateInterestingFiles(folder);
}
}
}
/**
* Creates some interesting files in the specified container.
* Adds these files to the appropriate member ArrayLists.
* Conditions on these files (out of sync, workspace only, etc)
* will be ensured by refreshFiles
*/
public void generateInterestingFiles(IContainer container) {
//non-existent file
IFile file = container.getFile(new Path(DOES_NOT_EXIST));
nonExistingFiles.add(file);
allFiles.add(file);
//exists in file system only
file = container.getFile(new Path(LOCAL_ONLY));
localOnlyFiles.add(file);
allFiles.add(file);
if (existsAndOpen(container)) {
//existing file
file = container.getFile(new Path(EXISTING));
existingFiles.add(file);
allFiles.add(file);
//exists in workspace only
file = container.getFile(new Path(WORKSPACE_ONLY));
workspaceOnlyFiles.add(file);
allFiles.add(file);
//exists in both but is out of sync
file = container.getFile(new Path(OUT_OF_SYNC));
outOfSyncFiles.add(file);
allFiles.add(file);
}
}
/**
* Returns some interesting files. These files are created
* during setup.
*/
public IFile[] interestingFiles() {
refreshFiles();
IFile[] result = new IFile[allFiles.size()];
allFiles.toArray(result);
return result;
}
/**
* Creates and returns some interesting projects
*/
public IProject[] interestingProjects() throws CoreException {
if (projects == null) {
projects = new IProject[3];
//open project
IProject openProject = getWorkspace().getRoot().getProject("OpenProject");
openProject.create(getMonitor());
openProject.open(getMonitor());
projects[0] = openProject;
//closed project
IProject closedProject = getWorkspace().getRoot().getProject("ClosedProject");
closedProject.create(getMonitor());
projects[1] = closedProject;
//non-existent project
projects[2] = getWorkspace().getRoot().getProject("NonExistentProject");
}
return projects;
}
/**
* Returns some interesting input streams
*/
public InputStream[] interestingStreams() {
ArrayList<InputStream> streams = new ArrayList<>();
//empty stream
ByteArrayInputStream bis = new ByteArrayInputStream(new byte[0]);
streams.add(bis);
// random content
streams.add(getRandomContents());
//large stream
bis = new ByteArrayInputStream(new byte[10000]);
streams.add(bis);
InputStream[] results = new InputStream[streams.size()];
streams.toArray(results);
return results;
}
/**
* Returns true if the given file is out of sync from the
* local file system. The file must exist in the workspace.
*/
public boolean outOfSync(IFile file) {
return file.getName().equals(OUT_OF_SYNC) || file.getName().equals(WORKSPACE_ONLY);
}
/**
* Makes sure file requirements are met (out of sync, workspace only, etc).
*/
public void refreshFile(IFile file) {
if (file.getName().equals(LOCAL_ONLY)) {
ensureDoesNotExistInWorkspace(file);
//project must exist to access file system store.
if (file.getProject().exists()) {
ensureExistsInFileSystem(file);
}
return;
}
if (file.getName().equals(WORKSPACE_ONLY)) {
ensureExistsInWorkspace(file, true);
ensureDoesNotExistInFileSystem(file);
return;
}
if (file.getName().equals(DOES_NOT_EXIST)) {
ensureDoesNotExistInWorkspace(file);
//project must exist to access file system store.
if (file.getProject().exists()) {
ensureDoesNotExistInFileSystem(file);
}
return;
}
if (file.getName().equals(EXISTING)) {
ensureExistsInWorkspace(file, true);
return;
}
if (file.getName().equals(OUT_OF_SYNC)) {
ensureExistsInWorkspace(file, true);
ensureOutOfSync(file);
return;
}
}
/**
* Makes sure file requirements are met (out of sync, workspace only, etc).
*/
public void refreshFiles() {
for (IFile file : allFiles) {
refreshFile(file);
}
}
@Override
protected void setUp() throws Exception {
super.setUp();
try {
generateInterestingFiles();
} catch (CoreException e) {
fail("Failed in setup for FileTest", e);
}
}
@Override
protected void tearDown() throws Exception {
getWorkspace().getRoot().refreshLocal(IResource.DEPTH_INFINITE, null);
ensureDoesNotExistInWorkspace(getWorkspace().getRoot());
super.tearDown();
}
public void testAppendContents() {
IFile target = projects[0].getFile("file1");
try {
target.create(getContents("abc"), false, null);
} catch (CoreException e) {
fail("1.0", e);
}
try {
target.appendContents(getContents("def"), false, false, null);
} catch (CoreException e) {
fail("2.0", e);
}
InputStream content = null;
try {
content = target.getContents(false);
assertTrue("3.0", compareContent(content, getContents("abcdef")));
} catch (CoreException e) {
fail("3.1", e);
}
}
public void testAppendContents2() {
IFile file = projects[0].getFile("file1");
ensureDoesNotExistInWorkspace(file);
// If force=true, IFile is non-local, file exists in local file system:
// make IFile local, append contents (the thinking being that this file,
// though marked non-local, was in fact local awaiting discovery; so
// force=true says we it is ok to make file local and proceed as per normal)
try {
// setup
file.create(null, false, getMonitor());
assertTrue("1.0", !file.isLocal(IResource.DEPTH_ZERO));
assertTrue("1.1", !file.getLocation().toFile().exists());
ensureExistsInFileSystem(file);
assertTrue("1.2", !file.isLocal(IResource.DEPTH_ZERO));
} catch (CoreException e) {
fail("1.3", e);
}
try {
file.appendContents(getRandomContents(), IResource.FORCE, getMonitor());
} catch (CoreException e) {
fail("1.4", e);
}
assertTrue("1.5", file.isLocal(IResource.DEPTH_ZERO));
assertTrue("1.6", file.getLocation().toFile().exists());
// cleanup
ensureDoesNotExistInWorkspace(file);
// If force=true, IFile is non-local, file does not exist in local file system:
// fail - file not local (this file is not local for real - cannot append
// something to a file that you don't have)
try {
// setup
file.create(null, false, getMonitor());
assertTrue("2.0", !file.isLocal(IResource.DEPTH_ZERO));
assertTrue("2.1", !file.getLocation().toFile().exists());
} catch (CoreException e) {
fail("2.2", e);
}
try {
file.appendContents(getRandomContents(), IResource.FORCE, getMonitor());
fail("2.3");
} catch (CoreException e) {
// should fail
}
assertTrue("2.4", !file.isLocal(IResource.DEPTH_ZERO));
// cleanup
ensureDoesNotExistInWorkspace(file);
// If force=false, IFile is non-local, file exists in local file system:
// fail - file not local
try {
// setup
file.create(null, false, getMonitor());
assertTrue("3.0", !file.isLocal(IResource.DEPTH_ZERO));
assertTrue("3.1", !file.getLocation().toFile().exists());
ensureExistsInFileSystem(file);
assertTrue("3.2", !file.isLocal(IResource.DEPTH_ZERO));
} catch (CoreException e) {
fail("3.3", e);
}
try {
file.appendContents(getRandomContents(), IResource.NONE, getMonitor());
fail("3.4");
} catch (CoreException e) {
// should fail
}
assertTrue("3.5", !file.isLocal(IResource.DEPTH_ZERO));
// cleanup
ensureDoesNotExistInWorkspace(file);
// If force=false, IFile is non-local, file does not exist in local file system:
// fail - file not local
try {
// setup
file.create(null, false, getMonitor());
assertTrue("4.0", !file.isLocal(IResource.DEPTH_ZERO));
assertTrue("4.1", !file.getLocation().toFile().exists());
} catch (CoreException e) {
fail("4.2", e);
}
try {
file.appendContents(getRandomContents(), IResource.NONE, getMonitor());
fail("4.3");
} catch (CoreException e) {
// should fail
}
assertTrue("4.4", !file.isLocal(IResource.DEPTH_ZERO));
// cleanup
ensureDoesNotExistInWorkspace(file);
}
/**
* Performs black box testing of the following method:
* void create(InputStream, boolean, IProgressMonitor)
*/
public void testCreate() {
Object[][] inputs = new Object[][] {interestingFiles(), interestingStreams(), TRUE_AND_FALSE, PROGRESS_MONITORS};
new TestPerformer("IFileTest.testCreate") {
@Override
public void cleanUp(Object[] args, int count) {
IFile file = (IFile) args[0];
refreshFile(file);
}
@Override
public Object[] interestingOldState(Object[] args) throws Exception {
return null;
}
@Override
public Object invokeMethod(Object[] args, int count) throws Exception {
IFile file = (IFile) args[0];
InputStream stream = (InputStream) args[1];
boolean force = ((Boolean) args[2]).booleanValue();
IProgressMonitor monitor = (IProgressMonitor) args[3];
if (monitor instanceof FussyProgressMonitor) {
((FussyProgressMonitor) monitor).prepare();
}
file.create(stream, force, monitor);
if (monitor instanceof FussyProgressMonitor) {
((FussyProgressMonitor) monitor).sanityCheck();
}
return null;
}
@Override
public boolean shouldFail(Object[] args, int count) {
IFile file = (IFile) args[0];
IPath fileLocation = file.getLocation();
boolean force = ((Boolean) args[2]).booleanValue();
boolean fileExistsInWS = file.exists();
boolean fileExistsInFS = fileLocation != null && fileLocation.toFile().exists();
// parent must be accessible
if (!file.getParent().isAccessible()) {
return true;
}
// should never fail if force is true
if (force && !fileExistsInWS) {
return false;
}
// file must not exist in WS or on filesystem.
return fileExistsInWS || fileExistsInFS;
}
@Override
public boolean wasSuccess(Object[] args, Object result, Object[] oldState) throws Exception {
IFile file = (IFile) args[0];
return file.exists();
}
}.performTest(inputs);
}
public void testCreateDerived() {
IFile derived = projects[0].getFile("derived.txt");
ensureExistsInWorkspace(projects[0], true);
ensureDoesNotExistInWorkspace(derived);
try {
derived.create(getRandomContents(), IResource.DERIVED, getMonitor());
} catch (CoreException e) {
fail("0.99", e);
}
assertTrue("1.0", derived.isDerived());
assertTrue("1.1", !derived.isTeamPrivateMember());
try {
derived.delete(false, getMonitor());
derived.create(getRandomContents(), IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("1.99", e);
}
assertTrue("2.0", !derived.isDerived());
assertTrue("2.1", !derived.isTeamPrivateMember());
}
public void testDeltaOnCreateDerived() {
IFile derived = projects[0].getFile("derived.txt");
ensureExistsInWorkspace(projects[0], true);
ResourceDeltaVerifier verifier = new ResourceDeltaVerifier();
getWorkspace().addResourceChangeListener(verifier, IResourceChangeEvent.POST_CHANGE);
verifier.addExpectedChange(derived, IResourceDelta.ADDED, IResource.NONE);
try {
derived.create(getRandomContents(), IResource.FORCE | IResource.DERIVED, getMonitor());
} catch (CoreException e) {
fail("1.0", e);
}
assertTrue("2.0", verifier.isDeltaValid());
}
public void testCreateDerivedTeamPrivate() {
IFile teamPrivate = projects[0].getFile("teamPrivateDerived.txt");
ensureExistsInWorkspace(projects[0], true);
ensureDoesNotExistInWorkspace(teamPrivate);
try {
teamPrivate.create(getRandomContents(), IResource.TEAM_PRIVATE | IResource.DERIVED, getMonitor());
} catch (CoreException e) {
fail("0.99", e);
}
assertTrue("1.0", teamPrivate.isTeamPrivateMember());
assertTrue("1.1", teamPrivate.isDerived());
try {
teamPrivate.delete(false, getMonitor());
teamPrivate.create(getRandomContents(), IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("1.99", e);
}
assertTrue("2.0", !teamPrivate.isTeamPrivateMember());
assertTrue("2.1", !teamPrivate.isDerived());
}
public void testCreateTeamPrivate() {
IFile teamPrivate = projects[0].getFile("teamPrivate.txt");
ensureExistsInWorkspace(projects[0], true);
ensureDoesNotExistInWorkspace(teamPrivate);
try {
teamPrivate.create(getRandomContents(), IResource.TEAM_PRIVATE, getMonitor());
} catch (CoreException e) {
fail("0.99", e);
}
assertTrue("1.0", teamPrivate.isTeamPrivateMember());
assertTrue("1.1", !teamPrivate.isDerived());
try {
teamPrivate.delete(false, getMonitor());
teamPrivate.create(getRandomContents(), IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("1.99", e);
}
assertTrue("2.0", !teamPrivate.isTeamPrivateMember());
assertTrue("2.1", !teamPrivate.isDerived());
}
public void testFileCreation() {
IFile target = projects[0].getFile("file1");
assertTrue("1.0", !target.exists());
try {
target.create(null, true, getMonitor());
} catch (CoreException e) {
fail("1.1", e);
}
assertTrue("1.2", target.exists());
// creation with empty content
target = projects[0].getFile("file2");
assertTrue("2.0", !target.exists());
String contents = "";
try {
target.create(getContents(contents), true, getMonitor());
} catch (CoreException e) {
fail("2.1", e);
}
assertTrue("2.2", target.exists());
InputStream stream = null;
try {
stream = target.getContents(false);
} catch (CoreException e) {
fail("2.3", e);
}
try {
assertTrue("2.4", stream.available() == 0);
} catch (IOException e) {
fail("2.5", e);
}
try {
stream.close();
} catch (IOException e) {
fail("2.55", e);
}
try {
assertTrue("2.6", compareContent(target.getContents(false), getContents(contents)));
} catch (CoreException e) {
fail("2.7", e);
}
// creation with random content
target = projects[0].getFile("file3");
assertTrue("3.0", !target.exists());
contents = getRandomString();
try {
target.create(getContents(contents), true, getMonitor());
} catch (CoreException e) {
fail("3.1", e);
}
assertTrue("3.2", target.exists());
try {
assertTrue("3.2", compareContent(target.getContents(false), getContents(contents)));
} catch (CoreException e) {
fail("3.3", e);
}
// try to create a file over a folder that exists
IFolder folder = projects[0].getFolder("folder1");
try {
folder.create(true, true, getMonitor());
} catch (CoreException e) {
fail("4.0", e);
}
assertTrue("4.1", folder.exists());
target = projects[0].getFile("folder1");
try {
target.create(null, true, getMonitor());
fail("4.2");
} catch (CoreException e) {
// expected
}
assertTrue("4.3", folder.exists());
assertTrue("4.4", !target.exists());
// try to create a file under a non-existent parent
folder = projects[0].getFolder("folder2");
assertTrue("5.0", !folder.exists());
target = folder.getFile("file4");
try {
target.create(null, true, getMonitor());
fail("5.1");
} catch (CoreException e) {
// expected
}
assertTrue("5.2", !folder.exists());
assertTrue("5.3", !target.exists());
//create from stream that throws exceptions
target = projects[0].getFile("file2");
ensureDoesNotExistInWorkspace(target);
ensureDoesNotExistInFileSystem(target);
InputStream content = new InputStream() {
@Override
public int read() throws IOException {
throw new IOException();
}
};
try {
target.create(content, false, getMonitor());
fail("6.1");
} catch (CoreException e) {
// expected
}
assertDoesNotExistInWorkspace("6.2", target);
assertDoesNotExistInFileSystem("6.3", target);
// cleanup
folder = projects[0].getFolder("folder1");
try {
folder.delete(false, getMonitor());
} catch (CoreException e) {
fail("7.0", e);
}
IFile file = projects[0].getFile("file1");
try {
file.delete(false, getMonitor());
} catch (CoreException e) {
fail("7.1", e);
}
file = projects[0].getFile("file2");
try {
file.delete(false, getMonitor());
} catch (CoreException e) {
fail("7.2", e);
}
file = projects[0].getFile("file3");
try {
file.delete(false, getMonitor());
} catch (CoreException e) {
fail("7.3", e);
}
}
public void testFileCreation_Bug107188() {
//create from stream that is canceled
IFile target = projects[0].getFile("file1");
ensureDoesNotExistInWorkspace(target);
ensureDoesNotExistInFileSystem(target);
InputStream content = new InputStream() {
@Override
public int read() {
throw new OperationCanceledException();
}
};
try {
target.create(content, false, getMonitor());
fail("1.0");
} catch (OperationCanceledException e) {
// expected
} catch (CoreException e) {
fail("2.0");
}
assertDoesNotExistInWorkspace("3.0", target);
assertDoesNotExistInFileSystem("4.0", target);
}
public void testFileDeletion() throws Throwable {
IFile target = projects[0].getFile("file1");
target.create(null, true, getMonitor());
assertTrue("1.0", target.exists());
target.delete(true, getMonitor());
assertTrue("1.1", !target.exists());
}
public void testFileEmptyDeletion() throws Throwable {
IFile target = projects[0].getFile("file1");
target.create(getContents(""), true, getMonitor());
assertTrue("1.0", target.exists());
target.delete(true, getMonitor());
assertTrue("1.1", !target.exists());
}
public void testFileInFolderCreation() {
IFolder folder = projects[0].getFolder("folder1");
try {
folder.create(false, true, getMonitor());
} catch (CoreException e) {
fail("1.0", e);
}
IFile target = folder.getFile("file1");
try {
target.create(getRandomContents(), true, getMonitor());
assertTrue("1.1", target.exists());
} catch (CoreException e) {
fail("1.2", e);
}
}
public void testFileInFolderCreation1() throws Throwable {
IFolder folder = projects[0].getFolder("folder1");
folder.create(false, true, null);
IFile target = folder.getFile("file1");
target.create(getRandomContents(), true, getMonitor());
assertTrue("1.0", target.exists());
}
public void testFileInFolderCreation2() {
IFolder folder = projects[0].getFolder("folder1");
try {
folder.create(false, true, getMonitor());
} catch (CoreException e) {
fail("1.0", e);
}
IFile target = folder.getFile("file1");
try {
target.create(getRandomContents(), true, getMonitor());
assertTrue("1.1", target.exists());
} catch (CoreException e) {
fail("1.2", e);
}
}
public void testFileMove() throws Throwable {
IFile target = projects[0].getFile("file1");
target.create(getRandomContents(), true, getMonitor());
IFile destination = projects[0].getFile("file2");
target.move(destination.getFullPath(), true, getMonitor());
assertTrue("1.0", destination.exists());
assertTrue("1.1", !target.exists());
}
public void testFileOverFolder() throws Throwable {
IFolder existing = projects[0].getFolder("ExistingFolder");
IFile target = projects[0].getFile("ExistingFolder");
try {
target.create(null, true, getMonitor());
fail("Should not be able to create file over folder");
} catch (CoreException e) {
assertTrue("1.1", existing.exists());
return;
}
}
/**
* Performs black box testing of the following method:
* InputStream getContents()
*/
public void testGetContents() {
Object[][] inputs = new Object[][] {interestingFiles()};
new TestPerformer("IFileTest.testGetContents") {
@Override
public void cleanUp(Object[] args, int count) {
IFile file = (IFile) args[0];
refreshFile(file);
}
@Override
public Object[] interestingOldState(Object[] args) throws Exception {
return null;
}
@Override
public Object invokeMethod(Object[] args, int count) throws Exception {
IFile file = (IFile) args[0];
return file.getContents(false);
}
@Override
public boolean shouldFail(Object[] args, int count) {
IFile file = (IFile) args[0];
//file must exist
if (!file.exists()) {
return true;
}
//file must be in sync
if (outOfSync(file)) {
return true;
}
return false;
}
@Override
public boolean wasSuccess(Object[] args, Object result, Object[] oldState) throws Exception {
IFile file = (IFile) args[0];
InputStream contents = (InputStream) result;
boolean returnVal = file.exists() && contents != null;
contents.close();
return returnVal;
}
}.performTest(inputs);
}
public void testGetContents2() throws IOException {
IFile target = projects[0].getFile("file1");
String testString = getRandomString();
try {
target.create(null, false, null);
target.setContents(getContents(testString), true, false, getMonitor());
} catch (CoreException e) {
fail("0.0", e);
}
ensureOutOfSync(target);
InputStream content = null;
try {
try {
content = target.getContents(false);
} finally {
if (content != null) {
content.close();
}
}
fail("1.0");
} catch (CoreException e) {
// Ok, the file is out is sync.
assertEquals("1.1", IResourceStatus.OUT_OF_SYNC_LOCAL, e.getStatus().getCode());
}
try {
try {
content = target.getContents(true);
} finally {
if (content != null) {
content.close();
}
}
} catch (CoreException e) {
fail("2.1", e);
}
try {
try {
content = target.getContents(false);
} finally {
if (content != null) {
content.close();
}
}
fail("3.0");
} catch (CoreException e) {
// Ok, the file is out is sync.
assertEquals("3.1", IResourceStatus.OUT_OF_SYNC_LOCAL, e.getStatus().getCode());
}
content = new InputStream() {
@Override
public int read() throws IOException {
throw new IOException();
}
};
try {
target.setContents(content, IResource.NONE, getMonitor());
fail("4.1");
} catch (CoreException e) {
// expected
}
assertExistsInWorkspace("4.2", target);
assertExistsInFileSystem("4.3", target);
}
/**
* Tests creation and manipulation of file names that are reserved on some platforms.
*/
public void testInvalidFileNames() {
IProject project = projects[0];
//should not be able to create a file with invalid path on any platform
String[] names = new String[] {"", "/"};
for (int i = 0; i < names.length; i++) {
try {
project.getFile(names[i]);
fail("0.1." + i);
} catch (RuntimeException e) {
//should fail
}
}
//do some tests with invalid names
names = new String[0];
if (isWindows()) {
//invalid windows names
names = new String[] {"a ", "foo::bar", "prn", "nul", "con", "aux", "clock$", "com1", "com2", "com3", "com4", "com5", "com6", "com7", "com8", "com9", "lpt1", "lpt2", "lpt3", "lpt4", "lpt5", "lpt6", "lpt7", "lpt8", "lpt9", "AUX", "con.foo", "LPT4.txt", "*", "?", "\"", "<", ">", "|"};
} else {
//invalid names on non-windows platforms
names = new String[] {};
}
for (String name : names) {
IFile file = project.getFile(Path.fromPortableString(name));
assertTrue("1.0 " + name, !file.exists());
try {
file.create(getRandomContents(), true, getMonitor());
fail("1.1 " + name);
} catch (CoreException e) {
// expected
}
assertTrue("1.2 " + name, !file.exists());
}
//do some tests with valid names that are *almost* invalid
if (isWindows()) {
//these names are valid on windows
names = new String[] {" a", "hello.prn.txt", "null", "con3", "foo.aux", "lpt0", "com0", "com10", "lpt10", ",", "'", ";", "clock$.class"};
} else {
//these names are valid on non-windows platforms
names = new String[] {" a", "a ", "foo:bar", "prn", "nul", "con", "aux", "clock$", "com1", "com2", "com3", "com4", "com5", "com6", "com7", "com8", "com9", "lpt1", "lpt2", "lpt3", "lpt4", "lpt5", "lpt6", "lpt7", "lpt8", "lpt9", "con.foo", "LPT4.txt", "*", "?", "\"", "<", ">", "|", "hello.prn.txt", "null", "con3", "foo.aux", "lpt0", "com0", "com10", "lpt10", ",", "'", ";"};
}
for (String name : names) {
IFile file = project.getFile(name);
assertTrue("2.0 " + name, !file.exists());
try {
file.create(getRandomContents(), true, getMonitor());
} catch (CoreException e) {
fail("2.1 " + name, e);
}
assertTrue("2.2 " + name, file.exists());
}
}
/**
* Performs black box testing of the following method:
* void setContents(InputStream, boolean, IProgressMonitor)
*/
public void testSetContents1() {
Object[][] inputs = new Object[][] {interestingFiles(), interestingStreams(), TRUE_AND_FALSE, PROGRESS_MONITORS};
new TestPerformer("IFileTest.testSetContents1") {
@Override
public void cleanUp(Object[] args, int count) {
IFile file = (IFile) args[0];
refreshFile(file);
}
@Override
public Object[] interestingOldState(Object[] args) throws Exception {
return null;
}
@Override
public Object invokeMethod(Object[] args, int count) throws Exception {
IFile file = (IFile) args[0];
InputStream stream = (InputStream) args[1];
boolean force = ((Boolean) args[2]).booleanValue();
IProgressMonitor monitor = (IProgressMonitor) args[3];
if (monitor instanceof FussyProgressMonitor) {
((FussyProgressMonitor) monitor).prepare();
}
file.setContents(stream, force, false, monitor);
if (monitor instanceof FussyProgressMonitor) {
((FussyProgressMonitor) monitor).sanityCheck();
}
return null;
}
@Override
public boolean shouldFail(Object[] args, int count) {
IFile file = (IFile) args[0];
boolean force = ((Boolean) args[2]).booleanValue();
//file must exist
if (!file.exists()) {
return true;
}
//file must be in sync if force is false
if (!force && outOfSync(file)) {
return true;
}
return false;
}
@Override
public boolean wasSuccess(Object[] args, Object result, Object[] oldState) throws Exception {
IFile file = (IFile) args[0];
return file.exists();
}
}.performTest(inputs);
}
public void testSetContents2() {
IFile target = projects[0].getFile("file1");
try {
target.create(null, false, null);
} catch (CoreException e) {
fail("0.0", e);
}
String testString = getRandomString();
try {
target.setContents(getContents(testString), true, false, getMonitor());
} catch (CoreException e) {
fail("1.0", e);
}
InputStream content = null;
try {
content = target.getContents(false);
assertTrue("get not equal set", compareContent(content, getContents(testString)));
} catch (CoreException e) {
fail("2.0", e);
} finally {
try {
content.close();
} catch (IOException e) {
// ignore
}
}
}
public void testSetGetFolderPersistentProperty() throws Throwable {
IResource target = getWorkspace().getRoot().getFile(new Path("/Project/File.txt"));
String value = "this is a test property value";
QualifiedName name = new QualifiedName("itp-test", "testProperty");
// getting/setting persistent properties on non-existent resources should throw an exception
ensureDoesNotExistInWorkspace(target);
try {
target.getPersistentProperty(name);
fail("1.0");
} catch (CoreException e) {
//this should happen
}
try {
target.setPersistentProperty(name, value);
fail("1.1");
} catch (CoreException e) {
//this should happen
}
ensureExistsInWorkspace(target, true);
target.setPersistentProperty(name, value);
// see if we can get the property
assertTrue("2.0", target.getPersistentProperty(name).equals(value));
// see what happens if we get a non-existant property
name = new QualifiedName("itp-test", "testNonProperty");
assertNull("2.1", target.getPersistentProperty(name));
//set a persistent property with null qualifier
name = new QualifiedName(null, "foo");
try {
target.setPersistentProperty(name, value);
fail("3.0");
} catch (CoreException e) {
//expect an exception
}
}
}