blob: 4957ce73962eea1cf95594b03f46f468d5aa3d64 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2015 Broadcom Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* James Blackburn (Broadcom Corp.) - initial API and implementation
*******************************************************************************/
package org.eclipse.core.tests.resources.regression;
import java.io.*;
import java.net.URI;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.filesystem.URIUtil;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.core.tests.internal.filesystem.wrapper.WrapperFileStore;
import org.eclipse.core.tests.internal.filesystem.wrapper.WrapperFileSystem;
import org.eclipse.core.tests.resources.ResourceTest;
/**
* This tests that I/O Exception on OuptuStream#close() after IFile#setContents is correctly reported.
*/
public class Bug_332543 extends ResourceTest {
public static Test suite() {
return new TestSuite(Bug_332543.class);
}
/**
* Wrapper FS which throws an IOException when someone
* closes an output stream...
*/
public static class IOErrOnCloseFileStore extends WrapperFileStore {
public IOErrOnCloseFileStore(IFileStore store) {
super(store);
}
@Override
public OutputStream openOutputStream(int options, IProgressMonitor monitor) throws CoreException {
OutputStream os = super.openOutputStream(options, monitor);
os = new BufferedOutputStream(os) {
@Override
public void close() throws java.io.IOException {
// We close the output stream (so there aren't issues deleting the project during tear-down)
super.close();
// But we also throw IOException as if the operation had failed.
throw new IOException("Whoops I dunno how to close!");
}
};
return os;
}
}
@Override
protected void setUp() throws Exception {
super.setUp();
}
@Override
protected void tearDown() throws Exception {
WrapperFileSystem.setCustomFileStore(null);
super.tearDown();
}
public void testBug() throws Exception {
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
String proj_name = getUniqueString();
IPath proj_loc = root.getLocation().append(proj_name);
URI proj_uri = WrapperFileSystem.getWrappedURI(URIUtil.toURI(proj_loc));
IProjectDescription desc = ResourcesPlugin.getWorkspace().newProjectDescription(proj_name);
desc.setLocationURI(proj_uri);
// Create the project on the wrapped file system
IProject project = root.getProject(desc.getName());
project.create(desc, getMonitor());
// Create a file in the project
IFile f = project.getFile("foo.txt");
ensureExistsInFileSystem(f);
// Set our evil IOException on close() fs.
WrapperFileSystem.setCustomFileStore(IOErrOnCloseFileStore.class);
// Now open the project
project.open(getMonitor());
// Try #setContents on an existing file
try {
f.setContents(new ByteArrayInputStream("Random".getBytes()), false, true, getMonitor());
fail("1.0");
} catch (CoreException e) {
// This is expected.
}
// Try create on a non-existent file
f = project.getFile("foo1.txt");
try {
f.create(new ByteArrayInputStream("Random".getBytes()), false, getMonitor());
fail("2.0");
} catch (CoreException e) {
// This is expected.
}
}
}