summaryrefslogtreecommitdiffstats
path: root/devtools/client/aboutdebugging/test/xpcshell
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/aboutdebugging/test/xpcshell')
-rw-r--r--devtools/client/aboutdebugging/test/xpcshell/.eslintrc.js6
-rw-r--r--devtools/client/aboutdebugging/test/xpcshell/test_extensions_path.js27
-rw-r--r--devtools/client/aboutdebugging/test/xpcshell/test_runtime_default_preferences.js203
-rw-r--r--devtools/client/aboutdebugging/test/xpcshell/xpcshell-head.js10
-rw-r--r--devtools/client/aboutdebugging/test/xpcshell/xpcshell.ini8
5 files changed, 254 insertions, 0 deletions
diff --git a/devtools/client/aboutdebugging/test/xpcshell/.eslintrc.js b/devtools/client/aboutdebugging/test/xpcshell/.eslintrc.js
new file mode 100644
index 0000000000..8611c174f5
--- /dev/null
+++ b/devtools/client/aboutdebugging/test/xpcshell/.eslintrc.js
@@ -0,0 +1,6 @@
+"use strict";
+
+module.exports = {
+ // Extend from the common devtools xpcshell eslintrc config.
+ extends: "../../../../.eslintrc.xpcshell.js",
+};
diff --git a/devtools/client/aboutdebugging/test/xpcshell/test_extensions_path.js b/devtools/client/aboutdebugging/test/xpcshell/test_extensions_path.js
new file mode 100644
index 0000000000..1ec9f0d7c2
--- /dev/null
+++ b/devtools/client/aboutdebugging/test/xpcshell/test_extensions_path.js
@@ -0,0 +1,27 @@
+/* global equal */
+
+"use strict";
+
+const {
+ parseFileUri,
+} = require("resource://devtools/client/aboutdebugging/src/modules/extensions-helper.js");
+
+add_task(async function testParseFileUri() {
+ equal(
+ parseFileUri("file:///home/me/my-extension/"),
+ "/home/me/my-extension/",
+ "UNIX paths are supported"
+ );
+
+ equal(
+ parseFileUri("file:///C:/Documents/my-extension/"),
+ "C:/Documents/my-extension/",
+ "Windows paths are supported"
+ );
+
+ equal(
+ parseFileUri("file://home/Documents/my-extension/"),
+ "home/Documents/my-extension/",
+ "Windows network paths are supported"
+ );
+});
diff --git a/devtools/client/aboutdebugging/test/xpcshell/test_runtime_default_preferences.js b/devtools/client/aboutdebugging/test/xpcshell/test_runtime_default_preferences.js
new file mode 100644
index 0000000000..637e42e078
--- /dev/null
+++ b/devtools/client/aboutdebugging/test/xpcshell/test_runtime_default_preferences.js
@@ -0,0 +1,203 @@
+"use strict";
+
+const { sinon } = ChromeUtils.importESModule(
+ "resource://testing-common/Sinon.sys.mjs"
+);
+const {
+ setDefaultPreferencesIfNeeded,
+ PREFERENCE_TYPES,
+} = require("resource://devtools/client/aboutdebugging/src/modules/runtime-default-preferences.js");
+
+const CHAR_PREF = "some.char.pref";
+const BOOL_PREF = "some.bool.pref";
+const INT_PREF = "some.int.pref";
+
+const TEST_PREFERENCES = [
+ {
+ prefName: BOOL_PREF,
+ defaultValue: false,
+ trait: "boolPrefTrait",
+ type: PREFERENCE_TYPES.BOOL,
+ },
+ {
+ prefName: CHAR_PREF,
+ defaultValue: "",
+ trait: "charPrefTrait",
+ type: PREFERENCE_TYPES.CHAR,
+ },
+ {
+ prefName: INT_PREF,
+ defaultValue: 1,
+ trait: "intPrefTrait",
+ type: PREFERENCE_TYPES.INT,
+ },
+];
+
+add_task(async function test_with_traits() {
+ // Create a front that indicates that the preferences should be safe to query.
+ // We should not perform any additional call to the preferences front.
+ const preferencesFront = {
+ getTraits: () => ({
+ boolPrefTrait: true,
+ charPrefTrait: true,
+ intPrefTrait: true,
+ }),
+
+ setBoolPref: sinon.spy(),
+ getBoolPref: sinon.spy(),
+ setCharPref: sinon.spy(),
+ getCharPref: sinon.spy(),
+ setIntPref: sinon.spy(),
+ getIntPref: sinon.spy(),
+ };
+
+ const clientWrapper = createClientWrapper(preferencesFront);
+ await setDefaultPreferencesIfNeeded(clientWrapper, TEST_PREFERENCES);
+
+ // Check get/setBoolPref spies
+ ok(preferencesFront.getBoolPref.notCalled, "getBoolPref was not called");
+ ok(preferencesFront.setBoolPref.notCalled, "setBoolPref was not called");
+
+ // Check get/setCharPref spies
+ ok(preferencesFront.getCharPref.notCalled, "getCharPref was not called");
+ ok(preferencesFront.setCharPref.notCalled, "setCharPref was not called");
+
+ // Check get/setIntPref spies
+ ok(preferencesFront.getIntPref.notCalled, "getIntPref was not called");
+ ok(preferencesFront.setIntPref.notCalled, "setIntPref was not called");
+});
+
+add_task(async function test_without_traits_no_error() {
+ // Create a front that indicates that the preferences are missing, but which
+ // doesn't fail when getting the preferences. This will typically happen when
+ // the user managed to set the preference on the remote runtime.
+ // We should not erase user values, so we should not call the set*Pref APIs.
+ const preferencesFront = {
+ getTraits: () => ({
+ boolPrefTrait: false,
+ charPrefTrait: false,
+ intPrefTrait: false,
+ }),
+
+ setBoolPref: sinon.spy(),
+ getBoolPref: sinon.spy(),
+ setCharPref: sinon.spy(),
+ getCharPref: sinon.spy(),
+ setIntPref: sinon.spy(),
+ getIntPref: sinon.spy(),
+ };
+
+ const clientWrapper = createClientWrapper(preferencesFront);
+ await setDefaultPreferencesIfNeeded(clientWrapper, TEST_PREFERENCES);
+
+ // Check get/setBoolPref spies
+ ok(
+ preferencesFront.getBoolPref.calledWith(BOOL_PREF),
+ "getBoolPref was called with the proper preference name"
+ );
+ ok(preferencesFront.getBoolPref.calledOnce, "getBoolPref was called once");
+ ok(preferencesFront.setBoolPref.notCalled, "setBoolPref was not called");
+
+ // Check get/setCharPref spies
+ ok(
+ preferencesFront.getCharPref.calledWith(CHAR_PREF),
+ "getCharPref was called with the proper preference name"
+ );
+ ok(preferencesFront.getCharPref.calledOnce, "getCharPref was called once");
+ ok(preferencesFront.setCharPref.notCalled, "setCharPref was not called");
+
+ // Check get/setIntPref spies
+ ok(
+ preferencesFront.getIntPref.calledWith(INT_PREF),
+ "getIntPref was called with the proper preference name"
+ );
+ ok(preferencesFront.getIntPref.calledOnce, "getIntPref was called once");
+ ok(preferencesFront.setIntPref.notCalled, "setIntPref was not called");
+});
+
+add_task(async function test_without_traits_with_error() {
+ // Create a front that indicates that the preferences are missing, and which
+ // will also throw when attempting to get said preferences.
+ // This should lead to create default values for the preferences.
+ const preferencesFront = {
+ getTraits: () => ({
+ boolPrefTrait: false,
+ charPrefTrait: false,
+ intPrefTrait: false,
+ }),
+
+ setBoolPref: sinon.spy(),
+ getBoolPref: sinon.spy(pref => {
+ if (pref === BOOL_PREF) {
+ throw new Error("Invalid preference");
+ }
+ }),
+ setCharPref: sinon.spy(),
+ getCharPref: sinon.spy(pref => {
+ if (pref === CHAR_PREF) {
+ throw new Error("Invalid preference");
+ }
+ }),
+ setIntPref: sinon.spy(),
+ getIntPref: sinon.spy(pref => {
+ if (pref === INT_PREF) {
+ throw new Error("Invalid preference");
+ }
+ }),
+ };
+
+ const clientWrapper = createClientWrapper(preferencesFront);
+ await setDefaultPreferencesIfNeeded(clientWrapper, TEST_PREFERENCES);
+
+ // Check get/setBoolPref spies
+ ok(preferencesFront.getBoolPref.calledOnce, "getBoolPref was called once");
+ ok(preferencesFront.getBoolPref.threw(), "getBoolPref threw");
+ ok(
+ preferencesFront.getBoolPref.calledWith(BOOL_PREF),
+ "getBoolPref was called with the proper preference name"
+ );
+
+ ok(preferencesFront.setBoolPref.calledOnce, "setBoolPref was called once");
+ ok(
+ preferencesFront.setBoolPref.calledWith(BOOL_PREF, false),
+ "setBoolPref was called with the proper preference name and value"
+ );
+
+ // Check get/setCharPref spies
+ ok(preferencesFront.getCharPref.calledOnce, "getCharPref was called once");
+ ok(preferencesFront.getCharPref.threw(), "getCharPref threw");
+ ok(
+ preferencesFront.getCharPref.calledWith(CHAR_PREF),
+ "getCharPref was called with the proper preference name"
+ );
+
+ ok(preferencesFront.setCharPref.calledOnce, "setCharPref was called once");
+ ok(
+ preferencesFront.setCharPref.calledWith(CHAR_PREF, ""),
+ "setCharPref was called with the proper preference name and value"
+ );
+
+ // Check get/setIntPref spies
+ ok(preferencesFront.getIntPref.calledOnce, "getIntPref was called once");
+ ok(preferencesFront.getIntPref.threw(), "getIntPref threw");
+ ok(
+ preferencesFront.getIntPref.calledWith(INT_PREF),
+ "getIntPref was called with the proper preference name"
+ );
+
+ ok(preferencesFront.setIntPref.calledOnce, "setIntPref was called once");
+ ok(
+ preferencesFront.setIntPref.calledWith(INT_PREF, 1),
+ "setIntPref was called with the proper preference name and value"
+ );
+});
+
+function createClientWrapper(preferencesFront) {
+ const clientWrapper = {
+ getFront: name => {
+ return preferencesFront;
+ },
+ };
+
+ return clientWrapper;
+}
diff --git a/devtools/client/aboutdebugging/test/xpcshell/xpcshell-head.js b/devtools/client/aboutdebugging/test/xpcshell/xpcshell-head.js
new file mode 100644
index 0000000000..733c0400da
--- /dev/null
+++ b/devtools/client/aboutdebugging/test/xpcshell/xpcshell-head.js
@@ -0,0 +1,10 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+/* eslint no-unused-vars: [2, {"vars": "local"}] */
+
+const { require } = ChromeUtils.importESModule(
+ "resource://devtools/shared/loader/Loader.sys.mjs"
+);
diff --git a/devtools/client/aboutdebugging/test/xpcshell/xpcshell.ini b/devtools/client/aboutdebugging/test/xpcshell/xpcshell.ini
new file mode 100644
index 0000000000..42954757e8
--- /dev/null
+++ b/devtools/client/aboutdebugging/test/xpcshell/xpcshell.ini
@@ -0,0 +1,8 @@
+[DEFAULT]
+tags = devtools
+head = xpcshell-head.js
+firefox-appdir = browser
+skip-if = toolkit == 'android'
+
+[test_extensions_path.js]
+[test_runtime_default_preferences.js]