// 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.");
    }
  };

  // test max_uuid_count
  var xhr = CouchDB.request("GET", "/_uuids?count=1001");
  TEquals(403, xhr.status, "should error when count > max_count");

  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
  );

 };
