Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test gets skipped with pattern: os == 'android' OR condprof
- Manifest: browser/components/sessionstore/test/unit/xpcshell.toml
"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(
);
updateAppInfo({
name: "SessionRestoreTest",
ID: "{230de50e-4cd1-11dc-8314-0800200c9a66}",
version: "1",
platformVersion: "",
});
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.`
);
})();
}
// Check whether the migration from .js to .jslz4 is correct.
add_task(async function test_migration() {
let source = do_get_file("data/sessionstore_valid.js");
source.copyTo(profd, "sessionstore.js");
// Read the content of the session store file.
let parsed = await IOUtils.readJSON(Paths.clean.replace("jsonlz4", "js"));
// Read the session file with .js extension.
let result = await SessionFile.read();
// Check whether the result is what we wanted.
equal(result.origin, "clean");
equal(result.useOldExtension, true);
Assert.deepEqual(
result.parsed,
parsed,
"result.parsed contains expected data"
);
// Initiate a write to ensure we write the compressed version.
await SessionFile.write(parsed);
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);
// The deprecated $Path.clean should exist.
await promise_check_exist(Paths.clean.replace("jsonlz4", "js"), true);
await promise_check_contents(Paths.recovery, parsed);
});
add_task(async function test_startup_with_compressed_clean() {
let state = { windows: [] };
// Mare sure we have an empty profile dir.
await SessionFile.wipe();
// Populate session files to profile dir.
await IOUtils.writeJSON(Paths.clean, state, {
compress: true,
});
await IOUtils.makeDirectory(Paths.backups);
await IOUtils.writeJSON(Paths.cleanBackup, state, {
compress: true,
});
// Initiate a read.
let result = await SessionFile.read();
// Make sure we read correct session file and its content.
equal(result.origin, "clean");
equal(result.useOldExtension, false);
Assert.deepEqual(
state,
result.parsed,
"result.parsed contains expected data"
);
});
add_task(async function test_empty_profile_dir() {
// Make sure that we have empty profile dir.
await SessionFile.wipe();
await promise_check_exist(Paths.backups, false);
await promise_check_exist(Paths.clean, false);
await promise_check_exist(Paths.cleanBackup, false);
await promise_check_exist(Paths.recovery, false);
await promise_check_exist(Paths.recoveryBackup, false);
await promise_check_exist(Paths.nextUpgradeBackup, false);
await promise_check_exist(Paths.backups.replace("jsonlz4", "js"), false);
await promise_check_exist(Paths.clean.replace("jsonlz4", "js"), false);
await promise_check_exist(Paths.cleanBackup.replace("lz4", ""), false);
await promise_check_exist(Paths.recovery.replace("jsonlz4", "js"), false);
await promise_check_exist(
Paths.recoveryBackup.replace("jsonlz4", "js"),
false
);
await promise_check_exist(
Paths.nextUpgradeBackup.replace("jsonlz4", "js"),
false
);
// Initiate a read and make sure that we are in empty state.
let result = await SessionFile.read();
equal(result.origin, "empty");
equal(result.noFilesFound, true);
// Create a state to store.
let state = { windows: [] };
await SessionWriter.write(state, { isFinalWrite: true });
// Check session files are created, but not deprecated ones.
await promise_check_exist(Paths.clean, true);
await promise_check_exist(Paths.clean.replace("jsonlz4", "js"), false);
// Check session file' content is correct.
await promise_check_contents(Paths.clean, state);
});