| /******************************************************************************* |
| * 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 |
| * 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.File; |
| import java.io.InputStream; |
| import junit.framework.Test; |
| import junit.framework.TestSuite; |
| import org.eclipse.core.resources.*; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.Path; |
| import org.eclipse.core.runtime.jobs.Job; |
| import org.eclipse.core.runtime.preferences.InstanceScope; |
| import org.eclipse.core.tests.resources.ResourceTest; |
| |
| /** |
| * Tests that, when the workspace discovery a resource is out-of-sync |
| * it brings the resource back into sync in a timely manner. |
| */ |
| public class Bug_303517 extends ResourceTest { |
| |
| public static Test suite() { |
| return new TestSuite(Bug_303517.class); |
| } |
| |
| String[] resources = new String[] {"/", "/Bug303517/", "/Bug303517/Folder/", "/Bug303517/Folder/Resource",}; |
| |
| @Override |
| public String[] defineHierarchy() { |
| return resources; |
| } |
| |
| @Override |
| protected void setUp() throws Exception { |
| super.setUp(); |
| InstanceScope.INSTANCE.getNode(ResourcesPlugin.PI_RESOURCES).putBoolean(ResourcesPlugin.PREF_LIGHTWEIGHT_AUTO_REFRESH, true); |
| } |
| |
| @Override |
| protected void tearDown() throws Exception { |
| super.tearDown(); |
| InstanceScope.INSTANCE.getNode(ResourcesPlugin.PI_RESOURCES).putBoolean(ResourcesPlugin.PREF_LIGHTWEIGHT_AUTO_REFRESH, false); |
| } |
| |
| /** |
| * Tests that file deleted is updated after #getContents |
| */ |
| public void testExists() throws Exception { |
| createHierarchy(); |
| IFile f = getWorkspace().getRoot().getFile(new Path(resources[resources.length - 1])); |
| assertTrue("1.0", f.exists()); |
| assertTrue("1.1", f.isSynchronized(IResource.DEPTH_ONE)); |
| |
| // Touch on file-system |
| f.getLocation().toFile().delete(); |
| // Core.resources still thinks the file exists |
| assertTrue("1.2", f.exists()); |
| try { |
| InputStream in = f.getContents(); |
| in.close(); |
| assertTrue("1.3", false); |
| } catch (CoreException e) { |
| // File doesn't exist - expected |
| } |
| |
| // Wait for auto-refresh to happen |
| Job.getJobManager().join(ResourcesPlugin.FAMILY_AUTO_REFRESH, getMonitor()); |
| |
| // Core.resources should be aware that the file no longer exists... |
| assertFalse("1.4", f.exists()); |
| } |
| |
| /** |
| * Tests that file discovered out-of-sync during #getContents is updated |
| */ |
| public void testGetContents() throws Exception { |
| createHierarchy(); |
| IFile f = getWorkspace().getRoot().getFile(new Path(resources[resources.length - 1])); |
| assertTrue("1.0", f.exists()); |
| assertTrue("1.1", f.isSynchronized(IResource.DEPTH_ONE)); |
| |
| // Touch on file-system |
| touchInFilesystem(f); |
| try { |
| InputStream in = f.getContents(false); |
| in.close(); |
| assertTrue("2.0", false); |
| } catch (CoreException e) { |
| // File is out-of-sync, so this is good. |
| assertEquals("2.1", IResourceStatus.OUT_OF_SYNC_LOCAL, e.getStatus().getCode()); |
| } |
| |
| // Wait for auto-refresh to happen |
| Job.getJobManager().join(ResourcesPlugin.FAMILY_AUTO_REFRESH, getMonitor()); |
| |
| // File is now in sync. |
| try { |
| InputStream in = f.getContents(false); |
| in.close(); |
| } catch (CoreException e) { |
| // Bad, file shouldn't be out-of-sync |
| fail("3.0", e); |
| } |
| } |
| |
| /** |
| * Tests that file discovered out-of-sync during #getContents is updated |
| */ |
| public void testGetContentsTrue() throws Exception { |
| createHierarchy(); |
| IFile f = getWorkspace().getRoot().getFile(new Path(resources[resources.length - 1])); |
| assertTrue("1.0", f.exists()); |
| assertTrue("1.1", f.isSynchronized(IResource.DEPTH_ONE)); |
| |
| // Touch on file-system |
| touchInFilesystem(f); |
| try (InputStream in = f.getContents(true)) { |
| } catch (CoreException e) { |
| // Bad, getContents(true) should succeed. |
| fail("1.2", e); |
| } |
| |
| // Wait for auto-refresh to happen |
| Job.getJobManager().join(ResourcesPlugin.FAMILY_AUTO_REFRESH, getMonitor()); |
| |
| // File is now in sync. |
| try (InputStream in = f.getContents()) { |
| } catch (CoreException e) { |
| // Bad, file shouldn't be out-of-sync. |
| fail("1.3", e); |
| } |
| |
| // Test that getContent(true) on an out-if-sync deleted file throws a CoreException |
| // with IResourceStatus.RESOURCE_NOT_FOUND error code. |
| f.getLocation().toFile().delete(); |
| try (InputStream in = f.getContents(true)) { |
| fail("2.0"); |
| } catch (CoreException e) { |
| // Expected. |
| assertEquals("2.1", IResourceStatus.RESOURCE_NOT_FOUND, e.getStatus().getCode()); |
| } |
| } |
| |
| /** |
| * Tests that resource discovered out-of-sync during #isSynchronized is updated |
| */ |
| public void testIsSynchronized() throws Exception { |
| createHierarchy(); |
| IFile f = getWorkspace().getRoot().getFile(new Path(resources[resources.length - 1])); |
| assertTrue("1.0", f.exists()); |
| assertTrue("1.1", f.isSynchronized(IResource.DEPTH_ONE)); |
| |
| // Touch on file-system |
| touchInFilesystem(f); |
| assertFalse("1.2", f.isSynchronized(IResource.DEPTH_ONE)); |
| |
| // Wait for auto-refresh to happen |
| Job.getJobManager().join(ResourcesPlugin.FAMILY_AUTO_REFRESH, getMonitor()); |
| |
| // File is now in sync. |
| assertTrue("1.3", f.isSynchronized(IResource.DEPTH_ONE)); |
| } |
| |
| /** |
| * Tests that when changing resource gender is correctly picked up. |
| */ |
| public void testChangeResourceGender() throws Exception { |
| createHierarchy(); |
| IResource f = getWorkspace().getRoot().getFile(new Path(resources[resources.length - 1])); |
| assertTrue("1.0", f.exists()); |
| assertTrue("1.1", f.isSynchronized(IResource.DEPTH_ONE)); |
| |
| // Replace the file with a folder |
| File osResource = f.getLocation().toFile(); |
| osResource.delete(); |
| osResource.mkdir(); |
| assertTrue(osResource.exists()); |
| File osChild = new File(osResource, "child"); |
| osChild.createNewFile(); |
| assertTrue(osChild.exists()); |
| |
| assertFalse("1.2", f.isSynchronized(IResource.DEPTH_ONE)); |
| |
| // Wait for auto-refresh to happen |
| Job.getJobManager().join(ResourcesPlugin.FAMILY_AUTO_REFRESH, getMonitor()); |
| |
| // File is no longer a file - i.e. still out-of-sync |
| assertFalse("1.3", f.exists()); |
| assertFalse("1.4", f.isSynchronized(IResource.DEPTH_ONE)); |
| // Folder + child are now in-sync |
| f = getWorkspace().getRoot().getFolder(new Path(resources[resources.length - 1])); |
| assertTrue("1.5", f.exists()); |
| assertTrue("1.6", f.isSynchronized(IResource.DEPTH_INFINITE)); |
| } |
| } |