// 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.compact = function(debug) {
  var db_name = get_random_db_name();
  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"});
  db.createDb();
  if (debug) debugger;
  var docs = makeDocs(0, 20);
  db.bulkSave(docs);

  var binAttDoc = {
    _id: "bin_doc",
    _attachments:{
      "foo.txt": {
        content_type:"text/plain",
        data: "VGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVkIHRleHQ="
      }
    }
  };

  T(db.save(binAttDoc).ok);

  var originalsize = db.info().sizes.file;
  var originaldatasize = db.info().sizes.active;
  var start_time = db.info().instance_start_time;

  TEquals("number", typeof originaldatasize, "data size is a number");
  T(originaldatasize < originalsize, "data size is < then db file size");

  for(var i in docs) {
      db.deleteDoc(docs[i]);
  }
  T(db.ensureFullCommit().ok);
  var deletesize = db.info().sizes.file;
  var deletedatasize = db.info().sizes.active;
  T(deletesize > originalsize);
  T(db.setDbProperty("_revs_limit", 666).ok);

  T(db.compact().ok);
  T(db.last_req.status == 202);
  // compaction isn't instantaneous, loop until done
  while (db.info().compact_running) {};
  T(db.info().instance_start_time == start_time);
  T(db.getDbProperty("_revs_limit") === 666);

  T(db.ensureFullCommit().ok);
  restartServer();
  var xhr = CouchDB.request("GET", "/" + db_name + "/bin_doc/foo.txt");
  T(xhr.responseText == "This is a base64 encoded text");
  T(xhr.getResponseHeader("Content-Type") == "text/plain");
  T(db.info().doc_count == 1);
  // XXX BUGGED! T(db.info().sizes.active < deletedatasize);
  TEquals("number", typeof db.info().sizes.active, "data size is a number");
  T(db.info().sizes.active < db.info().sizes.file, "data size is < then db file size");

  // cleanup
  db.deleteDb();

};
