Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
- Manifest: dom/console/tests/xpcshell/xpcshell.toml
/* Any copyright is dedicated to the Public Domain.
// This test checks that the various console log methods create messages when
// used with a logger with a matching maxLogLevel.
const TESTS = [
{ method: "trace", methodLevel: "Trace" },
{ method: "debug", methodLevel: "Debug" },
{ method: "count", methodLevel: "Info" },
{ method: "countReset", methodLevel: "Info" },
{ method: "dir", methodLevel: "Info" },
{ method: "dirxml", methodLevel: "Info" },
{
method: "group",
callMethodFn: (logger, msg) => {
logger.group(msg);
logger.groupEnd();
},
methodLevel: "Info",
},
{ method: "info", methodLevel: "Info" },
{ method: "log", methodLevel: "Info" },
{ method: "table", methodLevel: "Info" },
{
method: "TimeEnd",
callMethodFn: (logger, msg) => {
logger.time(msg);
logger.timeEnd(msg);
},
methodLevel: "Info",
},
{
method: "timeLog",
callMethodFn: (logger, msg) => {
logger.time(msg);
logger.timeLog(msg);
},
methodLevel: "Info",
},
{ method: "warn", methodLevel: "Warn" },
{
method: "assert",
callMethodFn: (logger, msg) => logger.assert(false, msg),
methodLevel: "Error",
},
{ method: "error", methodLevel: "Error" },
{ method: "exception", methodLevel: "Error" },
];
// @see WebIDLLogLevelToInteger
const levelToInteger = {
Error: 1,
Warn: 2,
Info: 3,
Debug: 4,
Trace: 5,
};
// This message will be logged as an error in all tests to avoid waiting
// indefinitely for messages that will not be logged.
const CANARY = "canary-error-message";
add_task(async function test_AssertMethod_levels() {
for (const test of TESTS) {
const { method, methodLevel } = test;
const callMethodFn =
test.callMethodFn || ((logger, msg) => logger[method](msg));
for (const level of Object.keys(levelToInteger)) {
const ci = console.createInstance({ maxLogLevel: level });
const logExpected = levelToInteger[level] >= levelToInteger[methodLevel];
const expectedMessage = method + "-" + level;
const onMessage = waitForMessage(expectedMessage);
callMethodFn(ci, expectedMessage);
ci.error(CANARY);
const messageReceived = await onMessage;
Assert.equal(
messageReceived,
logExpected,
`The message for method ${method} should be ${logExpected ? "LOGGED" : "SKIPPED"} for level ${level}`
);
}
}
});
/**
* Wait for a message with the provided expectedContent.
*
* @param {string} expectedContent
* A substring which should be found in the logged message.
*
* @return A promise which resolves to true if the message was received, false
* otherwise.
*/
function waitForMessage(expectedContent) {
return new Promise(r => {
function consoleListener() {
addConsoleStorageListener(this);
}
consoleListener.prototype = {
observe(aSubject) {
let obj = aSubject.wrappedJSObject;
// Received the expected message, remove listener and resolve true.
if (obj.arguments[0].includes(expectedContent)) {
removeConsoleStorageListener(this);
r(true);
}
// Received the canary, meaning we missed the expected message.
// Remove listener and resolve false.
if (obj.arguments[0].includes(CANARY)) {
removeConsoleStorageListener(this);
r(false);
}
},
};
new consoleListener();
});
}