diff options
Diffstat (limited to 'browser/components/installerprefs/test')
7 files changed, 261 insertions, 0 deletions
diff --git a/browser/components/installerprefs/test/unit/head.js b/browser/components/installerprefs/test/unit/head.js new file mode 100644 index 0000000000..3d00a2437f --- /dev/null +++ b/browser/components/installerprefs/test/unit/head.js @@ -0,0 +1,137 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +const { AppConstants } = ChromeUtils.importESModule( + "resource://gre/modules/AppConstants.sys.mjs" +); + +const { InstallerPrefs } = ChromeUtils.import( + "resource:///modules/InstallerPrefs.jsm" +); + +let gRegistryKeyPath = ""; + +function startModule(prefsList) { + // Construct an InstallerPrefs object and simulate a profile-after-change + // event on it, so that it performs its full startup procedure. + const prefsModule = new InstallerPrefs(prefsList); + prefsModule.observe(null, "profile-after-change", ""); + + gRegistryKeyPath = prefsModule._registryKeyPath; + + registerCleanupFunction(() => cleanupReflectedPrefs(prefsList)); +} + +function getRegistryKey() { + const key = Cc["@mozilla.org/windows-registry-key;1"].createInstance( + Ci.nsIWindowsRegKey + ); + key.open( + key.ROOT_KEY_CURRENT_USER, + gRegistryKeyPath, + key.ACCESS_READ | key.WOW64_64 + ); + return key; +} + +function verifyReflectedPrefs(prefsList) { + let key; + try { + key = getRegistryKey(); + } catch (ex) { + Assert.ok(false, `Failed to open registry key: ${ex}`); + return; + } + + for (const pref of prefsList) { + if (pref.startsWith("installer.")) { + if (Services.prefs.getPrefType(pref) != Services.prefs.PREF_BOOL) { + Assert.ok( + !key.hasValue(pref), + `Pref ${pref} should not be in the registry because its type is not bool` + ); + } else if (Services.prefs.getBoolPref(pref, false)) { + Assert.ok(key.hasValue(pref), `Pref ${pref} should be in the registry`); + Assert.equal( + key.getValueType(pref), + key.TYPE_INT, + `Pref ${pref} should be type DWORD` + ); + Assert.equal( + key.readIntValue(pref), + 1, + `Pref ${pref} should have value 1` + ); + } else { + Assert.ok( + !key.hasValue(pref), + `Pref ${pref} should not be in the registry because it is false` + ); + } + } else { + Assert.ok( + !key.hasValue(pref), + `Pref ${pref} should not be in the registry because its name is invalid` + ); + } + } + + key.close(); +} + +function cleanupReflectedPrefs(prefsList) { + // Clear out the prefs themselves. + prefsList.forEach(pref => Services.prefs.clearUserPref(pref)); + + // Get the registry key path without the path hash at the end, + // then delete the subkey with the path hash. + const app = AppConstants.MOZ_APP_NAME; + const vendor = Services.appinfo.vendor || "Mozilla"; + const xreDirProvider = Cc["@mozilla.org/xre/directory-provider;1"].getService( + Ci.nsIXREDirProvider + ); + + const path = `Software\\${vendor}\\${app}\\Installer`; + + const key = Cc["@mozilla.org/windows-registry-key;1"].createInstance( + Ci.nsIWindowsRegKey + ); + try { + key.open( + key.ROOT_KEY_CURRENT_USER, + path, + key.ACCESS_READ | key.ACCESS_WRITE | key.WOW64_64 + ); + const installHash = xreDirProvider.getInstallHash(); + key.removeChild(installHash); + } catch (ex) { + // Nothing left to clean up. + return; + } + + // If the Installer key is now empty, we need to clean it up also, because + // that would mean that this test created it. + if (key.childCount == 0) { + // Unfortunately we can't delete the actual open key, so we'll have to + // open its parent and delete the one we're after as a child. + key.close(); + const parentKey = Cc["@mozilla.org/windows-registry-key;1"].createInstance( + Ci.nsIWindowsRegKey + ); + try { + parentKey.open( + parentKey.ROOT_KEY_CURRENT_USER, + `Software\\${vendor}\\${app}`, + parentKey.ACCESS_READ | parentKey.ACCESS_WRITE | parentKey.WOW64_64 + ); + parentKey.removeChild("Installer"); + parentKey.close(); + } catch (ex) { + // Nothing we can do, and this isn't worth failing the test over. + } + } else { + key.close(); + } +} diff --git a/browser/components/installerprefs/test/unit/test_empty_prefs_list.js b/browser/components/installerprefs/test/unit/test_empty_prefs_list.js new file mode 100644 index 0000000000..a42e0d50bb --- /dev/null +++ b/browser/components/installerprefs/test/unit/test_empty_prefs_list.js @@ -0,0 +1,20 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Test passing an empty list of pref names to the module. + */ + +add_task(function() { + const PREFS_LIST = []; + + startModule(PREFS_LIST); + + Assert.throws( + getRegistryKey, + /NS_ERROR_FAILURE/, + "The registry key shouldn't have been created, so opening it should fail" + ); +}); diff --git a/browser/components/installerprefs/test/unit/test_invalid_name.js b/browser/components/installerprefs/test/unit/test_invalid_name.js new file mode 100644 index 0000000000..7de279c338 --- /dev/null +++ b/browser/components/installerprefs/test/unit/test_invalid_name.js @@ -0,0 +1,20 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Test that using prefs with invalid names is not allowed. + */ + +add_task(function() { + const PREFS_LIST = [ + "the.wrong.branch", + "installer.the.right.branch", + "not.a.real.pref", + ]; + + startModule(PREFS_LIST); + + verifyReflectedPrefs(PREFS_LIST); +}); diff --git a/browser/components/installerprefs/test/unit/test_nonbool_pref.js b/browser/components/installerprefs/test/unit/test_nonbool_pref.js new file mode 100644 index 0000000000..ad2f0be860 --- /dev/null +++ b/browser/components/installerprefs/test/unit/test_nonbool_pref.js @@ -0,0 +1,19 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Test that prefs of types other than bool are not reflected. + */ + +add_task(function() { + const PREFS_LIST = ["installer.int", "installer.string"]; + + Services.prefs.setIntPref("installer.int", 12); + Services.prefs.setStringPref("installer.string", "I'm a string"); + + startModule(PREFS_LIST); + + verifyReflectedPrefs(PREFS_LIST); +}); diff --git a/browser/components/installerprefs/test/unit/test_pref_change.js b/browser/components/installerprefs/test/unit/test_pref_change.js new file mode 100644 index 0000000000..1e28f6622c --- /dev/null +++ b/browser/components/installerprefs/test/unit/test_pref_change.js @@ -0,0 +1,26 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Test that pref values are correctly updated when they change. + */ + +add_task(function() { + const PREFS_LIST = ["installer.pref"]; + + Services.prefs.setBoolPref("installer.pref", true); + + startModule(PREFS_LIST); + + verifyReflectedPrefs(PREFS_LIST); + + Services.prefs.setBoolPref("installer.pref", false); + + verifyReflectedPrefs(PREFS_LIST); + + Services.prefs.setBoolPref("installer.pref", true); + + verifyReflectedPrefs(PREFS_LIST); +}); diff --git a/browser/components/installerprefs/test/unit/test_pref_values.js b/browser/components/installerprefs/test/unit/test_pref_values.js new file mode 100644 index 0000000000..db955da067 --- /dev/null +++ b/browser/components/installerprefs/test/unit/test_pref_values.js @@ -0,0 +1,19 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Test that pref values are reflected correctly. + */ + +add_task(function() { + const PREFS_LIST = ["installer.true.value", "installer.false.value"]; + + Services.prefs.setBoolPref("installer.true.value", true); + Services.prefs.setBoolPref("installer.false.value", false); + + startModule(PREFS_LIST); + + verifyReflectedPrefs(PREFS_LIST); +}); diff --git a/browser/components/installerprefs/test/unit/xpcshell.ini b/browser/components/installerprefs/test/unit/xpcshell.ini new file mode 100644 index 0000000000..f0ee7e3cea --- /dev/null +++ b/browser/components/installerprefs/test/unit/xpcshell.ini @@ -0,0 +1,20 @@ +[DEFAULT] +head = head.js +firefox-appdir = browser +skip-if = os != 'win' + +# These tests must all run sequentially because they use the same registry key. +# It might be possible to get around this requirement by overriding the install +# hash so each test uses a different key, and if a lot more tests are added here +# then it would be worth looking into that. +[test_empty_prefs_list.js] +run-sequentially = Uses the Windows registry +skip-if = os == 'win' && msix # https://bugzilla.mozilla.org/show_bug.cgi?id=1807932 +[test_invalid_name.js] +run-sequentially = Uses the Windows registry +[test_nonbool_pref.js] +run-sequentially = Uses the Windows registry +[test_pref_change.js] +run-sequentially = Uses the Windows registry +[test_pref_values.js] +run-sequentially = Uses the Windows registry |