1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/system/gonk/tests/marionette/test_data_connection.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,206 @@ 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 +MARIONETTE_CONTEXT = "chrome"; 1.9 + 1.10 +Cu.import("resource://gre/modules/Promise.jsm"); 1.11 + 1.12 +const DATA_KEY = "ril.data.enabled"; 1.13 +const APN_KEY = "ril.data.apnSettings"; 1.14 + 1.15 +let ril = Cc["@mozilla.org/ril;1"].getService(Ci.nsIRadioInterfaceLayer); 1.16 +ok(ril, "ril.constructor is " + ril.constructor); 1.17 + 1.18 +let radioInterface = ril.getRadioInterface(0); 1.19 +ok(radioInterface, "radioInterface.constructor is " + radioInterface.constrctor); 1.20 + 1.21 +function setSetting(key, value) { 1.22 + log("setSetting: '" + key + "'' -> " + JSON.stringify(value)); 1.23 + 1.24 + let deferred = Promise.defer(); 1.25 + let obj = {}; 1.26 + obj[key] = value; 1.27 + 1.28 + let setRequest = window.navigator.mozSettings.createLock().set(obj); 1.29 + setRequest.addEventListener("success", function() { 1.30 + log("set '" + key + "' to " + JSON.stringify(value) + " success"); 1.31 + deferred.resolve(); 1.32 + }); 1.33 + setRequest.addEventListener("error", function() { 1.34 + ok(false, "cannot set '" + key + "' to " + JSON.stringify(value)); 1.35 + deferred.reject(); 1.36 + }); 1.37 + 1.38 + return deferred.promise; 1.39 +} 1.40 + 1.41 +function getSetting(key) { 1.42 + log("getSetting: '" + key + "'"); 1.43 + 1.44 + let deferred = Promise.defer(); 1.45 + 1.46 + let getRequest = window.navigator.mozSettings.createLock().get(key); 1.47 + getRequest.addEventListener("success", function() { 1.48 + let result = getRequest.result[key]; 1.49 + log("setting '" + key + "': " + JSON.stringify(result)); 1.50 + deferred.resolve(result); 1.51 + }); 1.52 + getRequest.addEventListener("error", function() { 1.53 + ok(false, "cannot get '" + key + "'"); 1.54 + deferred.reject(); 1.55 + }); 1.56 + 1.57 + return deferred.promise; 1.58 +} 1.59 + 1.60 +function setEmulatorAPN() { 1.61 + let apn = [ 1.62 + [{"carrier":"T-Mobile US", 1.63 + "apn":"epc.tmobile.com", 1.64 + "mmsc":"http://mms.msg.eng.t-mobile.com/mms/wapenc", 1.65 + "types":["default","supl","mms","ims","dun"]}] 1.66 + ]; 1.67 + 1.68 + return setSetting(APN_KEY, apn); 1.69 +} 1.70 + 1.71 +function waitNetworkConnected(networkType) { 1.72 + log("wait network " + networkType + " connected"); 1.73 + 1.74 + let interfaceStateChangeTopic = "network-connection-state-changed"; 1.75 + let obs = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService); 1.76 + let deferred = Promise.defer(); 1.77 + 1.78 + function observer(subject, topic, data) { 1.79 + let network = subject.QueryInterface(Ci.nsINetworkInterface); 1.80 + log("Network " + network.type + " state changes to " + network.state); 1.81 + if (network.type == networkType && 1.82 + network.state == Ci.nsINetworkInterface.NETWORK_STATE_CONNECTED) { 1.83 + obs.removeObserver(observer, interfaceStateChangeTopic); 1.84 + deferred.resolve(); 1.85 + } 1.86 + } 1.87 + 1.88 + obs.addObserver(observer, interfaceStateChangeTopic, false); 1.89 + 1.90 + return deferred.promise; 1.91 +} 1.92 + 1.93 +function waitNetworkDisconnected(networkType) { 1.94 + log("wait network " + networkType + " disconnected"); 1.95 + 1.96 + let interfaceStateChangeTopic = "network-connection-state-changed"; 1.97 + let obs = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService); 1.98 + let deferred = Promise.defer(); 1.99 + 1.100 + function observer(subject, topic, data) { 1.101 + let network = subject.QueryInterface(Ci.nsINetworkInterface); 1.102 + log("Network " + network.type + " state changes to " + network.state); 1.103 + // We can not check network.type here cause network.type would return 1.104 + // NETWORK_TYPE_MOBILE_SUPL (NETWORK_TYPE_MOBILE_OTHERS) when disconnecting 1.105 + // and disconnected, see bug 939046. 1.106 + if (network.state == Ci.nsINetworkInterface.NETWORK_STATE_DISCONNECTED || 1.107 + network.state == Ci.nsINetworkInterface.NETWORK_STATE_UNKNOWN) { 1.108 + obs.removeObserver(observer, interfaceStateChangeTopic); 1.109 + deferred.resolve(); 1.110 + } 1.111 + } 1.112 + 1.113 + obs.addObserver(observer, interfaceStateChangeTopic, false); 1.114 + 1.115 + return deferred.promise; 1.116 +} 1.117 + 1.118 +// Test initial State 1.119 +function testInitialState() { 1.120 + log("= testInitialState ="); 1.121 + 1.122 + // Data should be off before starting any test. 1.123 + return Promise.resolve() 1.124 + .then(() => getSetting(DATA_KEY)) 1.125 + .then(value => { 1.126 + is(value, false, "Data must be off"); 1.127 + }) 1.128 + .then(null, () => { 1.129 + ok(false, "promise rejected during test"); 1.130 + }) 1.131 + .then(runNextTest); 1.132 +} 1.133 + 1.134 +// Test default data Connection 1.135 +function testDefaultDataConnection() { 1.136 + log("= testDefaultDataConnection ="); 1.137 + 1.138 + return Promise.resolve() 1.139 + // Enable data 1.140 + .then(() => setSetting(DATA_KEY, true)) 1.141 + .then(() => waitNetworkConnected(Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE)) 1.142 + // Disable data 1.143 + .then(() => setSetting(DATA_KEY, false)) 1.144 + .then(() => waitNetworkDisconnected(Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE)) 1.145 + .then(null, () => { 1.146 + ok(false, "promise rejected during test"); 1.147 + }) 1.148 + .then(runNextTest); 1.149 +} 1.150 + 1.151 +// Test non default data connection 1.152 +function testNonDefaultDataConnection() { 1.153 + log("= testNonDefaultDataConnection ="); 1.154 + 1.155 + function doTestNonDefaultDataConnection(type) { 1.156 + log("doTestNonDefaultDataConnection: " + type); 1.157 + 1.158 + let typeMapping = { 1.159 + "mms": Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_MMS, 1.160 + "supl": Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_SUPL, 1.161 + "ims": Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_IMS, 1.162 + "dun": Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_DUN 1.163 + }; 1.164 + let networkType = typeMapping[type]; 1.165 + 1.166 + return Promise.resolve() 1.167 + .then(() => radioInterface.setupDataCallByType(type)) 1.168 + .then(() => waitNetworkConnected(networkType)) 1.169 + .then(() => radioInterface.deactivateDataCallByType(type)) 1.170 + .then(() => waitNetworkDisconnected(networkType)); 1.171 + } 1.172 + 1.173 + let currentApn; 1.174 + return Promise.resolve() 1.175 + .then(() => getSetting(APN_KEY)) 1.176 + .then(value => { 1.177 + currentApn = value; 1.178 + }) 1.179 + .then(setEmulatorAPN) 1.180 + .then(() => doTestNonDefaultDataConnection("mms")) 1.181 + .then(() => doTestNonDefaultDataConnection("supl")) 1.182 + .then(() => doTestNonDefaultDataConnection("ims")) 1.183 + .then(() => doTestNonDefaultDataConnection("dun")) 1.184 + // Restore APN settings 1.185 + .then(() => setSetting(APN_KEY, currentApn)) 1.186 + .then(null, () => { 1.187 + ok(false, "promise rejected during test"); 1.188 + }) 1.189 + .then(runNextTest); 1.190 +} 1.191 + 1.192 +let tests = [ 1.193 + testInitialState, 1.194 + testDefaultDataConnection, 1.195 + testNonDefaultDataConnection 1.196 +]; 1.197 + 1.198 +function runNextTest() { 1.199 + let test = tests.shift(); 1.200 + if (!test) { 1.201 + finish(); 1.202 + return; 1.203 + } 1.204 + 1.205 + test(); 1.206 +} 1.207 + 1.208 +// Start Tests 1.209 +runNextTest();