diff -r 000000000000 -r 6474c204b198 dom/system/gonk/tests/header_helpers.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dom/system/gonk/tests/header_helpers.js Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,187 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components; + + +let subscriptLoader = Cc["@mozilla.org/moz/jssubscript-loader;1"] + .getService(Ci.mozIJSSubScriptLoader); + +/** + * Start a new RIL worker. + * + * @param custom_ns + * Namespace with symbols to be injected into the new worker + * namespace. + * + * @return an object that represents the worker's namespace. + * + * @note that this does not start an actual worker thread. The worker + * is executed on the main thread, within a separate namespace object. + */ +function newWorker(custom_ns) { + let worker_ns = { + importScripts: function() { + Array.slice(arguments).forEach(function(script) { + if (!script.startsWith("resource:")) { + script = "resource://gre/modules/" + script; + } + subscriptLoader.loadSubScript(script, this); + }, this); + }, + + postRILMessage: function(message) { + }, + + postMessage: function(message) { + }, + + // Define these variables inside the worker scope so ES5 strict mode + // doesn't flip out. + onmessage: undefined, + onerror: undefined, + + DEBUG: true + }; + // The 'self' variable in a worker points to the worker's own namespace. + worker_ns.self = worker_ns; + + // Copy the custom definitions over. + for (let key in custom_ns) { + worker_ns[key] = custom_ns[key]; + } + + // fake require() for toolkit/components/workerloader/require.js + let require = (function() { + return function require(script) { + worker_ns.module = {}; + worker_ns.importScripts(script); + return worker_ns; + } + })(); + + Object.freeze(require); + Object.defineProperty(worker_ns, "require", { + value: require, + enumerable: true, + configurable: false + }); + + // Load the RIL worker itself. + worker_ns.importScripts("ril_worker.js"); + + // Register at least one client. + worker_ns.ContextPool.registerClient({ clientId: 0 }); + + return worker_ns; +} + +/** + * Create a parcel suitable for postRILMessage(). + * + * @param fakeParcelSize + * Value to be written to parcel size field for testing + * incorrect/incomplete parcel reading. Replaced with correct + * one determined length of data if negative. + * @param response + * Response code of the incoming parcel. + * @param request + * Request code of the incoming parcel. + * @param data + * Extra data to be appended. + * + * @return an Uint8Array carrying all parcel data. + */ +function newIncomingParcel(fakeParcelSize, response, request, data) { + const UINT32_SIZE = 4; + const PARCEL_SIZE_SIZE = 4; + + let realParcelSize = data.length + 2 * UINT32_SIZE; + let buffer = new ArrayBuffer(realParcelSize + PARCEL_SIZE_SIZE); + let bytes = new Uint8Array(buffer); + + let writeIndex = 0; + function writeUint8(value) { + bytes[writeIndex] = value; + ++writeIndex; + } + + function writeInt32(value) { + writeUint8(value & 0xff); + writeUint8((value >> 8) & 0xff); + writeUint8((value >> 16) & 0xff); + writeUint8((value >> 24) & 0xff); + } + + function writeParcelSize(value) { + writeUint8((value >> 24) & 0xff); + writeUint8((value >> 16) & 0xff); + writeUint8((value >> 8) & 0xff); + writeUint8(value & 0xff); + } + + if (fakeParcelSize < 0) { + fakeParcelSize = realParcelSize; + } + writeParcelSize(fakeParcelSize); + + writeInt32(response); + writeInt32(request); + + // write parcel data + for (let ii = 0; ii < data.length; ++ii) { + writeUint8(data[ii]); + } + + return bytes; +} + +/** + * + */ +let ril_ns; +function newRadioInterface() { + if (!ril_ns) { + ril_ns = {}; + subscriptLoader.loadSubScript("resource://gre/components/RadioInterfaceLayer.js", ril_ns); + } + + return { + __proto__: ril_ns.RadioInterface.prototype, + }; +} + +/** + * Test whether specified function throws exception with expected + * result. + * + * @param func + * Function to be tested. + * @param message + * Message of expected exception. null for no throws. + * @param stack + * Optional stack object to be printed. null for + * Components#stack#caller. + */ +function do_check_throws(func, message, stack) +{ + if (!stack) + stack = Components.stack.caller; + + try { + func(); + } catch (exc) { + if (exc.message === message) { + return; + } + do_throw("expecting exception '" + message + + "', caught '" + exc.message + "'", stack); + } + + if (message) { + do_throw("expecting exception '" + message + "', none thrown", stack); + } +} +