| // Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| // use this file except in compliance with the License. You may obtain a copy of |
| // the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| // License for the specific language governing permissions and limitations under |
| // 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 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); |
| }; |
| |
| var db = new CouchDB("test_suite_db", {"X-Couch-Full-Commit":"false"}); |
| db.deleteDb(); |
| db.createDb(); |
| if (debug) debugger; |
| |
| // a single UUID without an explicit count |
| var xhr = CouchDB.request("GET", "/_uuids"); |
| T(xhr.status == 200); |
| var result = JSON.parse(xhr.responseText); |
| T(result.uuids.length == 1); |
| var first = result.uuids[0]; |
| testHashBustingHeaders(xhr); |
| |
| // a single UUID with an explicit count |
| xhr = CouchDB.request("GET", "/_uuids?count=1"); |
| T(xhr.status == 200); |
| result = JSON.parse(xhr.responseText); |
| T(result.uuids.length == 1); |
| var second = result.uuids[0]; |
| T(first != second); |
| |
| // no collisions with 1,000 UUIDs |
| xhr = CouchDB.request("GET", "/_uuids?count=1000"); |
| T(xhr.status == 200); |
| result = JSON.parse(xhr.responseText); |
| T( result.uuids.length == 1000 ); |
| var seen = {}; |
| for(var i in result.uuids) { |
| var id = result.uuids[i]; |
| T(seen[id] === undefined); |
| seen[id] = 1; |
| } |
| |
| // ensure we return a 405 on POST |
| xhr = CouchDB.request("POST", "/_uuids?count=1000"); |
| T(xhr.status == 405); |
| |
| // Test sequential uuids |
| var seq_testfun = function() { |
| xhr = CouchDB.request("GET", "/_uuids?count=1000"); |
| T(xhr.status == 200); |
| result = JSON.parse(xhr.responseText); |
| for(var i = 1; i < result.uuids.length; i++) { |
| T(result.uuids[i].length == 32); |
| T(result.uuids[i-1] < result.uuids[i], "Sequential uuids are ordered."); |
| } |
| }; |
| |
| run_on_modified_server([{ |
| "section": "uuids", |
| "key": "algorithm", |
| "value": "sequential", |
| }], |
| seq_testfun |
| ); |
| |
| // Test utc_random uuids |
| var utc_testfun = function() { |
| xhr = CouchDB.request("GET", "/_uuids?count=1000"); |
| T(xhr.status == 200); |
| result = JSON.parse(xhr.responseText); |
| T(result.uuids[1].length == 32); |
| |
| // no collisions |
| var seen = {}; |
| for(var i in result.uuids) { |
| var id = result.uuids[i]; |
| T(seen[id] === undefined); |
| seen[id] = 1; |
| } |
| |
| // roughly ordered |
| var u1 = result.uuids[1].substr(0, 13); |
| var u2 = result.uuids[result.uuids.length-1].substr(0, 13); |
| T(u1 < u2, "UTC uuids are only roughly ordered, so this assertion may fail occasionally. Don't sweat it."); |
| }; |
| |
| run_on_modified_server([{ |
| "section": "uuids", |
| "key": "algorithm", |
| "value": "utc_random" |
| }], |
| utc_testfun |
| ); |
| |
| // Test utc_id uuids |
| var utc_id_suffix = "frog"; |
| var suffix_testfun = function() { |
| xhr = CouchDB.request("GET", "/_uuids?count=10"); |
| T(xhr.status == 200); |
| result = JSON.parse(xhr.responseText); |
| for(var i = 1; i < result.uuids.length; i++) { |
| T(result.uuids[i].length == 14 + utc_id_suffix.length); |
| T(result.uuids[i].substring(14) == utc_id_suffix); |
| T(result.uuids[i-1] < result.uuids[i], "utc_id_suffix uuids are ordered."); |
| } |
| }; |
| |
| run_on_modified_server([{ |
| "section": "uuids", |
| "key": "algorithm", |
| "value": "utc_id" |
| }, { |
| "section": "uuids", |
| "key": "utc_id_suffix", |
| "value": utc_id_suffix |
| }], |
| suffix_testfun |
| ); |
| |
| }; |