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

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     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();

mercurial