Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
1 /* Any copyright is dedicated to the Public Domain.
2 * http://creativecommons.org/publicdomain/zero/1.0/ */
4 MARIONETTE_TIMEOUT = 60000;
5 MARIONETTE_CONTEXT = "chrome";
7 Cu.import("resource://gre/modules/Promise.jsm");
9 const DATA_KEY = "ril.data.enabled";
10 const APN_KEY = "ril.data.apnSettings";
12 let ril = Cc["@mozilla.org/ril;1"].getService(Ci.nsIRadioInterfaceLayer);
13 ok(ril, "ril.constructor is " + ril.constructor);
15 let radioInterface = ril.getRadioInterface(0);
16 ok(radioInterface, "radioInterface.constructor is " + radioInterface.constrctor);
18 function setSetting(key, value) {
19 log("setSetting: '" + key + "'' -> " + JSON.stringify(value));
21 let deferred = Promise.defer();
22 let obj = {};
23 obj[key] = value;
25 let setRequest = window.navigator.mozSettings.createLock().set(obj);
26 setRequest.addEventListener("success", function() {
27 log("set '" + key + "' to " + JSON.stringify(value) + " success");
28 deferred.resolve();
29 });
30 setRequest.addEventListener("error", function() {
31 ok(false, "cannot set '" + key + "' to " + JSON.stringify(value));
32 deferred.reject();
33 });
35 return deferred.promise;
36 }
38 function getSetting(key) {
39 log("getSetting: '" + key + "'");
41 let deferred = Promise.defer();
43 let getRequest = window.navigator.mozSettings.createLock().get(key);
44 getRequest.addEventListener("success", function() {
45 let result = getRequest.result[key];
46 log("setting '" + key + "': " + JSON.stringify(result));
47 deferred.resolve(result);
48 });
49 getRequest.addEventListener("error", function() {
50 ok(false, "cannot get '" + key + "'");
51 deferred.reject();
52 });
54 return deferred.promise;
55 }
57 function setEmulatorAPN() {
58 let apn = [
59 [{"carrier":"T-Mobile US",
60 "apn":"epc.tmobile.com",
61 "mmsc":"http://mms.msg.eng.t-mobile.com/mms/wapenc",
62 "types":["default","supl","mms","ims","dun"]}]
63 ];
65 return setSetting(APN_KEY, apn);
66 }
68 function waitNetworkConnected(networkType) {
69 log("wait network " + networkType + " connected");
71 let interfaceStateChangeTopic = "network-connection-state-changed";
72 let obs = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
73 let deferred = Promise.defer();
75 function observer(subject, topic, data) {
76 let network = subject.QueryInterface(Ci.nsINetworkInterface);
77 log("Network " + network.type + " state changes to " + network.state);
78 if (network.type == networkType &&
79 network.state == Ci.nsINetworkInterface.NETWORK_STATE_CONNECTED) {
80 obs.removeObserver(observer, interfaceStateChangeTopic);
81 deferred.resolve();
82 }
83 }
85 obs.addObserver(observer, interfaceStateChangeTopic, false);
87 return deferred.promise;
88 }
90 function waitNetworkDisconnected(networkType) {
91 log("wait network " + networkType + " disconnected");
93 let interfaceStateChangeTopic = "network-connection-state-changed";
94 let obs = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
95 let deferred = Promise.defer();
97 function observer(subject, topic, data) {
98 let network = subject.QueryInterface(Ci.nsINetworkInterface);
99 log("Network " + network.type + " state changes to " + network.state);
100 // We can not check network.type here cause network.type would return
101 // NETWORK_TYPE_MOBILE_SUPL (NETWORK_TYPE_MOBILE_OTHERS) when disconnecting
102 // and disconnected, see bug 939046.
103 if (network.state == Ci.nsINetworkInterface.NETWORK_STATE_DISCONNECTED ||
104 network.state == Ci.nsINetworkInterface.NETWORK_STATE_UNKNOWN) {
105 obs.removeObserver(observer, interfaceStateChangeTopic);
106 deferred.resolve();
107 }
108 }
110 obs.addObserver(observer, interfaceStateChangeTopic, false);
112 return deferred.promise;
113 }
115 // Test initial State
116 function testInitialState() {
117 log("= testInitialState =");
119 // Data should be off before starting any test.
120 return Promise.resolve()
121 .then(() => getSetting(DATA_KEY))
122 .then(value => {
123 is(value, false, "Data must be off");
124 })
125 .then(null, () => {
126 ok(false, "promise rejected during test");
127 })
128 .then(runNextTest);
129 }
131 // Test default data Connection
132 function testDefaultDataConnection() {
133 log("= testDefaultDataConnection =");
135 return Promise.resolve()
136 // Enable data
137 .then(() => setSetting(DATA_KEY, true))
138 .then(() => waitNetworkConnected(Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE))
139 // Disable data
140 .then(() => setSetting(DATA_KEY, false))
141 .then(() => waitNetworkDisconnected(Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE))
142 .then(null, () => {
143 ok(false, "promise rejected during test");
144 })
145 .then(runNextTest);
146 }
148 // Test non default data connection
149 function testNonDefaultDataConnection() {
150 log("= testNonDefaultDataConnection =");
152 function doTestNonDefaultDataConnection(type) {
153 log("doTestNonDefaultDataConnection: " + type);
155 let typeMapping = {
156 "mms": Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_MMS,
157 "supl": Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_SUPL,
158 "ims": Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_IMS,
159 "dun": Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_DUN
160 };
161 let networkType = typeMapping[type];
163 return Promise.resolve()
164 .then(() => radioInterface.setupDataCallByType(type))
165 .then(() => waitNetworkConnected(networkType))
166 .then(() => radioInterface.deactivateDataCallByType(type))
167 .then(() => waitNetworkDisconnected(networkType));
168 }
170 let currentApn;
171 return Promise.resolve()
172 .then(() => getSetting(APN_KEY))
173 .then(value => {
174 currentApn = value;
175 })
176 .then(setEmulatorAPN)
177 .then(() => doTestNonDefaultDataConnection("mms"))
178 .then(() => doTestNonDefaultDataConnection("supl"))
179 .then(() => doTestNonDefaultDataConnection("ims"))
180 .then(() => doTestNonDefaultDataConnection("dun"))
181 // Restore APN settings
182 .then(() => setSetting(APN_KEY, currentApn))
183 .then(null, () => {
184 ok(false, "promise rejected during test");
185 })
186 .then(runNextTest);
187 }
189 let tests = [
190 testInitialState,
191 testDefaultDataConnection,
192 testNonDefaultDataConnection
193 ];
195 function runNextTest() {
196 let test = tests.shift();
197 if (!test) {
198 finish();
199 return;
200 }
202 test();
203 }
205 // Start Tests
206 runNextTest();