diff options
Diffstat (limited to 'toolkit/modules/tests/browser/browser_Deprecated.js')
-rw-r--r-- | toolkit/modules/tests/browser/browser_Deprecated.js | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/toolkit/modules/tests/browser/browser_Deprecated.js b/toolkit/modules/tests/browser/browser_Deprecated.js new file mode 100644 index 0000000000..2b108721f0 --- /dev/null +++ b/toolkit/modules/tests/browser/browser_Deprecated.js @@ -0,0 +1,174 @@ +/* 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 PREF_DEPRECATION_WARNINGS = "devtools.errorconsole.deprecation_warnings"; + +ChromeUtils.import("resource://gre/modules/Services.jsm", this); +ChromeUtils.import("resource://gre/modules/Deprecated.jsm", this); + +// Using this named functions to test deprecation and the properly logged +// callstacks. +function basicDeprecatedFunction() { + Deprecated.warning("this method is deprecated.", "http://example.com"); + return true; +} + +function deprecationFunctionBogusCallstack() { + Deprecated.warning("this method is deprecated.", "http://example.com", { + caller: {}, + }); + return true; +} + +function deprecationFunctionCustomCallstack() { + // Get the nsIStackFrame that will contain the name of this function. + function getStack() { + return Components.stack; + } + Deprecated.warning( + "this method is deprecated.", + "http://example.com", + getStack() + ); + return true; +} + +var tests = [ + // Test deprecation warning without passing the callstack. + { + deprecatedFunction: basicDeprecatedFunction, + expectedObservation(aMessage) { + testAMessage(aMessage); + ok( + aMessage.errorMessage.indexOf("basicDeprecatedFunction") > 0, + "Callstack is correctly logged." + ); + }, + }, + // Test a reported error when URL to documentation is not passed. + { + deprecatedFunction() { + Deprecated.warning("this method is deprecated."); + return true; + }, + expectedObservation(aMessage) { + ok( + aMessage.errorMessage.indexOf("must provide a URL") > 0, + "Deprecation warning logged an empty URL argument." + ); + }, + }, + // Test deprecation with a bogus callstack passed as an argument (it will be + // replaced with the current call stack). + { + deprecatedFunction: deprecationFunctionBogusCallstack, + expectedObservation(aMessage) { + testAMessage(aMessage); + ok( + aMessage.errorMessage.indexOf("deprecationFunctionBogusCallstack") > 0, + "Callstack is correctly logged." + ); + }, + }, + // When pref is unset Deprecated.warning should not log anything. + { + deprecatedFunction: basicDeprecatedFunction, + expectedObservation: null, + // Set pref to false. + logWarnings: false, + }, + // Test deprecation with a valid custom callstack passed as an argument. + { + deprecatedFunction: deprecationFunctionCustomCallstack, + expectedObservation(aMessage) { + testAMessage(aMessage); + ok( + aMessage.errorMessage.indexOf("deprecationFunctionCustomCallstack") > 0, + "Callstack is correctly logged." + ); + }, + // Set pref to true. + logWarnings: true, + }, +]; + +// Which test are we running now? +var idx = -1; + +function test() { + waitForExplicitFinish(); + + // Check if Deprecated is loaded. + ok(Deprecated, "Deprecated object exists"); + + nextTest(); +} + +// Test Consle Message attributes. +function testAMessage(aMessage) { + ok( + aMessage.errorMessage.indexOf( + "DEPRECATION WARNING: this method is deprecated." + ) === 0, + "Deprecation is correctly logged." + ); + ok( + aMessage.errorMessage.indexOf("http://example.com") > 0, + "URL is correctly logged." + ); +} + +function nextTest() { + idx++; + + if (idx == tests.length) { + finish(); + return; + } + + info("Running test #" + idx); + let test = tests[idx]; + + // Deprecation warnings will be logged only when the preference is set. + if (typeof test.logWarnings !== "undefined") { + Services.prefs.setBoolPref(PREF_DEPRECATION_WARNINGS, test.logWarnings); + } + + // Create a console listener. + let consoleListener = { + observe(aMessage) { + // Ignore unexpected messages. + if (!(aMessage instanceof Ci.nsIScriptError)) { + return; + } + if ( + !aMessage.errorMessage.includes("DEPRECATION WARNING: ") && + !aMessage.errorMessage.includes("must provide a URL") + ) { + return; + } + ok( + aMessage instanceof Ci.nsIScriptError, + "Deprecation log message is an instance of type nsIScriptError." + ); + + if (test.expectedObservation === null) { + ok(false, "Deprecated warning not expected"); + } else { + test.expectedObservation(aMessage); + } + + Services.console.unregisterListener(consoleListener); + executeSoon(nextTest); + }, + }; + Services.console.registerListener(consoleListener); + test.deprecatedFunction(); + if (test.expectedObservation === null) { + executeSoon(function() { + Services.console.unregisterListener(consoleListener); + executeSoon(nextTest); + }); + } +} |