I made the suggested code change to check if the "expires" parameter is null before calling the
getTime method on it.  If it is null, we pass 0 to setCookieImpl, effectively creating a session 
cookie instead.

Patch by: jlabanca
Review by: jgw
Issue: 1152, 658



git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@1199 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/client/Cookies.java b/user/src/com/google/gwt/user/client/Cookies.java
index 7be0b5c..9c10e61 100644
--- a/user/src/com/google/gwt/user/client/Cookies.java
+++ b/user/src/com/google/gwt/user/client/Cookies.java
@@ -76,7 +76,7 @@
    * @param value the cookie's value
    */
   public static void setCookie(String name, String value) {
-    setCookieImpl(name, value, "", null, null, false);
+    setCookieImpl(name, value, 0, null, null, false);
   }
 
   /**
@@ -102,7 +102,7 @@
    */
   public static void setCookie(String name, String value, Date expires,
       String domain, String path, boolean secure) {
-    setCookieImpl(name, value, expires.toGMTString(), domain, path, secure);
+    setCookieImpl(name, value, (expires == null) ? 0 : expires.getTime(), domain, path, secure);
   }
 
   static native void loadCookies(HashMap m) /*-{
@@ -147,9 +147,10 @@
   }-*/;
 
   private static native void setCookieImpl(String name, String value,
-      String expires, String domain, String path, boolean secure) /*-{
+      long expires, String domain, String path, boolean secure) /*-{
     var c = encodeURIComponent(name) + '=' + encodeURIComponent(value);
-    c += ';expires=' + expires;
+    if ( expires )
+      c += ';expires=' + (new Date(expires)).toGMTString();
     if (domain)
       c += ';domain=' + domain;
     if (path)
diff --git a/user/test/com/google/gwt/user/client/CookieTest.java b/user/test/com/google/gwt/user/client/CookieTest.java
index d48169e..c6a5a3f 100644
--- a/user/test/com/google/gwt/user/client/CookieTest.java
+++ b/user/test/com/google/gwt/user/client/CookieTest.java
@@ -20,7 +20,7 @@
 import java.util.Date;
 
 /**
- * TODO: document me.
+ * Test Case for {@link Cookies}.
  */
 public class CookieTest extends GWTTestCase {
 
@@ -52,4 +52,38 @@
     assertEquals(Cookies.getCookie("novalue"), "");
     assertEquals(Cookies.getCookie("notpresent"), null);
   }
+  
+  /*
+   * Test that the cookie will expire correctly after a set amount of time,
+   * but does not expire before that time. 
+   */
+  public void testExpires() {
+    // 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);
+
+    // Wait until the cookie expires before checking it
+    Timer timer = new Timer() {
+      public void run() {
+        // Verify that the early expiring cookie does NOT exist
+        assertNull(Cookies.getCookie("shouldExpireEarly"));
+
+        // Verify that the late expiring cookie does exist
+        assertEquals(Cookies.getCookie("shouldExpireLate"), "late");
+
+        // Verify the session cookie doesn't expire
+        assertEquals(Cookies.getCookie("shouldNotExpire"), "forever");
+        Cookies.removeCookie("shouldNotExpire");
+        assertNull(Cookies.getCookie("shouldNotExpire"));
+        
+        // Finish the test
+        finishTest();
+      }
+    };
+    timer.schedule(5010);
+    delayTestFinish(6 * 1000);
+  }
 }