Bug 576999: Wait for selectFrame to complete before resuming test

Doing a select frame causes (after some delay) a selectAndReveal on the
editor for the frame's location. Make sure this selectAndReveal is
complete before continuing the test.

Prior to this patch, sometimes the frame's selectAndReveal ran after the
key one in the test and the wrong thing would be selected in the editor
for the test.

triggerWinGerrit

Change-Id: I7fbf951886ff157baa0b30fe5e3c73fa2aae0368
Reviewed-on: https://git.eclipse.org/r/c/jdt/eclipse.jdt.debug/+/191738
Tested-by: JDT Bot <jdt-bot@eclipse.org>
Tested-by: Releng Bot <releng-bot@eclipse.org>
Reviewed-by: Jonah Graham <jonah@kichwacoders.com>
Reviewed-by: Sarika Sinha <sarika.sinha@in.ibm.com>
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/DebugHoverTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/DebugHoverTests.java
index 50f7248..36818e3 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/DebugHoverTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/DebugHoverTests.java
@@ -13,6 +13,8 @@
  *******************************************************************************/
 package org.eclipse.jdt.debug.tests.ui;
 
+import static org.junit.Assert.assertNotEquals;
+
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -1240,7 +1242,7 @@
 			thread = launchToBreakpoint(typeName);
 			CompilationUnitEditor part = openEditorAndValidateStack(expectedMethod, frameNumber, file, thread);
 
-			selectFrame(thread.getStackFrames()[4]);
+			selectFrame(part, thread.getStackFrames()[4]);
 
 			JavaDebugHover hover = new JavaDebugHover();
 			hover.setEditor(part);
@@ -1453,7 +1455,7 @@
 		return sync(() -> selection.getText());
 	}
 
-	private void selectFrame(IStackFrame frame) throws Exception {
+	private void selectFrame(CompilationUnitEditor editor, IStackFrame frame) throws Exception {
 		LaunchView debugView = sync(() -> (LaunchView) getActivePage().findView(IDebugUIConstants.ID_DEBUG_VIEW));
 		assertNotNull("expected Debug View to be open", debugView);
 
@@ -1461,8 +1463,25 @@
 		TreePath path = selection.getPaths()[0];
 		TreePath newPath = path.getParentPath().createChildPath(frame);
 		TreeSelection newSelection = new TreeSelection(newPath);
-		sync(() -> debugView.getViewer().setSelection(newSelection, true));
-		processUiEvents(100);
+
+		// frames uses 1 based line number, subtract 1 to line up with editor line numbers
+		int targetLineNumber = frame.getLineNumber() - 1;
+		int initialLineNumber = sync(() -> ((ITextSelection) editor.getSelectionProvider().getSelection()).getStartLine());
+		assertNotEquals("selectFrame cannot detect when it has"
+				+ "completed because selecting frame doesn't change the line number.", initialLineNumber, targetLineNumber);
+		final int timeoutms = 1000;
+		int selectedLineNumer = sync(() -> {
+			int lineNumber;
+			long endtime = System.currentTimeMillis() + timeoutms;
+			debugView.getViewer().setSelection(newSelection, true);
+			do {
+				TestUtil.runEventLoop();
+				lineNumber = ((ITextSelection) editor.getSelectionProvider().getSelection()).getStartLine();
+			} while (lineNumber != targetLineNumber && System.currentTimeMillis() < endtime);
+			return lineNumber;
+		});
+		assertEquals("After waiting " + timeoutms
+				+ "ms the editor selection was not moved to the expected line", targetLineNumber, selectedLineNumer);
 	}
 
 	@Override