TestAudioFocusManager.cpp (5191B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 #include "AudioFocusManager.h" 6 #include "MediaControlService.h" 7 #include "gtest/gtest.h" 8 #include "mozilla/Preferences.h" 9 10 using namespace mozilla::dom; 11 12 #define FIRST_CONTROLLER_ID 0 13 #define SECOND_CONTROLLER_ID 1 14 15 // This RAII class is used to set the audio focus management pref within a test 16 // and automatically revert the change when a test ends, in order not to 17 // interfere other tests unexpectedly. 18 class AudioFocusManagmentPrefSetterRAII { 19 public: 20 explicit AudioFocusManagmentPrefSetterRAII(bool aPrefValue) { 21 mOriginalValue = mozilla::Preferences::GetBool(mPrefName, false); 22 mozilla::Preferences::SetBool(mPrefName, aPrefValue); 23 } 24 ~AudioFocusManagmentPrefSetterRAII() { 25 mozilla::Preferences::SetBool(mPrefName, mOriginalValue); 26 } 27 28 private: 29 const char* mPrefName = "media.audioFocus.management"; 30 bool mOriginalValue; 31 }; 32 33 TEST(AudioFocusManager, TestRequestAudioFocus) 34 { 35 AudioFocusManager manager; 36 ASSERT_TRUE(manager.GetAudioFocusNums() == 0); 37 38 RefPtr<MediaController> controller = new MediaController(FIRST_CONTROLLER_ID); 39 40 manager.RequestAudioFocus(controller); 41 ASSERT_TRUE(manager.GetAudioFocusNums() == 1); 42 43 manager.RevokeAudioFocus(controller); 44 ASSERT_TRUE(manager.GetAudioFocusNums() == 0); 45 } 46 47 TEST(AudioFocusManager, TestAudioFocusNumsWhenEnableAudioFocusManagement) 48 { 49 // When enabling audio focus management, we only allow one controller owing 50 // audio focus at a time when the audio competing occurs. As the mechanism of 51 // handling the audio competing involves multiple components, we can't test it 52 // simply by using the APIs from AudioFocusManager. 53 AudioFocusManagmentPrefSetterRAII prefSetter(true); 54 55 AudioFocusManager manager; 56 ASSERT_TRUE(manager.GetAudioFocusNums() == 0); 57 58 RefPtr<MediaController> controller1 = 59 new MediaController(FIRST_CONTROLLER_ID); 60 61 RefPtr<MediaController> controller2 = 62 new MediaController(SECOND_CONTROLLER_ID); 63 64 manager.RequestAudioFocus(controller1); 65 ASSERT_TRUE(manager.GetAudioFocusNums() == 1); 66 67 // When controller2 starts, it would win the audio focus from controller1. So 68 // only one audio focus would exist. 69 manager.RequestAudioFocus(controller2); 70 ASSERT_TRUE(manager.GetAudioFocusNums() == 1); 71 72 manager.RevokeAudioFocus(controller2); 73 ASSERT_TRUE(manager.GetAudioFocusNums() == 0); 74 } 75 76 TEST(AudioFocusManager, TestAudioFocusNumsWhenDisableAudioFocusManagement) 77 { 78 // When disabling audio focus management, we won't handle the audio competing, 79 // so we allow multiple audio focus existing at the same time. 80 AudioFocusManagmentPrefSetterRAII prefSetter(false); 81 82 AudioFocusManager manager; 83 ASSERT_TRUE(manager.GetAudioFocusNums() == 0); 84 85 RefPtr<MediaController> controller1 = 86 new MediaController(FIRST_CONTROLLER_ID); 87 88 RefPtr<MediaController> controller2 = 89 new MediaController(SECOND_CONTROLLER_ID); 90 91 manager.RequestAudioFocus(controller1); 92 ASSERT_TRUE(manager.GetAudioFocusNums() == 1); 93 94 manager.RequestAudioFocus(controller2); 95 ASSERT_TRUE(manager.GetAudioFocusNums() == 2); 96 97 manager.RevokeAudioFocus(controller1); 98 ASSERT_TRUE(manager.GetAudioFocusNums() == 1); 99 100 manager.RevokeAudioFocus(controller2); 101 ASSERT_TRUE(manager.GetAudioFocusNums() == 0); 102 } 103 104 TEST(AudioFocusManager, TestRequestAudioFocusRepeatedly) 105 { 106 AudioFocusManager manager; 107 ASSERT_TRUE(manager.GetAudioFocusNums() == 0); 108 109 RefPtr<MediaController> controller = new MediaController(FIRST_CONTROLLER_ID); 110 111 manager.RequestAudioFocus(controller); 112 ASSERT_TRUE(manager.GetAudioFocusNums() == 1); 113 114 manager.RequestAudioFocus(controller); 115 ASSERT_TRUE(manager.GetAudioFocusNums() == 1); 116 } 117 118 TEST(AudioFocusManager, TestRevokeAudioFocusRepeatedly) 119 { 120 AudioFocusManager manager; 121 ASSERT_TRUE(manager.GetAudioFocusNums() == 0); 122 123 RefPtr<MediaController> controller = new MediaController(FIRST_CONTROLLER_ID); 124 125 manager.RequestAudioFocus(controller); 126 ASSERT_TRUE(manager.GetAudioFocusNums() == 1); 127 128 manager.RevokeAudioFocus(controller); 129 ASSERT_TRUE(manager.GetAudioFocusNums() == 0); 130 131 manager.RevokeAudioFocus(controller); 132 ASSERT_TRUE(manager.GetAudioFocusNums() == 0); 133 } 134 135 TEST(AudioFocusManager, TestRevokeAudioFocusWithoutRequestAudioFocus) 136 { 137 AudioFocusManager manager; 138 ASSERT_TRUE(manager.GetAudioFocusNums() == 0); 139 140 RefPtr<MediaController> controller = new MediaController(FIRST_CONTROLLER_ID); 141 142 manager.RevokeAudioFocus(controller); 143 ASSERT_TRUE(manager.GetAudioFocusNums() == 0); 144 } 145 146 TEST(AudioFocusManager, 147 TestRevokeAudioFocusForControllerWithoutOwningAudioFocus) 148 { 149 AudioFocusManager manager; 150 ASSERT_TRUE(manager.GetAudioFocusNums() == 0); 151 152 RefPtr<MediaController> controller1 = 153 new MediaController(FIRST_CONTROLLER_ID); 154 155 RefPtr<MediaController> controller2 = 156 new MediaController(SECOND_CONTROLLER_ID); 157 158 manager.RequestAudioFocus(controller1); 159 ASSERT_TRUE(manager.GetAudioFocusNums() == 1); 160 161 manager.RevokeAudioFocus(controller2); 162 ASSERT_TRUE(manager.GetAudioFocusNums() == 1); 163 }