dom/system/gonk/tests/marionette/test_data_connection.js

branch
TOR_BUG_9701
changeset 15
b8a032363ba2
equal deleted inserted replaced
-1:000000000000 0:8c8bd8d3b786
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();

mercurial