|
1 /* Any copyright is dedicated to the Public Domain. |
|
2 * http://creativecommons.org/publicdomain/zero/1.0/ */ |
|
3 |
|
4 MARIONETTE_TIMEOUT = 60000; |
|
5 MARIONETTE_CONTEXT = "chrome"; |
|
6 |
|
7 Cu.import("resource://gre/modules/Promise.jsm"); |
|
8 |
|
9 const DATA_KEY = "ril.data.enabled"; |
|
10 const APN_KEY = "ril.data.apnSettings"; |
|
11 |
|
12 let ril = Cc["@mozilla.org/ril;1"].getService(Ci.nsIRadioInterfaceLayer); |
|
13 ok(ril, "ril.constructor is " + ril.constructor); |
|
14 |
|
15 let radioInterface = ril.getRadioInterface(0); |
|
16 ok(radioInterface, "radioInterface.constructor is " + radioInterface.constrctor); |
|
17 |
|
18 function setSetting(key, value) { |
|
19 log("setSetting: '" + key + "'' -> " + JSON.stringify(value)); |
|
20 |
|
21 let deferred = Promise.defer(); |
|
22 let obj = {}; |
|
23 obj[key] = value; |
|
24 |
|
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 }); |
|
34 |
|
35 return deferred.promise; |
|
36 } |
|
37 |
|
38 function getSetting(key) { |
|
39 log("getSetting: '" + key + "'"); |
|
40 |
|
41 let deferred = Promise.defer(); |
|
42 |
|
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 }); |
|
53 |
|
54 return deferred.promise; |
|
55 } |
|
56 |
|
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 ]; |
|
64 |
|
65 return setSetting(APN_KEY, apn); |
|
66 } |
|
67 |
|
68 function waitNetworkConnected(networkType) { |
|
69 log("wait network " + networkType + " connected"); |
|
70 |
|
71 let interfaceStateChangeTopic = "network-connection-state-changed"; |
|
72 let obs = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService); |
|
73 let deferred = Promise.defer(); |
|
74 |
|
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 } |
|
84 |
|
85 obs.addObserver(observer, interfaceStateChangeTopic, false); |
|
86 |
|
87 return deferred.promise; |
|
88 } |
|
89 |
|
90 function waitNetworkDisconnected(networkType) { |
|
91 log("wait network " + networkType + " disconnected"); |
|
92 |
|
93 let interfaceStateChangeTopic = "network-connection-state-changed"; |
|
94 let obs = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService); |
|
95 let deferred = Promise.defer(); |
|
96 |
|
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 } |
|
109 |
|
110 obs.addObserver(observer, interfaceStateChangeTopic, false); |
|
111 |
|
112 return deferred.promise; |
|
113 } |
|
114 |
|
115 // Test initial State |
|
116 function testInitialState() { |
|
117 log("= testInitialState ="); |
|
118 |
|
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 } |
|
130 |
|
131 // Test default data Connection |
|
132 function testDefaultDataConnection() { |
|
133 log("= testDefaultDataConnection ="); |
|
134 |
|
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 } |
|
147 |
|
148 // Test non default data connection |
|
149 function testNonDefaultDataConnection() { |
|
150 log("= testNonDefaultDataConnection ="); |
|
151 |
|
152 function doTestNonDefaultDataConnection(type) { |
|
153 log("doTestNonDefaultDataConnection: " + type); |
|
154 |
|
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]; |
|
162 |
|
163 return Promise.resolve() |
|
164 .then(() => radioInterface.setupDataCallByType(type)) |
|
165 .then(() => waitNetworkConnected(networkType)) |
|
166 .then(() => radioInterface.deactivateDataCallByType(type)) |
|
167 .then(() => waitNetworkDisconnected(networkType)); |
|
168 } |
|
169 |
|
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 } |
|
188 |
|
189 let tests = [ |
|
190 testInitialState, |
|
191 testDefaultDataConnection, |
|
192 testNonDefaultDataConnection |
|
193 ]; |
|
194 |
|
195 function runNextTest() { |
|
196 let test = tests.shift(); |
|
197 if (!test) { |
|
198 finish(); |
|
199 return; |
|
200 } |
|
201 |
|
202 test(); |
|
203 } |
|
204 |
|
205 // Start Tests |
|
206 runNextTest(); |