Bug 642175 - Part 1: Simplify mochitest logging, and other minor cleanups. r=ted

This commit is contained in:
Cameron McCormack 2011-06-21 12:11:18 +12:00
parent 6469811981
commit 5135d118cc
3 changed files with 116 additions and 99 deletions

View File

@ -204,7 +204,16 @@ SpecialPowers.prototype = {
gc: function() {
this.DOMWindowUtils.garbageCollect();
}
},
hasContentProcesses: function() {
try {
var rt = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime);
return rt.processType != Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT;
} catch (e) {
return true;
}
},
};
// Expose everything but internal APIs (starting with underscores) to

View File

@ -14,22 +14,22 @@
*
**/
if (typeof(SimpleTest) == "undefined") {
var SimpleTest = {};
}
var SimpleTest = { };
var parentRunner = null;
if (typeof(parent) != "undefined" && parent.TestRunner) {
if (parent) {
parentRunner = parent.TestRunner;
} else if (parent && parent.wrappedJSObject &&
parent.wrappedJSObject.TestRunner) {
parentRunner = parent.wrappedJSObject.TestRunner;
if (!parentRunner && parent.wrappedJSObject) {
parentRunner = parent.wrappedJSObject.TestRunner;
}
}
//Simple test to see if we are running in e10s IPC
// running in e10s build and need to use IPC?
var ipcMode = false;
if (parentRunner) {
ipcMode = parentRunner.ipcMode;
ipcMode = parentRunner.ipcMode;
} else if (typeof SpecialPowers != 'undefined') {
ipcMode = SpecialPowers.hasContentProcesses();
}
/**
@ -67,11 +67,6 @@ SimpleTest.testPluginIsOOP = function () {
return testPluginIsOOP;
};
// Check to see if the TestRunner is present and has logging
if (parentRunner) {
SimpleTest._logEnabled = parentRunner.logEnabled;
}
SimpleTest._tests = [];
SimpleTest._stopOnLoad = true;
@ -80,8 +75,7 @@ SimpleTest._stopOnLoad = true;
**/
SimpleTest.ok = function (condition, name, diag) {
var test = {'result': !!condition, 'name': name, 'diag': diag};
if (SimpleTest._logEnabled)
SimpleTest._logResult(test, "TEST-PASS", "TEST-UNEXPECTED-FAIL");
SimpleTest._logResult(test, "TEST-PASS", "TEST-UNEXPECTED-FAIL");
SimpleTest._tests.push(test);
};
@ -107,31 +101,32 @@ SimpleTest.isnot = function (a, b, name) {
// --------------- Test.Builder/Test.More todo() -----------------
SimpleTest.todo = function(condition, name, diag) {
var test = {'result': !!condition, 'name': name, 'diag': diag, todo: true};
if (SimpleTest._logEnabled)
SimpleTest._logResult(test, "TEST-UNEXPECTED-PASS", "TEST-KNOWN-FAIL");
SimpleTest._tests.push(test);
var test = {'result': !!condition, 'name': name, 'diag': diag, todo: true};
SimpleTest._logResult(test, "TEST-UNEXPECTED-PASS", "TEST-KNOWN-FAIL");
SimpleTest._tests.push(test);
};
SimpleTest._getCurrentTestURL = function() {
return parentRunner && parentRunner.currentTestURL ||
typeof gTestPath == "string" && gTestPath ||
"";
};
SimpleTest._logResult = function(test, passString, failString) {
var msg = test.result ? passString : failString;
msg += " | ";
if (parentRunner.currentTestURL)
msg += parentRunner.currentTestURL;
msg += " | " + test.name;
if (test.diag)
msg += " - " + test.diag;
if (test.result) {
if (test.todo)
parentRunner.logger.error(msg);
else
parentRunner.logger.log(msg);
} else {
if (test.todo)
parentRunner.logger.log(msg);
else
parentRunner.logger.error(msg);
}
var isError = !test.result == !test.todo;
var resultString = test.result ? passString : failString;
var url = SimpleTest._getCurrentTestURL();
var diagnostic = test.name + (test.diag ? " - " + test.diag : "");
var msg = [resultString, url, diagnostic].join(" | ");
if (parentRunner) {
if (isError) {
parentRunner.error(msg);
} else {
parentRunner.log(msg);
}
} else {
dump(msg + "\n");
}
};
/**
@ -227,7 +222,6 @@ SimpleTest.toggleByClass = function (cls, evt) {
/**
* Shows the report in the browser
**/
SimpleTest.showReport = function() {
var togglePassed = A({'href': '#'}, "Toggle passed checks");
var toggleFailed = A({'href': '#'}, "Toggle failed checks");
@ -318,8 +312,8 @@ SimpleTest.waitForFocus = function (callback, targetWindow, expectBlankPage) {
getInterface(Components.interfaces.nsIDOMWindowUtils);
//TODO: make this support scenarios where we run test standalone and not inside of TestRunner only
if (parent && parent.ipcWaitForFocus != undefined) {
parent.contentAsyncEvent("waitForFocus", {"callback":callback, "targetWindow":domutils.outerWindowID});
if (parent && parent.ipcWaitForFocus) {
parent.contentAsyncEvent("waitForFocus", {"callback":callback, "targetWindow":domutils.outerWindowID});
}
return;
}
@ -336,10 +330,7 @@ SimpleTest.waitForFocus = function (callback, targetWindow, expectBlankPage) {
childTargetWindow = childTargetWindow.value;
function info(msg) {
if (SimpleTest._logEnabled)
SimpleTest._logResult({result: true, name: msg}, "TEST-INFO");
else
dump("TEST-INFO | " + msg + "\n");
}
function debugFocusLog(prefix) {
@ -546,7 +537,7 @@ SimpleTest.executeSoon = function(aFunc) {
return;
} catch (ex) {
// If the above fails (most likely because of enablePrivilege
// failing, fall through to the setTimeout path.
// failing), fall through to the setTimeout path.
}
}
setTimeout(aFunc, 0);
@ -603,7 +594,7 @@ SimpleTest._deepCheck = function (e1, e2, stack, seen) {
ok = SimpleTest._eqAssoc(e1, e2, stack, seen);
} else {
// If we get here, they're not the same (function references must
// always simply rererence the same function).
// always simply reference the same function).
stack.push({ vals: [e1, e2] });
ok = false;
}
@ -781,28 +772,41 @@ var isDeeply = SimpleTest.isDeeply;
var gOldOnError = window.onerror;
window.onerror = function simpletestOnerror(errorMsg, url, lineNumber) {
var funcIdentifier = "[SimpleTest/SimpleTest.js, window.onerror] ";
var funcIdentifier = "[SimpleTest/SimpleTest.js, window.onerror]";
// Log the message.
ok(false, funcIdentifier + "An error occurred", errorMsg + " at " + url + ":" + lineNumber);
// There is no Components.stack.caller to log. (See bug 511888.)
// Call previous handler.
if (gOldOnError) {
try {
// Ignore return value: always run default handler.
gOldOnError(errorMsg, url, lineNumber);
} catch (e) {
// Log the error.
ok(false, funcIdentifier + "Exception thrown by gOldOnError()", e);
// Log its stack.
if (e.stack)
ok(false, funcIdentifier + "JavaScript error stack:\n" + e.stack);
// Log the message.
// XXX Chrome mochitests sometimes trigger this window.onerror handler,
// but there are a number of uncaught JS exceptions from those tests
// currently, so we can't log them as errors just yet. For now, when
// parentRunner is null, just dump it so that the error is visible but
// doesn't cause a test failure. See bug 652494.
function logInfo(message) {
if (parentRunner) {
SimpleTest._logInfo(funcIdentifier, message);
} else {
dump(funcIdentifier + " " + message);
}
}
}
logInfo("An error occurred: " + errorMsg + " at " + url + ":" + lineNumber);
// There is no Components.stack.caller to log. (See bug 511888.)
if (!SimpleTest._stopOnLoad) {
// Need to finish() manually here, yet let the test actually end first.
SimpleTest.executeSoon(SimpleTest.finish);
}
}
// Call previous handler.
if (gOldOnError) {
try {
// Ignore return value: always run default handler.
gOldOnError(errorMsg, url, lineNumber);
} catch (e) {
// Log the error.
logInfo("Exception thrown by gOldOnError(): " + e);
// Log its stack.
if (e.stack) {
logInfo("JavaScript error stack:\n" + e.stack);
}
}
}
if (!SimpleTest._stopOnLoad) {
// Need to finish() manually here, yet let the test actually end first.
SimpleTest.executeSoon(SimpleTest.finish);
}
};

View File

@ -42,14 +42,11 @@ TestRunner._urls = [];
TestRunner.timeout = 5 * 60 * 1000; // 5 minutes.
TestRunner.maxTimeouts = 4; // halt testing after too many timeouts
TestRunner.ipcMode = false; // running in e10s build and need to use IPC?
try {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
var ipcsanity = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch);
ipcsanity.setIntPref("mochitest.ipcmode", 0);
} catch (e) {
TestRunner.ipcMode = true;
// running in e10s build and need to use IPC?
if (typeof SpecialPowers != 'undefined') {
TestRunner.ipcMode = SpecialPowers.hasContentProcesses();
} else {
TestRunner.ipcMode = false;
}
/**
@ -102,6 +99,22 @@ TestRunner.onComplete = null;
**/
TestRunner.logger = MochiKit.Logging.logger;
TestRunner.log = function(msg) {
if (TestRunner.logEnabled) {
TestRunner.logger.log(msg);
} else {
dump(msg + "\n");
}
};
TestRunner.error = function(msg) {
if (TestRunner.logEnabled) {
TestRunner.logger.error(msg);
} else {
dump(msg + "\n");
}
};
/**
* Toggle element visibility
**/
@ -137,9 +150,7 @@ TestRunner._makeIframe = function (url, retry) {
return;
}
if (TestRunner.logEnabled) {
TestRunner.logger.log("Error: Unable to restore focus, expect failures and timeouts.");
}
TestRunner.log("Error: Unable to restore focus, expect failures and timeouts.");
}
window.scrollTo(0, $('indicator').offsetTop);
iframe.src = url;
@ -155,8 +166,7 @@ TestRunner._makeIframe = function (url, retry) {
*
**/
TestRunner.runTests = function (/*url...*/) {
if (TestRunner.logEnabled)
TestRunner.logger.log("SimpleTest START");
TestRunner.log("SimpleTest START");
TestRunner._urls = flattenArguments(arguments);
$('testframe').src="";
@ -182,8 +192,7 @@ TestRunner.runNextTest = function() {
TestRunner._currentTestStartTime = new Date().valueOf();
TestRunner._timeoutFactor = 1;
if (TestRunner.logEnabled)
TestRunner.logger.log("TEST-START | " + url); // used by automation.py
TestRunner.log("TEST-START | " + url); // used by automation.py
TestRunner._makeIframe(url, 0);
} else {
@ -196,8 +205,7 @@ TestRunner.runNextTest = function() {
{
// No |$('testframe').contentWindow|, so manually update: ...
// ... the log,
if (TestRunner.logEnabled)
TestRunner.logger.error("TEST-UNEXPECTED-FAIL | (SimpleTest/TestRunner.js) | No checks actually run.");
TestRunner.error("TEST-UNEXPECTED-FAIL | (SimpleTest/TestRunner.js) | No checks actually run.");
// ... the count,
$("fail-count").innerHTML = 1;
// ... the indicator.
@ -206,13 +214,11 @@ TestRunner.runNextTest = function() {
indicator.style.backgroundColor = "red";
}
if (TestRunner.logEnabled) {
TestRunner.logger.log("TEST-START | Shutdown"); // used by automation.py
TestRunner.logger.log("Passed: " + $("pass-count").innerHTML);
TestRunner.logger.log("Failed: " + $("fail-count").innerHTML);
TestRunner.logger.log("Todo: " + $("todo-count").innerHTML);
TestRunner.logger.log("SimpleTest FINISHED");
}
TestRunner.log("TEST-START | Shutdown"); // used by automation.py
TestRunner.log("Passed: " + $("pass-count").innerHTML);
TestRunner.log("Failed: " + $("fail-count").innerHTML);
TestRunner.log("Todo: " + $("todo-count").innerHTML);
TestRunner.log("SimpleTest FINISHED");
if (TestRunner.onComplete) {
TestRunner.onComplete();
@ -224,12 +230,10 @@ TestRunner.runNextTest = function() {
* This stub is called by SimpleTest when a test is finished.
**/
TestRunner.testFinished = function(tests) {
if (TestRunner.logEnabled) {
var runtime = new Date().valueOf() - TestRunner._currentTestStartTime;
TestRunner.logger.log("TEST-END | " +
TestRunner._urls[TestRunner._currentTest] +
" | finished in " + runtime + "ms");
}
var runtime = new Date().valueOf() - TestRunner._currentTestStartTime;
TestRunner.log("TEST-END | " +
TestRunner._urls[TestRunner._currentTest] +
" | finished in " + runtime + "ms");
TestRunner.updateUI(tests);
TestRunner._currentTest++;