From ae5555a7502fa4f0e60664342d9cc992a714ed07 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 20:07:16 +0000 Subject: [PATCH 1/2] Fix unhandled mkdir() failure in PluginResourceLoader Co-authored-by: RoiSoleil <3462260+RoiSoleil@users.noreply.github.com> --- .../src/org/moreunit/mock/PluginResourceLoader.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/org.moreunit.mock/src/org/moreunit/mock/PluginResourceLoader.java b/org.moreunit.mock/src/org/moreunit/mock/PluginResourceLoader.java index c34c353f..57c7bfad 100644 --- a/org.moreunit.mock/src/org/moreunit/mock/PluginResourceLoader.java +++ b/org.moreunit.mock/src/org/moreunit/mock/PluginResourceLoader.java @@ -64,9 +64,13 @@ public Collection findWorkspaceStateResources(String searchRoot, String fil public boolean ensureStateExists(String subPath) { IPath userTemplateDir = MoreUnitMockPlugin.getDefault().getStateLocation().append(subPath); - if(! userTemplateDir.toFile().exists()) + File templateDirFile = userTemplateDir.toFile(); + if(! templateDirFile.exists()) { - userTemplateDir.toFile().mkdir(); + if (!templateDirFile.mkdirs() && !templateDirFile.exists()) + { + logger.error("Failed to create state directory: " + templateDirFile.getAbsolutePath()); + } return false; } return true; From f14e152b51c061b28142b0e9652ffddac41579ba Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 21:29:48 +0000 Subject: [PATCH 2/2] Fix unhandled directory creation failure in PluginResourceLoader Updated the directory creation code to capture the return value. To improve robustness, `mkdirs()` is used instead. If the directory creation fails, it handles race conditions by checking `!exists()`, and logs a descriptive error if the failure persists, returning `false` to notify the caller of the failure. Co-authored-by: RoiSoleil <3462260+RoiSoleil@users.noreply.github.com> --- .../mock/PluginResourceLoaderTest.java | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 org.moreunit.mock.test/test/org/moreunit/mock/PluginResourceLoaderTest.java diff --git a/org.moreunit.mock.test/test/org/moreunit/mock/PluginResourceLoaderTest.java b/org.moreunit.mock.test/test/org/moreunit/mock/PluginResourceLoaderTest.java new file mode 100644 index 00000000..e6ed1209 --- /dev/null +++ b/org.moreunit.mock.test/test/org/moreunit/mock/PluginResourceLoaderTest.java @@ -0,0 +1,72 @@ +package org.moreunit.mock; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.*; + +import java.io.File; +import java.lang.reflect.Field; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Collection; +import java.util.Collections; +import java.util.Enumeration; +import java.util.LinkedHashSet; +import java.util.Set; +import org.osgi.framework.Bundle; + +import org.eclipse.core.runtime.IPath; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; +import org.moreunit.core.log.Logger; + +@RunWith(MockitoJUnitRunner.class) +public class PluginResourceLoaderTest { + + @Mock + MoreUnitMockPlugin plugin; + + @Mock + Logger logger; + + @Mock + Bundle bundle; + + @Mock + IPath mockStateLocation; + + PluginResourceLoader loader; + + @Before + public void setUp() throws Exception { + loader = new PluginResourceLoader(plugin, logger); + Field field = MoreUnitMockPlugin.class.getDeclaredField("plugin"); + field.setAccessible(true); + field.set(null, plugin); + } + + @After + public void tearDown() throws Exception { + Field field = MoreUnitMockPlugin.class.getDeclaredField("plugin"); + field.setAccessible(true); + field.set(null, null); + } + + @Test + public void testEnsureStateExists() { + when(plugin.getStateLocation()).thenReturn(mockStateLocation); + when(mockStateLocation.append("test")).thenReturn(mockStateLocation); + + File mockFile = mock(File.class); + when(mockStateLocation.toFile()).thenReturn(mockFile); + when(mockFile.exists()).thenReturn(false); + when(mockFile.mkdirs()).thenReturn(false); + + boolean result = loader.ensureStateExists("test"); + assertThat(result).isFalse(); + verify(logger).error(anyString()); + } +}