зеркало из https://github.com/mozilla/gecko-dev.git
Bug 889737 - Part 02: Add new test cases. r=vicamo
This commit is contained in:
Родитель
b71a8451e6
Коммит
5e04bfa6bf
|
@ -1302,3 +1302,25 @@ function startDSDSTest(test) {
|
||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function sendMMI(aMmi) {
|
||||||
|
let deferred = Promise.defer();
|
||||||
|
|
||||||
|
telephony.dial(aMmi)
|
||||||
|
.then(request => {
|
||||||
|
ok(request instanceof DOMRequest,
|
||||||
|
"request is instanceof " + request.constructor);
|
||||||
|
|
||||||
|
request.addEventListener("success", function(event) {
|
||||||
|
deferred.resolve(request.result);
|
||||||
|
});
|
||||||
|
|
||||||
|
request.addEventListener("error", function(event) {
|
||||||
|
deferred.reject(request.error);
|
||||||
|
});
|
||||||
|
}, cause => {
|
||||||
|
deferred.reject(cause);
|
||||||
|
});
|
||||||
|
|
||||||
|
return deferred.promise;
|
||||||
|
}
|
||||||
|
|
|
@ -63,5 +63,7 @@ disabled = Bug 821958
|
||||||
[test_incomingcall_phonestate_speaker.js]
|
[test_incomingcall_phonestate_speaker.js]
|
||||||
[test_temporary_clir.js]
|
[test_temporary_clir.js]
|
||||||
[test_outgoing_error_state.js]
|
[test_outgoing_error_state.js]
|
||||||
[test_mmi_code.js]
|
|
||||||
[test_outgoing_auto_hold.js]
|
[test_outgoing_auto_hold.js]
|
||||||
|
[test_mmi.js]
|
||||||
|
[test_mmi_change_pin.js]
|
||||||
|
[test_mmi_call_forwarding.js]
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
/* Any copyright is dedicated to the Public Domain.
|
||||||
|
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||||
|
|
||||||
|
MARIONETTE_TIMEOUT = 60000;
|
||||||
|
MARIONETTE_HEAD_JS = "head.js";
|
||||||
|
|
||||||
|
function testGettingIMEI() {
|
||||||
|
log("Test *#06# ...");
|
||||||
|
|
||||||
|
let MMI_CODE = "*#06#";
|
||||||
|
return sendMMI(MMI_CODE)
|
||||||
|
.then(function resolve(aResult) {
|
||||||
|
ok(true, MMI_CODE + " success");
|
||||||
|
is(aResult.serviceCode, "scImei", "Service code IMEI");
|
||||||
|
// IMEI is hardcoded as "000000000000000".
|
||||||
|
// See it here {B2G_HOME}/external/qemu/telephony/android_modem.c
|
||||||
|
// (The result of +CGSN).
|
||||||
|
is(aResult.statusMessage, "000000000000000", "Emulator IMEI");
|
||||||
|
is(aResult.additionalInformation, undefined, "No additional information");
|
||||||
|
}, function reject() {
|
||||||
|
ok(false, MMI_CODE + " should not fail");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start test
|
||||||
|
startTest(function() {
|
||||||
|
Promise.resolve()
|
||||||
|
.then(() => testGettingIMEI())
|
||||||
|
.then(finish);
|
||||||
|
});
|
|
@ -0,0 +1,221 @@
|
||||||
|
/* Any copyright is dedicated to the Public Domain.
|
||||||
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||||
|
|
||||||
|
MARIONETTE_TIMEOUT = 60000;
|
||||||
|
MARIONETTE_HEAD_JS = "head.js";
|
||||||
|
|
||||||
|
let connection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wait for one named MobileConnection event.
|
||||||
|
*
|
||||||
|
* Resolve if that named event occurs. Never reject.
|
||||||
|
*
|
||||||
|
* Fulfill params: the DOMEvent passed.
|
||||||
|
*
|
||||||
|
* @param aEventName
|
||||||
|
* A string event name.
|
||||||
|
*
|
||||||
|
* @return A deferred promise.
|
||||||
|
*/
|
||||||
|
function waitForManagerEvent(aEventName) {
|
||||||
|
let deferred = Promise.defer();
|
||||||
|
|
||||||
|
connection.addEventListener(aEventName, function onevent(aEvent) {
|
||||||
|
connection.removeEventListener(aEventName, onevent);
|
||||||
|
|
||||||
|
ok(true, "MobileConnection event '" + aEventName + "' got.");
|
||||||
|
deferred.resolve(aEvent);
|
||||||
|
});
|
||||||
|
|
||||||
|
return deferred.promise;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrap DOMRequest onsuccess/onerror events to Promise resolve/reject.
|
||||||
|
*
|
||||||
|
* Fulfill params: A DOMEvent.
|
||||||
|
* Reject params: A DOMEvent.
|
||||||
|
*
|
||||||
|
* @param aRequest
|
||||||
|
* A DOMRequest instance.
|
||||||
|
*
|
||||||
|
* @return A deferred promise.
|
||||||
|
*/
|
||||||
|
function wrapDomRequestAsPromise(aRequest) {
|
||||||
|
let deferred = Promise.defer();
|
||||||
|
|
||||||
|
ok(aRequest instanceof DOMRequest,
|
||||||
|
"aRequest is instanceof " + aRequest.constructor);
|
||||||
|
|
||||||
|
aRequest.addEventListener("success", function(aEvent) {
|
||||||
|
deferred.resolve(aEvent);
|
||||||
|
});
|
||||||
|
aRequest.addEventListener("error", function(aEvent) {
|
||||||
|
deferred.reject(aEvent);
|
||||||
|
});
|
||||||
|
|
||||||
|
return deferred.promise;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures call forward options.
|
||||||
|
*
|
||||||
|
* Fulfill params: (none)
|
||||||
|
* Reject params:
|
||||||
|
* 'RadioNotAvailable', 'RequestNotSupported', 'InvalidParameter', or
|
||||||
|
* 'GenericFailure'.
|
||||||
|
*
|
||||||
|
* @param aOptions
|
||||||
|
* A MozCallForwardingOptions.
|
||||||
|
*
|
||||||
|
* @return A deferred promise.
|
||||||
|
*/
|
||||||
|
function setCallForwardingOption(aOptions) {
|
||||||
|
let request = connection.setCallForwardingOption(aOptions);
|
||||||
|
return wrapDomRequestAsPromise(request)
|
||||||
|
.then(null, () => { throw request.error; });
|
||||||
|
}
|
||||||
|
|
||||||
|
const TEST_DATA = [
|
||||||
|
{
|
||||||
|
reason: MozMobileConnection.CALL_FORWARD_REASON_UNCONDITIONAL,
|
||||||
|
number: "+886912345678",
|
||||||
|
serviceClass: MozMobileConnection.ICC_SERVICE_CLASS_VOICE,
|
||||||
|
timeSeconds: 5
|
||||||
|
}, {
|
||||||
|
reason: MozMobileConnection.CALL_FORWARD_REASON_MOBILE_BUSY,
|
||||||
|
number: "0912345678",
|
||||||
|
serviceClass: MozMobileConnection.ICC_SERVICE_CLASS_VOICE,
|
||||||
|
timeSeconds: 10
|
||||||
|
}, {
|
||||||
|
reason: MozMobileConnection.CALL_FORWARD_REASON_NO_REPLY,
|
||||||
|
number: "+886987654321",
|
||||||
|
serviceClass: MozMobileConnection.ICC_SERVICE_CLASS_VOICE,
|
||||||
|
timeSeconds: 15
|
||||||
|
}, {
|
||||||
|
reason: MozMobileConnection.CALL_FORWARD_REASON_NOT_REACHABLE,
|
||||||
|
number: "+0987654321",
|
||||||
|
serviceClass: MozMobileConnection.ICC_SERVICE_CLASS_VOICE,
|
||||||
|
timeSeconds: 20
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
// Please see TS 22.030 Annex B
|
||||||
|
const CF_REASON_TO_MMI = {
|
||||||
|
/* CALL_FORWARD_REASON_UNCONDITIONAL */
|
||||||
|
0: "21",
|
||||||
|
/* CALL_FORWARD_REASON_MOBILE_BUSY */
|
||||||
|
1: "67",
|
||||||
|
/* CALL_FORWARD_REASON_NO_REPLY */
|
||||||
|
2: "61",
|
||||||
|
/* CALL_FORWARD_REASON_NOT_REACHABLE */
|
||||||
|
3: "62",
|
||||||
|
/* CALL_FORWARD_REASON_ALL_CALL_FORWARDING */
|
||||||
|
4: "002",
|
||||||
|
/* CALL_FORWARD_REASON_ALL_CONDITIONAL_CALL_FORWARDING */
|
||||||
|
5: "004"
|
||||||
|
};
|
||||||
|
|
||||||
|
// Please see TS 22.030 Annex C
|
||||||
|
const SERVICE_CLASS_TO_MMI = {
|
||||||
|
/* ICC_SERVICE_CLASS_VOICE */
|
||||||
|
1: "11"
|
||||||
|
};
|
||||||
|
|
||||||
|
function testSetCallForwarding(aData) {
|
||||||
|
// Registration: **SC*SIA*SIB*SIC#
|
||||||
|
let MMI_CODE = "**" + CF_REASON_TO_MMI[aData.reason] + "*" + aData.number +
|
||||||
|
"*" + SERVICE_CLASS_TO_MMI[aData.serviceClass] +
|
||||||
|
"*" + aData.timeSeconds + "#";
|
||||||
|
log("Test " + MMI_CODE);
|
||||||
|
|
||||||
|
let promises = [];
|
||||||
|
// Check cfstatechange event.
|
||||||
|
promises.push(waitForManagerEvent("cfstatechange").then(function(aEvent) {
|
||||||
|
is(aEvent.success, true, "check success");
|
||||||
|
is(aEvent.action, MozMobileConnection.CALL_FORWARD_ACTION_REGISTRATION,
|
||||||
|
"check action");
|
||||||
|
is(aEvent.reason, aData.reason, "check reason");
|
||||||
|
is(aEvent.number, aData.number, "check number");
|
||||||
|
is(aEvent.timeSeconds, aData.timeSeconds, "check timeSeconds");
|
||||||
|
is(aEvent.serviceClass, aData.serviceClass, "check serviceClass");
|
||||||
|
}));
|
||||||
|
// Check DOMRequest's result.
|
||||||
|
promises.push(sendMMI(MMI_CODE)
|
||||||
|
.then(function resolve(aResult) {
|
||||||
|
is(aResult.serviceCode, "scCallForwarding", "Check service code");
|
||||||
|
is(aResult.statusMessage, "smServiceRegistered", "Check status message");
|
||||||
|
is(aResult.additionalInformation, undefined, "Check additional information");
|
||||||
|
}, function reject(aError) {
|
||||||
|
ok(false, "got '" + aError.name + "' error");
|
||||||
|
}));
|
||||||
|
|
||||||
|
return Promise.all(promises);
|
||||||
|
}
|
||||||
|
|
||||||
|
function testGetCallForwarding(aExpectedData) {
|
||||||
|
// Interrogation: *#SC#
|
||||||
|
let MMI_CODE = "*#" + CF_REASON_TO_MMI[aExpectedData.reason] + "#";
|
||||||
|
log("Test " + MMI_CODE);
|
||||||
|
|
||||||
|
return sendMMI(MMI_CODE)
|
||||||
|
.then(function resolve(aResult) {
|
||||||
|
is(aResult.serviceCode, "scCallForwarding", "Check service code");
|
||||||
|
is(aResult.statusMessage, "smServiceInterrogated", "Check status message");
|
||||||
|
is(Array.isArray(aResult.additionalInformation), true,
|
||||||
|
"additionalInformation should be an array");
|
||||||
|
|
||||||
|
for (let i = 0; i < aResult.additionalInformation.length; i++) {
|
||||||
|
let result = aResult.additionalInformation[i];
|
||||||
|
|
||||||
|
// Only need to check the result containing the serviceClass that we are
|
||||||
|
// interested in.
|
||||||
|
if (!(result.serviceClass & aExpectedData.serviceClass)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
is(result.active, true, "check active");
|
||||||
|
is(result.reason, aExpectedData.reason, "check reason");
|
||||||
|
is(result.number, aExpectedData.number, "check number");
|
||||||
|
is(result.timeSeconds, aExpectedData.timeSeconds, "check timeSeconds");
|
||||||
|
}
|
||||||
|
}, function reject(aError) {
|
||||||
|
ok(false, MMI_CODE + " got error: " + aError.name);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function clearAllCallForwardingSettings() {
|
||||||
|
log("Clear all call forwarding settings");
|
||||||
|
|
||||||
|
let promise = Promise.resolve();
|
||||||
|
for (let reason = MozMobileConnection.CALL_FORWARD_REASON_UNCONDITIONAL;
|
||||||
|
reason <= MozMobileConnection.CALL_FORWARD_REASON_ALL_CONDITIONAL_CALL_FORWARDING;
|
||||||
|
reason++) {
|
||||||
|
let options = {
|
||||||
|
reason: reason,
|
||||||
|
action: MozMobileConnection.CALL_FORWARD_ACTION_ERASURE
|
||||||
|
};
|
||||||
|
// Emulator doesn't support CALL_FORWARD_REASON_ALL_* yet, we catch the
|
||||||
|
// reject here in order to avoid impact the test result.
|
||||||
|
promise =
|
||||||
|
promise.then(() => setCallForwardingOption(options).then(null, () => {}));
|
||||||
|
}
|
||||||
|
return promise;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start tests
|
||||||
|
startTestWithPermissions(['mobileconnection'], function() {
|
||||||
|
connection = navigator.mozMobileConnections[0];
|
||||||
|
|
||||||
|
let promise = Promise.resolve();
|
||||||
|
for (let i = 0; i < TEST_DATA.length; i++) {
|
||||||
|
let data = TEST_DATA[i];
|
||||||
|
promise = promise.then(() => testSetCallForwarding(data))
|
||||||
|
.then(() => testGetCallForwarding(data));
|
||||||
|
}
|
||||||
|
// reset call forwarding settings.
|
||||||
|
return promise.then(null, () => { ok(false, "promise reject during test"); })
|
||||||
|
.then(() => clearAllCallForwardingSettings())
|
||||||
|
.then(finish);
|
||||||
|
});
|
|
@ -0,0 +1,111 @@
|
||||||
|
/* Any copyright is dedicated to the Public Domain.
|
||||||
|
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||||
|
|
||||||
|
MARIONETTE_TIMEOUT = 60000;
|
||||||
|
MARIONETTE_HEAD_JS = "head.js";
|
||||||
|
|
||||||
|
// PIN is hardcoded as "0000" by default.
|
||||||
|
// See it here {B2G_HOME}/external/qemu/telephony/sim_card.c,
|
||||||
|
// in asimcard_create().
|
||||||
|
const TEST_DATA = [
|
||||||
|
// Test passing no pin.
|
||||||
|
{
|
||||||
|
pin: "",
|
||||||
|
newPin: "0000",
|
||||||
|
newPinAgain: "1111",
|
||||||
|
expectedError: {
|
||||||
|
name: "emMmiError",
|
||||||
|
additionalInformation: null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// Test passing no newPin.
|
||||||
|
{
|
||||||
|
pin: "0000",
|
||||||
|
newPin: "",
|
||||||
|
newPinAgain: "",
|
||||||
|
expectedError: {
|
||||||
|
name: "emMmiError",
|
||||||
|
additionalInformation: null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// Test passing mismatched newPin.
|
||||||
|
{
|
||||||
|
pin: "0000",
|
||||||
|
newPin: "0000",
|
||||||
|
newPinAgain: "1111",
|
||||||
|
expectedError: {
|
||||||
|
name: "emMmiErrorMismatchPin",
|
||||||
|
additionalInformation: null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// Test passing invalid pin (< 4 digit).
|
||||||
|
{
|
||||||
|
pin: "000",
|
||||||
|
newPin: "0000",
|
||||||
|
newPinAgain: "0000",
|
||||||
|
expectedError: {
|
||||||
|
name: "emMmiErrorInvalidPin",
|
||||||
|
additionalInformation: null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// Test passing invalid newPin (> 8 digit).
|
||||||
|
{
|
||||||
|
pin: "0000",
|
||||||
|
newPin: "000000000",
|
||||||
|
newPinAgain: "000000000",
|
||||||
|
expectedError: {
|
||||||
|
name: "emMmiErrorInvalidPin",
|
||||||
|
additionalInformation: null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// Test passing incorrect pin.
|
||||||
|
{
|
||||||
|
pin: "1234",
|
||||||
|
newPin: "0000",
|
||||||
|
newPinAgain: "0000",
|
||||||
|
expectedError: {
|
||||||
|
name: "emMmiErrorBadPin",
|
||||||
|
// The default pin retries is 3, failed once becomes to 2
|
||||||
|
additionalInformation: 2
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// Test changing pin successfully (Reset the retries).
|
||||||
|
{
|
||||||
|
pin: "0000",
|
||||||
|
newPin: "0000",
|
||||||
|
newPinAgain: "0000"
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
function testChangePin(aPin, aNewPin, aNewPinAgain, aExpectedError) {
|
||||||
|
let MMI_CODE = "**04*" + aPin + "*" + aNewPin + "*" + aNewPinAgain + "#";
|
||||||
|
log("Test " + MMI_CODE);
|
||||||
|
|
||||||
|
return sendMMI(MMI_CODE)
|
||||||
|
.then(function resolve(aResult) {
|
||||||
|
ok(!aExpectedError, MMI_CODE + " success");
|
||||||
|
is(aResult.serviceCode, "scPin", "Check service code");
|
||||||
|
is(aResult.statusMessage, "smPinChanged", "Check status message");
|
||||||
|
is(aResult.additionalInformation, undefined, "Check additional information");
|
||||||
|
}, function reject(aError) {
|
||||||
|
ok(aExpectedError, MMI_CODE + " fail");
|
||||||
|
is(aError.name, aExpectedError.name, "Check name");
|
||||||
|
is(aError.message, "", "Check message");
|
||||||
|
is(aError.serviceCode, "scPin", "Check service code");
|
||||||
|
is(aError.additionalInformation, aExpectedError.additionalInformation,
|
||||||
|
"Check additional information");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start test
|
||||||
|
startTest(function() {
|
||||||
|
let promise = Promise.resolve();
|
||||||
|
for (let i = 0; i < TEST_DATA.length; i++) {
|
||||||
|
let data = TEST_DATA[i];
|
||||||
|
promise = promise.then(() => testChangePin(data.pin,
|
||||||
|
data.newPin,
|
||||||
|
data.newPinAgain,
|
||||||
|
data.expectedError));
|
||||||
|
}
|
||||||
|
return promise.then(finish);
|
||||||
|
});
|
|
@ -1,23 +0,0 @@
|
||||||
/* Any copyright is dedicated to the Public Domain.
|
|
||||||
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
||||||
|
|
||||||
MARIONETTE_TIMEOUT = 60000;
|
|
||||||
MARIONETTE_HEAD_JS = 'head.js';
|
|
||||||
|
|
||||||
let number = "";
|
|
||||||
|
|
||||||
function dialMMI() {
|
|
||||||
telephony.dial("*#06#").then(null, cause => {
|
|
||||||
log("Received promise 'reject'");
|
|
||||||
|
|
||||||
is(telephony.active, null);
|
|
||||||
is(telephony.calls.length, 0);
|
|
||||||
is(cause, "BadNumberError");
|
|
||||||
|
|
||||||
finish();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
startTest(function() {
|
|
||||||
dialMMI();
|
|
||||||
});
|
|
Загрузка…
Ссылка в новой задаче