test_returncode.js (3055B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 function getConsoleMessages() { 6 let consoleService = Cc["@mozilla.org/consoleservice;1"].getService(Ci.nsIConsoleService); 7 let messages = consoleService.getMessageArray().map((m) => m.toString()); 8 // reset ready for the next call. 9 consoleService.reset(); 10 return messages; 11 } 12 13 function run_test() { 14 // Load the component manifests. 15 registerXPCTestComponents(); 16 17 test_simple("@mozilla.org/js/xpc/test/native/ESMReturnCodeParent;1"); 18 test_nested("@mozilla.org/js/xpc/test/native/ESMReturnCodeParent;1"); 19 } 20 21 function test_simple(contractID) { 22 let parent = Cc[contractID].createInstance(Ci.nsIXPCTestReturnCodeParent); 23 let result; 24 25 // flush existing messages before we start testing. 26 getConsoleMessages(); 27 28 // Ask the C++ to call the JS object which will throw. 29 result = parent.callChild(Ci.nsIXPCTestReturnCodeChild.CHILD_SHOULD_THROW); 30 Assert.equal(result, Cr.NS_ERROR_XPC_JAVASCRIPT_ERROR_WITH_DETAILS, 31 "exception caused NS_ERROR_XPC_JAVASCRIPT_ERROR_WITH_DETAILS"); 32 33 let messages = getConsoleMessages(); 34 Assert.equal(messages.length, 1, "got a console message from the exception"); 35 Assert.ok(messages[0].includes("a requested error"), "got the message text"); 36 37 // Ask the C++ to call the JS object which will return success. 38 result = parent.callChild(Ci.nsIXPCTestReturnCodeChild.CHILD_SHOULD_RETURN_SUCCESS); 39 Assert.equal(result, Cr.NS_OK, "success is success"); 40 41 Assert.deepEqual(getConsoleMessages(), [], "no messages reported on success."); 42 43 // And finally the point of this test! 44 // Ask the C++ to call the JS object which will use .returnCode 45 result = parent.callChild(Ci.nsIXPCTestReturnCodeChild.CHILD_SHOULD_RETURN_RESULTCODE); 46 Assert.equal(result, Cr.NS_ERROR_FAILURE, 47 "NS_ERROR_FAILURE was seen as the error code."); 48 49 Assert.deepEqual(getConsoleMessages(), [], "no messages reported with .returnCode"); 50 } 51 52 function test_nested(contractID) { 53 let parent = Cc[contractID].createInstance(Ci.nsIXPCTestReturnCodeParent); 54 let result; 55 56 // flush existing messages before we start testing. 57 getConsoleMessages(); 58 59 // Ask the C++ to call the "outer" JS object, which will set .returnCode, but 60 // then create and call *another* component which itself sets the .returnCode 61 // to a different value. This checks the returnCode is correctly saved 62 // across call contexts. 63 result = parent.callChild(Ci.nsIXPCTestReturnCodeChild.CHILD_SHOULD_NEST_RESULTCODES); 64 Assert.equal(result, Cr.NS_ERROR_UNEXPECTED, 65 "NS_ERROR_UNEXPECTED was seen as the error code."); 66 // We expect one message, which is the child reporting what it got as the 67 // return code - which should be NS_ERROR_FAILURE 68 let expected = ["nested child returned " + Cr.NS_ERROR_FAILURE]; 69 Assert.deepEqual(getConsoleMessages(), expected, "got the correct sub-error"); 70 }