JUnitShell will wait indefinitely for a remote web test to start because BrowserManagerServer might queue the test for a while.

Patch by: jlabanca
Review by: jat



git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@6456 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/junit/JUnitShell.java b/user/src/com/google/gwt/junit/JUnitShell.java
index 99a42e3..b020a14 100644
--- a/user/src/com/google/gwt/junit/JUnitShell.java
+++ b/user/src/com/google/gwt/junit/JUnitShell.java
@@ -688,15 +688,22 @@
    */
   protected boolean notDone() {
     int activeClients = messageQueue.getNumClientsRetrievedTest(currentTestInfo);
-    if (firstLaunch && runStyle instanceof RunStyleManual) {
-      String[] newClients = messageQueue.getNewClients();
-      int printIndex = activeClients - newClients.length + 1;
-      for (String newClient : newClients) {
-        System.out.println(printIndex + " - " + newClient);
-        ++printIndex;
+    if (firstLaunch && runStyle.isStartDelayed()) {
+      // Pretty print the list of clients for manual tests.
+      if (runStyle instanceof RunStyleManual) {
+        String[] newClients = messageQueue.getNewClients();
+        int printIndex = activeClients - newClients.length + 1;
+        for (String newClient : newClients) {
+          System.out.println(printIndex + " - " + newClient);
+          ++printIndex;
+        }
       }
-      if (activeClients != this.numClients) {
-        // Wait forever for first contact; user-driven.
+
+      if (runStyle.wasInterrupted()) {
+        // Exit early if the test is interrupted.
+        throw new TimeoutException("A remote browser died a mysterious death.");
+      } else if (activeClients != this.numClients) {
+        // Wait forever for first contact.
         return true;
       }
     }
diff --git a/user/src/com/google/gwt/junit/RunStyle.java b/user/src/com/google/gwt/junit/RunStyle.java
index d054429..088cd94 100644
--- a/user/src/com/google/gwt/junit/RunStyle.java
+++ b/user/src/com/google/gwt/junit/RunStyle.java
@@ -51,6 +51,15 @@
   }
 
   /**
+   * Check whether or not tests start immediately or if they can be delayed.
+   * 
+   * @return <code>true</code> if the test can be delayed
+   */
+  public boolean isStartDelayed() {
+    return false;
+  }
+
+  /**
    * Requests initial launch of the browser. This should only be called once per
    * instance of RunStyle.
    * 
diff --git a/user/src/com/google/gwt/junit/RunStyleManual.java b/user/src/com/google/gwt/junit/RunStyleManual.java
index 07e974a..5486a8f 100644
--- a/user/src/com/google/gwt/junit/RunStyleManual.java
+++ b/user/src/com/google/gwt/junit/RunStyleManual.java
@@ -46,6 +46,14 @@
     return true;
   }
 
+  /**
+   * Manual tests are started by users in user time.
+   */
+  @Override
+  public boolean isStartDelayed() {
+    return true;
+  }
+
   @Override
   public void launchModule(String moduleName) throws UnableToCompleteException {
     if (numClients == 1) {
diff --git a/user/src/com/google/gwt/junit/RunStyleRemoteWeb.java b/user/src/com/google/gwt/junit/RunStyleRemoteWeb.java
index 795762d..43dfd43 100644
--- a/user/src/com/google/gwt/junit/RunStyleRemoteWeb.java
+++ b/user/src/com/google/gwt/junit/RunStyleRemoteWeb.java
@@ -201,6 +201,14 @@
     return true;
   }
 
+  /**
+   * Remote web tests can be queued for extended periods.
+   */
+  @Override
+  public boolean isStartDelayed() {
+    return true;
+  }
+
   @Override
   public synchronized void launchModule(String moduleName)
       throws UnableToCompleteException {