Fix flaky test ThreadStartTest
We may receive THREAD_START events for runtime internal threads (like
GCDaemon) before receiving one for the tested thread.
We now loop until receiving a THREAD_START event for the tested
thread. If we receive a THREAD_START event for another thread, we
just ignore it and wait for the next event.
Bug: 19438651
(cherry picked from commit 2d5d534cf8b1e4788317678df2301227c16e0433)
Change-Id: I6b12ef318ecb779cf9fec66b28c495b34604a668
diff --git a/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/Events/ThreadStartTest.java b/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/Events/ThreadStartTest.java
index b13b497..58c696f 100644
--- a/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/Events/ThreadStartTest.java
+++ b/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/Events/ThreadStartTest.java
@@ -69,29 +69,36 @@
// wait for thread start and finish
synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);
- logWriter.println("=> vmMirror.receiveEvent()...");
- CommandPacket event = debuggeeWrapper.vmMirror.receiveEvent();
+ // The runtime may start internal threads before starting the debuggee's thread.
+ // We loop until receiving a THREAD_START event for our thread.
+ boolean receivedExpectedThreadStartEvent = false;
+ while (!receivedExpectedThreadStartEvent) {
+ logWriter.println("=> vmMirror.receiveEvent()...");
+ CommandPacket event = debuggeeWrapper.vmMirror.receiveEvent();
- assertNotNull("Invalid (null) event received", event);
- logWriter.println("=> Event received!");
+ assertNotNull("Invalid (null) event received", event);
+ logWriter.println("=> Event received!");
- ParsedEvent[] parsedEvents = ParsedEvent.parseEventPacket(event);
- logWriter.println("=> Number of events = " + parsedEvents.length);
- assertEquals("Invalid number of events,", 1, parsedEvents.length);
- logWriter.println("=> EventKind() = " + parsedEvents[0].getEventKind()
- + " (" + JDWPConstants.EventKind.getName(parsedEvents[0].getEventKind()) + ")");
- assertEquals("Invalid event kind,",
- JDWPConstants.EventKind.THREAD_START,
- parsedEvents[0].getEventKind(),
- JDWPConstants.EventKind.getName(JDWPConstants.EventKind.THREAD_START),
- JDWPConstants.EventKind.getName(parsedEvents[0].getEventKind()));
- logWriter.println("=> EventRequestID() = " + parsedEvents[0].getRequestID());
+ ParsedEvent[] parsedEvents = ParsedEvent.parseEventPacket(event);
+ logWriter.println("=> Number of events = " + parsedEvents.length);
+ assertEquals("Invalid number of events,", 1, parsedEvents.length);
+ logWriter.println("=> EventKind() = " + parsedEvents[0].getEventKind()
+ + " (" + JDWPConstants.EventKind.getName(parsedEvents[0].getEventKind()) + ")");
+ assertEquals("Invalid event kind,",
+ JDWPConstants.EventKind.THREAD_START,
+ parsedEvents[0].getEventKind(),
+ JDWPConstants.EventKind.getName(JDWPConstants.EventKind.THREAD_START),
+ JDWPConstants.EventKind.getName(parsedEvents[0].getEventKind()));
+ logWriter.println("=> EventRequestID() = " + parsedEvents[0].getRequestID());
- long threadID = ((Event_THREAD_START)parsedEvents[0]).getThreadID();
- logWriter.println("=> threadID = " + threadID);
- String threadName = debuggeeWrapper.vmMirror.getThreadName(threadID);
- logWriter.println("=> threadName = " + threadName);
- assertEquals("Invalid thread name", EventDebuggee.testedThreadName, threadName);
+ long threadID = ((Event_THREAD_START)parsedEvents[0]).getThreadID();
+ logWriter.println("=> threadID = " + threadID);
+ String threadName = debuggeeWrapper.vmMirror.getThreadName(threadID);
+ logWriter.println("=> threadName = " + threadName);
+
+ // Is it the debuggee's thread ?
+ receivedExpectedThreadStartEvent = threadName.equals(EventDebuggee.testedThreadName);
+ }
synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
logWriter.println("==> testThreadStartEvent001 - OK");