Bug 821578 - Add Marionette test for data call with multiple APN. f=edgar, r=hsinyi

This commit is contained in:
Jessica Jong 2014-06-06 19:15:00 -04:00
parent c8ca0853e5
commit 9b4e51b7f3
5 changed files with 205 additions and 79 deletions

View File

@ -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.
*

View File

@ -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]

View File

@ -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

View File

@ -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);
}
});
});

View File

@ -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,