Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
/* -*- 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
/**
* Check for correct functionality of bookmarks backups
*/
const NUMBER_OF_BACKUPS = 10;
async function createBackups(nBackups, dateObj, bookmarksBackupDir) {
// Generate random dates.
let dates = [];
while (dates.length < nBackups) {
// Use last year to ensure today's backup is the newest.
let randomDate = new Date(
dateObj.getFullYear() - 1,
Math.floor(12 * Math.random()),
Math.floor(28 * Math.random())
);
if (!dates.includes(randomDate.getTime())) {
dates.push(randomDate.getTime());
}
}
// Sort dates from oldest to newest.
dates.sort();
// Fake backups are created backwards to ensure we won't consider file
// creation time.
// Create fake backups for the newest dates.
for (let i = dates.length - 1; i >= 0; i--) {
let backupFilename = PlacesBackups.getFilenameForDate(new Date(dates[i]));
let backupFile = bookmarksBackupDir.clone();
backupFile.append(backupFilename);
backupFile.create(Ci.nsIFile.NORMAL_FILE_TYPE, parseInt("0666", 8));
info("Creating fake backup " + backupFile.leafName);
if (!backupFile.exists()) {
do_throw("Unable to create fake backup " + backupFile.leafName);
}
}
return dates;
}
async function checkBackups(dates, bookmarksBackupDir) {
// Check backups. We have 11 dates but we the max number is 10 so the
// oldest backup should have been removed.
for (let i = 0; i < dates.length; i++) {
let backupFilename;
let shouldExist;
let backupFile;
if (i > 0) {
let files = bookmarksBackupDir.directoryEntries;
while (files.hasMoreElements()) {
let entry = files.nextFile;
if (PlacesBackups.filenamesRegex.test(entry.leafName)) {
backupFilename = entry.leafName;
backupFile = entry;
break;
}
}
shouldExist = true;
} else {
backupFilename = PlacesBackups.getFilenameForDate(new Date(dates[i]));
backupFile = bookmarksBackupDir.clone();
backupFile.append(backupFilename);
shouldExist = false;
}
if (backupFile.exists() != shouldExist) {
do_throw(
"Backup should " +
(shouldExist ? "" : "not") +
" exist: " +
backupFilename
);
}
}
}
async function cleanupFiles(bookmarksBackupDir) {
// Cleanup backups folder.
// XXX: Can't use bookmarksBackupDir.remove(true) because file lock happens
// on WIN XP.
let files = bookmarksBackupDir.directoryEntries;
while (files.hasMoreElements()) {
let entry = files.nextFile;
entry.remove(false);
}
// Clear cache to match the manual removing of files
delete PlacesBackups._backupFiles;
Assert.ok(!bookmarksBackupDir.directoryEntries.hasMoreElements());
}
add_task(async function test_create_backups() {
let backupFolderPath = await PlacesBackups.getBackupFolder();
let bookmarksBackupDir = new FileUtils.File(backupFolderPath);
let dateObj = new Date();
let dates = await createBackups(
NUMBER_OF_BACKUPS,
dateObj,
bookmarksBackupDir
);
// Add today's backup.
await PlacesBackups.create(NUMBER_OF_BACKUPS);
dates.push(dateObj.getTime());
await checkBackups(dates, bookmarksBackupDir);
await cleanupFiles(bookmarksBackupDir);
});
add_task(async function test_saveBookmarks_with_no_backups() {
let backupFolderPath = await PlacesBackups.getBackupFolder();
let bookmarksBackupDir = new FileUtils.File(backupFolderPath);
Services.prefs.setIntPref("browser.bookmarks.max_backups", 0);
let filePath = PathUtils.join(do_get_tempdir().path, "backup.json");
await PlacesBackups.saveBookmarksToJSONFile(filePath);
let files = bookmarksBackupDir.directoryEntries;
Assert.ok(!files.hasMoreElements(), "Should have no backup files.");
await IOUtils.remove(filePath);
// We don't need to call cleanupFiles as we are not creating any
// backups but need to reset the cache.
delete PlacesBackups._backupFiles;
});
add_task(async function test_saveBookmarks_with_backups() {
let backupFolderPath = await PlacesBackups.getBackupFolder();
let bookmarksBackupDir = new FileUtils.File(backupFolderPath);
Services.prefs.setIntPref("browser.bookmarks.max_backups", NUMBER_OF_BACKUPS);
let filePath = PathUtils.join(do_get_tempdir().path, "backup.json");
let dateObj = new Date();
let dates = await createBackups(
NUMBER_OF_BACKUPS,
dateObj,
bookmarksBackupDir
);
await PlacesBackups.saveBookmarksToJSONFile(filePath);
let backupPath = await PlacesBackups.getMostRecentBackup();
Assert.ok(await IOUtils.read(backupPath, { decompress: true }));
dates.push(dateObj.getTime());
await checkBackups(dates, bookmarksBackupDir);
await IOUtils.remove(filePath);
await cleanupFiles(bookmarksBackupDir);
});