Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test runs only with pattern: os != 'android'
- Manifest: browser/components/backup/tests/xpcshell/xpcshell.toml
/* Any copyright is dedicated to the Public Domain.
"use strict";
const { SiteSettingsBackupResource } = ChromeUtils.importESModule(
"resource:///modules/backup/SiteSettingsBackupResource.sys.mjs"
);
/**
* Tests that we can measure the Site Settings databases in a profile directory.
*/
add_task(async function test_measure() {
const EXPECTED_PERMISSIONS_DB_SIZE = 500;
const EXPECTED_CONTENT_PREFS_DB_SIZE = 500;
Services.fog.testResetFOG();
let tempDir = PathUtils.tempDir;
let tempPermissionsDBPath = PathUtils.join(tempDir, "permissions.sqlite");
let tempContentPrefsDBPath = PathUtils.join(tempDir, "content-prefs.sqlite");
await createKilobyteSizedFile(
tempPermissionsDBPath,
EXPECTED_PERMISSIONS_DB_SIZE
);
await createKilobyteSizedFile(
tempContentPrefsDBPath,
EXPECTED_CONTENT_PREFS_DB_SIZE
);
let siteSettingsBackupResource = new SiteSettingsBackupResource();
await siteSettingsBackupResource.measure(tempDir);
await IOUtils.remove(tempPermissionsDBPath);
await IOUtils.remove(tempContentPrefsDBPath);
});
/**
* Test that the backup method correctly copies items from the profile directory
* into the staging directory.
*/
add_task(async function test_backup() {
let sandbox = sinon.createSandbox();
let siteSettingsBackupResource = new SiteSettingsBackupResource();
let sourcePath = await IOUtils.createUniqueDirectory(
PathUtils.tempDir,
"SiteSettingsBackupResource-source-test"
);
let stagingPath = await IOUtils.createUniqueDirectory(
PathUtils.tempDir,
"SiteSettingsBackupResource-staging-test"
);
await createTestFiles(sourcePath, [
{ path: "permissions.sqlite" },
{ path: "content-prefs.sqlite" },
]);
let fakeConnection = {
backup: sandbox.stub().resolves(true),
close: sandbox.stub().resolves(true),
};
sandbox.stub(Sqlite, "openConnection").returns(fakeConnection);
let manifestEntry = await siteSettingsBackupResource.backup(
stagingPath,
sourcePath
);
Assert.equal(
manifestEntry,
null,
"SiteSettingsBackupResource.backup should return null as its ManifestEntry"
);
Assert.ok(
fakeConnection.backup.calledTwice,
"Called backup the expected number of times for all connections"
);
Assert.ok(
fakeConnection.backup.calledWith(
PathUtils.join(stagingPath, "permissions.sqlite")
),
"Called backup on the permissions.sqlite Sqlite connection"
);
Assert.ok(
fakeConnection.backup.calledWith(
PathUtils.join(stagingPath, "content-prefs.sqlite")
),
"Called backup on the content-prefs.sqlite Sqlite connection"
);
await maybeRemovePath(stagingPath);
await maybeRemovePath(sourcePath);
sandbox.restore();
});
/**
* Test that the recover method correctly copies items from the recovery
* directory into the destination profile directory.
*/
add_task(async function test_recover() {
let siteSettingsBackupResource = new SiteSettingsBackupResource();
let recoveryPath = await IOUtils.createUniqueDirectory(
PathUtils.tempDir,
"SiteSettingsBackupResource-recovery-test"
);
let destProfilePath = await IOUtils.createUniqueDirectory(
PathUtils.tempDir,
"SiteSettingsBackupResource-test-profile"
);
const simpleCopyFiles = [
{ path: "permissions.sqlite" },
{ path: "content-prefs.sqlite" },
];
await createTestFiles(recoveryPath, simpleCopyFiles);
let postRecoveryEntry = await siteSettingsBackupResource.recover(
null,
recoveryPath,
destProfilePath
);
Assert.equal(
postRecoveryEntry,
null,
"SiteSettingsBackupResource.recover should return null as its post recovery entry"
);
await assertFilesExist(destProfilePath, simpleCopyFiles);
await maybeRemovePath(recoveryPath);
await maybeRemovePath(destProfilePath);
});
/**
* Tests that the backup method does not copy the permissions or content prefs
* databases if the browser is configured to not save history - either while
* running, or to clear it at shutdown.
*/
add_task(async function test_backup_no_saved_history() {
let siteSettingsBackupResource = new SiteSettingsBackupResource();
let sourcePath = await IOUtils.createUniqueDirectory(
PathUtils.tempDir,
"SiteSettingsBackupResource-source-test"
);
let stagingPath = await IOUtils.createUniqueDirectory(
PathUtils.tempDir,
"SiteSettingsBackupResource-staging-test"
);
let sandbox = sinon.createSandbox();
let fakeConnection = {
backup: sandbox.stub().resolves(true),
close: sandbox.stub().resolves(true),
};
sandbox.stub(Sqlite, "openConnection").returns(fakeConnection);
Services.prefs.setBoolPref(SANITIZE_ON_SHUTDOWN_PREF, true);
Services.prefs.setBoolPref(SITE_SETTINGS_CLEARED_ON_SHUTDOWN_PREF, true);
Assert.ok(
!SiteSettingsBackupResource.canBackupResource,
"Cannot backup site settings since they are being cleared on shutdown"
);
let manifestEntry = await siteSettingsBackupResource.backup(
stagingPath,
sourcePath
);
Assert.equal(
manifestEntry,
null,
"SiteSettingsBackupResource.backup should return null as its ManifestEntry"
);
Assert.ok(
fakeConnection.backup.notCalled,
"No sqlite connections should have been made with sanitize shutdown enabled"
);
Services.prefs.clearUserPref(SANITIZE_ON_SHUTDOWN_PREF);
Services.prefs.clearUserPref(SITE_SETTINGS_CLEARED_ON_SHUTDOWN_PREF);
Assert.ok(
SiteSettingsBackupResource.canBackupResource,
"We should be allowed to backup this resource now"
);
fakeConnection.backup.resetHistory();
manifestEntry = await siteSettingsBackupResource.backup(
stagingPath,
sourcePath
);
Assert.equal(
manifestEntry,
null,
"Should have gotten back a null ManifestEntry"
);
Assert.ok(
fakeConnection.backup.notCalled,
"No files to backup, so no sqlite connections should have been made"
);
await maybeRemovePath(stagingPath);
await maybeRemovePath(sourcePath);
sandbox.restore();
});
/**
* Tests the canBackupResource method with various pref configurations.
*/
add_task(async function test_canBackupResource() {
Assert.ok(
SiteSettingsBackupResource.canBackupResource,
"Should be able to backup by default"
);
Services.prefs.setBoolPref(SANITIZE_ON_SHUTDOWN_PREF, true);
Services.prefs.setBoolPref(SITE_SETTINGS_CLEARED_ON_SHUTDOWN_PREF, true);
Assert.ok(
!SiteSettingsBackupResource.canBackupResource,
"Cannot backup when sanitizeOnShutdown and site settings cleared on shutdown (v2) are enabled"
);
Services.prefs.clearUserPref(SANITIZE_ON_SHUTDOWN_PREF);
Services.prefs.clearUserPref(SITE_SETTINGS_CLEARED_ON_SHUTDOWN_PREF);
Assert.ok(
SiteSettingsBackupResource.canBackupResource,
"Should be able to backup after clearing prefs"
);
Services.prefs.setBoolPref(USE_OLD_CLEAR_HISTORY_DIALOG_PREF, true);
Services.prefs.setBoolPref(SANITIZE_ON_SHUTDOWN_PREF, true);
Services.prefs.setBoolPref(SITE_SETTINGS_CLEARED_ON_SHUTDOWN_OLD_PREF, true);
Assert.ok(
!SiteSettingsBackupResource.canBackupResource,
"Cannot backup when sanitizeOnShutdown and site settings cleared on shutdown (old) are enabled"
);
Services.prefs.clearUserPref(USE_OLD_CLEAR_HISTORY_DIALOG_PREF);
Services.prefs.clearUserPref(SANITIZE_ON_SHUTDOWN_PREF);
Services.prefs.clearUserPref(SITE_SETTINGS_CLEARED_ON_SHUTDOWN_OLD_PREF);
});