Fixes a concurrency issue in CookieTest where two instances of the test can cause each other to fail.

Patch by: jlabanca
Review by: jgw (desk)



git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@6058 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/test/com/google/gwt/user/client/CookieTest.java b/user/test/com/google/gwt/user/client/CookieTest.java
index 8b915e4..7ecef1b 100644
--- a/user/test/com/google/gwt/user/client/CookieTest.java
+++ b/user/test/com/google/gwt/user/client/CookieTest.java
@@ -25,6 +25,7 @@
  */
 public class CookieTest extends GWTTestCase {
 
+  @Override
   public String getModuleName() {
     return "com.google.gwt.user.User";
   }
@@ -59,26 +60,36 @@
    * but does not expire before that time. 
    */
   public void testExpires() {
+    // Generate a random ID for the cookies. Since cookies are shared across
+    // browser instances, its possible for multiple instances of this test to
+    // run concurrently (eg. hosted and web mode tests).  If that happens,
+    // the cookies will be cleared while we wait for the timer to fire.
+    int uniqueId = Random.nextInt(9000000) + 1000000;
+    final String earlyCookie = "shouldExpireEarly" + uniqueId;
+    final String lateCookie = "shouldExpireLate" + uniqueId;
+    final String sessionCookie = "shouldNotExpire" + uniqueId;
+
     // Test that the cookie expires in 5 seconds
     Date expiresEarly = new Date(new Date().getTime() + (5 * 1000));
     Date expiresLate  = new Date(new Date().getTime() + (60 * 1000));
-    Cookies.setCookie("shouldExpireEarly", "early", expiresEarly);
-    Cookies.setCookie("shouldExpireLate", "late", expiresLate);
-    Cookies.setCookie("shouldNotExpire", "forever", null);
+    Cookies.setCookie(earlyCookie, "early", expiresEarly);
+    Cookies.setCookie(lateCookie, "late", expiresLate);
+    Cookies.setCookie(sessionCookie, "forever", null);
 
     // Wait until the cookie expires before checking it
     Timer timer = new Timer() {
+      @Override
       public void run() {
         // Verify that the early expiring cookie does NOT exist
-        assertNull(Cookies.getCookie("shouldExpireEarly"));
+        assertNull(Cookies.getCookie(earlyCookie));
 
         // Verify that the late expiring cookie does exist
-        assertEquals(Cookies.getCookie("shouldExpireLate"), "late");
+        assertEquals(Cookies.getCookie(lateCookie), "late");
 
         // Verify the session cookie doesn't expire
-        assertEquals(Cookies.getCookie("shouldNotExpire"), "forever");
-        Cookies.removeCookie("shouldNotExpire");
-        assertNull(Cookies.getCookie("shouldNotExpire"));
+        assertEquals(Cookies.getCookie(sessionCookie), "forever");
+        Cookies.removeCookie(sessionCookie);
+        assertNull(Cookies.getCookie(sessionCookie));
 
         // Finish the test
         finishTest();
@@ -96,11 +107,12 @@
     clearCookies();
 
     // Set a few cookies
+    int curCount = Cookies.getCookieNames().size();
     Cookies.setCookie("test1", "value1");
     Cookies.setCookie("test2", "value2");
     Cookies.setCookie("test3", "value3");
     Collection<String> cookies = Cookies.getCookieNames();
-    assertEquals(3, cookies.size());
+    assertEquals(curCount + 3, cookies.size());
 
     // Remove a cookie
     Cookies.removeCookie("test2");
@@ -120,20 +132,20 @@
     assertEquals(null, Cookies.getCookie("test2"));
     assertEquals(null, Cookies.getCookie("test3"));
     cookies = Cookies.getCookieNames();
-    assertEquals(0, cookies.size());
+    assertEquals(curCount, cookies.size());
 
     // Add/remove URI encoded cookies
     Cookies.setCookie("test1-test1", "value1 value1");
     Cookies.removeCookie("test1-test1");
     cookies = Cookies.getCookieNames();
-    assertEquals(0, cookies.size());
+    assertEquals(curCount, cookies.size());
 
     // Add/remove cookies that are not URI encoded
     Cookies.setUriEncode(false);
     Cookies.setCookie("test1+test1", "value1+value1");
     Cookies.removeCookie("test1+test1");
     cookies = Cookies.getCookieNames();
-    assertEquals(0, cookies.size());
+    assertEquals(curCount, cookies.size());
 
     // Make sure unencoded cookies with bogus format are not added
     try {
@@ -181,12 +193,15 @@
   }
 
   /**
-   * Clear out all existing cookies.
+   * Clear out all existing cookies, except the ones used in
+   * {@link #testExpires()}.
    */
   private void clearCookies() {
     Collection<String> cookies = Cookies.getCookieNames();
     for (String cookie : cookies) {
-      Cookies.removeCookie(cookie);
+      if (!cookie.startsWith("should")) {
+        Cookies.removeCookie(cookie);
+      }
     }
   }
 
@@ -204,11 +219,12 @@
     Cookies.setUriEncode(false);
 
     // Set a few cookies
+    int curCount = Cookies.getCookieNames().size();
     Cookies.setCookie("test1+test1", "value1", null, null, "/", false);
     Cookies.setCookie("test2", "value2+value2", null, null, "/", false);
     Cookies.setCookie("test3", "value3", null, null, "/", false);
     Collection<String> cookies = Cookies.getCookieNames();
-    assertEquals(3, cookies.size());
+    assertEquals(curCount + 3, cookies.size());
 
     // Remove a cookie
     Cookies.removeCookie("test2", "/");
@@ -228,7 +244,7 @@
     assertEquals(null, Cookies.getCookie("test2"));
     assertEquals(null, Cookies.getCookie("test3"));
     cookies = Cookies.getCookieNames();
-    assertEquals(0, cookies.size());
+    assertEquals(curCount, cookies.size());
 
     // First clear all cookies
     clearCookies();
@@ -241,7 +257,7 @@
     Cookies.setCookie("test2", "value2+value2", null, null, "/", false);
     Cookies.setCookie("test3", "value3", null, null, "/", false);
     cookies = Cookies.getCookieNames();
-    assertEquals(3, cookies.size());
+    assertEquals(curCount + 3, cookies.size());
 
     // Remove a cookie
     Cookies.removeCookie("test2", "/");
@@ -261,6 +277,6 @@
     assertEquals(null, Cookies.getCookie("test2"));
     assertEquals(null, Cookies.getCookie("test3"));
     cookies = Cookies.getCookieNames();
-    assertEquals(0, cookies.size());
+    assertEquals(curCount, cookies.size());
   }
 }