/******************************************************************************* * 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 * Sergey Prigogin (Google) - [462440] IFile#getContents methods should specify the status codes for its exceptions *******************************************************************************/ package org.eclipse.core.tests.resources.regression; import java.io.InputStream; import junit.framework.Test; import junit.framework.TestSuite; import org.eclipse.core.filesystem.EFS; import org.eclipse.core.resources.*; import org.eclipse.core.runtime.*; import org.eclipse.core.tests.resources.ResourceTest; public class IResourceTest extends ResourceTest { private boolean DISABLED = true; public static Test suite() { return new TestSuite(IResourceTest.class); } public IResourceTest() { super(); } public IResourceTest(String name) { super(name); } @Override protected void tearDown() throws Exception { super.tearDown(); getWorkspace().getRoot().delete(true, null); } /** * 1G9RBH5: ITPCORE:WIN98 - IFile.appendContents might lose data */ public void testAppendContents_1G9RBH5() { IProject project = getWorkspace().getRoot().getProject("MyProject"); try { project.create(null); project.open(null); } catch (CoreException e) { fail("0.0", e); } IFile target = project.getFile("file1"); try { target.create(getContents("abc"), false, null); } catch (CoreException e) { fail("1.0", e); } try { target.appendContents(getContents("def"), false, true, 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); } // clean up try { project.delete(true, true, null); } catch (CoreException e) { fail("3.0", e); } } /** * Bug states that JDT cannot copy the .project file from the project root to * the build output folder. */ public void testBug25686() { IProject project = getWorkspace().getRoot().getProject("MyProject"); IFolder outputFolder = project.getFolder("bin"); IFile description = project.getFile(".project"); IFile destination = outputFolder.getFile(".project"); ensureExistsInWorkspace(new IResource[] {project, outputFolder}, true); assertTrue("0.0", description.exists()); try { description.copy(destination.getFullPath(), IResource.NONE, getMonitor()); } catch (CoreException e) { fail("0.99", e); } assertTrue("0.1", destination.exists()); } public void testBug28790() { // only activate this test on platforms that support it if (!isAttributeSupported(EFS.ATTRIBUTE_ARCHIVE)) { return; } IProject project = getWorkspace().getRoot().getProject("MyProject"); IFile file = project.getFile("a.txt"); ensureExistsInWorkspace(file, getRandomString()); try { //ensure archive bit is not set ResourceAttributes attributes = file.getResourceAttributes(); attributes.setArchive(false); file.setResourceAttributes(attributes); assertTrue("1.0", !file.getResourceAttributes().isArchive()); //modify the file file.setContents(getRandomContents(), IResource.KEEP_HISTORY, getMonitor()); } catch (CoreException e) { fail("1.99", e); } //now the archive bit should be set assertTrue("2.0", file.getResourceAttributes().isArchive()); } /** * Bug 31750 states that an OperationCanceledException is * not handled correctly if it occurs within a proxy visitor. */ public void testBug31750() { IResourceProxyVisitor visitor = proxy -> { throw new OperationCanceledException(); }; try { getWorkspace().getRoot().accept(visitor, IResource.NONE); fail("1.0"); } catch (OperationCanceledException e) { // expected results } catch (CoreException e) { fail("2.0", e); } } /** * A resource that is deleted, recreated, and converted to a phantom * all in one operation should not appear in the resource delta for * clients that are not interested in phantoms. */ public void testBug35991() { IProject project = getWorkspace().getRoot().getProject("MyProject"); final IFile file = project.getFile("file1"); ensureExistsInWorkspace(project, true); //create phantom file by adding sync info final QualifiedName name = new QualifiedName("test", "testBug35991"); getWorkspace().getSynchronizer().add(name); try { getWorkspace().getSynchronizer().setSyncInfo(name, file, new byte[] {1}); } catch (CoreException e) { fail("1.99", e); } final boolean[] seen = new boolean[] {false}; final boolean[] phantomSeen = new boolean[] {false}; class DeltaVisitor implements IResourceDeltaVisitor { private boolean[] mySeen; DeltaVisitor(boolean[] mySeen) { this.mySeen = mySeen; } @Override public boolean visit(IResourceDelta aDelta) { if (aDelta.getResource().equals(file)) { mySeen[0] = true; } return true; } } IResourceChangeListener listener = event -> { IResourceDelta delta = event.getDelta(); if (delta == null) { return; } try { delta.accept(new DeltaVisitor(seen)); delta.accept(new DeltaVisitor(phantomSeen), true); } catch (CoreException e) { fail("1.99", e); } }; try { getWorkspace().addResourceChangeListener(listener, IResourceChangeEvent.POST_CHANGE); try { //removing and adding sync info causes phantom to be deleted and recreated getWorkspace().run((IWorkspaceRunnable) monitor -> { ISynchronizer synchronizer = getWorkspace().getSynchronizer(); synchronizer.flushSyncInfo(name, file, IResource.DEPTH_INFINITE); synchronizer.setSyncInfo(name, file, new byte[] {1}); }, null, IWorkspace.AVOID_UPDATE, getMonitor()); //ensure file was only seen by phantom listener assertTrue("1.0", !seen[0]); assertTrue("1.0", phantomSeen[0]); } catch (CoreException e) { fail("2.99", e); } } finally { getWorkspace().removeResourceChangeListener(listener); } } /** * Calling isSynchronized on a non-local resource caused an internal error. */ public void testBug83777() { IProject project = getWorkspace().getRoot().getProject("testBug83777"); IFolder folder = project.getFolder("f"); ensureExistsInWorkspace(project, true); ensureExistsInWorkspace(folder, true); try { folder.setLocal(false, IResource.DEPTH_ZERO, getMonitor()); //non-local resource is never synchronized because it doesn't exist on disk assertTrue("1.0", !project.isSynchronized(IResource.DEPTH_INFINITE)); } catch (RuntimeException e) { fail("1.99", e); } catch (CoreException e) { fail("2.99", e); } } public void testBug111821() { //this test only makes sense on Windows if (!isWindows()) { return; } IProject project = getWorkspace().getRoot().getProject("testBug111821"); IFolder folder = project.getFolder(new Path(null, "c:")); ensureExistsInWorkspace(project, true); QualifiedName partner = new QualifiedName("HowdyThere", "Partner"); ISynchronizer sync = getWorkspace().getSynchronizer(); sync.add(partner); try { sync.setSyncInfo(partner, folder, new byte[] {1}); fail("1.0");//should not get here } catch (CoreException e) { //expected } } /** * 1GA6QJP: ITPCORE:ALL - Copying a resource does not copy its lastmodified time */ public void testCopy_1GA6QJP() { IProject project = getWorkspace().getRoot().getProject("MyProject"); IFile source = project.getFile("file1"); try { project.create(getMonitor()); project.open(getMonitor()); source.create(getContents("abc"), true, getMonitor()); } catch (CoreException e) { fail("0.0", e); } try { Thread.sleep(5000); } catch (InterruptedException e) { fail("0.99", e); } IPath destinationPath = new Path("copy of file"); try { source.copy(destinationPath, true, getMonitor()); } catch (CoreException e) { fail("1.0", e); } IFile destination = project.getFile(destinationPath); assertEquals("2.0", source.getLocation().toFile().lastModified(), destination.getLocation().toFile().lastModified()); // clean up try { project.delete(true, true, null); } catch (CoreException e) { fail("3.0", e); } } /** * 1FW87XF: ITPUI:WIN2000 - Can create 2 files with same name */ public void testCreate_1FW87XF() { // FIXME: remove when fix this PR String os = Platform.getOS(); if (!os.equals(Platform.OS_LINUX)) { debug("Skipping testCreate_1FW87XF because it is still not supported by the platform."); return; } // test if the file system is case sensitive boolean caseSensitive = new java.io.File("abc").compareTo(new java.io.File("ABC")) != 0; IProject project = getWorkspace().getRoot().getProject("MyProject"); IFile file = project.getFile("file"); try { project.create(null); project.open(null); file.create(getRandomContents(), true, null); } catch (CoreException e) { fail("1.0", e); } // force = true assertTrue("2.0", file.exists()); IFile anotherFile = project.getFile("File"); try { anotherFile.create(getRandomContents(), true, null); if (!caseSensitive) { fail("2.1"); } } catch (CoreException e) { if (caseSensitive) { fail("2.2", e); } } // clean-up try { anotherFile.delete(true, false, null); } catch (CoreException e) { fail("3.0", e); } // force = false try { anotherFile.create(getRandomContents(), false, null); if (!caseSensitive) { fail("4.0"); } } catch (CoreException e) { if (caseSensitive) { fail("4.1", e); } } // test refreshLocal try { anotherFile.refreshLocal(IResource.DEPTH_ZERO, getMonitor()); if (!caseSensitive) { fail("5.0"); } } catch (CoreException e) { if (caseSensitive) { fail("5.1", e); } } // clean up try { project.delete(true, true, getMonitor()); } catch (CoreException e) { fail("6.0", e); } } /** * 1FWYTKT: ITPCORE:WINNT - Error creating folder with long name */ public void testCreate_1FWYTKT() { IProject project = getWorkspace().getRoot().getProject("MyProject"); try { project.create(null); project.open(null); } catch (CoreException e) { fail("1.0", e); } StringBuffer sb = new StringBuffer(); for (int i = 0; i < 260; i++) { sb.append('a'); } sb.append('b'); IFolder folder = project.getFolder(sb.toString()); try { folder.create(true, true, null); fail("2.1"); } catch (CoreException e) { // expected } assertTrue("2.2", !folder.exists()); IFile file = project.getFile(sb.toString()); try { file.create(getRandomContents(), true, null); fail("3.0"); } catch (CoreException e) { // expected } assertTrue("3.1", !file.exists()); // clean up try { project.delete(true, true, null); } catch (CoreException e) { fail("3.0", e); } project = getWorkspace().getRoot().getProject(sb.toString()); try { project.create(null); fail("4.0"); } catch (CoreException e) { // expected } assertTrue("4.1", !project.exists()); } /** * 1GD7CSU: ITPCORE:ALL - IFile.create bug? * * Ensure that creating a file with force==true doesn't throw * a CoreException if the resource already exists on disk. */ public void testCreate_1GD7CSU() { IProject project = getWorkspace().getRoot().getProject("MyProject"); try { project.create(null); project.open(null); } catch (CoreException e) { fail("1.0", e); } IFile file = project.getFile("MyFile"); ensureExistsInFileSystem(file); try { file.create(getRandomContents(), true, getMonitor()); } catch (CoreException e) { fail("2.0", e); } } /* * Test PR: 1GD3ZUZ. Ensure that a CoreException is being thrown * when we try to delete a read-only resource. It will depend on the * OS and file system. */ public void testDelete_1GD3ZUZ() { // This test cannot be done automatically because we don't know in that // file system we are running. Will leave test here in case it needs // to be run it in a special environment. if (DISABLED) { return; } IProject project = getWorkspace().getRoot().getProject("MyProject"); IFile file = project.getFile("MyFile"); // setup ensureExistsInWorkspace(new IResource[] {project, file}, true); ResourceAttributes attributes = file.getResourceAttributes(); attributes.setReadOnly(true); try { file.setResourceAttributes(attributes); } catch (CoreException e1) { fail("1.99", e1); } assertTrue("2.0", file.isReadOnly()); // doit try { file.delete(false, getMonitor()); fail("3.0"); } catch (CoreException e) { // expected } // cleanup attributes = file.getResourceAttributes(); attributes.setReadOnly(false); try { file.setResourceAttributes(attributes); } catch (CoreException e1) { fail("3.99", e1); } assertTrue("4.0", !file.isReadOnly()); ensureDoesNotExistInWorkspace(new IResource[] {project, file}); } public void testDelete_Bug8754() { //In this test, we delete with force false on a file that does not exist in the file system, //and ensure that the returned exception is of type OUT_OF_SYNC_LOCAL IProject project = getWorkspace().getRoot().getProject("MyProject"); IFile file = project.getFile("MyFile"); // setup ensureExistsInWorkspace(new IResource[] {project, file}, true); ensureOutOfSync(file); // doit try { file.delete(false, getMonitor()); fail("1.0"); } catch (CoreException e) { IStatus status = e.getStatus(); if (status.isMultiStatus()) { IStatus[] children = status.getChildren(); assertEquals("1.1", 1, children.length); status = children[0]; } assertEquals("1.2", IResourceStatus.OUT_OF_SYNC_LOCAL, status.getCode()); } //cleanup ensureDoesNotExistInWorkspace(new IResource[] {project, file}); } public void testEquals_1FUOU25() { IResource fileResource = getWorkspace().getRoot().getFile(new Path("a/b/c/d")); IResource folderResource = getWorkspace().getRoot().getFolder(new Path("a/b/c/d")); assertTrue("1FUOU25: ITPCORE:ALL - Bug in Resource.equals()", !fileResource.equals(folderResource)); } public void testExists_1FUP8U6() { IProject project = getWorkspace().getRoot().getProject("MyProject"); IFolder folder = project.getFolder("folder"); try { project.create(null); project.open(null); folder.create(true, true, null); } catch (CoreException e) { fail("1.0", e); } IFile file = project.getFile("folder"); assertTrue("2.0", !file.exists()); // clean up try { project.delete(true, true, null); } catch (CoreException e) { fail("3.0", e); } } /** * 1GA6QYV: ITPCORE:ALL - IContainer.findMember( Path, boolean ) breaking API */ public void testFindMember_1GA6QYV() { IProject project = getWorkspace().getRoot().getProject("MyProject"); try { project.create(getMonitor()); project.open(getMonitor()); } catch (CoreException e) { fail("1.0", e); } IFolder folder1 = project.getFolder("Folder1"); IFolder folder2 = folder1.getFolder("Folder2"); IFolder folder3 = folder2.getFolder("Folder3"); try { folder1.create(true, true, getMonitor()); folder2.create(true, true, getMonitor()); folder3.create(true, true, getMonitor()); } catch (CoreException e) { fail("2.0", e); } IPath targetPath = new Path("Folder2/Folder3"); IFolder target = (IFolder) folder1.findMember(targetPath); assertTrue("3.0", folder3.equals(target)); targetPath = new Path("/Folder2/Folder3"); target = (IFolder) folder1.findMember(targetPath); assertTrue("4.0", folder3.equals(target)); // clean up try { project.delete(true, true, null); } catch (CoreException e) { fail("3.0", e); } } /** * 1GBZD4S: ITPCORE:API - IFile.getContents(true) fails if performed during delta notification */ public void testGetContents_1GBZD4S() { IProject project = getWorkspace().getRoot().getProject("MyProject"); try { project.create(null); project.open(null); } catch (CoreException e) { fail("0.0", e); } final IFile target = project.getFile("file1"); String contents = "some random contents"; try { target.create(getContents(contents), false, null); } catch (CoreException e) { fail("1.0", e); } try { InputStream is = target.getContents(false); assertTrue("2.0", compareContent(getContents(contents), is)); } catch (CoreException e) { fail("2.1", e); } final String newContents = "some other contents"; try { Thread.sleep(5000); } catch (InterruptedException e) { fail("3.99", e); } createFileInFileSystem(target.getLocation(), getContents(newContents)); final boolean[] failed = new boolean[1]; IResourceChangeListener listener = event -> { try { failed[0] = true; InputStream is = target.getContents(true); assertTrue("4.0", compareContent(getContents(newContents), is)); failed[0] = false; } catch (CoreException e) { fail("4.1", e); } }; getWorkspace().addResourceChangeListener(listener); // trigger delta notification try { project.touch(null); } catch (CoreException e) { fail("4.5", e); } getWorkspace().removeResourceChangeListener(listener); assertTrue("4.6", !failed[0]); try { target.getContents(false); fail("5.0"); } catch (CoreException e) { // Expected. assertEquals("5.1", IResourceStatus.OUT_OF_SYNC_LOCAL, e.getStatus().getCode()); } try { InputStream is = target.getContents(true); assertTrue("6.0", compareContent(getContents(newContents), is)); } catch (CoreException e) { fail("6.1", e); } // clean up try { project.delete(true, true, null); } catch (CoreException e) { fail("3.0", e); } } /** * 1G60AFG: ITPCORE:WIN - problem calling RefreshLocal with DEPTH_ZERO on folder */ public void testRefreshLocal_1G60AFG() { IProject project = getWorkspace().getRoot().getProject("MyProject"); IFolder folder = project.getFolder("folder"); IFile file = folder.getFile("file"); try { project.create(null); project.open(null); folder.create(true, true, null); file.create(getRandomContents(), true, null); } catch (CoreException e) { fail("1.0", e); } assertTrue("2.0", file.exists()); try { folder.refreshLocal(IResource.DEPTH_ZERO, null); } catch (CoreException e) { fail("2.1", e); } assertTrue("2.2", file.exists()); // clean up try { project.delete(true, true, null); } catch (CoreException e) { fail("3.0", e); } } }