From 961558babea0e22d5d4997f9f61eb40fab8254ce Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 2 Oct 2025 16:36:30 +0000 Subject: [PATCH 1/3] Initial plan From d4e16a638ead0bebbe8b035fc90e87fa99341015 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 2 Oct 2025 16:45:27 +0000 Subject: [PATCH 2/3] Fix race condition in ResourceInitialSelectionTest by waiting for async jobs Add DisplayHelper.waitForCondition() calls to wait for background jobs (FilterHistoryJob, FilterJob) to complete before checking the selection. This prevents intermittent test failures on macOS where the table hasn't been populated yet when getSelectedItems() is called. Fixes: eclipse-platform/eclipse.platform.ui#1108 Co-authored-by: vogella <139910+vogella@users.noreply.github.com> --- .../dialogs/ResourceInitialSelectionTest.java | 38 ++++++++++++++++++- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/ResourceInitialSelectionTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/ResourceInitialSelectionTest.java index 68dee301d34..63911712625 100644 --- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/ResourceInitialSelectionTest.java +++ b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/ResourceInitialSelectionTest.java @@ -82,6 +82,9 @@ public void testSingleSelectionAndNoInitialSelectionWithInitialPattern() { dialog.open(); dialog.refresh(); + Display display = PlatformUI.getWorkbench().getDisplay(); + DisplayHelper.waitForCondition(display, 3000, () -> !getSelectedItems(dialog).isEmpty()); + List selected = getSelectedItems(dialog); assertFalse("One file should be selected by default", selected.isEmpty()); @@ -100,6 +103,10 @@ public void testSingleSelectionAndOneInitialSelectionWithInitialPattern() { dialog.open(); dialog.refresh(); + Display display = PlatformUI.getWorkbench().getDisplay(); + DisplayHelper.waitForCondition(display, 3000, + () -> asList(FILES.get("foo.txt")).equals(getSelectedItems(dialog))); + List selected = getSelectedItems(dialog); assertEquals("One file should be selected by default", asList(FILES.get("foo.txt")), selected); @@ -174,6 +181,10 @@ public void testSingleSelectionAndTwoInitialSelectionsWithInitialPattern() { dialog.open(); dialog.refresh(); + Display display = PlatformUI.getWorkbench().getDisplay(); + DisplayHelper.waitForCondition(display, 3000, + () -> asList(FILES.get("foo.txt")).equals(getSelectedItems(dialog))); + List selected = getSelectedItems(dialog); assertEquals("The first file should be selected by default", asList(FILES.get("foo.txt")), selected); @@ -192,6 +203,9 @@ public void testMultiSelectionAndNoInitialSelectionWithInitialPattern() { dialog.open(); dialog.refresh(); + Display display = PlatformUI.getWorkbench().getDisplay(); + DisplayHelper.waitForCondition(display, 3000, () -> !getSelectedItems(dialog).isEmpty()); + List selected = getSelectedItems(dialog); assertFalse("One file should be selected by default", selected.isEmpty()); @@ -211,6 +225,10 @@ public void testMultiSelectionAndOneInitialSelectionWithInitialPattern() { dialog.open(); dialog.refresh(); + Display display = PlatformUI.getWorkbench().getDisplay(); + DisplayHelper.waitForCondition(display, 3000, + () -> asList(FILES.get("foo.txt")).equals(getSelectedItems(dialog))); + List selected = getSelectedItems(dialog); assertEquals("One file should be selected by default", asList(FILES.get("foo.txt")), selected); @@ -266,8 +284,12 @@ public void testMultiSelectionAndSomeInitialNonExistingSelectionWithInitialPatte dialog.open(); dialog.refresh(); - List selected = getSelectedItems(dialog); + Display display = PlatformUI.getWorkbench().getDisplay(); Set expectedSelection = new HashSet<>(asList(FILES.get("bar.txt"), FILES.get("foofoo"))); + DisplayHelper.waitForCondition(display, 3000, + () -> expectedSelection.equals(new HashSet<>(getSelectedItems(dialog)))); + + List selected = getSelectedItems(dialog); boolean allInitialElementsAreSelected = expectedSelection.equals(new HashSet<>(selected)); assertTrue("Two files should be selected by default", allInitialElementsAreSelected); @@ -288,6 +310,12 @@ public void testMultiSelectionAndTwoInitialSelectionsWithInitialPattern() { dialog.open(); dialog.refresh(); + Display display = PlatformUI.getWorkbench().getDisplay(); + DisplayHelper.waitForCondition(display, 3000, () -> { + List selected = getSelectedItems(dialog); + return selected.containsAll(initialSelection) && initialSelection.containsAll(selected); + }); + List selected = getSelectedItems(dialog); boolean initialElementsAreSelected = selected.containsAll(initialSelection) && initialSelection.containsAll(selected); @@ -310,8 +338,14 @@ public void testMultiSelectionAndTwoInitialFilteredSelections() { dialog.open(); dialog.refresh(); - List selected = getSelectedItems(dialog); + Display display = PlatformUI.getWorkbench().getDisplay(); List expectedSelection = asList(FILES.get("foo.txt"), FILES.get("bar.txt")); + DisplayHelper.waitForCondition(display, 3000, () -> { + List selected = getSelectedItems(dialog); + return selected.containsAll(expectedSelection) && expectedSelection.containsAll(selected); + }); + + List selected = getSelectedItems(dialog); boolean initialElementsAreSelected = selected.containsAll(expectedSelection) && expectedSelection.containsAll(selected); From cdbb93af0927730d7b9306b7a1b7bb4816292b19 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 2 Oct 2025 16:47:46 +0000 Subject: [PATCH 3/3] Add wait conditions to all tests checking empty selection Also add DisplayHelper.waitForCondition() to tests that check for empty selection to ensure the table is fully populated before the assertion. This prevents race conditions where the table hasn't been initialized yet. Co-authored-by: vogella <139910+vogella@users.noreply.github.com> --- .../dialogs/ResourceInitialSelectionTest.java | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/ResourceInitialSelectionTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/ResourceInitialSelectionTest.java index 63911712625..17c04ae7e64 100644 --- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/ResourceInitialSelectionTest.java +++ b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/ResourceInitialSelectionTest.java @@ -126,6 +126,14 @@ public void testSingleSelectionAndOneInitialNonExistingSelectionWithInitialPatte dialog.open(); dialog.refresh(); + Display display = PlatformUI.getWorkbench().getDisplay(); + // Wait for table to be populated (even if selection remains empty) + DisplayHelper.waitForCondition(display, 3000, () -> { + Table table = (Table) ((Composite) ((Composite) ((Composite) dialog.getShell().getChildren()[0]) + .getChildren()[0]).getChildren()[0]).getChildren()[3]; + return table.getItemCount() > 0; + }); + List selected = getSelectedItems(dialog); assertTrue("No file should be selected by default", selected.isEmpty()); @@ -143,6 +151,14 @@ public void testSingleSelectionAndOneInitialSelectionWithoutInitialPattern() { dialog.open(); dialog.refresh(); + Display display = PlatformUI.getWorkbench().getDisplay(); + // Wait for table to be populated (even if selection remains empty) + DisplayHelper.waitForCondition(display, 3000, () -> { + Table table = (Table) ((Composite) ((Composite) ((Composite) dialog.getShell().getChildren()[0]) + .getChildren()[0]).getChildren()[0]).getChildren()[3]; + return table.getItemCount() > 0; + }); + List selected = getSelectedItems(dialog); assertTrue("No file should be selected by default", selected.isEmpty()); @@ -162,6 +178,14 @@ public void testSingleSelectionAndOneFilteredSelection() { dialog.open(); dialog.refresh(); + Display display = PlatformUI.getWorkbench().getDisplay(); + // Wait for table to be populated (even if selection remains empty) + DisplayHelper.waitForCondition(display, 3000, () -> { + Table table = (Table) ((Composite) ((Composite) ((Composite) dialog.getShell().getChildren()[0]) + .getChildren()[0]).getChildren()[0]).getChildren()[3]; + return table.getItemCount() > 0; + }); + List selected = getSelectedItems(dialog); assertTrue("No file should be selected by default", selected.isEmpty()); @@ -246,6 +270,14 @@ public void testMultiSelectionAndOneInitialSelectionWithoutInitialPattern() { dialog.open(); dialog.refresh(); + Display display = PlatformUI.getWorkbench().getDisplay(); + // Wait for table to be populated (even if selection remains empty) + DisplayHelper.waitForCondition(display, 3000, () -> { + Table table = (Table) ((Composite) ((Composite) ((Composite) dialog.getShell().getChildren()[0]) + .getChildren()[0]).getChildren()[0]).getChildren()[3]; + return table.getItemCount() > 0; + }); + List selected = getSelectedItems(dialog); assertTrue("No file should be selected by default", selected.isEmpty()); @@ -265,6 +297,14 @@ public void testMultiSelectionAndTwoInitialNonExistingSelectionWithInitialPatter dialog.open(); dialog.refresh(); + Display display = PlatformUI.getWorkbench().getDisplay(); + // Wait for table to be populated (even if selection remains empty) + DisplayHelper.waitForCondition(display, 3000, () -> { + Table table = (Table) ((Composite) ((Composite) ((Composite) dialog.getShell().getChildren()[0]) + .getChildren()[0]).getChildren()[0]).getChildren()[3]; + return table.getItemCount() > 0; + }); + List selected = getSelectedItems(dialog); assertTrue("No file should be selected by default", selected.isEmpty());