summaryrefslogtreecommitdiffstats
path: root/dom/serviceworkers/test/error_reporting_helpers.js
diff options
context:
space:
mode:
Diffstat (limited to 'dom/serviceworkers/test/error_reporting_helpers.js')
-rw-r--r--dom/serviceworkers/test/error_reporting_helpers.js73
1 files changed, 73 insertions, 0 deletions
diff --git a/dom/serviceworkers/test/error_reporting_helpers.js b/dom/serviceworkers/test/error_reporting_helpers.js
new file mode 100644
index 0000000000..42ddbe42a2
--- /dev/null
+++ b/dom/serviceworkers/test/error_reporting_helpers.js
@@ -0,0 +1,73 @@
+"use strict";
+
+/**
+ * Helpers for use in tests that want to verify that localized error messages
+ * are logged during the test. Because most of our errors (ex:
+ * ServiceWorkerManager) generate nsIScriptError instances with flattened
+ * strings (the interpolated arguments aren't kept around), we load the string
+ * bundle and use it to derive the exact string message we expect for the given
+ * payload.
+ **/
+
+let stringBundleService = SpecialPowers.Cc[
+ "@mozilla.org/intl/stringbundle;1"
+].getService(SpecialPowers.Ci.nsIStringBundleService);
+let localizer = stringBundleService.createBundle(
+ "chrome://global/locale/dom/dom.properties"
+);
+
+/**
+ * Start monitoring the console for the given localized error message string(s)
+ * with the given arguments to be logged. Call before running code that will
+ * generate the console message. Pair with a call to
+ * `wait_for_expected_message` invoked after the message should have been
+ * generated.
+ *
+ * Multiple error messages can be expected, just repeat the msgId and args
+ * argument pair as needed.
+ *
+ * @param {String} msgId
+ * The localization message identifier used in the properties file.
+ * @param {String[]} args
+ * The list of formatting arguments we expect the error to be generated with.
+ * @return {Object} Promise/handle to pass to wait_for_expected_message.
+ */
+function expect_console_message(/* msgId, args, ... */) {
+ let expectations = [];
+ // process repeated paired arguments of: msgId, args
+ for (let i = 0; i < arguments.length; i += 2) {
+ let msgId = arguments[i];
+ let args = arguments[i + 1];
+ if (args.length === 0) {
+ expectations.push({ errorMessage: localizer.GetStringFromName(msgId) });
+ } else {
+ expectations.push({
+ errorMessage: localizer.formatStringFromName(msgId, args),
+ });
+ }
+ }
+ return new Promise(resolve => {
+ SimpleTest.monitorConsole(resolve, expectations);
+ });
+}
+let expect_console_messages = expect_console_message;
+
+/**
+ * Stop monitoring the console, returning a Promise that will be resolved when
+ * the sentinel console message sent through the async data path has been
+ * received. The Promise will not reject on failure; instead a mochitest
+ * failure will have been generated by ok(false)/equivalent by the time it is
+ * resolved.
+ */
+function wait_for_expected_message(expectedPromise) {
+ SimpleTest.endMonitorConsole();
+ return expectedPromise;
+}
+
+/**
+ * Derive an absolute URL string from a relative URL to simplify error message
+ * argument generation.
+ */
+function make_absolute_url(relUrl) {
+ return new URL(relUrl, window.location).href;
+}