summaryrefslogtreecommitdiffstats
path: root/browser/components/migration/tests/unit/test_Chrome_permissions.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/migration/tests/unit/test_Chrome_permissions.js')
-rw-r--r--browser/components/migration/tests/unit/test_Chrome_permissions.js205
1 files changed, 205 insertions, 0 deletions
diff --git a/browser/components/migration/tests/unit/test_Chrome_permissions.js b/browser/components/migration/tests/unit/test_Chrome_permissions.js
new file mode 100644
index 0000000000..6dfd8bcceb
--- /dev/null
+++ b/browser/components/migration/tests/unit/test_Chrome_permissions.js
@@ -0,0 +1,205 @@
+/* Any copyright is dedicated to the Public Domain.
+http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+/**
+ * Tests that if the migrator does not have the permission to
+ * read from the Chrome data directory, that it can request
+ * permission to read from it, if the system allows.
+ */
+
+const { ChromeMigrationUtils } = ChromeUtils.importESModule(
+ "resource:///modules/ChromeMigrationUtils.sys.mjs"
+);
+
+const { ChromeProfileMigrator } = ChromeUtils.importESModule(
+ "resource:///modules/ChromeProfileMigrator.sys.mjs"
+);
+
+const { sinon } = ChromeUtils.importESModule(
+ "resource://testing-common/Sinon.sys.mjs"
+);
+
+const { MockFilePicker } = ChromeUtils.importESModule(
+ "resource://testing-common/MockFilePicker.sys.mjs"
+);
+
+let gTempDir;
+
+add_setup(async () => {
+ Services.prefs.setBoolPref(
+ "browser.migrate.chrome.get_permissions.enabled",
+ true
+ );
+ gTempDir = do_get_tempdir();
+ await IOUtils.writeJSON(PathUtils.join(gTempDir.path, "Local State"), []);
+
+ MockFilePicker.init(globalThis);
+ registerCleanupFunction(() => {
+ MockFilePicker.cleanup();
+ });
+});
+
+/**
+ * Tests that canGetPermissions will return false if the platform does
+ * not allow for folder selection in the native file picker, and returns
+ * the data path otherwise.
+ */
+add_task(async function test_canGetPermissions() {
+ let sandbox = sinon.createSandbox();
+ registerCleanupFunction(() => {
+ sandbox.restore();
+ });
+
+ let migrator = new ChromeProfileMigrator();
+ let canGetPermissionsStub = sandbox
+ .stub(MigrationUtils, "canGetPermissionsOnPlatform")
+ .resolves(false);
+ sandbox.stub(ChromeMigrationUtils, "getDataPath").resolves(gTempDir.path);
+
+ Assert.ok(
+ !(await migrator.canGetPermissions()),
+ "Should not be able to get permissions."
+ );
+
+ canGetPermissionsStub.resolves(true);
+
+ Assert.equal(
+ await migrator.canGetPermissions(),
+ gTempDir.path,
+ "Should be able to get the permissions path."
+ );
+
+ sandbox.restore();
+});
+
+/**
+ * Tests that getPermissions will show the native file picker in a
+ * loop until either the user cancels or selects a folder that grants
+ * read permissions to the data directory.
+ */
+add_task(async function test_getPermissions() {
+ let sandbox = sinon.createSandbox();
+ registerCleanupFunction(() => {
+ sandbox.restore();
+ });
+
+ let migrator = new ChromeProfileMigrator();
+ sandbox.stub(MigrationUtils, "canGetPermissionsOnPlatform").resolves(true);
+ sandbox.stub(ChromeMigrationUtils, "getDataPath").resolves(gTempDir.path);
+ let hasPermissionsStub = sandbox
+ .stub(migrator, "hasPermissions")
+ .resolves(false);
+
+ Assert.equal(
+ await migrator.canGetPermissions(),
+ gTempDir.path,
+ "Should be able to get the permissions path."
+ );
+
+ let filePickerSeenCount = 0;
+
+ let filePickerShownPromise = new Promise(resolve => {
+ MockFilePicker.showCallback = () => {
+ Assert.ok(true, "Filepicker shown.");
+ MockFilePicker.useDirectory([gTempDir.path]);
+ filePickerSeenCount++;
+ if (filePickerSeenCount > 3) {
+ Assert.ok(true, "File picker looped 3 times.");
+ hasPermissionsStub.resolves(true);
+ resolve();
+ }
+ };
+ });
+ MockFilePicker.returnValue = MockFilePicker.returnOK;
+ Assert.ok(
+ await migrator.getPermissions(),
+ "Should report that we got permissions."
+ );
+
+ await filePickerShownPromise;
+
+ // Make sure that the user can also hit "cancel" and that we
+ // file picker loop.
+
+ hasPermissionsStub.resolves(false);
+
+ filePickerSeenCount = 0;
+ filePickerShownPromise = new Promise(resolve => {
+ MockFilePicker.showCallback = () => {
+ Assert.ok(true, "Filepicker shown.");
+ filePickerSeenCount++;
+ Assert.equal(filePickerSeenCount, 1, "Saw the picker once.");
+ resolve();
+ };
+ });
+ MockFilePicker.returnValue = MockFilePicker.returnCancel;
+ Assert.ok(
+ !(await migrator.getPermissions()),
+ "Should report that we didn't get permissions."
+ );
+ await filePickerShownPromise;
+
+ sandbox.restore();
+});
+
+/**
+ * Tests that if the native file picker chooses a different directory
+ * than the one we originally asked for, that we remap attempts to
+ * read profiles from that new directory. This is because Ubuntu Snaps
+ * will return us paths from the native file picker that are symlinks
+ * to the original directories.
+ */
+add_task(async function test_remapDirectories() {
+ let remapDir = new FileUtils.File(
+ await IOUtils.createUniqueDirectory(
+ PathUtils.tempDir,
+ "test-chrome-migration"
+ )
+ );
+ let localStatePath = PathUtils.join(remapDir.path, "Local State");
+ await IOUtils.writeJSON(localStatePath, []);
+
+ let sandbox = sinon.createSandbox();
+ registerCleanupFunction(() => {
+ sandbox.restore();
+ });
+
+ let migrator = new ChromeProfileMigrator();
+ sandbox.stub(MigrationUtils, "canGetPermissionsOnPlatform").resolves(true);
+ sandbox.stub(ChromeMigrationUtils, "getDataPath").resolves(gTempDir.path);
+ let hasPermissionsStub = sandbox
+ .stub(migrator, "hasPermissions")
+ .resolves(false);
+
+ Assert.equal(
+ await migrator.canGetPermissions(),
+ gTempDir.path,
+ "Should be able to get the permissions path."
+ );
+
+ let filePickerShownPromise = new Promise(resolve => {
+ MockFilePicker.showCallback = () => {
+ Assert.ok(true, "Filepicker shown.");
+ MockFilePicker.useDirectory([remapDir.path]);
+ hasPermissionsStub.resolves(true);
+ resolve();
+ };
+ });
+ MockFilePicker.returnValue = MockFilePicker.returnOK;
+ Assert.ok(
+ await migrator.getPermissions(),
+ "Should report that we got permissions."
+ );
+
+ Assert.equal(
+ PathUtils.normalize(await migrator.canGetPermissions()),
+ PathUtils.normalize(remapDir.path),
+ "Should be able to get the remapped permissions path."
+ );
+
+ await filePickerShownPromise;
+
+ sandbox.restore();
+});