From 5fd4290a596e932c7610a2bc0573d120617f74bb Mon Sep 17 00:00:00 2001 From: "Szu-Yu Chen [:aknow]" Date: Thu, 5 Dec 2013 09:29:08 -0500 Subject: [PATCH] Bug 931697 - Add multisim telephony test. r=hsinyi --- dom/telephony/test/marionette/head.js | 37 ++- dom/telephony/test/marionette/manifest.ini | 1 + .../test/marionette/test_dsds_normal_call.js | 243 ++++++++++++++++++ 3 files changed, 271 insertions(+), 10 deletions(-) create mode 100644 dom/telephony/test/marionette/test_dsds_normal_call.js diff --git a/dom/telephony/test/marionette/head.js b/dom/telephony/test/marionette/head.js index 683bc74272c3..d49a64dc1042 100644 --- a/dom/telephony/test/marionette/head.js +++ b/dom/telephony/test/marionette/head.js @@ -53,10 +53,10 @@ let emulator = (function() { (function() { function checkInitialState() { log("Verify initial state."); - ok(telephony, 'telephony'); - is(telephony.active, null, 'telephony.active'); - ok(telephony.calls, 'telephony.calls'); - is(telephony.calls.length, 0, 'telephony.calls.length'); + ok(telephony, "telephony"); + is(telephony.active, null, "telephony.active"); + ok(telephony.calls, "telephony.calls"); + is(telephony.calls.length, 0, "telephony.calls.length"); } /** @@ -104,7 +104,7 @@ function _startTest(permissions, test) { } function setUp() { - log('== Test SetUp =='); + log("== Test SetUp =="); permissionSetUp(); // Make sure that we get the telephony after adding permission. telephony = window.navigator.mozTelephony; @@ -117,7 +117,7 @@ function _startTest(permissions, test) { let originalFinish = finish; function tearDown() { - log('== Test TearDown =='); + log("== Test TearDown =="); emulator.waitFinish() .then(permissionTearDown) .then(function() { @@ -131,11 +131,11 @@ function _startTest(permissions, test) { function mainTest() { setUp() .then(function onSuccess() { - log('== Test Start =='); + log("== Test Start =="); test(); }, function onError(error) { SpecialPowers.Cu.reportError(error); - ok(false, 'SetUp error'); + ok(false, "SetUp error"); }); } @@ -143,9 +143,26 @@ function _startTest(permissions, test) { } function startTest(test) { - _startTest(['telephony'], test); + _startTest(["telephony"], test); } function startTestWithPermissions(permissions, test) { - _startTest(permissions.concat('telephony'), test); + _startTest(permissions.concat("telephony"), test); +} + +function startDSDSTest(test) { + let numRIL; + try { + numRIL = SpecialPowers.getIntPref("ril.numRadioInterfaces"); + } catch (ex) { + numRIL = 1; // Pref not set. + } + + if (numRIL > 1) { + startTest(test); + } else { + log("Not a DSDS environment. Test is skipped."); + ok(true); // We should run at least one test. + finish(); + } } diff --git a/dom/telephony/test/marionette/manifest.ini b/dom/telephony/test/marionette/manifest.ini index 09ad092ce5c3..6725296d2c94 100644 --- a/dom/telephony/test/marionette/manifest.ini +++ b/dom/telephony/test/marionette/manifest.ini @@ -45,3 +45,4 @@ disabled = Bug 821958 [test_conference.js] [test_dsds_default_service_id.js] [test_call_mute.js] +[test_dsds_normal_call.js] diff --git a/dom/telephony/test/marionette/test_dsds_normal_call.js b/dom/telephony/test/marionette/test_dsds_normal_call.js new file mode 100644 index 000000000000..b9476388a823 --- /dev/null +++ b/dom/telephony/test/marionette/test_dsds_normal_call.js @@ -0,0 +1,243 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +MARIONETTE_TIMEOUT = 60000; +MARIONETTE_HEAD_JS = 'head.js'; + +/** + * The functions are created to provide the string format of the emulator call + * list results. + * + * Usage: + * let outInfo = OutCallStrPool("911"); + * outInfo.ringing == "outbound to 911 : ringing" + * outInfo.active == "outbound to 911 : active" + */ +function CallStrPool(prefix, number) { + let padding = " : "; + let numberInfo = prefix + number + padding.substr(number.length); + + let info = {}; + let states = ["ringing", "incoming", "active", "held"]; + for (let state of states) { + info[state] = numberInfo + state; + } + + return info; +} + +function OutCallStrPool(number) { + return CallStrPool("outbound to ", number); +} + +function InCallStrPool(number) { + return CallStrPool("inbound from ", number); +} + +function checkEventCallState(event, call, state) { + is(call, event.call, "event.call"); + is(call.state, state, "call state"); +} + +function checkTelephonyActiveAndCalls(active, calls) { + is(telephony.active, active, "telephony.active"); + is(telephony.calls.length, calls.length, "telephony.calls"); + for (let i = 0; i < calls.length; ++i) { + is(telephony.calls[i], calls[i]); + } +} + +function checkEmulatorCallList(expectedCallList) { + let deferred = Promise.defer(); + + emulator.run("gsm list", function(result) { + log("Call list is now: " + result); + for (let i = 0; i < expectedCallList.length; ++i) { + is(result[i], expectedCallList[i], "emulator calllist"); + } + is(result[expectedCallList.length], "OK", "emulator calllist"); + deferred.resolve(); + }); + + return deferred.promise; +} + +// Promise. +function checkAll(active, calls, callList) { + checkTelephonyActiveAndCalls(active, calls); + return checkEmulatorCallList(callList); +} + +function dial(number, serviceId) { + serviceId = typeof serviceId !== "undefined" ? serviceId : 0; + log("Make an outgoing call: " + number + ", serviceId: " + serviceId); + + let deferred = Promise.defer(); + let call = telephony.dial(number, serviceId); + + ok(call); + is(call.number, number); + is(call.state, "dialing"); + + call.onalerting = function onalerting(event) { + call.onalerting = null; + log("Received 'onalerting' call event."); + is(call.serviceId, serviceId); + checkEventCallState(event, call, "alerting"); + deferred.resolve(call); + }; + + return deferred.promise; +} + +function remoteDial(number) { + log("Simulating an incoming call."); + + let deferred = Promise.defer(); + + telephony.onincoming = function onincoming(event) { + log("Received 'incoming' call event."); + telephony.onimcoming = null; + + let call = event.call; + + ok(call); + is(call.number, number); + is(call.state, "incoming"); + + deferred.resolve(call); + }; + emulator.run("gsm call " + number); + + return deferred.promise; +} + +function answer(call) { + log("Answering the incoming call."); + + let deferred = Promise.defer(); + + call.onconnecting = function onconnectingIn(event) { + log("Received 'connecting' call event for incoming call."); + call.onconnecting = null; + checkEventCallState(event, call, "connecting"); + }; + + call.onconnected = function onconnectedIn(event) { + log("Received 'connected' call event for incoming call."); + call.onconnected = null; + checkEventCallState(event, call, "connected"); + ok(!call.onconnecting); + deferred.resolve(call); + }; + call.answer(); + + return deferred.promise; +} + +function remoteAnswer(call) { + log("Remote answering the call."); + + let deferred = Promise.defer(); + + call.onconnected = function onconnected(event) { + log("Received 'connected' call event."); + call.onconnected = null; + checkEventCallState(event, call, "connected"); + deferred.resolve(call); + }; + emulator.run("gsm accept " + call.number); + + return deferred.promise; +} + +function remoteHangUp(call) { + log("Remote hanging up the call."); + + let deferred = Promise.defer(); + + call.ondisconnected = function ondisconnected(event) { + log("Received 'disconnected' call event."); + call.ondisconnected = null; + checkEventCallState(event, call, "disconnected"); + deferred.resolve(call); + }; + emulator.run("gsm cancel " + call.number); + + return deferred.promise; +} + +function muxModem(id) { + let deferred = Promise.defer(); + + emulator.run("mux modem " + id, function() { + deferred.resolve(); + }); + + return deferred.promise; +} + +function testOutgoingCallForServiceId(number, serviceId) { + let outCall; + let outInfo = OutCallStrPool(number); + + return Promise.resolve() + .then(() => dial(number, serviceId)) + .then(call => { + outCall = call; + is(outCall.serviceId, serviceId); + }) + .then(() => checkAll(outCall, [outCall], [outInfo.ringing])) + .then(() => remoteAnswer(outCall)) + .then(() => checkAll(outCall, [outCall], [outInfo.active])) + .then(() => remoteHangUp(outCall)) + .then(() => checkAll(null, [], [])); +} + +function testIncomingCallForServiceId(number, serviceId) { + let inCall; + let inInfo = InCallStrPool(number); + + return Promise.resolve() + .then(() => remoteDial(number)) + .then(call => { + inCall = call; + is(inCall.serviceId, serviceId); + }) + .then(() => checkAll(null, [inCall], [inInfo.incoming])) + .then(() => answer(inCall)) + .then(() => checkAll(inCall, [inCall], [inInfo.active])) + .then(() => remoteHangUp(inCall)) + .then(() => checkAll(null, [], [])); +} + +function testOutgoingCall() { + log("= testOutgoingCall ="); + + return Promise.resolve() + .then(() => muxModem(0)) + .then(() => testOutgoingCallForServiceId("0912345000", 0)) + .then(() => muxModem(1)) + .then(() => testOutgoingCallForServiceId("0912345001", 1)) + .then(() => muxModem(0)); +} + +function testIncomingCall() { + log("= testIncomingCall ="); + + return Promise.resolve() + .then(() => muxModem(0)) + .then(() => testIncomingCallForServiceId("0912345000", 0)) + .then(() => muxModem(1)) + .then(() => testIncomingCallForServiceId("0912345001", 1)) + .then(() => muxModem(0)); +} + +startDSDSTest(function() { + testOutgoingCall() + .then(testIncomingCall) + .then(null, () => { + ok(false, "promise rejects during test."); + }) + .then(finish); +});