diff --git a/services/healthreport/modules-testing/utils.jsm b/services/healthreport/modules-testing/utils.jsm index a7482f1665a..bc4f8e070dd 100644 --- a/services/healthreport/modules-testing/utils.jsm +++ b/services/healthreport/modules-testing/utils.jsm @@ -7,7 +7,6 @@ this.EXPORTED_SYMBOLS = [ "getAppInfo", "updateAppInfo", - "makeFakeAppDir", "createFakeCrash", "InspectedHealthReporter", "getHealthReporter", @@ -85,97 +84,6 @@ this.updateAppInfo = function (obj) { registrar.registerFactory(id, "XULAppInfo", cid, factory); }; -// Reference needed in order for fake app dir provider to be active. -let gFakeAppDirectoryProvider; - -/** - * Installs a fake UAppData directory. - * - * This is needed by tests because a UAppData directory typically isn't - * present in the test environment. - * - * This function is suitable for use in different components. If we ever - * establish a central location for convenient test helpers, this should - * go there. - * - * We create the new UAppData directory under the profile's directory - * because the profile directory is automatically cleaned as part of - * test shutdown. - * - * This returns a promise that will be resolved once the new directory - * is created and installed. - */ -this.makeFakeAppDir = function () { - let dirMode = OS.Constants.libc.S_IRWXU; - let dirService = Cc["@mozilla.org/file/directory_service;1"] - .getService(Ci.nsIProperties); - let baseFile = dirService.get("ProfD", Ci.nsIFile); - let appD = baseFile.clone(); - appD.append("UAppData"); - - if (gFakeAppDirectoryProvider) { - return Promise.resolve(appD.path); - } - - function makeDir(f) { - if (f.exists()) { - return; - } - - dump("Creating directory: " + f.path + "\n"); - f.create(Ci.nsIFile.DIRECTORY_TYPE, dirMode); - } - - makeDir(appD); - - let reportsD = appD.clone(); - reportsD.append("Crash Reports"); - - let pendingD = reportsD.clone(); - pendingD.append("pending"); - let submittedD = reportsD.clone(); - submittedD.append("submitted"); - - makeDir(reportsD); - makeDir(pendingD); - makeDir(submittedD); - - let provider = { - getFile: function (prop, persistent) { - persistent.value = true; - if (prop == "UAppData") { - return appD.clone(); - } - - throw Cr.NS_ERROR_FAILURE; - }, - - QueryInterace: function (iid) { - if (iid.equals(Ci.nsIDirectoryServiceProvider) || - iid.equals(Ci.nsISupports)) { - return this; - } - - throw Cr.NS_ERROR_NO_INTERFACE; - }, - }; - - // Register the new provider. - dirService.QueryInterface(Ci.nsIDirectoryService) - .registerProvider(provider); - - // And undefine the old one. - try { - dirService.undefine("UAppData"); - } catch (ex) {}; - - gFakeAppDirectoryProvider = provider; - - dump("Successfully installed fake UAppDir\n"); - return Promise.resolve(appD.path); -}; - - /** * Creates a fake crash in the Crash Reports directory. * diff --git a/services/healthreport/tests/xpcshell/test_healthreporter.js b/services/healthreport/tests/xpcshell/test_healthreporter.js index 97ad1fdf927..6bd48b0ed14 100644 --- a/services/healthreport/tests/xpcshell/test_healthreporter.js +++ b/services/healthreport/tests/xpcshell/test_healthreporter.js @@ -20,6 +20,7 @@ Cu.import("resource://testing-common/httpd.js"); Cu.import("resource://testing-common/services-common/bagheeraserver.js"); Cu.import("resource://testing-common/services/metrics/mocks.jsm"); Cu.import("resource://testing-common/services/healthreport/utils.jsm"); +Cu.import("resource://testing-common/AppData.jsm"); const DUMMY_URI = "http://localhost:62013/"; diff --git a/services/healthreport/tests/xpcshell/test_provider_crashes.js b/services/healthreport/tests/xpcshell/test_provider_crashes.js index 9b20f964086..284f0ebe495 100644 --- a/services/healthreport/tests/xpcshell/test_provider_crashes.js +++ b/services/healthreport/tests/xpcshell/test_provider_crashes.js @@ -9,6 +9,7 @@ const {utils: Cu} = Components; Cu.import("resource://gre/modules/Metrics.jsm"); Cu.import("resource://gre/modules/services/healthreport/providers.jsm"); Cu.import("resource://testing-common/services/healthreport/utils.jsm"); +Cu.import("resource://testing-common/AppData.jsm"); const MILLISECONDS_PER_DAY = 24 * 60 * 60 * 1000; diff --git a/testing/modules/AppData.jsm b/testing/modules/AppData.jsm new file mode 100644 index 00000000000..afccfb7cf9f --- /dev/null +++ b/testing/modules/AppData.jsm @@ -0,0 +1,101 @@ +/* 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"; + +this.EXPORTED_SYMBOLS = [ + "makeFakeAppDir", +]; + +const {classes: Cc, interfaces: Ci, results: Cr, utils: Cu} = Components; + +Cu.import("resource://gre/modules/osfile.jsm"); +Cu.import("resource://gre/modules/Promise.jsm"); + +// Reference needed in order for fake app dir provider to be active. +let gFakeAppDirectoryProvider; + +/** + * Installs a fake UAppData directory. + * + * This is needed by tests because a UAppData directory typically isn't + * present in the test environment. + * + * We create the new UAppData directory under the profile's directory + * because the profile directory is automatically cleaned as part of + * test shutdown. + * + * This returns a promise that will be resolved once the new directory + * is created and installed. + */ +this.makeFakeAppDir = function () { + let dirMode = OS.Constants.libc.S_IRWXU; + let dirService = Cc["@mozilla.org/file/directory_service;1"] + .getService(Ci.nsIProperties); + let baseFile = dirService.get("ProfD", Ci.nsIFile); + let appD = baseFile.clone(); + appD.append("UAppData"); + + if (gFakeAppDirectoryProvider) { + return Promise.resolve(appD.path); + } + + function makeDir(f) { + if (f.exists()) { + return; + } + + dump("Creating directory: " + f.path + "\n"); + f.create(Ci.nsIFile.DIRECTORY_TYPE, dirMode); + } + + makeDir(appD); + + let reportsD = appD.clone(); + reportsD.append("Crash Reports"); + + let pendingD = reportsD.clone(); + pendingD.append("pending"); + let submittedD = reportsD.clone(); + submittedD.append("submitted"); + + makeDir(reportsD); + makeDir(pendingD); + makeDir(submittedD); + + let provider = { + getFile: function (prop, persistent) { + persistent.value = true; + if (prop == "UAppData") { + return appD.clone(); + } + + throw Cr.NS_ERROR_FAILURE; + }, + + QueryInterace: function (iid) { + if (iid.equals(Ci.nsIDirectoryServiceProvider) || + iid.equals(Ci.nsISupports)) { + return this; + } + + throw Cr.NS_ERROR_NO_INTERFACE; + }, + }; + + // Register the new provider. + dirService.QueryInterface(Ci.nsIDirectoryService) + .registerProvider(provider); + + // And undefine the old one. + try { + dirService.undefine("UAppData"); + } catch (ex) {}; + + gFakeAppDirectoryProvider = provider; + + dump("Successfully installed fake UAppDir\n"); + return Promise.resolve(appD.path); +}; + diff --git a/testing/modules/Makefile.in b/testing/modules/Makefile.in index f0606d46225..98cae641a35 100644 --- a/testing/modules/Makefile.in +++ b/testing/modules/Makefile.in @@ -3,6 +3,7 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. TESTING_JS_MODULES := \ + AppData.jsm \ AppInfo.jsm \ Assert.jsm \ $(NULL)