michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: * http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: MARIONETTE_TIMEOUT = 60000; michael@0: MARIONETTE_HEAD_JS = 'head.js'; michael@0: michael@0: function setRadioEnabled(enabled) { michael@0: log("Set radio enabled: " + enabled + "."); michael@0: michael@0: let desiredRadioState = enabled ? 'enabled' : 'disabled'; michael@0: let deferred = Promise.defer(); michael@0: let connection = navigator.mozMobileConnections[0]; michael@0: michael@0: connection.onradiostatechange = function() { michael@0: let state = connection.radioState; michael@0: log("Received 'radiostatechange' event, radioState: " + state); michael@0: michael@0: // We are waiting for 'desiredRadioState.' Ignore any transient state. michael@0: if (state === desiredRadioState) { michael@0: connection.onradiostatechange = null; michael@0: deferred.resolve(); michael@0: } michael@0: }; michael@0: connection.setRadioEnabled(enabled); michael@0: michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function dial(number) { michael@0: log("Make an outgoing call."); michael@0: michael@0: let deferred = Promise.defer(); michael@0: telephony.dial(number).then(call => { michael@0: ok(call); michael@0: is(call.number, number); michael@0: is(call.state, "dialing"); michael@0: michael@0: call.onalerting = function(event) { michael@0: log("Received 'onalerting' call event."); michael@0: call.onalerting = null; michael@0: is(call, event.call); michael@0: is(call.state, "alerting"); michael@0: deferred.resolve(call); michael@0: }; michael@0: }); michael@0: michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function remoteAnswer(call) { michael@0: log("Remote answering the call."); michael@0: michael@0: let deferred = Promise.defer(); michael@0: michael@0: call.onconnected = function(event) { michael@0: log("Received 'connected' call event."); michael@0: call.onconnected = null; michael@0: is(call, event.call); michael@0: is(call.state, "connected"); michael@0: deferred.resolve(call); michael@0: }; michael@0: emulator.run("gsm accept " + call.number); michael@0: michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function disableRadioAndWaitForCallEvent(call) { michael@0: log("Disable radio and wait for call event."); michael@0: michael@0: let deferred = Promise.defer(); michael@0: michael@0: call.ondisconnected = function(event) { michael@0: log("Received 'disconnected' call event."); michael@0: call.ondisconnected = null; michael@0: is(call, event.call); michael@0: is(call.state, "disconnected"); michael@0: deferred.resolve(); michael@0: }; michael@0: navigator.mozMobileConnections[0].setRadioEnabled(false); michael@0: michael@0: return deferred.promise; michael@0: } michael@0: michael@0: /** michael@0: * Make an outgoing call then power off radio. michael@0: */ michael@0: function testOutgoingCallRadioOff() { michael@0: log("= testOutgoingCallRadioOff ="); michael@0: let number = "0912345000"; michael@0: michael@0: return Promise.resolve() michael@0: .then(() => dial(number)) michael@0: .then(call => remoteAnswer(call)) michael@0: .then(call => disableRadioAndWaitForCallEvent(call)) michael@0: .then(() => setRadioEnabled(true)); michael@0: } michael@0: michael@0: // Start test michael@0: startTestWithPermissions(['mobileconnection'], function() { michael@0: testOutgoingCallRadioOff() michael@0: .then(null, () => { michael@0: ok(false, "promise rejects during test."); michael@0: }) michael@0: .then(finish); michael@0: });