diff -r 000000000000 -r 6474c204b198 dom/telephony/test/marionette/test_audiomanager_phonestate.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dom/telephony/test/marionette/test_audiomanager_phonestate.js Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,108 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +MARIONETTE_TIMEOUT = 60000; +MARIONETTE_HEAD_JS = 'head.js'; + +const AUDIO_MANAGER_CONTRACT_ID = "@mozilla.org/telephony/audiomanager;1"; + +// See nsIAudioManager +const PHONE_STATE_INVALID = -2; +const PHONE_STATE_CURRENT = -1; +const PHONE_STATE_NORMAL = 0; +const PHONE_STATE_RINGTONE = 1; +const PHONE_STATE_IN_CALL = 2; +const PHONE_STATE_IN_COMMUNICATION = 3; + +let audioManager; +function checkStates(speakerEnabled, phoneState) { + if (!audioManager) { + audioManager = SpecialPowers.Cc[AUDIO_MANAGER_CONTRACT_ID] + .getService(SpecialPowers.Ci.nsIAudioManager); + ok(audioManager, "nsIAudioManager instance"); + } + + is(telephony.speakerEnabled, speakerEnabled, "telephony.speakerEnabled"); + if (phoneState == PHONE_STATE_CURRENT) { + ok(audioManager.phoneState === PHONE_STATE_CURRENT || + audioManager.phoneState === PHONE_STATE_NORMAL, "audioManager.phoneState"); + } else { + is(audioManager.phoneState, phoneState, "audioManager.phoneState"); + } +} + +function check(phoneStateOrig, phoneStateEnabled, phoneStateDisabled) { + checkStates(false, phoneStateOrig); + + let canEnableSpeaker = arguments.length > 1; + telephony.speakerEnabled = true; + if (canEnableSpeaker) { + checkStates(true, phoneStateEnabled); + } else { + checkStates(false, phoneStateOrig); + return; + } + + telephony.speakerEnabled = false; + checkStates(false, arguments.length > 2 ? phoneStateDisabled : phoneStateOrig); +} + +// Start the test +startTest(function() { + let outNumber = "5555550101"; + let inNumber = "5555550201"; + let outCall; + let inCall; + + Promise.resolve() + .then(() => check(PHONE_STATE_CURRENT, PHONE_STATE_NORMAL, PHONE_STATE_NORMAL)) + + // Dial in + .then(() => gRemoteDial(inNumber)) + .then(call => { inCall = call; }) + // TODO - Bug 948860: should this be {RINGTONE, RINGTONE, RINGTONE}? + // From current UX spec, there is no chance that an user may enable speaker + // during alerting, so basically this 'set speaker enable' action can't + // happen in B2G. + .then(() => check(PHONE_STATE_RINGTONE, PHONE_STATE_NORMAL, PHONE_STATE_NORMAL)) + .then(() => gAnswer(inCall)) + .then(() => check(PHONE_STATE_IN_CALL, PHONE_STATE_IN_CALL)) + // Hang up all + .then(() => gRemoteHangUp(inCall)) + .then(() => check(PHONE_STATE_NORMAL, PHONE_STATE_NORMAL)) + + // Dial out + .then(() => gDial(outNumber)) + .then(call => { outCall = call; }) + .then(() => check(PHONE_STATE_IN_CALL, PHONE_STATE_IN_CALL)) + .then(() => gRemoteAnswer(outCall)) + .then(() => check(PHONE_STATE_IN_CALL, PHONE_STATE_IN_CALL)) + // Hang up all + .then(() => gRemoteHangUp(outCall)) + .then(() => check(PHONE_STATE_NORMAL, PHONE_STATE_NORMAL)) + + // Dial out + .then(() => gDial(outNumber)) + .then(call => { outCall = call; }) + .then(() => check(PHONE_STATE_IN_CALL, PHONE_STATE_IN_CALL)) + .then(() => gRemoteAnswer(outCall)) + .then(() => check(PHONE_STATE_IN_CALL, PHONE_STATE_IN_CALL)) + // Dial out and dial in + .then(() => gRemoteDial(inNumber)) + .then(call => { inCall = call; }) + .then(() => check(PHONE_STATE_IN_CALL, PHONE_STATE_IN_CALL)) + .then(() => gAnswer(inCall)) + .then(() => check(PHONE_STATE_IN_CALL, PHONE_STATE_IN_CALL)) + // Conference + .then(() => gAddCallsToConference([outCall, inCall])) + .then(() => check(PHONE_STATE_IN_CALL, PHONE_STATE_IN_CALL)) + // Hang up all + .then(() => gRemoteHangUpCalls([outCall, inCall])) + .then(() => check(PHONE_STATE_NORMAL, PHONE_STATE_NORMAL)) + + // End + .then(null, error => { + ok(false, 'promise rejects during test.'); + }) + .then(finish); +});