tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 }