Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* 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/. */
function getConsoleMessages() {
let consoleService = Cc["@mozilla.org/consoleservice;1"].getService(Ci.nsIConsoleService);
let messages = consoleService.getMessageArray().map((m) => m.toString());
// reset ready for the next call.
consoleService.reset();
return messages;
}
function run_test() {
// Load the component manifests.
registerXPCTestComponents();
test_simple("@mozilla.org/js/xpc/test/native/ESMReturnCodeParent;1");
test_nested("@mozilla.org/js/xpc/test/native/ESMReturnCodeParent;1");
}
function test_simple(contractID) {
let parent = Cc[contractID].createInstance(Ci.nsIXPCTestReturnCodeParent);
let result;
// flush existing messages before we start testing.
getConsoleMessages();
// Ask the C++ to call the JS object which will throw.
result = parent.callChild(Ci.nsIXPCTestReturnCodeChild.CHILD_SHOULD_THROW);
Assert.equal(result, Cr.NS_ERROR_XPC_JAVASCRIPT_ERROR_WITH_DETAILS,
"exception caused NS_ERROR_XPC_JAVASCRIPT_ERROR_WITH_DETAILS");
let messages = getConsoleMessages();
Assert.equal(messages.length, 1, "got a console message from the exception");
Assert.ok(messages[0].includes("a requested error"), "got the message text");
// Ask the C++ to call the JS object which will return success.
result = parent.callChild(Ci.nsIXPCTestReturnCodeChild.CHILD_SHOULD_RETURN_SUCCESS);
Assert.equal(result, Cr.NS_OK, "success is success");
Assert.deepEqual(getConsoleMessages(), [], "no messages reported on success.");
// And finally the point of this test!
// Ask the C++ to call the JS object which will use .returnCode
result = parent.callChild(Ci.nsIXPCTestReturnCodeChild.CHILD_SHOULD_RETURN_RESULTCODE);
Assert.equal(result, Cr.NS_ERROR_FAILURE,
"NS_ERROR_FAILURE was seen as the error code.");
Assert.deepEqual(getConsoleMessages(), [], "no messages reported with .returnCode");
}
function test_nested(contractID) {
let parent = Cc[contractID].createInstance(Ci.nsIXPCTestReturnCodeParent);
let result;
// flush existing messages before we start testing.
getConsoleMessages();
// Ask the C++ to call the "outer" JS object, which will set .returnCode, but
// then create and call *another* component which itself sets the .returnCode
// to a different value. This checks the returnCode is correctly saved
// across call contexts.
result = parent.callChild(Ci.nsIXPCTestReturnCodeChild.CHILD_SHOULD_NEST_RESULTCODES);
Assert.equal(result, Cr.NS_ERROR_UNEXPECTED,
"NS_ERROR_UNEXPECTED was seen as the error code.");
// We expect one message, which is the child reporting what it got as the
// return code - which should be NS_ERROR_FAILURE
let expected = ["nested child returned " + Cr.NS_ERROR_FAILURE];
Assert.deepEqual(getConsoleMessages(), expected, "got the correct sub-error");
}