From 89790cbf9e1c1488da0a991f5816332648f4a5fc Mon Sep 17 00:00:00 2001 From: Heiko Klare Date: Fri, 2 Jan 2026 16:14:49 +0100 Subject: [PATCH] Wrap different ways of IResource read-only property access in tests Some tests still access the deprecated IResource#isReadyOnly() and IResource#setReadOnly(). Some do that by intent to test the deprecated functionality, some have not been adapted to (also) test the new way of accessing that property. This leads to potentially missed test paths and also produces useless warnings. This change parameterizes the existing callers in tests to test both the legacy API as well as the recommended one.. --- .../core/tests/resources/IFolderTest.java | 18 ++++++++----- .../core/tests/resources/IWorkspaceTest.java | 13 ++++++--- .../tests/resources/ResourceTestUtil.java | 24 +++++++++++++++++ .../tests/resources/regression/IFileTest.java | 27 ++++++++++++------- .../resources/regression/IFolderTest.java | 16 +++++++---- 5 files changed, 73 insertions(+), 25 deletions(-) diff --git a/resources/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IFolderTest.java b/resources/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IFolderTest.java index 71bcad5c734..bedeeaf7109 100644 --- a/resources/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IFolderTest.java +++ b/resources/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IFolderTest.java @@ -23,9 +23,11 @@ import static org.eclipse.core.tests.resources.ResourceTestUtil.createRandomContentsStream; import static org.eclipse.core.tests.resources.ResourceTestUtil.createRandomString; import static org.eclipse.core.tests.resources.ResourceTestUtil.createTestMonitor; +import static org.eclipse.core.tests.resources.ResourceTestUtil.isReadOnly; import static org.eclipse.core.tests.resources.ResourceTestUtil.isReadOnlySupported; import static org.eclipse.core.tests.resources.ResourceTestUtil.removeFromFileSystem; import static org.eclipse.core.tests.resources.ResourceTestUtil.removeFromWorkspace; +import static org.eclipse.core.tests.resources.ResourceTestUtil.setReadOnly; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -42,9 +44,12 @@ import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Platform.OS; import org.eclipse.core.runtime.QualifiedName; +import org.eclipse.core.tests.resources.ResourceTestUtil.ReadOnlyApi; import org.eclipse.core.tests.resources.util.WorkspaceResetExtension; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; @ExtendWith(WorkspaceResetExtension.class) public class IFolderTest { @@ -316,8 +321,9 @@ public void testLeafFolderMove() throws Exception { assertDoesNotExistInWorkspace(source); } - @Test - public void testReadOnlyFolderCopy() throws Exception { + @ParameterizedTest + @EnumSource(ReadOnlyApi.class) + public void testReadOnlyFolderCopy(ReadOnlyApi apiVersion) throws Exception { // We need to know whether or not we can unset the read-only flag // in order to perform this test. if (!isReadOnlySupported()) { @@ -326,16 +332,16 @@ public void testReadOnlyFolderCopy() throws Exception { IProject project = getWorkspace().getRoot().getProject("Project"); IFolder source = project.getFolder("Folder1"); createInWorkspace(source); - source.setReadOnly(true); + setReadOnly(source, true, apiVersion); IFolder dest = project.getFolder("Folder2"); source.copy(dest.getFullPath(), true, createTestMonitor()); assertExistsInWorkspace(dest); assertExistsInWorkspace(source); - assertTrue(dest.isReadOnly()); + assertTrue(isReadOnly(dest, apiVersion)); // cleanup - ensure that the files can be deleted. - source.setReadOnly(false); - dest.setReadOnly(false); + setReadOnly(source, false, apiVersion); + setReadOnly(dest, true, apiVersion); } @Test diff --git a/resources/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IWorkspaceTest.java b/resources/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IWorkspaceTest.java index f4df24f6e42..77cc6a0f6a7 100644 --- a/resources/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IWorkspaceTest.java +++ b/resources/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IWorkspaceTest.java @@ -43,6 +43,7 @@ import static org.eclipse.core.tests.resources.ResourceTestUtil.isReadOnlySupported; import static org.eclipse.core.tests.resources.ResourceTestUtil.removeFromFileSystem; import static org.eclipse.core.tests.resources.ResourceTestUtil.removeFromWorkspace; +import static org.eclipse.core.tests.resources.ResourceTestUtil.setReadOnly; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotEquals; @@ -73,9 +74,12 @@ import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Platform.OS; +import org.eclipse.core.tests.resources.ResourceTestUtil.ReadOnlyApi; import org.eclipse.core.tests.resources.util.WorkspaceResetExtension; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; import org.osgi.framework.BundleContext; import org.osgi.framework.FrameworkUtil; import org.osgi.framework.ServiceReference; @@ -762,8 +766,9 @@ public void testSortNatureSet() { order -> assertThat(order).containsExactly(NATURE_SIMPLE, NATURE_WATER, NATURE_SNOW)); } - @Test - public void testValidateEdit() throws CoreException { + @ParameterizedTest + @EnumSource(ReadOnlyApi.class) + public void testValidateEdit(ReadOnlyApi apiVersion) throws CoreException { // We need to know whether or not we can unset the read-only flag // in order to perform this test. if (!isReadOnlySupported()) { @@ -774,12 +779,12 @@ public void testValidateEdit() throws CoreException { createInWorkspace(new IResource[] {project, file}); IStatus result = getWorkspace().validateEdit(new IFile[] {file}, null); assertTrue(result.isOK()); - file.setReadOnly(true); + setReadOnly(file, true, apiVersion); result = getWorkspace().validateEdit(new IFile[] {file}, null); assertEquals(IStatus.ERROR, result.getSeverity()); // assertEquals(IResourceStatus.READ_ONLY_LOCAL, result.getCode()); // remove the read-only status so test cleanup will work ok - file.setReadOnly(false); + setReadOnly(file, false, apiVersion); } @Test diff --git a/resources/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ResourceTestUtil.java b/resources/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ResourceTestUtil.java index 803c23219d9..55fccd5c69f 100644 --- a/resources/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ResourceTestUtil.java +++ b/resources/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ResourceTestUtil.java @@ -773,4 +773,28 @@ public static boolean isLocal(IResource resource, int depth) { return resource.isLocal(depth); } + public enum ReadOnlyApi { + CURRENT, DEPRECATED + } + + @SuppressWarnings("deprecation") + public static void setReadOnly(IResource resource, boolean value, ReadOnlyApi api) throws CoreException { + if (api == ReadOnlyApi.CURRENT) { + ResourceAttributes attributes = new ResourceAttributes(); + attributes.setReadOnly(value); + resource.setResourceAttributes(attributes); + } else { + resource.setReadOnly(value); + } + } + + @SuppressWarnings("deprecation") + public static boolean isReadOnly(IResource resource, ReadOnlyApi api) { + if (api == ReadOnlyApi.CURRENT) { + ResourceAttributes attributes = resource.getResourceAttributes(); + return attributes.isReadOnly(); + } + return resource.isReadOnly(); + } + } diff --git a/resources/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/IFileTest.java b/resources/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/IFileTest.java index 7a1b4de08b9..07117a5374b 100644 --- a/resources/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/IFileTest.java +++ b/resources/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/IFileTest.java @@ -19,7 +19,9 @@ import static org.eclipse.core.tests.resources.ResourceTestUtil.createInWorkspace; import static org.eclipse.core.tests.resources.ResourceTestUtil.createRandomContentsStream; import static org.eclipse.core.tests.resources.ResourceTestUtil.createTestMonitor; +import static org.eclipse.core.tests.resources.ResourceTestUtil.isReadOnly; import static org.eclipse.core.tests.resources.ResourceTestUtil.isReadOnlySupported; +import static org.eclipse.core.tests.resources.ResourceTestUtil.setReadOnly; import static org.junit.Assume.assumeFalse; import static org.junit.Assume.assumeTrue; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -42,10 +44,13 @@ import org.eclipse.core.runtime.Platform.OS; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.core.tests.resources.ResourceTestUtil.ReadOnlyApi; import org.eclipse.core.tests.resources.util.WorkspaceResetExtension; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; @ExtendWith(WorkspaceResetExtension.class) public class IFileTest { @@ -55,9 +60,10 @@ public class IFileTest { * you try to create a file in a read-only folder on Linux should be * ERROR_WRITE. */ - @Test + @ParameterizedTest + @EnumSource(ReadOnlyApi.class) @Disabled("This test is no longer valid since the error code is dependent on whether or not the parent folder is marked as read-only. We need to write a different test to make the file.create fail.") - public void testBug25658() throws CoreException { + public void testBug25658(ReadOnlyApi apiVersion) throws CoreException { // We need to know whether or not we can unset the read-only flag // in order to perform this test. assumeTrue("only relevant for platforms supporting read-only files", isReadOnlySupported()); @@ -71,13 +77,13 @@ public void testBug25658() throws CoreException { IFile file = folder.getFile("file.txt"); try { - folder.setReadOnly(true); - assertThat(folder).matches(IResource::isReadOnly, "is read only"); + setReadOnly(folder, true, apiVersion); + assertThat(folder).matches(res -> isReadOnly(res, apiVersion), "is read only"); CoreException exception = assertThrows(CoreException.class, () -> file.create(createRandomContentsStream(), true, createTestMonitor())); assertEquals(IResourceStatus.FAILED_WRITE_LOCAL, exception.getStatus().getCode()); } finally { - folder.setReadOnly(false); + setReadOnly(folder, false, apiVersion); } } @@ -86,8 +92,9 @@ public void testBug25658() throws CoreException { * parent to see if it is read-only so we can return a better error code and message * to the user. */ - @Test - public void testBug25662() throws CoreException { + @ParameterizedTest + @EnumSource(ReadOnlyApi.class) + public void testBug25662(ReadOnlyApi apiVersion) throws CoreException { // We need to know whether or not we can unset the read-only flag // in order to perform this test. @@ -103,13 +110,13 @@ public void testBug25662() throws CoreException { IFile file = folder.getFile("file.txt"); try { - folder.setReadOnly(true); - assertThat(folder).matches(IResource::isReadOnly, "is read only"); + setReadOnly(folder, true, apiVersion); + assertThat(folder).matches(res -> isReadOnly(res, apiVersion), "is read only"); CoreException exception = assertThrows(CoreException.class, () -> file.create(createRandomContentsStream(), true, createTestMonitor())); assertEquals(IResourceStatus.PARENT_READ_ONLY, exception.getStatus().getCode()); } finally { - folder.setReadOnly(false); + setReadOnly(folder, false, apiVersion); } } diff --git a/resources/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/IFolderTest.java b/resources/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/IFolderTest.java index 351ea41488b..435c9320e15 100644 --- a/resources/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/IFolderTest.java +++ b/resources/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/IFolderTest.java @@ -19,7 +19,9 @@ import static org.eclipse.core.tests.resources.ResourceTestUtil.createInFileSystem; import static org.eclipse.core.tests.resources.ResourceTestUtil.createInWorkspace; import static org.eclipse.core.tests.resources.ResourceTestUtil.createTestMonitor; +import static org.eclipse.core.tests.resources.ResourceTestUtil.isReadOnly; import static org.eclipse.core.tests.resources.ResourceTestUtil.isReadOnlySupported; +import static org.eclipse.core.tests.resources.ResourceTestUtil.setReadOnly; import static org.junit.Assume.assumeTrue; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -35,9 +37,12 @@ import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Platform.OS; +import org.eclipse.core.tests.resources.ResourceTestUtil.ReadOnlyApi; import org.eclipse.core.tests.resources.util.WorkspaceResetExtension; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; @ExtendWith(WorkspaceResetExtension.class) public class IFolderTest { @@ -47,8 +52,9 @@ public class IFolderTest { * the immediate parent to see if it is read-only so we can return a better * error code and message to the user. */ - @Test - public void testBug25662() throws CoreException { + @ParameterizedTest + @EnumSource(ReadOnlyApi.class) + public void testBug25662(ReadOnlyApi apiVersion) throws CoreException { // We need to know whether or not we can unset the read-only flag // in order to perform this test. assumeTrue("only relevant for platforms supporting read-only files", isReadOnlySupported()); @@ -63,12 +69,12 @@ public void testBug25662() throws CoreException { IFolder folder = parentFolder.getFolder("folder"); try { - parentFolder.setReadOnly(true); - assertThat(parentFolder).matches(IResource::isReadOnly, "is read only"); + setReadOnly(parentFolder, true, apiVersion); + assertThat(parentFolder).matches(res -> isReadOnly(res, apiVersion), "is read only"); CoreException exception = assertThrows(CoreException.class, () -> folder.create(true, true, createTestMonitor())); assertEquals(IResourceStatus.PARENT_READ_ONLY, exception.getStatus().getCode()); } finally { - parentFolder.setReadOnly(false); + setReadOnly(parentFolder, false, apiVersion); } }