/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et: */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

function assert_date_eq(a, b) {
  if (typeof a != "number") {
    a = PlacesUtils.toPRTime(a);
  }
  if (typeof b != "number") {
    b = PlacesUtils.toPRTime(b);
  }
  Assert.equal(a, b, "The dates should match");
}

/**
 * Test that inserting a new bookmark will set lastModified to the same
 * values as dateAdded.
 */
add_task(async function test_bookmarkLastModified() {
  let bookmark = await PlacesUtils.bookmarks.insert({
    parentGuid: PlacesUtils.bookmarks.menuGuid,
    url: "http://www.mozilla.org/",
    title: "itemTitle",
  });

  let guid = bookmark.guid;

  // Check the bookmark from the database.
  bookmark = await PlacesUtils.bookmarks.fetch(guid);

  let dateAdded = PlacesUtils.toPRTime(bookmark.dateAdded);
  assert_date_eq(dateAdded, bookmark.lastModified);

  // Change lastModified, then change dateAdded.  LastModified should be set
  // to the new dateAdded.
  // This could randomly fail on virtual machines due to timing issues, so
  // we manually increase the time value.  See bug 500640 for details.
  await PlacesUtils.bookmarks.update({
    guid,
    lastModified: PlacesUtils.toDate(dateAdded + 1000),
  });

  bookmark = await PlacesUtils.bookmarks.fetch(guid);

  assert_date_eq(bookmark.lastModified, dateAdded + 1000);
  Assert.less(
    bookmark.dateAdded,
    bookmark.lastModified,
    "Date added should be earlier than last modified."
  );

  await PlacesUtils.bookmarks.update({
    guid,
    dateAdded: PlacesUtils.toDate(dateAdded + 2000),
  });

  bookmark = await PlacesUtils.bookmarks.fetch(guid);

  assert_date_eq(bookmark.dateAdded, dateAdded + 2000);
  assert_date_eq(bookmark.dateAdded, bookmark.lastModified);

  // If dateAdded is set to older than lastModified, then we shouldn't
  // update lastModified to keep sync happy.
  let origLastModified = bookmark.lastModified;

  await PlacesUtils.bookmarks.update({
    guid,
    dateAdded: PlacesUtils.toDate(dateAdded - 10000),
  });

  bookmark = await PlacesUtils.bookmarks.fetch(guid);

  assert_date_eq(bookmark.dateAdded, dateAdded - 10000);
  assert_date_eq(bookmark.lastModified, origLastModified);

  await PlacesUtils.bookmarks.remove(guid);
});
