michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: subscriptLoader.loadSubScript("resource://gre/modules/ril_consts.js", this); michael@0: michael@0: function run_test() { michael@0: run_next_test(); michael@0: } michael@0: michael@0: function _getWorker() { michael@0: let _postedMessage; michael@0: let _worker = newWorker({ michael@0: postRILMessage: function(data) { michael@0: }, michael@0: postMessage: function(message) { michael@0: _postedMessage = message; michael@0: } michael@0: }); michael@0: return { michael@0: get postedMessage() { michael@0: return _postedMessage; michael@0: }, michael@0: get worker() { michael@0: return _worker; michael@0: } michael@0: }; michael@0: } michael@0: michael@0: var timeoutCallback = null; michael@0: var timeoutDelayMs = 0; michael@0: const TIMER_ID = 1234; michael@0: const TIMEOUT_VALUE = 300000; // 5 mins. michael@0: michael@0: // No window in xpcshell-test. Create our own timer mechanism. michael@0: michael@0: function setTimeout(callback, timeoutMs) { michael@0: timeoutCallback = callback; michael@0: timeoutDelayMs = timeoutMs; michael@0: do_check_eq(timeoutMs, TIMEOUT_VALUE); michael@0: return TIMER_ID; michael@0: } michael@0: michael@0: function clearTimeout(timeoutId) { michael@0: do_check_eq(timeoutId, TIMER_ID); michael@0: timeoutCallback = null; michael@0: } michael@0: michael@0: function fireTimeout() { michael@0: do_check_neq(timeoutCallback, null); michael@0: if (timeoutCallback) { michael@0: timeoutCallback(); michael@0: timeoutCallback = null; michael@0: } michael@0: } michael@0: michael@0: add_test(function test_enter_emergencyCbMode() { michael@0: let workerHelper = _getWorker(); michael@0: let worker = workerHelper.worker; michael@0: let context = worker.ContextPool._contexts[0]; michael@0: michael@0: // Do it twice. Should always send the event. michael@0: for (let i = 0; i < 2; ++i) { michael@0: context.RIL[UNSOLICITED_ENTER_EMERGENCY_CALLBACK_MODE](); michael@0: let postedMessage = workerHelper.postedMessage; michael@0: michael@0: // Should store the mode. michael@0: do_check_eq(context.RIL._isInEmergencyCbMode, true); michael@0: michael@0: // Should notify change. michael@0: do_check_eq(postedMessage.rilMessageType, "emergencyCbModeChange"); michael@0: do_check_eq(postedMessage.active, true); michael@0: do_check_eq(postedMessage.timeoutMs, TIMEOUT_VALUE); michael@0: michael@0: // Should start timer. michael@0: do_check_eq(context.RIL._exitEmergencyCbModeTimeoutID, TIMER_ID); michael@0: } michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_exit_emergencyCbMode() { michael@0: let workerHelper = _getWorker(); michael@0: let worker = workerHelper.worker; michael@0: let context = worker.ContextPool._contexts[0]; michael@0: michael@0: context.RIL[UNSOLICITED_ENTER_EMERGENCY_CALLBACK_MODE](); michael@0: context.RIL[UNSOLICITED_EXIT_EMERGENCY_CALLBACK_MODE](); michael@0: let postedMessage = workerHelper.postedMessage; michael@0: michael@0: // Should store the mode. michael@0: do_check_eq(context.RIL._isInEmergencyCbMode, false); michael@0: michael@0: // Should notify change. michael@0: do_check_eq(postedMessage.rilMessageType, "emergencyCbModeChange"); michael@0: do_check_eq(postedMessage.active, false); michael@0: michael@0: // Should clear timer. michael@0: do_check_eq(context.RIL._exitEmergencyCbModeTimeoutID, null); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_request_exit_emergencyCbMode_when_timeout() { michael@0: let workerHelper = _getWorker(); michael@0: let worker = workerHelper.worker; michael@0: let context = worker.ContextPool._contexts[0]; michael@0: michael@0: context.RIL[UNSOLICITED_ENTER_EMERGENCY_CALLBACK_MODE](); michael@0: do_check_eq(context.RIL._isInEmergencyCbMode, true); michael@0: do_check_eq(context.RIL._exitEmergencyCbModeTimeoutID, TIMER_ID); michael@0: michael@0: let parcelTypes = []; michael@0: context.Buf.newParcel = function(type, options) { michael@0: parcelTypes.push(type); michael@0: }; michael@0: michael@0: // Timeout. michael@0: fireTimeout(); michael@0: michael@0: // Should clear timeout event. michael@0: do_check_eq(context.RIL._exitEmergencyCbModeTimeoutID, null); michael@0: michael@0: // Check indeed sent out REQUEST_EXIT_EMERGENCY_CALLBACK_MODE. michael@0: do_check_neq(parcelTypes.indexOf(REQUEST_EXIT_EMERGENCY_CALLBACK_MODE), -1); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_request_exit_emergencyCbMode_when_dial() { michael@0: let workerHelper = _getWorker(); michael@0: let worker = workerHelper.worker; michael@0: let context = worker.ContextPool._contexts[0]; michael@0: michael@0: context.RIL[UNSOLICITED_ENTER_EMERGENCY_CALLBACK_MODE](); michael@0: do_check_eq(context.RIL._isInEmergencyCbMode, true); michael@0: do_check_eq(context.RIL._exitEmergencyCbModeTimeoutID, TIMER_ID); michael@0: michael@0: let parcelTypes = []; michael@0: context.Buf.newParcel = function(type, options) { michael@0: parcelTypes.push(type); michael@0: }; michael@0: michael@0: // Dial non-emergency call. michael@0: context.RIL.dial({number: "0912345678", michael@0: isDialEmergency: false}); michael@0: michael@0: // Should clear timeout event. michael@0: do_check_eq(context.RIL._exitEmergencyCbModeTimeoutID, null); michael@0: michael@0: // Check indeed sent out REQUEST_EXIT_EMERGENCY_CALLBACK_MODE. michael@0: do_check_neq(parcelTypes.indexOf(REQUEST_EXIT_EMERGENCY_CALLBACK_MODE), -1); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_request_exit_emergencyCbMode_explicitly() { michael@0: let workerHelper = _getWorker(); michael@0: let worker = workerHelper.worker; michael@0: let context = worker.ContextPool._contexts[0]; michael@0: michael@0: context.RIL[UNSOLICITED_ENTER_EMERGENCY_CALLBACK_MODE](); michael@0: do_check_eq(context.RIL._isInEmergencyCbMode, true); michael@0: do_check_eq(context.RIL._exitEmergencyCbModeTimeoutID, TIMER_ID); michael@0: michael@0: let parcelTypes = []; michael@0: context.Buf.newParcel = function(type, options) { michael@0: parcelTypes.push(type); michael@0: }; michael@0: michael@0: context.RIL.handleChromeMessage({rilMessageType: "exitEmergencyCbMode"}); michael@0: context.RIL[REQUEST_EXIT_EMERGENCY_CALLBACK_MODE](1, { michael@0: rilMessageType: "exitEmergencyCbMode", michael@0: rilRequestError: ERROR_SUCCESS michael@0: }); michael@0: let postedMessage = workerHelper.postedMessage; michael@0: michael@0: // Should clear timeout event. michael@0: do_check_eq(context.RIL._exitEmergencyCbModeTimeoutID, null); michael@0: michael@0: // Check indeed sent out REQUEST_EXIT_EMERGENCY_CALLBACK_MODE. michael@0: do_check_neq(parcelTypes.indexOf(REQUEST_EXIT_EMERGENCY_CALLBACK_MODE), -1); michael@0: michael@0: // Send back the response. michael@0: do_check_eq(postedMessage.rilMessageType, "exitEmergencyCbMode"); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: