/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */

const TEMP_FILES_TO_CREATE = 5;
const LAST_MODIFICATION_DAY = [5, 10, 15, 20, 25];
const TEST_CURRENT_TIME = Date.now();
const MS_PER_DAY = 86400000;
const RETAIN_DAYS = 14;

async function createfiles() {
  for (let i = 0; i < TEMP_FILES_TO_CREATE; i++) {
    let setTime = TEST_CURRENT_TIME;
    setTime -= LAST_MODIFICATION_DAY[i] * MS_PER_DAY;
    let fileName = "places.sqlite" + (i > 0 ? "-" + i : "") + ".corrupt";
    let filePath = PathUtils.join(PathUtils.profileDir, fileName);
    await IOUtils.writeUTF8(filePath, "test-file-delete-me", {
      tmpPath: filePath + ".tmp",
    });
    Assert.ok(await IOUtils.exists(filePath), "file created: " + filePath);
    await IOUtils.setModificationTime(filePath, setTime);
  }
}

add_task(async function removefiles() {
  await createfiles();
  let tasksStatusMap = await PlacesDBUtils.runTasks([
    PlacesDBUtils.removeOldCorruptDBs,
  ]);
  for (let [name, { succeeded, logs }] of tasksStatusMap) {
    info(
      `Task ${name} ${succeeded ? "succeeded" : "failed"}:\n${logs.join("\n")}`
    );
    Assert.ok(succeeded, `Task ${name} should have succeeded`);
  }
  for (let i = 0; i < TEMP_FILES_TO_CREATE; i++) {
    let fileName = "places.sqlite" + (i > 0 ? "-" + i : "") + ".corrupt";
    let filePath = PathUtils.join(PathUtils.profileDir, fileName);
    if (LAST_MODIFICATION_DAY[i] >= RETAIN_DAYS) {
      Assert.ok(
        !(await IOUtils.exists(filePath)),
        "Old corrupt file has been removed" + filePath
      );
    } else {
      Assert.ok(
        await IOUtils.exists(filePath),
        "Files that are not old are not removed" + filePath
      );
    }
  }
});
