зеркало из https://github.com/mozilla/gecko-dev.git
Bug 821578 - Add Marionette test for data call with multiple APN. f=edgar, r=hsinyi
This commit is contained in:
Родитель
875db4dc4a
Коммит
3385cb0339
|
@ -3,8 +3,21 @@
|
|||
|
||||
MARIONETTE_CONTEXT = "chrome";
|
||||
|
||||
const SETTINGS_KEY_DATA_ENABLED = "ril.data.enabled";
|
||||
const SETTINGS_KEY_DATA_APN_SETTINGS = "ril.data.apnSettings";
|
||||
|
||||
const TOPIC_CONNECTION_STATE_CHANGED = "network-connection-state-changed";
|
||||
const TOPIC_INTERFACE_STATE_CHANGED = "network-interface-state-changed";
|
||||
const TOPIC_NETWORK_ACTIVE_CHANGED = "network-active-changed";
|
||||
|
||||
let Promise = Cu.import("resource://gre/modules/Promise.jsm").Promise;
|
||||
|
||||
let ril = Cc["@mozilla.org/ril;1"].getService(Ci.nsIRadioInterfaceLayer);
|
||||
ok(ril, "ril.constructor is " + ril.constructor);
|
||||
|
||||
let radioInterface = ril.getRadioInterface(0);
|
||||
ok(radioInterface, "radioInterface.constructor is " + radioInterface.constrctor);
|
||||
|
||||
/**
|
||||
* Wrap DOMRequest onsuccess/onerror events to Promise resolve/reject.
|
||||
*
|
||||
|
@ -116,6 +129,103 @@ function waitForObserverEvent(aTopic) {
|
|||
return deferred.promise;
|
||||
}
|
||||
|
||||
let mobileTypeMapping = {
|
||||
"default": Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE,
|
||||
"mms": Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_MMS,
|
||||
"supl": Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_SUPL,
|
||||
"ims": Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_IMS,
|
||||
"dun": Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_DUN
|
||||
};
|
||||
|
||||
/**
|
||||
* Set the default data connection enabling state, wait for
|
||||
* "network-connection-state-changed" event and verify state.
|
||||
*
|
||||
* Fulfill params: (none)
|
||||
*
|
||||
* @param aEnabled
|
||||
* A boolean state.
|
||||
*
|
||||
* @return A deferred promise.
|
||||
*/
|
||||
function setDataEnabledAndWait(aEnabled) {
|
||||
let promises = [];
|
||||
promises.push(waitForObserverEvent(TOPIC_CONNECTION_STATE_CHANGED)
|
||||
.then(function(aSubject) {
|
||||
ok(aSubject instanceof Ci.nsIRilNetworkInterface,
|
||||
"subject should be an instance of nsIRILNetworkInterface");
|
||||
is(aSubject.type, Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE,
|
||||
"subject.type should be " + Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE);
|
||||
is(aSubject.state,
|
||||
aEnabled ? Ci.nsINetworkInterface.NETWORK_STATE_CONNECTED
|
||||
: Ci.nsINetworkInterface.NETWORK_STATE_DISCONNECTED,
|
||||
"subject.state should be " + aEnabled ? "CONNECTED" : "DISCONNECTED");
|
||||
}));
|
||||
promises.push(setSettings(SETTINGS_KEY_DATA_ENABLED, aEnabled));
|
||||
|
||||
return Promise.all(promises);
|
||||
}
|
||||
|
||||
/**
|
||||
* Setup a certain type of data connection, wait for
|
||||
* "network-connection-state-changed" event and verify state.
|
||||
*
|
||||
* Fulfill params: (none)
|
||||
*
|
||||
* @param aType
|
||||
* The string of the type of data connection to setup.
|
||||
*
|
||||
* @return A deferred promise.
|
||||
*/
|
||||
function setupDataCallAndWait(aType) {
|
||||
log("setupDataCallAndWait: " + aType);
|
||||
|
||||
let promises = [];
|
||||
promises.push(waitForObserverEvent(TOPIC_CONNECTION_STATE_CHANGED)
|
||||
.then(function(aSubject) {
|
||||
let networkType = mobileTypeMapping[aType];
|
||||
ok(aSubject instanceof Ci.nsIRilNetworkInterface,
|
||||
"subject should be an instance of nsIRILNetworkInterface");
|
||||
is(aSubject.type, networkType,
|
||||
"subject.type should be " + networkType);
|
||||
is(aSubject.state, Ci.nsINetworkInterface.NETWORK_STATE_CONNECTED,
|
||||
"subject.state should be CONNECTED");
|
||||
}));
|
||||
promises.push(radioInterface.setupDataCallByType(aType));
|
||||
|
||||
return Promise.all(promises);
|
||||
}
|
||||
|
||||
/**
|
||||
* Deactivate a certain type of data connection, wait for
|
||||
* "network-connection-state-changed" event and verify state.
|
||||
*
|
||||
* Fulfill params: (none)
|
||||
*
|
||||
* @param aType
|
||||
* The string of the type of data connection to deactivate.
|
||||
*
|
||||
* @return A deferred promise.
|
||||
*/
|
||||
function deactivateDataCallAndWait(aType) {
|
||||
log("deactivateDataCallAndWait: " + aType);
|
||||
|
||||
let promises = [];
|
||||
promises.push(waitForObserverEvent(TOPIC_CONNECTION_STATE_CHANGED)
|
||||
.then(function(aSubject) {
|
||||
let networkType = mobileTypeMapping[aType];
|
||||
ok(aSubject instanceof Ci.nsIRilNetworkInterface,
|
||||
"subject should be an instance of nsIRILNetworkInterface");
|
||||
is(aSubject.type, networkType,
|
||||
"subject.type should be " + networkType);
|
||||
is(aSubject.state, Ci.nsINetworkInterface.NETWORK_STATE_DISCONNECTED,
|
||||
"subject.state should be DISCONNECTED");
|
||||
}));
|
||||
promises.push(radioInterface.deactivateDataCallByType(aType));
|
||||
|
||||
return Promise.all(promises);
|
||||
}
|
||||
|
||||
/**
|
||||
* Basic test routine helper.
|
||||
*
|
||||
|
|
|
@ -11,3 +11,4 @@ disabled = Bug 808783
|
|||
[test_dsds_numRadioInterfaces.js]
|
||||
[test_data_connection.js]
|
||||
[test_network_active_changed.js]
|
||||
[test_multiple_data_connection.js]
|
||||
|
|
|
@ -4,18 +4,6 @@
|
|||
MARIONETTE_TIMEOUT = 60000;
|
||||
MARIONETTE_HEAD_JS = "head.js";
|
||||
|
||||
Cu.import("resource://gre/modules/Promise.jsm");
|
||||
|
||||
const DATA_KEY = "ril.data.enabled";
|
||||
const APN_KEY = "ril.data.apnSettings";
|
||||
const TOPIC_CONNECTION_STATE_CHANGED = "network-connection-state-changed";
|
||||
|
||||
let ril = Cc["@mozilla.org/ril;1"].getService(Ci.nsIRadioInterfaceLayer);
|
||||
ok(ril, "ril.constructor is " + ril.constructor);
|
||||
|
||||
let radioInterface = ril.getRadioInterface(0);
|
||||
ok(radioInterface, "radioInterface.constructor is " + radioInterface.constrctor);
|
||||
|
||||
function setEmulatorAPN() {
|
||||
let apn = [
|
||||
[{"carrier":"T-Mobile US",
|
||||
|
@ -24,57 +12,7 @@ function setEmulatorAPN() {
|
|||
"types":["default","supl","mms","ims","dun"]}]
|
||||
];
|
||||
|
||||
return setSettings(APN_KEY, apn);
|
||||
}
|
||||
|
||||
function setupDataCallAndWait(type, networkType) {
|
||||
let promises = [];
|
||||
promises.push(waitForObserverEvent(TOPIC_CONNECTION_STATE_CHANGED));
|
||||
promises.push(radioInterface.setupDataCallByType(type));
|
||||
|
||||
return Promise.all(promises).then(function(results) {
|
||||
let subject = results[0];
|
||||
ok(subject instanceof Ci.nsIRilNetworkInterface,
|
||||
"subject should be an instance of nsIRILNetworkInterface");
|
||||
is(subject.type, networkType,
|
||||
"subject.type should be " + networkType);
|
||||
is(subject.state, Ci.nsINetworkInterface.NETWORK_STATE_CONNECTED,
|
||||
"subject.state should be CONNECTED");
|
||||
});
|
||||
}
|
||||
|
||||
function deactivateDataCallAndWait(type, networkType) {
|
||||
let promises = [];
|
||||
promises.push(waitForObserverEvent(TOPIC_CONNECTION_STATE_CHANGED));
|
||||
promises.push(radioInterface.deactivateDataCallByType(type));
|
||||
|
||||
return Promise.all(promises).then(function(results) {
|
||||
let subject = results[0];
|
||||
ok(subject instanceof Ci.nsIRilNetworkInterface,
|
||||
"subject should be an instance of nsIRILNetworkInterface");
|
||||
is(subject.type, networkType,
|
||||
"subject.type should be " + networkType);
|
||||
is(subject.state, Ci.nsINetworkInterface.NETWORK_STATE_DISCONNECTED,
|
||||
"subject.state should be DISCONNECTED");
|
||||
});
|
||||
}
|
||||
|
||||
function setDataEnabledAndWait(enabled) {
|
||||
let promises = [];
|
||||
promises.push(waitForObserverEvent(TOPIC_CONNECTION_STATE_CHANGED));
|
||||
promises.push(setSettings(DATA_KEY, enabled));
|
||||
|
||||
return Promise.all(promises).then(function(results) {
|
||||
let subject = results[0];
|
||||
ok(subject instanceof Ci.nsIRilNetworkInterface,
|
||||
"subject should be an instance of nsIRILNetworkInterface");
|
||||
is(subject.type, Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE,
|
||||
"subject.type should be " + Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE);
|
||||
is(subject.state,
|
||||
enabled ? Ci.nsINetworkInterface.NETWORK_STATE_CONNECTED
|
||||
: Ci.nsINetworkInterface.NETWORK_STATE_DISCONNECTED,
|
||||
"subject.state should be " + enabled ? "CONNECTED" : "DISCONNECTED");
|
||||
});
|
||||
return setSettings(SETTINGS_KEY_DATA_APN_SETTINGS, apn);
|
||||
}
|
||||
|
||||
// Test initial State
|
||||
|
@ -82,7 +20,7 @@ function testInitialState() {
|
|||
log("= testInitialState =");
|
||||
|
||||
// Data should be off before starting any test.
|
||||
return getSettings(DATA_KEY)
|
||||
return getSettings(SETTINGS_KEY_DATA_ENABLED)
|
||||
.then(value => {
|
||||
is(value, false, "Data must be off");
|
||||
});
|
||||
|
@ -105,20 +43,12 @@ function testNonDefaultDataConnection() {
|
|||
function doTestNonDefaultDataConnection(type) {
|
||||
log("doTestNonDefaultDataConnection: " + type);
|
||||
|
||||
let typeMapping = {
|
||||
"mms": Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_MMS,
|
||||
"supl": Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_SUPL,
|
||||
"ims": Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_IMS,
|
||||
"dun": Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_DUN
|
||||
};
|
||||
let networkType = typeMapping[type];
|
||||
|
||||
return setupDataCallAndWait(type, networkType)
|
||||
.then(() => deactivateDataCallAndWait(type, networkType));
|
||||
return setupDataCallAndWait(type)
|
||||
.then(() => deactivateDataCallAndWait(type));
|
||||
}
|
||||
|
||||
let currentApn;
|
||||
return getSettings(APN_KEY)
|
||||
return getSettings(SETTINGS_KEY_DATA_APN_SETTINGS)
|
||||
.then(value => {
|
||||
currentApn = value;
|
||||
})
|
||||
|
@ -128,7 +58,7 @@ function testNonDefaultDataConnection() {
|
|||
.then(() => doTestNonDefaultDataConnection("ims"))
|
||||
.then(() => doTestNonDefaultDataConnection("dun"))
|
||||
// Restore APN settings
|
||||
.then(() => setSettings(APN_KEY, currentApn));
|
||||
.then(() => setSettings(SETTINGS_KEY_DATA_APN_SETTINGS, currentApn));
|
||||
}
|
||||
|
||||
// Start test
|
||||
|
|
|
@ -0,0 +1,88 @@
|
|||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
MARIONETTE_TIMEOUT = 60000;
|
||||
MARIONETTE_HEAD_JS = "head.js";
|
||||
|
||||
// Must sync with hardware/ril/reference-ril/reference-ril.c
|
||||
const MAX_DATA_CONTEXTS = 4;
|
||||
|
||||
function setEmulatorAPN() {
|
||||
// Use different apn for each network type.
|
||||
let apn = [[ { "carrier":"T-Mobile US",
|
||||
"apn":"epc1.tmobile.com",
|
||||
"types":["default"] },
|
||||
{ "carrier":"T-Mobile US",
|
||||
"apn":"epc2.tmobile.com",
|
||||
"mmsc":"http://mms.msg.eng.t-mobile.com/mms/wapenc",
|
||||
"types":["mms"] },
|
||||
{ "carrier":"T-Mobile US",
|
||||
"apn":"epc3.tmobile.com",
|
||||
"types":["supl"] },
|
||||
{ "carrier":"T-Mobile US",
|
||||
"apn":"epc4.tmobile.com",
|
||||
"types":["ims"] },
|
||||
{ "carrier":"T-Mobile US",
|
||||
"apn":"epc5.tmobile.com",
|
||||
"types":["dun"] }]];
|
||||
|
||||
return setSettings(SETTINGS_KEY_DATA_APN_SETTINGS, apn);
|
||||
}
|
||||
|
||||
// Test initial State
|
||||
function testInitialState() {
|
||||
log("= testInitialState =");
|
||||
|
||||
// Data should be off before starting any test.
|
||||
return getSettings(SETTINGS_KEY_DATA_ENABLED)
|
||||
.then(value => {
|
||||
is(value, false, "Data must be off");
|
||||
});
|
||||
}
|
||||
|
||||
function testSetupConcurrentDataCalls() {
|
||||
log("= testSetupConcurrentDataCalls =");
|
||||
|
||||
let promise = Promise.resolve();
|
||||
let types = Object.keys(mobileTypeMapping);
|
||||
// Skip default mobile type.
|
||||
for (let i = 1; i < MAX_DATA_CONTEXTS; i++) {
|
||||
let type = types[i];
|
||||
promise = promise.then(() => setupDataCallAndWait(type));
|
||||
}
|
||||
return promise;
|
||||
}
|
||||
|
||||
function testDeactivateConcurrentDataCalls() {
|
||||
log("= testDeactivateConcurrentDataCalls =");
|
||||
|
||||
let promise = Promise.resolve();
|
||||
let types = Object.keys(mobileTypeMapping);
|
||||
// Skip default mobile type.
|
||||
for (let i = 1; i < MAX_DATA_CONTEXTS; i++) {
|
||||
let type = types[i];
|
||||
promise = promise.then(() => deactivateDataCallAndWait(type));
|
||||
}
|
||||
return promise;
|
||||
}
|
||||
|
||||
// Start test
|
||||
startTestBase(function() {
|
||||
|
||||
let origApnSettings;
|
||||
return testInitialState()
|
||||
.then(() => getSettings(SETTINGS_KEY_DATA_APN_SETTINGS))
|
||||
.then(value => {
|
||||
origApnSettings = value;
|
||||
})
|
||||
.then(() => setEmulatorAPN())
|
||||
.then(() => setDataEnabledAndWait(true))
|
||||
.then(() => testSetupConcurrentDataCalls())
|
||||
.then(() => testDeactivateConcurrentDataCalls())
|
||||
.then(() => setDataEnabledAndWait(false))
|
||||
.then(() => {
|
||||
if (origApnSettings) {
|
||||
return setSettings(SETTINGS_KEY_DATA_APN_SETTINGS, origApnSettings);
|
||||
}
|
||||
});
|
||||
});
|
|
@ -4,9 +4,6 @@
|
|||
MARIONETTE_TIMEOUT = 60000;
|
||||
MARIONETTE_HEAD_JS = "head.js";
|
||||
|
||||
const SETTINGS_KEY_DATA_ENABLED = "ril.data.enabled";
|
||||
const TOPIC_NETWORK_ACTIVE_CHANGED = "network-active-changed";
|
||||
|
||||
let networkManager =
|
||||
Cc["@mozilla.org/network/manager;1"].getService(Ci.nsINetworkManager);
|
||||
ok(networkManager,
|
||||
|
|
Загрузка…
Ссылка в новой задаче