michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: #ifdef XP_WIN michael@0: #include michael@0: #else michael@0: #include michael@0: #endif michael@0: michael@0: #include "TestHarness.h" michael@0: michael@0: #include "nsWeakReference.h" michael@0: #include "AudioChannelService.h" michael@0: #include "AudioChannelAgent.h" michael@0: michael@0: #define TEST_ENSURE_BASE(_test, _msg) \ michael@0: PR_BEGIN_MACRO \ michael@0: if (!(_test)) { \ michael@0: fail(_msg); \ michael@0: return NS_ERROR_FAILURE; \ michael@0: } else { \ michael@0: passed(_msg); \ michael@0: } \ michael@0: PR_END_MACRO michael@0: michael@0: using namespace mozilla::dom; michael@0: michael@0: class Agent : public nsIAudioChannelAgentCallback, michael@0: public nsSupportsWeakReference michael@0: { michael@0: public: michael@0: NS_DECL_ISUPPORTS michael@0: michael@0: Agent(AudioChannel aChannel) michael@0: : mChannel(aChannel) michael@0: , mWaitCallback(false) michael@0: , mRegistered(false) michael@0: , mCanPlay(AUDIO_CHANNEL_STATE_MUTED) michael@0: { michael@0: mAgent = do_CreateInstance("@mozilla.org/audiochannelagent;1"); michael@0: } michael@0: michael@0: virtual ~Agent() michael@0: { michael@0: if (mRegistered) { michael@0: StopPlaying(); michael@0: } michael@0: } michael@0: michael@0: nsresult Init(bool video=false) michael@0: { michael@0: nsresult rv = NS_OK; michael@0: if (video) { michael@0: rv = mAgent->InitWithVideo(nullptr, static_cast(mChannel), michael@0: this, true); michael@0: } michael@0: else { michael@0: rv = mAgent->InitWithWeakCallback(nullptr, static_cast(mChannel), michael@0: this); michael@0: } michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: return mAgent->SetVisibilityState(false); michael@0: } michael@0: michael@0: nsresult StartPlaying(AudioChannelState *_ret) michael@0: { michael@0: if (mRegistered) { michael@0: StopPlaying(); michael@0: } michael@0: michael@0: nsresult rv = mAgent->StartPlaying((int32_t *)_ret); michael@0: mRegistered = true; michael@0: return rv; michael@0: } michael@0: michael@0: nsresult StopPlaying() michael@0: { michael@0: mRegistered = false; michael@0: int loop = 0; michael@0: while (mWaitCallback) { michael@0: #ifdef XP_WIN michael@0: Sleep(1000); michael@0: #else michael@0: sleep(1); michael@0: #endif michael@0: if (loop++ == 5) { michael@0: TEST_ENSURE_BASE(false, "StopPlaying timeout"); michael@0: } michael@0: } michael@0: return mAgent->StopPlaying(); michael@0: } michael@0: michael@0: nsresult SetVisibilityState(bool visible) michael@0: { michael@0: if (mRegistered) { michael@0: mWaitCallback = true; michael@0: } michael@0: return mAgent->SetVisibilityState(visible); michael@0: } michael@0: michael@0: NS_IMETHODIMP CanPlayChanged(int32_t canPlay) michael@0: { michael@0: mCanPlay = static_cast(canPlay); michael@0: mWaitCallback = false; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP WindowVolumeChanged() michael@0: { michael@0: return NS_OK; michael@0: } michael@0: michael@0: nsresult GetCanPlay(AudioChannelState *_ret) michael@0: { michael@0: int loop = 0; michael@0: while (mWaitCallback) { michael@0: #ifdef XP_WIN michael@0: Sleep(1000); michael@0: #else michael@0: sleep(1); michael@0: #endif michael@0: if (loop++ == 5) { michael@0: TEST_ENSURE_BASE(false, "GetCanPlay timeout"); michael@0: } michael@0: } michael@0: *_ret = mCanPlay; michael@0: return NS_OK; michael@0: } michael@0: michael@0: nsCOMPtr mAgent; michael@0: AudioChannel mChannel; michael@0: bool mWaitCallback; michael@0: bool mRegistered; michael@0: AudioChannelState mCanPlay; michael@0: }; michael@0: michael@0: NS_IMPL_ISUPPORTS(Agent, nsIAudioChannelAgentCallback, michael@0: nsISupportsWeakReference) michael@0: michael@0: nsresult michael@0: TestDoubleStartPlaying() michael@0: { michael@0: nsRefPtr agent = new Agent(AudioChannel::Normal); michael@0: michael@0: nsresult rv = agent->Init(); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: AudioChannelState playable; michael@0: rv = agent->mAgent->StartPlaying((int32_t *)&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: rv = agent->mAgent->StartPlaying((int32_t *)&playable); michael@0: TEST_ENSURE_BASE(NS_FAILED(rv), michael@0: "Test0: StartPlaying calling twice must return error"); michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: nsresult michael@0: TestOneNormalChannel() michael@0: { michael@0: nsRefPtr agent = new Agent(AudioChannel::Normal); michael@0: nsresult rv = agent->Init(); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: AudioChannelState playable; michael@0: rv = agent->StartPlaying(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_MUTED, michael@0: "Test1: A normal channel unvisible agent must be muted"); michael@0: michael@0: rv = agent->SetVisibilityState(true); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: rv = agent->GetCanPlay(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_NORMAL, michael@0: "Test1: A normal channel visible agent must be playable"); michael@0: michael@0: return rv; michael@0: } michael@0: michael@0: nsresult michael@0: TestTwoNormalChannels() michael@0: { michael@0: nsRefPtr agent1 = new Agent(AudioChannel::Normal); michael@0: nsresult rv = agent1->Init(); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: nsRefPtr agent2 = new Agent(AudioChannel::Normal); michael@0: rv = agent2->Init(); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: AudioChannelState playable; michael@0: rv = agent1->StartPlaying(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_MUTED, michael@0: "Test2: A normal channel unvisible agent1 must be muted"); michael@0: michael@0: rv = agent2->StartPlaying(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_MUTED, michael@0: "Test2: A normal channel unvisible agent2 must be muted"); michael@0: michael@0: rv = agent1->SetVisibilityState(true); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: rv = agent2->SetVisibilityState(true); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: rv = agent1->GetCanPlay(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_NORMAL, michael@0: "Test2: A normal channel visible agent1 must be playable"); michael@0: michael@0: rv = agent2->GetCanPlay(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_NORMAL, michael@0: "Test2: A normal channel visible agent2 must be playable"); michael@0: michael@0: return rv; michael@0: } michael@0: michael@0: nsresult michael@0: TestContentChannels() michael@0: { michael@0: nsRefPtr agent1 = new Agent(AudioChannel::Content); michael@0: nsresult rv = agent1->Init(); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: nsRefPtr agent2 = new Agent(AudioChannel::Content); michael@0: rv = agent2->Init(); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: // All content channels in the foreground can be allowed to play michael@0: rv = agent1->SetVisibilityState(true); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: rv = agent2->SetVisibilityState(true); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: AudioChannelState playable; michael@0: rv = agent1->StartPlaying(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_NORMAL, michael@0: "Test3: A content channel visible agent1 must be playable"); michael@0: michael@0: rv = agent2->StartPlaying(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_NORMAL, michael@0: "Test3: A content channel visible agent2 must be playable"); michael@0: michael@0: // Test the transition state of one content channel tried to set non-visible michael@0: // state first when app is going to background. michael@0: rv = agent1->SetVisibilityState(false); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: rv = agent1->GetCanPlay(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_NORMAL, michael@0: "Test3: A content channel unvisible agent1 must be playable from " michael@0: "foreground to background"); michael@0: michael@0: // Test all content channels set non-visible already michael@0: rv = agent2->SetVisibilityState(false); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: rv = agent2->GetCanPlay(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_NORMAL, michael@0: "Test3: A content channel unvisible agent2 must be playable from " michael@0: "foreground to background"); michael@0: michael@0: // Clear the content channels & mActiveContentChildIDs in AudioChannelService. michael@0: // If agent stop playable in the background, we will reserve it's childID in michael@0: // mActiveContentChildIDs, then it can allow to play next song. So we set agents michael@0: // to foreground first then stopping to play michael@0: rv = agent1->SetVisibilityState(true); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: rv = agent2->SetVisibilityState(true); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: rv = agent1->StopPlaying(); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: rv = agent2->StopPlaying(); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: // Test that content channels can be allow to play when they starts from michael@0: // the background state michael@0: rv = agent1->SetVisibilityState(false); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: rv = agent2->SetVisibilityState(false); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: rv = agent1->StartPlaying(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_NORMAL, michael@0: "Test3: A content channel unvisible agent1 must be playable " michael@0: "from background state"); michael@0: michael@0: rv = agent2->StartPlaying(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_NORMAL, michael@0: "Test3: A content channel unvisible agent2 must be playable " michael@0: "from background state"); michael@0: michael@0: return rv; michael@0: } michael@0: michael@0: nsresult michael@0: TestFadedState() michael@0: { michael@0: nsRefPtr normalAgent = new Agent(AudioChannel::Normal); michael@0: nsresult rv = normalAgent->Init(); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: nsRefPtr contentAgent = new Agent(AudioChannel::Content); michael@0: rv = contentAgent->Init(); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: nsRefPtr notificationAgent = new Agent(AudioChannel::Notification); michael@0: rv = notificationAgent->Init(); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: rv = normalAgent->SetVisibilityState(true); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: rv = contentAgent->SetVisibilityState(true); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: rv = notificationAgent->SetVisibilityState(true); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: AudioChannelState playable; michael@0: rv = normalAgent->StartPlaying(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_NORMAL, michael@0: "Test4: A normal channel visible agent must be playable"); michael@0: michael@0: rv = contentAgent->StartPlaying(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_NORMAL, michael@0: "Test4: A content channel visible agent must be playable"); michael@0: michael@0: rv = notificationAgent->StartPlaying(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_NORMAL, michael@0: "Test4: A notification channel visible agent must be playable"); michael@0: michael@0: rv = contentAgent->GetCanPlay(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_FADED, michael@0: "Test4: A content channel unvisible agent must be faded because of " michael@0: "notification channel is playing"); michael@0: michael@0: rv = contentAgent->SetVisibilityState(false); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: rv = contentAgent->GetCanPlay(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_FADED, michael@0: "Test4: A content channel unvisible agent must be faded because of " michael@0: "notification channel is playing"); michael@0: michael@0: rv = notificationAgent->SetVisibilityState(false); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: rv = notificationAgent->GetCanPlay(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_NORMAL, michael@0: "Test4: A notification channel unvisible agent must be playable from " michael@0: "foreground to background"); michael@0: michael@0: rv = notificationAgent->StopPlaying(); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: rv = contentAgent->GetCanPlay(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_NORMAL, michael@0: "Test4: A content channel unvisible agent must be playable " michael@0: "because of notification channel is stopped"); michael@0: michael@0: rv = contentAgent->SetVisibilityState(true); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: return rv; michael@0: } michael@0: michael@0: nsresult michael@0: TestPriorities() michael@0: { michael@0: nsRefPtr normalAgent = new Agent(AudioChannel::Normal); michael@0: nsresult rv = normalAgent->Init(); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: nsRefPtr contentAgent = new Agent(AudioChannel::Content); michael@0: rv = contentAgent->Init(); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: nsRefPtr notificationAgent = new Agent(AudioChannel::Notification); michael@0: rv = notificationAgent->Init(); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: nsRefPtr alarmAgent = new Agent(AudioChannel::Alarm); michael@0: rv = alarmAgent->Init(); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: nsRefPtr telephonyAgent = new Agent(AudioChannel::Telephony); michael@0: rv = telephonyAgent->Init(); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: nsRefPtr ringerAgent = new Agent(AudioChannel::Ringer); michael@0: rv = ringerAgent->Init(); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: nsRefPtr pNotificationAgent = michael@0: new Agent(AudioChannel::Publicnotification); michael@0: rv = pNotificationAgent->Init(); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: AudioChannelState playable; michael@0: michael@0: rv = normalAgent->StartPlaying(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_MUTED, michael@0: "Test5: A normal channel unvisible agent must be muted"); michael@0: michael@0: rv = contentAgent->StartPlaying(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_NORMAL, michael@0: "Test5: A content channel unvisible agent must be playable while " michael@0: "playing from background state"); michael@0: michael@0: rv = notificationAgent->StartPlaying(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_NORMAL, michael@0: "Test5: A notification channel unvisible agent must be playable"); michael@0: michael@0: rv = alarmAgent->StartPlaying(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_NORMAL, michael@0: "Test5: An alarm channel unvisible agent must be playable"); michael@0: michael@0: rv = notificationAgent->StartPlaying(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_MUTED, michael@0: "Test5: A notification channel unvisible agent must be muted when an " michael@0: "alarm is playing"); michael@0: michael@0: rv = telephonyAgent->StartPlaying(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_NORMAL, michael@0: "Test5: A telephony channel unvisible agent must be playable"); michael@0: michael@0: rv = alarmAgent->StartPlaying(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_MUTED, michael@0: "Test5: An alarm channel unvisible agent must be muted when a telephony " michael@0: "is playing"); michael@0: michael@0: rv = ringerAgent->StartPlaying(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_NORMAL, michael@0: "Test5: A ringer channel unvisible agent must be playable"); michael@0: michael@0: rv = telephonyAgent->StartPlaying(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_MUTED, michael@0: "Test5: A telephony channel unvisible agent must be muted when a ringer " michael@0: "is playing"); michael@0: michael@0: rv = pNotificationAgent->StartPlaying(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_NORMAL, michael@0: "Test5: A pNotification channel unvisible agent must be playable"); michael@0: michael@0: rv = ringerAgent->StartPlaying(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_MUTED, michael@0: "Test5: A ringer channel unvisible agent must be muted when a public " michael@0: "notification is playing"); michael@0: michael@0: // Stop to play notification channel or normal/content will be faded. michael@0: // Which already be tested on Test 4. michael@0: rv = notificationAgent->StopPlaying(); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: // Settings visible the normal channel. michael@0: rv = normalAgent->SetVisibilityState(true); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: rv = normalAgent->GetCanPlay(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_NORMAL, michael@0: "Test5: A normal channel visible agent must be playable"); michael@0: michael@0: // Set the content channel as visible . michael@0: rv = contentAgent->SetVisibilityState(true); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: // Content must be playable because visible. michael@0: rv = contentAgent->GetCanPlay(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_NORMAL, michael@0: "Test5: A content channel visible agent must be playable"); michael@0: michael@0: // Set the alarm channel as visible. michael@0: rv = alarmAgent->SetVisibilityState(true); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: rv = alarmAgent->GetCanPlay(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_NORMAL, michael@0: "Test5: An alarm channel visible agent must be playable"); michael@0: michael@0: // Set the telephony channel as visible. michael@0: rv = telephonyAgent->SetVisibilityState(true); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: rv = telephonyAgent->GetCanPlay(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_NORMAL, michael@0: "Test5: A telephony channel visible agent must be playable"); michael@0: michael@0: // Set the ringer channel as visible. michael@0: rv = ringerAgent->SetVisibilityState(true); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: rv = ringerAgent->GetCanPlay(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_NORMAL, michael@0: "Test5: A ringer channel visible agent must be playable"); michael@0: michael@0: // Set the public notification channel as visible. michael@0: rv = pNotificationAgent->SetVisibilityState(true); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: rv = pNotificationAgent->GetCanPlay(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_NORMAL, michael@0: "Test5: A pNotification channel visible agent must be playable"); michael@0: michael@0: return rv; michael@0: } michael@0: michael@0: nsresult michael@0: TestOneVideoNormalChannel() michael@0: { michael@0: nsRefPtr agent1 = new Agent(AudioChannel::Normal); michael@0: nsresult rv = agent1->Init(true); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: nsRefPtr agent2 = new Agent(AudioChannel::Content); michael@0: rv = agent2->Init(false); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: AudioChannelState playable; michael@0: rv = agent1->StartPlaying(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_MUTED, michael@0: "Test6: A video normal channel invisible agent1 must be muted"); michael@0: michael@0: rv = agent2->StartPlaying(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_NORMAL, michael@0: "Test6: A content channel invisible agent2 must be playable"); michael@0: michael@0: // one video normal channel in foreground and one content channel in background michael@0: rv = agent1->SetVisibilityState(true); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: rv = agent1->GetCanPlay(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_NORMAL, michael@0: "Test6: A video normal channel visible agent1 must be playable"); michael@0: michael@0: rv = agent2->GetCanPlay(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_MUTED, michael@0: "Test6: A content channel invisible agent2 must be muted"); michael@0: michael@0: // both one video normal channel and one content channel in foreground michael@0: rv = agent2->SetVisibilityState(true); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: rv = agent1->GetCanPlay(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_NORMAL, michael@0: "Test6: A video normal channel visible agent1 must be playable"); michael@0: michael@0: rv = agent2->GetCanPlay(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_NORMAL, michael@0: "Test6: A content channel visible agent2 must be playable"); michael@0: michael@0: // one video normal channel in background and one content channel in foreground michael@0: rv = agent1->SetVisibilityState(false); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: rv = agent1->GetCanPlay(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_MUTED, michael@0: "Test6: A video normal channel invisible agent1 must be muted"); michael@0: michael@0: rv = agent2->GetCanPlay(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_NORMAL, michael@0: "Test6: A content channel visible agent2 must be playable"); michael@0: michael@0: // both one video normal channel and one content channel in background michael@0: rv = agent2->SetVisibilityState(false); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: rv = agent1->GetCanPlay(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_MUTED, michael@0: "Test6: A video normal channel invisible agent1 must be muted"); michael@0: michael@0: rv = agent2->GetCanPlay(&playable); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: TEST_ENSURE_BASE(playable == AUDIO_CHANNEL_STATE_NORMAL, michael@0: "Test6: A content channel invisible agent2 must be playable"); michael@0: michael@0: return rv; michael@0: } michael@0: michael@0: int main(int argc, char** argv) michael@0: { michael@0: ScopedXPCOM xpcom("AudioChannelService"); michael@0: if (xpcom.failed()) { michael@0: return 1; michael@0: } michael@0: michael@0: if (NS_FAILED(TestDoubleStartPlaying())) { michael@0: return 1; michael@0: } michael@0: michael@0: if (NS_FAILED(TestOneNormalChannel())) { michael@0: return 1; michael@0: } michael@0: michael@0: if (NS_FAILED(TestTwoNormalChannels())) { michael@0: return 1; michael@0: } michael@0: michael@0: if (NS_FAILED(TestContentChannels())) { michael@0: return 1; michael@0: } michael@0: michael@0: if (NS_FAILED(TestFadedState())) { michael@0: return 1; michael@0: } michael@0: michael@0: // Channel type with AudioChannel::Telephony cannot be unregistered until the michael@0: // main thread has chances to process 1500 millisecond timer. In order to michael@0: // skip ambiguous return value of ChannelsActiveWithHigherPriorityThan(), new michael@0: // test cases are added before any test case that registers the channel type michael@0: // with AudioChannel::Telephony channel. michael@0: if (NS_FAILED(TestOneVideoNormalChannel())) { michael@0: return 1; michael@0: } michael@0: michael@0: if (NS_FAILED(TestPriorities())) { michael@0: return 1; michael@0: } michael@0: michael@0: return 0; michael@0: } michael@0: