Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

/* Any copyright is dedicated to the Public Domain.
"use strict";
const { BookmarksBackupResource } = ChromeUtils.importESModule(
"resource:///modules/backup/BookmarksBackupResource.sys.mjs"
);
const { BookmarkJSONUtils } = ChromeUtils.importESModule(
"resource://gre/modules/BookmarkJSONUtils.sys.mjs"
);
/**
* Test that the backup method correctly creates a compressed bookmarks JSON file.
*/
add_task(async function test_backup() {
let sandbox = sinon.createSandbox();
let bookmarksBackupResource = new BookmarksBackupResource();
let sourcePath = await IOUtils.createUniqueDirectory(
PathUtils.tempDir,
"BookmarksBackupResource-source-test"
);
let stagingPath = await IOUtils.createUniqueDirectory(
PathUtils.tempDir,
"BookmarksBackupResource-staging-test"
);
let exportStub = sandbox.stub(BookmarkJSONUtils, "exportToFile").resolves();
let manifestEntry = await bookmarksBackupResource.backup(
stagingPath,
sourcePath
);
Assert.equal(
manifestEntry,
null,
"BookmarksBackupResource.backup should return null as its ManifestEntry"
);
Assert.ok(
exportStub.calledOnce,
"BookmarkJSONUtils.exportToFile should have been called once"
);
Assert.ok(
exportStub.calledWith(PathUtils.join(stagingPath, "bookmarks.jsonlz4"), {
compress: true,
}),
"BookmarkJSONUtils.exportToFile should have been called with the correct arguments"
);
await maybeRemovePath(stagingPath);
await maybeRemovePath(sourcePath);
sandbox.restore();
});
/**
* Test that the recover method correctly returns the path to the bookmarks backup file.
*/
add_task(async function test_recover() {
let bookmarksBackupResource = new BookmarksBackupResource();
let recoveryPath = await IOUtils.createUniqueDirectory(
PathUtils.tempDir,
"BookmarksBackupResource-recovery-test"
);
let destProfilePath = await IOUtils.createUniqueDirectory(
PathUtils.tempDir,
"BookmarksBackupResource-test-profile"
);
await createTestFiles(recoveryPath, [{ path: "bookmarks.jsonlz4" }]);
let postRecoveryEntry = await bookmarksBackupResource.recover(
null,
recoveryPath,
destProfilePath
);
let expectedBookmarksPath = PathUtils.join(recoveryPath, "bookmarks.jsonlz4");
Assert.deepEqual(
postRecoveryEntry,
{ bookmarksBackupPath: expectedBookmarksPath },
"BookmarksBackupResource.recover should return the path to the bookmarks backup file"
);
// The bookmarks file should not be copied to the destination profile during recovery,
// it will be imported in postRecovery
Assert.ok(
!(await IOUtils.exists(
PathUtils.join(destProfilePath, "bookmarks.jsonlz4")
)),
"bookmarks.jsonlz4 should not exist in the destination profile yet"
);
await maybeRemovePath(recoveryPath);
await maybeRemovePath(destProfilePath);
});
/**
* Test that the postRecovery method correctly imports bookmarks from the backup file.
*/
add_task(async function test_postRecovery() {
let sandbox = sinon.createSandbox();
let bookmarksBackupResource = new BookmarksBackupResource();
let recoveryPath = await IOUtils.createUniqueDirectory(
PathUtils.tempDir,
"BookmarksBackupResource-recovery-test"
);
await createTestFiles(recoveryPath, [{ path: "bookmarks.jsonlz4" }]);
let bookmarksBackupPath = PathUtils.join(recoveryPath, "bookmarks.jsonlz4");
let importStub = sandbox
.stub(BookmarkJSONUtils, "importFromFile")
.resolves(true);
await bookmarksBackupResource.postRecovery({ bookmarksBackupPath });
Assert.ok(
importStub.calledOnce,
"BookmarkJSONUtils.importFromFile should have been called once"
);
Assert.ok(
importStub.calledWith(bookmarksBackupPath, { replace: true }),
"BookmarkJSONUtils.importFromFile should have been called with the correct arguments"
);
await maybeRemovePath(recoveryPath);
sandbox.restore();
});
/**
* Test that postRecovery handles missing bookmarksBackupPath gracefully.
*/
add_task(async function test_postRecovery_no_path() {
let sandbox = sinon.createSandbox();
let bookmarksBackupResource = new BookmarksBackupResource();
let importStub = sandbox
.stub(BookmarkJSONUtils, "importFromFile")
.resolves(true);
await bookmarksBackupResource.postRecovery(null);
Assert.ok(
importStub.notCalled,
"BookmarkJSONUtils.importFromFile should not have been called with null postRecoveryEntry"
);
await bookmarksBackupResource.postRecovery({});
Assert.ok(
importStub.notCalled,
"BookmarkJSONUtils.importFromFile should not have been called with empty postRecoveryEntry"
);
sandbox.restore();
});