/* 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/. */ "use strict"; // Each "test suite" is a set of tests run on a specific registry // configuration. // NB: None of these files will actually exist. const customerId = "12345"; const testSuites = [ { registryMap: { "HKEY_CURRENT_USER\\Software\\Microsoft\\OneDrive\\Accounts\\Personal\\UserFolder": "Q:\\Me\\OneDrive", "HKEY_CURRENT_USER\\Software\\Microsoft\\OneDrive\\Accounts\\Personal\\cid": customerId, }, personalFolder: "Q:\\Me\\OneDrive", businessFolders: [], }, { registryMap: { "HKEY_CURRENT_USER\\Software\\Microsoft\\OneDrive\\Accounts\\Business1\\UserFolder": "Q:\\Me\\OneDrive - MyOrg", }, personalFolder: null, businessFolders: ["Q:\\Me\\OneDrive - MyOrg"], }, { registryMap: { "HKEY_CURRENT_USER\\Software\\Microsoft\\OneDrive\\Accounts\\Personal\\UserFolder": "Q:\\Me\\OneDrive - Personal", "HKEY_CURRENT_USER\\Software\\Microsoft\\OneDrive\\Accounts\\Personal\\cid": customerId, "HKEY_CURRENT_USER\\Software\\Microsoft\\OneDrive\\Accounts\\Business5\\UserFolder": "Q:\\Me\\OneDrive - Org1", "HKEY_CURRENT_USER\\Software\\Microsoft\\OneDrive\\Accounts\\Business6\\UserFolder": "Q:\\Me\\OneDrive - Org2", "HKEY_CURRENT_USER\\Software\\Microsoft\\OneDrive\\Accounts\\Business10\\UserFolder": "Q:\\Me\\OneDrive - Org2(2)", }, personalFolder: "Q:\\Me\\OneDrive - Personal", businessFolders: [ "Q:\\Me\\OneDrive - Org1", "Q:\\Me\\OneDrive - Org2", "Q:\\Me\\OneDrive - Org2(2)", ], }, ]; // value of registryMap from currently-running test suite let currentRegistryContents; // The registry won't be opened for more than one key at a time. let currentRegistryPath; // Un-mock the registry. We need to do this before test end (i.e. // registerCleanupFunction) because cleanup involves the registry. let do_cleanup; let mockRegistry = { open: (root, path, mode) => { Assert.equal( root, Ci.nsIWindowsRegKey.ROOT_KEY_CURRENT_USER, "reg key is in HKEY_CURRENT_USER" ); let isPersonal = path.match( /Software\\Microsoft\\OneDrive\\Accounts\\Personal/ ); let isBusiness = path.match( /Software\\Microsoft\\OneDrive\\Accounts\\Business(\d+)/ ); Assert.ok(isPersonal || isBusiness, "opening correct root path"); Assert.equal(mode, Ci.nsIWindowsRegKey.ACCESS_READ, "mode was ACCESS_READ"); currentRegistryPath = "HKEY_CURRENT_USER\\" + path; }, hasValue: value => { const allowedKeys = new Set(["UserFolder", "cid"]); Assert.ok(allowedKeys.has(value), `value is ${value}`); return currentRegistryPath + "\\" + value in currentRegistryContents; }, readStringValue: value => { if (!(currentRegistryPath + "\\" + value in currentRegistryContents)) { // This should never happen. Assert.ok( false, `${currentRegistryPath + "\\" + value} not found in registry` ); throw new Error("read nonexistent value"); } return currentRegistryContents[currentRegistryPath + "\\" + value]; }, setRegistryContents: newRegistryMap => { info(`setting new registry map: ${JSON.stringify(newRegistryMap)}`); currentRegistryContents = newRegistryMap; }, QueryInterface: ChromeUtils.generateQI(["nsIWindowsRegKey"]), }; function setupMockRegistryComponent() { const { MockRegistrar } = ChromeUtils.importESModule( "resource://testing-common/MockRegistrar.sys.mjs" ); let cid = MockRegistrar.registerEx( "@mozilla.org/windows-registry-key;1", { shouldCreateInstance: false }, mockRegistry ); do_cleanup = () => { MockRegistrar.unregister(cid); }; } add_task(async function runTests() { setupMockRegistryComponent(); for (let test of testSuites) { mockRegistry.setRegistryContents(test.registryMap); let dirSvc = Services.dirsvc.QueryInterface(Ci.nsIProperties); try { let personalFolder = dirSvc.get("OneDrPD", Ci.nsIFile); Assert.equal( personalFolder.path, test.personalFolder, "got correct personal OneDrive root" ); } catch (e) { // DirectoryService throws out error codes and returns NS_ERROR_FAILURE // for any error. Assert.equal(e.result, Cr.NS_ERROR_FAILURE, "reported file not found"); Assert.equal( test.personalFolder, null, "non-existent personal OneDrive root" ); } let businessFolders = Array.from( dirSvc.get("OneDrBDL", Ci.nsISimpleEnumerator) ); Assert.equal( businessFolders.length, test.businessFolders.length, "Found all business folders" ); if (test.businessFolders.length) { for (let folder of businessFolders) { Assert.ok( test.businessFolders.includes(folder.path), `Found business folder ${folder.path}` ); } } } do_cleanup(); });