TestMediaController.cpp (7260B)
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 "MediaControlService.h" 6 #include "MediaController.h" 7 #include "gtest/gtest.h" 8 #include "mozilla/dom/MediaSessionBinding.h" 9 10 using namespace mozilla::dom; 11 12 #define CONTROLLER_ID 0 13 #define FAKE_CONTEXT_ID 0 14 15 #define FIRST_CONTROLLER_ID 0 16 17 TEST(MediaController, DefaultValueCheck) 18 { 19 RefPtr<MediaController> controller = new MediaController(CONTROLLER_ID); 20 ASSERT_TRUE(!controller->IsAnyMediaBeingControlled()); 21 ASSERT_TRUE(controller->Id() == CONTROLLER_ID); 22 ASSERT_TRUE(controller->PlaybackState() == MediaSessionPlaybackState::None); 23 ASSERT_TRUE(!controller->IsAudible()); 24 } 25 26 TEST(MediaController, IsAnyMediaBeingControlled) 27 { 28 RefPtr<MediaController> controller = new MediaController(CONTROLLER_ID); 29 ASSERT_TRUE(!controller->IsAnyMediaBeingControlled()); 30 31 controller->NotifyMediaPlaybackChanged(FAKE_CONTEXT_ID, 32 MediaPlaybackState::eStarted); 33 ASSERT_TRUE(controller->IsAnyMediaBeingControlled()); 34 35 controller->NotifyMediaPlaybackChanged(FAKE_CONTEXT_ID, 36 MediaPlaybackState::eStarted); 37 ASSERT_TRUE(controller->IsAnyMediaBeingControlled()); 38 39 controller->NotifyMediaPlaybackChanged(FAKE_CONTEXT_ID, 40 MediaPlaybackState::eStopped); 41 ASSERT_TRUE(controller->IsAnyMediaBeingControlled()); 42 43 controller->NotifyMediaPlaybackChanged(FAKE_CONTEXT_ID, 44 MediaPlaybackState::eStopped); 45 ASSERT_TRUE(!controller->IsAnyMediaBeingControlled()); 46 } 47 48 class FakeControlledMedia final { 49 public: 50 explicit FakeControlledMedia(MediaController* aController) 51 : mController(aController) { 52 mController->NotifyMediaPlaybackChanged(FAKE_CONTEXT_ID, 53 MediaPlaybackState::eStarted); 54 } 55 56 void SetPlaying(MediaPlaybackState aState) { 57 if (mPlaybackState == aState) { 58 return; 59 } 60 mController->NotifyMediaPlaybackChanged(FAKE_CONTEXT_ID, aState); 61 mPlaybackState = aState; 62 } 63 64 void SetAudible(MediaAudibleState aState) { 65 if (mAudibleState == aState) { 66 return; 67 } 68 mController->NotifyMediaAudibleChanged(FAKE_CONTEXT_ID, aState); 69 mAudibleState = aState; 70 } 71 72 ~FakeControlledMedia() { 73 if (mPlaybackState == MediaPlaybackState::ePlayed) { 74 mController->NotifyMediaPlaybackChanged(FAKE_CONTEXT_ID, 75 MediaPlaybackState::ePaused); 76 } 77 mController->NotifyMediaPlaybackChanged(FAKE_CONTEXT_ID, 78 MediaPlaybackState::eStopped); 79 } 80 81 private: 82 MediaPlaybackState mPlaybackState = MediaPlaybackState::eStopped; 83 MediaAudibleState mAudibleState = MediaAudibleState::eInaudible; 84 RefPtr<MediaController> mController; 85 }; 86 87 TEST(MediaController, ActiveAndDeactiveController) 88 { 89 RefPtr<MediaControlService> service = MediaControlService::GetService(); 90 ASSERT_TRUE(service->GetActiveControllersNum() == 0); 91 92 RefPtr<MediaController> controller = new MediaController(FIRST_CONTROLLER_ID); 93 94 // In order to check active control number after FakeControlledMedia 95 // destroyed. 96 { 97 FakeControlledMedia fakeMedia(controller); 98 fakeMedia.SetPlaying(MediaPlaybackState::ePlayed); 99 ASSERT_TRUE(service->GetActiveControllersNum() == 1); 100 101 fakeMedia.SetAudible(MediaAudibleState::eAudible); 102 ASSERT_TRUE(service->GetActiveControllersNum() == 1); 103 104 fakeMedia.SetAudible(MediaAudibleState::eInaudible); 105 ASSERT_TRUE(service->GetActiveControllersNum() == 1); 106 } 107 108 ASSERT_TRUE(service->GetActiveControllersNum() == 0); 109 } 110 111 TEST(MediaController, AudibleChanged) 112 { 113 RefPtr<MediaController> controller = new MediaController(CONTROLLER_ID); 114 115 FakeControlledMedia fakeMedia(controller); 116 fakeMedia.SetPlaying(MediaPlaybackState::ePlayed); 117 ASSERT_TRUE(!controller->IsAudible()); 118 119 fakeMedia.SetAudible(MediaAudibleState::eAudible); 120 ASSERT_TRUE(controller->IsAudible()); 121 122 fakeMedia.SetAudible(MediaAudibleState::eInaudible); 123 ASSERT_TRUE(!controller->IsAudible()); 124 } 125 126 TEST(MediaController, PlayingStateChangeViaControlledMedia) 127 { 128 RefPtr<MediaController> controller = new MediaController(CONTROLLER_ID); 129 130 // In order to check playing state after FakeControlledMedia destroyed. 131 { 132 FakeControlledMedia foo(controller); 133 ASSERT_TRUE(controller->PlaybackState() == MediaSessionPlaybackState::None); 134 135 foo.SetPlaying(MediaPlaybackState::ePlayed); 136 ASSERT_TRUE(controller->PlaybackState() == 137 MediaSessionPlaybackState::Playing); 138 139 foo.SetPlaying(MediaPlaybackState::ePaused); 140 ASSERT_TRUE(controller->PlaybackState() == 141 MediaSessionPlaybackState::Paused); 142 143 foo.SetPlaying(MediaPlaybackState::ePlayed); 144 ASSERT_TRUE(controller->PlaybackState() == 145 MediaSessionPlaybackState::Playing); 146 } 147 148 // FakeControlledMedia has been destroyed, no playing media exists. 149 ASSERT_TRUE(controller->PlaybackState() == MediaSessionPlaybackState::Paused); 150 } 151 152 TEST(MediaController, ControllerShouldRemainPlayingIfAnyPlayingMediaExists) 153 { 154 RefPtr<MediaController> controller = new MediaController(CONTROLLER_ID); 155 156 { 157 FakeControlledMedia foo(controller); 158 ASSERT_TRUE(controller->PlaybackState() == MediaSessionPlaybackState::None); 159 160 foo.SetPlaying(MediaPlaybackState::ePlayed); 161 ASSERT_TRUE(controller->PlaybackState() == 162 MediaSessionPlaybackState::Playing); 163 164 // foo is playing, so controller is in `playing` state. 165 FakeControlledMedia bar(controller); 166 ASSERT_TRUE(controller->PlaybackState() == 167 MediaSessionPlaybackState::Playing); 168 169 bar.SetPlaying(MediaPlaybackState::ePlayed); 170 ASSERT_TRUE(controller->PlaybackState() == 171 MediaSessionPlaybackState::Playing); 172 173 // Although we paused bar, but foo is still playing, so the controller would 174 // still be in `playing`. 175 bar.SetPlaying(MediaPlaybackState::ePaused); 176 ASSERT_TRUE(controller->PlaybackState() == 177 MediaSessionPlaybackState::Playing); 178 179 foo.SetPlaying(MediaPlaybackState::ePaused); 180 ASSERT_TRUE(controller->PlaybackState() == 181 MediaSessionPlaybackState::Paused); 182 } 183 184 // both foo and bar have been destroyed, no playing media exists. 185 ASSERT_TRUE(controller->PlaybackState() == MediaSessionPlaybackState::Paused); 186 } 187 188 TEST(MediaController, PictureInPictureModeOrFullscreen) 189 { 190 RefPtr<MediaController> controller = new MediaController(CONTROLLER_ID); 191 ASSERT_TRUE(!controller->IsBeingUsedInPIPModeOrFullscreen()); 192 193 controller->SetIsInPictureInPictureMode(FAKE_CONTEXT_ID, true); 194 ASSERT_TRUE(controller->IsBeingUsedInPIPModeOrFullscreen()); 195 196 controller->SetIsInPictureInPictureMode(FAKE_CONTEXT_ID, false); 197 ASSERT_TRUE(!controller->IsBeingUsedInPIPModeOrFullscreen()); 198 199 controller->NotifyMediaFullScreenState(FAKE_CONTEXT_ID, true); 200 ASSERT_TRUE(controller->IsBeingUsedInPIPModeOrFullscreen()); 201 202 controller->NotifyMediaFullScreenState(FAKE_CONTEXT_ID, false); 203 ASSERT_TRUE(!controller->IsBeingUsedInPIPModeOrFullscreen()); 204 }