forked from mirrors/gecko-dev
137 lines
4.4 KiB
JavaScript
137 lines
4.4 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
"use strict";
|
|
|
|
const { SessionWriter } = ChromeUtils.importESModule(
|
|
"resource:///modules/sessionstore/SessionWriter.sys.mjs"
|
|
);
|
|
|
|
// Make sure that we have a profile before initializing SessionFile.
|
|
const profd = do_get_profile();
|
|
const { SessionFile } = ChromeUtils.importESModule(
|
|
"resource:///modules/sessionstore/SessionFile.sys.mjs"
|
|
);
|
|
const Paths = SessionFile.Paths;
|
|
|
|
// We need a XULAppInfo to initialize SessionFile
|
|
const { updateAppInfo } = ChromeUtils.importESModule(
|
|
"resource://testing-common/AppInfo.sys.mjs"
|
|
);
|
|
updateAppInfo({
|
|
name: "SessionRestoreTest",
|
|
ID: "{230de50e-4cd1-11dc-8314-0800200c9a66}",
|
|
version: "1",
|
|
platformVersion: "",
|
|
});
|
|
|
|
add_setup(async function () {
|
|
let source = do_get_file("data/sessionstore_valid.js");
|
|
source.copyTo(profd, "sessionstore.js");
|
|
await writeCompressedFile(Paths.clean.replace("jsonlz4", "js"), Paths.clean);
|
|
|
|
// Finish initialization of SessionFile
|
|
await SessionFile.read();
|
|
});
|
|
|
|
function promise_check_exist(path, shouldExist) {
|
|
return (async function () {
|
|
info(
|
|
"Ensuring that " + path + (shouldExist ? " exists" : " does not exist")
|
|
);
|
|
if ((await IOUtils.exists(path)) != shouldExist) {
|
|
throw new Error(
|
|
"File" + path + " should " + (shouldExist ? "exist" : "not exist")
|
|
);
|
|
}
|
|
})();
|
|
}
|
|
|
|
function promise_check_contents(path, expect) {
|
|
return (async function () {
|
|
info("Checking whether " + path + " has the right contents");
|
|
let actual = await IOUtils.readJSON(path, {
|
|
decompress: true,
|
|
});
|
|
Assert.deepEqual(
|
|
actual,
|
|
expect,
|
|
`File ${path} contains the expected data.`
|
|
);
|
|
})();
|
|
}
|
|
|
|
function generateFileContents(id) {
|
|
let url = `http://example.com/test_backup_once#${id}_${Math.random()}`;
|
|
return { windows: [{ tabs: [{ entries: [{ url }], index: 1 }] }] };
|
|
}
|
|
|
|
// Write to the store, and check that it creates:
|
|
// - $Path.recovery with the new data
|
|
// - $Path.nextUpgradeBackup with the old data
|
|
add_task(async function test_first_write_backup() {
|
|
let initial_content = generateFileContents("initial");
|
|
let new_content = generateFileContents("test_1");
|
|
|
|
info("Before the first write, none of the files should exist");
|
|
await promise_check_exist(Paths.backups, false);
|
|
|
|
await IOUtils.makeDirectory(Paths.backups);
|
|
await IOUtils.writeJSON(Paths.clean, initial_content, {
|
|
compress: true,
|
|
});
|
|
await SessionFile.write(new_content);
|
|
|
|
info("After first write, a few files should have been created");
|
|
await promise_check_exist(Paths.backups, true);
|
|
await promise_check_exist(Paths.clean, false);
|
|
await promise_check_exist(Paths.cleanBackup, true);
|
|
await promise_check_exist(Paths.recovery, true);
|
|
await promise_check_exist(Paths.recoveryBackup, false);
|
|
await promise_check_exist(Paths.nextUpgradeBackup, true);
|
|
|
|
await promise_check_contents(Paths.recovery, new_content);
|
|
await promise_check_contents(Paths.nextUpgradeBackup, initial_content);
|
|
});
|
|
|
|
// Write to the store again, and check that
|
|
// - $Path.clean is not written
|
|
// - $Path.recovery contains the new data
|
|
// - $Path.recoveryBackup contains the previous data
|
|
add_task(async function test_second_write_no_backup() {
|
|
let new_content = generateFileContents("test_2");
|
|
let previous_backup_content = await IOUtils.readJSON(Paths.recovery, {
|
|
decompress: true,
|
|
});
|
|
|
|
await IOUtils.remove(Paths.cleanBackup);
|
|
|
|
await SessionFile.write(new_content);
|
|
|
|
await promise_check_exist(Paths.backups, true);
|
|
await promise_check_exist(Paths.clean, false);
|
|
await promise_check_exist(Paths.cleanBackup, false);
|
|
await promise_check_exist(Paths.recovery, true);
|
|
await promise_check_exist(Paths.nextUpgradeBackup, true);
|
|
|
|
await promise_check_contents(Paths.recovery, new_content);
|
|
await promise_check_contents(Paths.recoveryBackup, previous_backup_content);
|
|
});
|
|
|
|
// Make sure that we create $Paths.clean and remove $Paths.recovery*
|
|
// upon shutdown
|
|
add_task(async function test_shutdown() {
|
|
let output = generateFileContents("test_3");
|
|
|
|
await IOUtils.writeUTF8(Paths.recovery, "I should disappear");
|
|
await IOUtils.writeUTF8(Paths.recoveryBackup, "I should also disappear");
|
|
|
|
await SessionWriter.write(output, {
|
|
isFinalWrite: true,
|
|
performShutdownCleanup: true,
|
|
});
|
|
|
|
Assert.ok(!(await IOUtils.exists(Paths.recovery)));
|
|
Assert.ok(!(await IOUtils.exists(Paths.recoveryBackup)));
|
|
await promise_check_contents(Paths.clean, output);
|
|
});
|