1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/mobileconnection/tests/marionette/test_mobile_set_radio.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,168 @@ 1.4 +/* Any copyright is dedicated to the Public Domain. 1.5 + * http://creativecommons.org/publicdomain/zero/1.0/ */ 1.6 + 1.7 +MARIONETTE_TIMEOUT = 60000; 1.8 + 1.9 +const DATA_KEY = "ril.data.enabled"; 1.10 +const APN_KEY = "ril.data.apnSettings"; 1.11 + 1.12 +let Promise = SpecialPowers.Cu.import("resource://gre/modules/Promise.jsm").Promise; 1.13 + 1.14 +SpecialPowers.setBoolPref("dom.mozSettings.enabled", true); 1.15 +SpecialPowers.addPermission("mobileconnection", true, document); 1.16 +SpecialPowers.addPermission("settings-read", true, document); 1.17 +SpecialPowers.addPermission("settings-write", true, document); 1.18 + 1.19 +let settings = window.navigator.mozSettings; 1.20 +let connection = window.navigator.mozMobileConnections[0]; 1.21 +ok(connection instanceof MozMobileConnection, 1.22 + "connection is instanceof " + connection.constructor); 1.23 + 1.24 +function setSetting(key, value) { 1.25 + let deferred = Promise.defer(); 1.26 + 1.27 + let setLock = settings.createLock(); 1.28 + let obj = {}; 1.29 + obj[key] = value; 1.30 + 1.31 + let setReq = setLock.set(obj); 1.32 + setReq.addEventListener("success", function onSetSuccess() { 1.33 + ok(true, "set '" + key + "' to " + obj[key]); 1.34 + deferred.resolve(); 1.35 + }); 1.36 + setReq.addEventListener("error", function onSetError() { 1.37 + ok(false, "cannot set '" + key + "'"); 1.38 + deferred.reject(); 1.39 + }); 1.40 + 1.41 + return deferred.promise; 1.42 +} 1.43 + 1.44 +function setEmulatorAPN() { 1.45 + let apn = 1.46 + [ 1.47 + [ 1.48 + {"carrier":"T-Mobile US", 1.49 + "apn":"epc.tmobile.com", 1.50 + "mmsc":"http://mms.msg.eng.t-mobile.com/mms/wapenc", 1.51 + "types":["default","supl","mms"]} 1.52 + ] 1.53 + ]; 1.54 + return setSetting(APN_KEY, apn); 1.55 +} 1.56 + 1.57 +function enableData() { 1.58 + log("Turn data on."); 1.59 + 1.60 + let deferred = Promise.defer(); 1.61 + 1.62 + connection.addEventListener("datachange", function ondatachange() { 1.63 + if (connection.data.connected === true) { 1.64 + connection.removeEventListener("datachange", ondatachange); 1.65 + log("mobileConnection.data.connected is now '" 1.66 + + connection.data.connected + "'."); 1.67 + deferred.resolve(); 1.68 + } 1.69 + }); 1.70 + 1.71 + setEmulatorAPN() 1.72 + .then(() => setSetting(DATA_KEY, true)); 1.73 + 1.74 + return deferred.promise; 1.75 +} 1.76 + 1.77 +function receivedPending(received, pending, nextAction) { 1.78 + let index = pending.indexOf(received); 1.79 + if (index != -1) { 1.80 + pending.splice(index, 1); 1.81 + } 1.82 + if (pending.length === 0) { 1.83 + nextAction(); 1.84 + } 1.85 +} 1.86 + 1.87 +function waitRadioState(state) { 1.88 + let deferred = Promise.defer(); 1.89 + 1.90 + waitFor(function() { 1.91 + deferred.resolve(); 1.92 + }, function() { 1.93 + return connection.radioState == state; 1.94 + }); 1.95 + 1.96 + return deferred.promise; 1.97 +} 1.98 + 1.99 +function setRadioEnabled(enabled, transientState, finalState) { 1.100 + log("setRadioEnabled to " + enabled); 1.101 + 1.102 + let deferred = Promise.defer(); 1.103 + let done = function() { 1.104 + deferred.resolve(); 1.105 + }; 1.106 + 1.107 + let pending = ["onradiostatechange", "onsuccess"]; 1.108 + 1.109 + let receivedTransient = false; 1.110 + connection.onradiostatechange = function() { 1.111 + let state = connection.radioState; 1.112 + log("Received 'radiostatechange' event, radioState: " + state); 1.113 + 1.114 + if (state == transientState) { 1.115 + receivedTransient = true; 1.116 + } else if (state == finalState) { 1.117 + ok(receivedTransient); 1.118 + receivedPending("onradiostatechange", pending, done); 1.119 + } 1.120 + }; 1.121 + 1.122 + let req = connection.setRadioEnabled(enabled); 1.123 + 1.124 + req.onsuccess = function() { 1.125 + log("setRadioEnabled success"); 1.126 + receivedPending("onsuccess", pending, done); 1.127 + }; 1.128 + 1.129 + req.onerror = function() { 1.130 + ok(false, "setRadioEnabled should not fail"); 1.131 + deferred.reject(); 1.132 + }; 1.133 + 1.134 + return deferred.promise; 1.135 +} 1.136 + 1.137 +function testSwitchRadio() { 1.138 + log("= testSwitchRadio ="); 1.139 + return waitRadioState("enabled") 1.140 + .then(setRadioEnabled.bind(null, false, "disabling", "disabled")) 1.141 + .then(setRadioEnabled.bind(null, true, "enabling", "enabled")); 1.142 +} 1.143 + 1.144 +function testDisableRadioWhenDataConnected() { 1.145 + log("= testDisableRadioWhenDataConnected ="); 1.146 + return waitRadioState("enabled") 1.147 + .then(enableData) 1.148 + .then(setRadioEnabled.bind(null, false, "disabling", "disabled")) 1.149 + .then(() => { 1.150 + // Data should be disconnected. 1.151 + is(connection.data.connected, false); 1.152 + }) 1.153 + .then(setRadioEnabled.bind(null, true, "enabling", "enabled")) 1.154 + // Disable data 1.155 + .then(setSetting.bind(null, DATA_KEY, false)); 1.156 +} 1.157 + 1.158 +function cleanUp() { 1.159 + SpecialPowers.removePermission("mobileconnection", document); 1.160 + SpecialPowers.removePermission("settings-write", document); 1.161 + SpecialPowers.removePermission("settings-read", document); 1.162 + SpecialPowers.clearUserPref("dom.mozSettings.enabled"); 1.163 + finish(); 1.164 +} 1.165 + 1.166 +testSwitchRadio() 1.167 + .then(testDisableRadioWhenDataConnected) 1.168 + .then(null, () => { 1.169 + ok(false, "promise reject somewhere"); 1.170 + }) 1.171 + .then(cleanUp);