From b78a9df33a9517ceb20b714e3a835a626a69c92b Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Fri, 28 Aug 2026 17:03:30 +0200 Subject: [PATCH 1/4] chore: Wait for workspace jobs to complete before teardown of tests --- .../sourceforge/pmd/eclipse/EclipseUtils.java | 21 +++++++++++++++++++ .../runtime/builder/PMDNatureTest.java | 1 + .../runtime/cmd/DetectCutAndPasteCmdTest.java | 1 + .../runtime/cmd/MultipleRulesetsTest.java | 1 + .../runtime/cmd/RenderReportCmdTest.java | 1 + .../eclipse/runtime/cmd/ReviewCmdTest.java | 2 ++ .../runtime/cmd/ReviewCodeCmdNonJavaTest.java | 1 + .../ProjectPropertiesModelTest.java | 1 + .../impl/ProjectPropertiesImplTest.java | 1 + .../ui/actions/PMDCheckActionTest.java | 17 +++++++-------- .../ui/actions/PMDGenerateASTActionTest.java | 17 +++++++-------- .../dialogs/ViolationDetailsDialogTest.java | 17 +++++++-------- .../properties/ExternalRuleSetFileTest.java | 13 +++++------- .../PMDProjectPropertyPageTest.java | 1 + .../UpdateProjectPropertiesCmdTest.java | 1 + 15 files changed, 58 insertions(+), 38 deletions(-) diff --git a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/EclipseUtils.java b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/EclipseUtils.java index 193d791f1..407dd9f1e 100644 --- a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/EclipseUtils.java +++ b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/EclipseUtils.java @@ -27,9 +27,11 @@ import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.resources.WorkspaceJob; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.jobs.IJobManager; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IJavaProject; @@ -371,6 +373,25 @@ public static void createFolders(IProject testProject, String fullpath) throws C } } + public static void waitForJobsToComplete() throws InterruptedException { + long start = System.currentTimeMillis(); + String testClass = determineTestClass(); + LOG.debug("waitForJobsToComplete started ({})...", testClass); + IJobManager jobManager = Job.getJobManager(); + jobManager.suspend(); + try { + Job[] jobs = jobManager.find(null); + for (Job job : jobs) { + if (job instanceof WorkspaceJob) { + job.join(); + } + } + } finally { + jobManager.resume(); + } + LOG.debug("waitForJobsToComplete finished in {} ms ({})", System.currentTimeMillis() - start, testClass); + } + public static void waitForPMDJobs() throws InterruptedException { LOG.debug("waitForPMDJobs started..."); long start = System.currentTimeMillis(); diff --git a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/builder/PMDNatureTest.java b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/builder/PMDNatureTest.java index 9ee1f4475..199110425 100644 --- a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/builder/PMDNatureTest.java +++ b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/builder/PMDNatureTest.java @@ -26,6 +26,7 @@ public void addPMDNatureForNonJavaProject() throws Exception { Assert.assertTrue(testProject.hasNature(PMDNature.PMD_NATURE)); + EclipseUtils.waitForJobsToComplete(); if (testProject.exists() && testProject.isAccessible()) { EclipseUtils.removePMDNature(testProject); testProject.refreshLocal(IResource.DEPTH_INFINITE, null); diff --git a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/DetectCutAndPasteCmdTest.java b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/DetectCutAndPasteCmdTest.java index 253d8f069..bf47ec680 100644 --- a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/DetectCutAndPasteCmdTest.java +++ b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/DetectCutAndPasteCmdTest.java @@ -45,6 +45,7 @@ public void setUp() throws Exception { @After public void tearDown() throws Exception { + EclipseUtils.waitForJobsToComplete(); if (this.testProject != null) { if (this.testProject.exists() && this.testProject.isAccessible()) { EclipseUtils.removePMDNature(this.testProject); diff --git a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/MultipleRulesetsTest.java b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/MultipleRulesetsTest.java index 7cc0fd037..ba037c23a 100644 --- a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/MultipleRulesetsTest.java +++ b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/MultipleRulesetsTest.java @@ -88,6 +88,7 @@ public void setUp() throws Exception { @After public void tearDown() throws Exception { + EclipseUtils.waitForJobsToComplete(); if (this.testProject != null) { if (this.testProject.exists() && this.testProject.isAccessible()) { EclipseUtils.removePMDNature(this.testProject); diff --git a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/RenderReportCmdTest.java b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/RenderReportCmdTest.java index 74ac23d62..ed638d79b 100644 --- a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/RenderReportCmdTest.java +++ b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/RenderReportCmdTest.java @@ -58,6 +58,7 @@ public void setUp() throws Exception { @After public void tearDown() throws Exception { + EclipseUtils.waitForJobsToComplete(); if (this.testProject != null) { if (this.testProject.exists() && this.testProject.isAccessible()) { EclipseUtils.removePMDNature(this.testProject); diff --git a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/ReviewCmdTest.java b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/ReviewCmdTest.java index d64dfef50..c32618fed 100644 --- a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/ReviewCmdTest.java +++ b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/ReviewCmdTest.java @@ -72,6 +72,7 @@ public void setUp() throws Exception { @After public void tearDown() throws Exception { + EclipseUtils.waitForJobsToComplete(); if (this.testProject != null) { if (this.testProject.exists() && this.testProject.isAccessible()) { EclipseUtils.removePMDNature(this.testProject); @@ -94,6 +95,7 @@ public void testReviewCmdBasic() throws CoreException { cmd.addResource(this.testProject); cmd.performExecute(); cmd.join(); + final Map> markers = cmd.getMarkers(); // We do not test PMD, only a non-empty report is enough diff --git a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/ReviewCodeCmdNonJavaTest.java b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/ReviewCodeCmdNonJavaTest.java index 0ee6a8ad3..d213331dc 100644 --- a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/ReviewCodeCmdNonJavaTest.java +++ b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/ReviewCodeCmdNonJavaTest.java @@ -75,6 +75,7 @@ public void checkCodeForNonJavaProject() throws Exception { // only one file has an extension, that could be mapped to a language, and therefore pmd was executed Assert.assertEquals(1, cmd.getFileCount()); + EclipseUtils.waitForJobsToComplete(); if (testProject.exists() && testProject.isAccessible()) { EclipseUtils.removePMDNature(testProject); testProject.refreshLocal(IResource.DEPTH_INFINITE, null); diff --git a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/properties/ProjectPropertiesModelTest.java b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/properties/ProjectPropertiesModelTest.java index 6a27efc32..2364fb0b7 100644 --- a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/properties/ProjectPropertiesModelTest.java +++ b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/properties/ProjectPropertiesModelTest.java @@ -99,6 +99,7 @@ public void setUp() throws Exception { @After public void tearDown() throws Exception { + EclipseUtils.waitForJobsToComplete(); // 1. Delete the test project if (this.testProject != null) { if (this.testProject.exists() && this.testProject.isAccessible()) { diff --git a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/properties/impl/ProjectPropertiesImplTest.java b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/properties/impl/ProjectPropertiesImplTest.java index 110417a58..99f8fd45d 100644 --- a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/properties/impl/ProjectPropertiesImplTest.java +++ b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/properties/impl/ProjectPropertiesImplTest.java @@ -45,6 +45,7 @@ public void setUp() throws Exception { @After public void tearDown() throws Exception { + EclipseUtils.waitForJobsToComplete(); if (this.testProject != null) { if (this.testProject.exists() && this.testProject.isAccessible()) { EclipseUtils.removePMDNature(this.testProject); diff --git a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/ui/actions/PMDCheckActionTest.java b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/ui/actions/PMDCheckActionTest.java index 545381322..10a33c3d7 100644 --- a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/ui/actions/PMDCheckActionTest.java +++ b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/ui/actions/PMDCheckActionTest.java @@ -48,17 +48,14 @@ public void setUp() throws Exception { @After public void tearDown() throws Exception { - try { - if (this.testProject != null) { - if (this.testProject.exists() && this.testProject.isAccessible()) { - EclipseUtils.removePMDNature(this.testProject); - this.testProject.refreshLocal(IResource.DEPTH_INFINITE, null); - this.testProject.delete(true, true, null); - this.testProject = null; - } + EclipseUtils.waitForJobsToComplete(); + if (this.testProject != null) { + if (this.testProject.exists() && this.testProject.isAccessible()) { + EclipseUtils.removePMDNature(this.testProject); + this.testProject.refreshLocal(IResource.DEPTH_INFINITE, null); + this.testProject.delete(true, true, null); + this.testProject = null; } - } catch (final Exception e) { - System.out.println("Exception " + e.getClass().getName() + " when tearing down. Ignored."); } } diff --git a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/ui/actions/PMDGenerateASTActionTest.java b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/ui/actions/PMDGenerateASTActionTest.java index e2ca2e421..a96239c25 100644 --- a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/ui/actions/PMDGenerateASTActionTest.java +++ b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/ui/actions/PMDGenerateASTActionTest.java @@ -51,17 +51,14 @@ public void setUp() throws Exception { @After public void tearDown() throws Exception { - try { - if (this.testProject != null) { - if (this.testProject.exists() && this.testProject.isAccessible()) { - EclipseUtils.removePMDNature(this.testProject); - this.testProject.refreshLocal(IResource.DEPTH_INFINITE, null); - this.testProject.delete(true, true, null); - this.testProject = null; - } + EclipseUtils.waitForJobsToComplete(); + if (this.testProject != null) { + if (this.testProject.exists() && this.testProject.isAccessible()) { + EclipseUtils.removePMDNature(this.testProject); + this.testProject.refreshLocal(IResource.DEPTH_INFINITE, null); + this.testProject.delete(true, true, null); + this.testProject = null; } - } catch (final Exception e) { - System.out.println("Exception " + e.getClass().getName() + " when tearing down. Ignored."); } } diff --git a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/ui/dialogs/ViolationDetailsDialogTest.java b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/ui/dialogs/ViolationDetailsDialogTest.java index d08c2be0c..159251498 100644 --- a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/ui/dialogs/ViolationDetailsDialogTest.java +++ b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/ui/dialogs/ViolationDetailsDialogTest.java @@ -63,17 +63,14 @@ public void setUp() throws Exception { @After public void tearDown() throws Exception { - try { - if (this.testProject != null) { - if (this.testProject.exists() && this.testProject.isAccessible()) { - EclipseUtils.removePMDNature(this.testProject); - this.testProject.refreshLocal(IResource.DEPTH_INFINITE, null); - this.testProject.delete(true, true, null); - this.testProject = null; - } + EclipseUtils.waitForJobsToComplete(); + if (this.testProject != null) { + if (this.testProject.exists() && this.testProject.isAccessible()) { + EclipseUtils.removePMDNature(this.testProject); + this.testProject.refreshLocal(IResource.DEPTH_INFINITE, null); + this.testProject.delete(true, true, null); + this.testProject = null; } - } catch (final Exception e) { - System.out.println("Exception " + e.getClass().getName() + " when tearing down. Ignored."); } } diff --git a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/ui/properties/ExternalRuleSetFileTest.java b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/ui/properties/ExternalRuleSetFileTest.java index 844c34093..ff18f2757 100644 --- a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/ui/properties/ExternalRuleSetFileTest.java +++ b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/ui/properties/ExternalRuleSetFileTest.java @@ -53,15 +53,12 @@ private void setUpProject(String projectName) { @After public void tearDown() throws Exception { - try { - if (this.testProject != null) { - if (this.testProject.exists() && this.testProject.isAccessible()) { - this.testProject.delete(true, true, null); - this.testProject = null; - } + EclipseUtils.waitForJobsToComplete(); + if (this.testProject != null) { + if (this.testProject.exists() && this.testProject.isAccessible()) { + this.testProject.delete(true, true, null); + this.testProject = null; } - } catch (CoreException e) { - throw new RuntimeException(e); } } diff --git a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/ui/properties/PMDProjectPropertyPageTest.java b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/ui/properties/PMDProjectPropertyPageTest.java index 21d6e1c83..78dad2c71 100644 --- a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/ui/properties/PMDProjectPropertyPageTest.java +++ b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/ui/properties/PMDProjectPropertyPageTest.java @@ -38,6 +38,7 @@ public void setUp() throws Exception { @After public void tearDown() throws Exception { + EclipseUtils.waitForJobsToComplete(); if (this.testProject != null) { if (this.testProject.exists() && this.testProject.isAccessible()) { EclipseUtils.removePMDNature(this.testProject); diff --git a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/ui/properties/UpdateProjectPropertiesCmdTest.java b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/ui/properties/UpdateProjectPropertiesCmdTest.java index 2a77b7412..be7519391 100644 --- a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/ui/properties/UpdateProjectPropertiesCmdTest.java +++ b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/ui/properties/UpdateProjectPropertiesCmdTest.java @@ -35,6 +35,7 @@ public void setUp() throws Exception { @After public void tearDown() throws Exception { + EclipseUtils.waitForJobsToComplete(); if (this.testProject != null) { if (this.testProject.exists() && this.testProject.isAccessible()) { EclipseUtils.removePMDNature(this.testProject); From 436b95ee19608c9186de9a6e4ec8991917ac528e Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Fri, 28 Aug 2026 17:55:01 +0200 Subject: [PATCH 2/4] Refresh workspace after setup and wait until build jobs are done --- .../net/sourceforge/pmd/eclipse/runtime/cmd/ReviewCmdTest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/ReviewCmdTest.java b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/ReviewCmdTest.java index c32618fed..8f4107afe 100644 --- a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/ReviewCmdTest.java +++ b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/ReviewCmdTest.java @@ -68,6 +68,9 @@ public void setUp() throws Exception { IProjectProperties properties = PMDPlugin.getDefault().getPropertiesManager() .loadProjectProperties(testProject); properties.setPmdEnabled(true); + + testProject.refreshLocal(IResource.DEPTH_INFINITE, null); + EclipseUtils.waitForPMDJobs(); } @After From 2ee636442ffc81bdcef306a57b418c73bed90b4f Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Fri, 28 Aug 2026 20:04:25 +0200 Subject: [PATCH 3/4] Add another wait condition to wait, until the problem view entry is there --- .../dialogs/ViolationDetailsDialogTest.java | 30 +++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/ui/dialogs/ViolationDetailsDialogTest.java b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/ui/dialogs/ViolationDetailsDialogTest.java index 159251498..82986984c 100644 --- a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/ui/dialogs/ViolationDetailsDialogTest.java +++ b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/ui/dialogs/ViolationDetailsDialogTest.java @@ -32,6 +32,7 @@ import net.sourceforge.pmd.eclipse.AbstractSWTBotTest; import net.sourceforge.pmd.eclipse.EclipseUtils; +import net.sourceforge.pmd.eclipse.LoggingRule; import net.sourceforge.pmd.eclipse.plugin.PMDPlugin; import net.sourceforge.pmd.eclipse.runtime.PMDRuntimeConstants; import net.sourceforge.pmd.eclipse.runtime.properties.IProjectProperties; @@ -61,6 +62,9 @@ public void setUp() throws Exception { properties.sync(); } + @org.junit.Rule + public LoggingRule loggingRule = new LoggingRule(); + @After public void tearDown() throws Exception { EclipseUtils.waitForJobsToComplete(); @@ -86,12 +90,8 @@ public void openDialogViaProblemView() throws Exception { bot.waitUntil(new DefaultCondition() { @Override public boolean test() throws Exception { - try { - // Try to find all violation nodes - if all exist, tree is ready - return warningsNode.getItems().length >= 4; - } catch (Exception e) { - return false; - } + // Try to find all violation nodes - if all exist, tree is ready + return warningsNode.getItems().length >= 4; } @Override @@ -100,6 +100,24 @@ public String getFailureMessage() { } }); + // Wait for the marker by partial match or iterate through nodes + bot.waitUntil(new DefaultCondition() { + @Override + public boolean test() throws Exception { + for (SWTBotTreeItem node : warningsNode.getItems()) { + if (node.getText().contains("UnnecessaryModifier")) { + return true; + } + } + return false; + } + + @Override + public String getFailureMessage() { + return "Violation UnnecessaryModifier not found in ProblemsView"; + } + }); + // Now search for the marker by partial match or iterate through nodes SWTBotTreeItem markerItem = null; for (SWTBotTreeItem node : warningsNode.getItems()) { From 63ff3afa4c446fc92ac77f447c3d6eebd16a8d33 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Fri, 28 Aug 2026 20:31:14 +0200 Subject: [PATCH 4/4] Update ReleaseNotes.md --- ReleaseNotes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 787d0e6d6..95f16e468 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -22,6 +22,7 @@ This is a minor release. * [#432](https://github.com/pmd/pmd-eclipse-plugin/pull/432): refactor: Remove custom JavaProject cache - [Andreas Dangel](https://github.com/adangel) (@adangel) * [#449](https://github.com/pmd/pmd-eclipse-plugin/pull/449): chore: Upload surefire reports for failed unit tests - [Andreas Dangel](https://github.com/adangel) (@adangel) * [#451](https://github.com/pmd/pmd-eclipse-plugin/pull/451): chore: Make ViolationDetailsDialogTest more reliable - [Andreas Dangel](https://github.com/adangel) (@adangel) +* [#452](https://github.com/pmd/pmd-eclipse-plugin/pull/452): chore: Wait for workspace jobs to complete before teardown of tests - [Andreas Dangel](https://github.com/adangel) (@adangel) ### 📦 Dependency updates