1. Benoit Chesneau
  2. couchdb

Commits

Paul J. Davis  committed 29e959d

Fix the UUID's test failures when clocks are out of sync.

Changes the tests for cache busting by using ETag's. Left the date tests commented out just in case someone thinks I'm crazy and sees a better solution.

  • Participants
  • Parent commits e5f7df2
  • Branches default

Comments (0)

Files changed (2)

File share/www/script/test/uuids.js

View file
 // the License.
 
 couchTests.uuids = function(debug) {
+  var etags = [];
   var testHashBustingHeaders = function(xhr) {
     T(xhr.getResponseHeader("Cache-Control").match(/no-cache/));
     T(xhr.getResponseHeader("Pragma") == "no-cache");
 
-    var currentTime = new Date();
-    var expiresHeader = Date.parse(xhr.getResponseHeader("Expires"));
-    var dateHeader = Date.parse(xhr.getResponseHeader("Date"));
+    var newetag = xhr.getResponseHeader("ETag");
+    T(etags.indexOf(newetag) < 0);
+    etags[etags.length] = newetag;
+    
+    // Removing the time based tests as they break easily when
+    // running CouchDB on a remote server in regards to the browser
+    // running the Futon test suite.
+    //
+    //var currentTime = new Date();
+    //var expiresHeader = Date.parse(xhr.getResponseHeader("Expires"));
+    //var dateHeader = Date.parse(xhr.getResponseHeader("Date"));
 
-    T(expiresHeader < currentTime);
-    T(currentTime - dateHeader < 3000);
+    //T(expiresHeader < currentTime);
+    //T(currentTime - dateHeader < 3000);
   };
 
   var db = new CouchDB("test_suite_db", {"X-Couch-Full-Commit":"false"});

File src/couchdb/couch_httpd_misc_handlers.erl

View file
 
 handle_uuids_req(#httpd{method='GET'}=Req) ->
     Count = list_to_integer(couch_httpd:qs_value(Req, "count", "1")),
-    CacheBustingHeaders = [{"Date", httpd_util:rfc1123_date()},
-                           {"Cache-Control", "no-cache"},
-                           % Past date, ON PURPOSE!
-                           {"Expires", "Fri, 01 Jan 1990 00:00:00 GMT"},
-                           {"Pragma", "no-cache"}],
     UUIDs = [couch_uuids:new() || _ <- lists:seq(1, Count)],
-    send_json(Req, 200, CacheBustingHeaders, {[{<<"uuids">>, UUIDs}]});
+    couch_httpd:etag_respond(Req, erlang:md5(UUIDs), fun() ->
+        CacheBustingHeaders = [
+            {"Date", httpd_util:rfc1123_date()},
+            {"Cache-Control", "no-cache"},
+            % Past date, ON PURPOSE!
+            {"Expires", "Fri, 01 Jan 1990 00:00:00 GMT"},
+            {"Pragma", "no-cache"},
+            {"ETag", erlang:md5(UUIDs)}
+        ],
+        send_json(Req, 200, CacheBustingHeaders, {[{<<"uuids">>, UUIDs}]})
+    end);
 handle_uuids_req(Req) ->
     send_method_not_allowed(Req, "GET").