TestMediaKeysEventMediaCenter.mm (9266B)
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 #import <MediaPlayer/MediaPlayer.h> 5 6 #include "MediaHardwareKeysEventSourceMacMediaCenter.h" 7 #include "MediaKeyListenerTest.h" 8 #include "gtest/gtest.h" 9 #include "mozilla/TimeStamp.h" 10 #include "nsCocoaUtils.h" 11 #include "prinrval.h" 12 #include "prthread.h" 13 14 using namespace mozilla::dom; 15 using namespace mozilla::widget; 16 17 NS_ASSUME_NONNULL_BEGIN 18 19 TEST(MediaHardwareKeysEventSourceMacMediaCenter, TestMediaCenterPlayPauseEvent) 20 { 21 RefPtr<MediaHardwareKeysEventSourceMacMediaCenter> source = 22 new MediaHardwareKeysEventSourceMacMediaCenter(); 23 24 ASSERT_TRUE(source->GetListenersNum() == 0); 25 26 RefPtr<MediaKeyListenerTest> listener = new MediaKeyListenerTest(); 27 28 MPNowPlayingInfoCenter* center = [MPNowPlayingInfoCenter defaultCenter]; 29 30 source->AddListener(listener.get()); 31 32 ASSERT_TRUE(source->Open()); 33 34 ASSERT_TRUE(source->GetListenersNum() == 1); 35 ASSERT_TRUE(!listener->IsReceivedResult()); 36 ASSERT_TRUE(center.playbackState == MPNowPlayingPlaybackStatePlaying); 37 38 MediaCenterEventHandler playPauseHandler = source->CreatePlayPauseHandler(); 39 playPauseHandler(nil); 40 41 ASSERT_TRUE(center.playbackState == MPNowPlayingPlaybackStatePaused); 42 ASSERT_TRUE(listener->IsKeyEqualTo(MediaControlKey::Playpause)); 43 44 listener->Clear(); // Reset stored media key 45 46 playPauseHandler(nil); 47 48 ASSERT_TRUE(center.playbackState == MPNowPlayingPlaybackStatePlaying); 49 ASSERT_TRUE(listener->IsKeyEqualTo(MediaControlKey::Playpause)); 50 51 MPRemoteCommandCenter* commandCenter = 52 [MPRemoteCommandCenter sharedCommandCenter]; 53 54 ASSERT_TRUE(!commandCenter.togglePlayPauseCommand.enabled); 55 56 source->SetSupportedMediaKeys({MediaControlKey::Playpause}); 57 58 ASSERT_TRUE(commandCenter.togglePlayPauseCommand.enabled); 59 } 60 61 TEST(MediaHardwareKeysEventSourceMacMediaCenter, TestMediaCenterPlayEvent) 62 { 63 RefPtr<MediaHardwareKeysEventSourceMacMediaCenter> source = 64 new MediaHardwareKeysEventSourceMacMediaCenter(); 65 66 ASSERT_TRUE(source->GetListenersNum() == 0); 67 68 RefPtr<MediaKeyListenerTest> listener = new MediaKeyListenerTest(); 69 70 MPNowPlayingInfoCenter* center = [MPNowPlayingInfoCenter defaultCenter]; 71 72 source->AddListener(listener.get()); 73 74 ASSERT_TRUE(source->Open()); 75 76 ASSERT_TRUE(source->GetListenersNum() == 1); 77 ASSERT_TRUE(!listener->IsReceivedResult()); 78 ASSERT_TRUE(center.playbackState == MPNowPlayingPlaybackStatePlaying); 79 80 MediaCenterEventHandler playHandler = source->CreatePlayHandler(); 81 82 center.playbackState = MPNowPlayingPlaybackStatePaused; 83 84 playHandler(nil); 85 86 ASSERT_TRUE(center.playbackState == MPNowPlayingPlaybackStatePlaying); 87 ASSERT_TRUE(listener->IsKeyEqualTo(MediaControlKey::Play)); 88 89 MPRemoteCommandCenter* commandCenter = 90 [MPRemoteCommandCenter sharedCommandCenter]; 91 92 ASSERT_TRUE(!commandCenter.playCommand.enabled); 93 94 source->SetSupportedMediaKeys({MediaControlKey::Play}); 95 96 ASSERT_TRUE(commandCenter.playCommand.enabled); 97 } 98 99 TEST(MediaHardwareKeysEventSourceMacMediaCenter, TestMediaCenterPauseEvent) 100 { 101 RefPtr<MediaHardwareKeysEventSourceMacMediaCenter> source = 102 new MediaHardwareKeysEventSourceMacMediaCenter(); 103 104 ASSERT_TRUE(source->GetListenersNum() == 0); 105 106 RefPtr<MediaKeyListenerTest> listener = new MediaKeyListenerTest(); 107 108 MPNowPlayingInfoCenter* center = [MPNowPlayingInfoCenter defaultCenter]; 109 110 source->AddListener(listener.get()); 111 112 ASSERT_TRUE(source->Open()); 113 114 ASSERT_TRUE(source->GetListenersNum() == 1); 115 ASSERT_TRUE(!listener->IsReceivedResult()); 116 ASSERT_TRUE(center.playbackState == MPNowPlayingPlaybackStatePlaying); 117 118 MediaCenterEventHandler pauseHandler = source->CreatePauseHandler(); 119 120 pauseHandler(nil); 121 122 ASSERT_TRUE(center.playbackState == MPNowPlayingPlaybackStatePaused); 123 ASSERT_TRUE(listener->IsKeyEqualTo(MediaControlKey::Pause)); 124 125 MPRemoteCommandCenter* commandCenter = 126 [MPRemoteCommandCenter sharedCommandCenter]; 127 128 ASSERT_TRUE(!commandCenter.pauseCommand.enabled); 129 130 source->SetSupportedMediaKeys({MediaControlKey::Pause}); 131 132 ASSERT_TRUE(commandCenter.pauseCommand.enabled); 133 } 134 135 TEST(MediaHardwareKeysEventSourceMacMediaCenter, TestMediaCenterPrevNextEvent) 136 { 137 RefPtr<MediaHardwareKeysEventSourceMacMediaCenter> source = 138 new MediaHardwareKeysEventSourceMacMediaCenter(); 139 140 ASSERT_TRUE(source->GetListenersNum() == 0); 141 142 RefPtr<MediaKeyListenerTest> listener = new MediaKeyListenerTest(); 143 144 source->AddListener(listener.get()); 145 146 ASSERT_TRUE(source->Open()); 147 148 MediaCenterEventHandler nextHandler = source->CreateNextTrackHandler(); 149 150 nextHandler(nil); 151 152 ASSERT_TRUE(listener->IsKeyEqualTo(MediaControlKey::Nexttrack)); 153 154 MediaCenterEventHandler previousHandler = 155 source->CreatePreviousTrackHandler(); 156 157 previousHandler(nil); 158 159 ASSERT_TRUE(listener->IsKeyEqualTo(MediaControlKey::Previoustrack)); 160 161 MPRemoteCommandCenter* commandCenter = 162 [MPRemoteCommandCenter sharedCommandCenter]; 163 164 ASSERT_TRUE(!commandCenter.previousTrackCommand.enabled); 165 ASSERT_TRUE(!commandCenter.nextTrackCommand.enabled); 166 167 source->SetSupportedMediaKeys( 168 {MediaControlKey::Previoustrack, MediaControlKey::Nexttrack}); 169 170 ASSERT_TRUE(commandCenter.previousTrackCommand.enabled); 171 ASSERT_TRUE(commandCenter.nextTrackCommand.enabled); 172 } 173 174 @interface MockChangePlaybackPositionCommandEvent : MPRemoteCommandEvent 175 @property(nonatomic, assign) NSTimeInterval positionTime; 176 @end 177 178 @implementation MockChangePlaybackPositionCommandEvent 179 180 - (instancetype)initWithPositionTime:(NSTimeInterval)time { 181 _positionTime = time; 182 return self; 183 } 184 185 @end 186 187 TEST(MediaHardwareKeysEventSourceMacMediaCenter, 188 TestMediaCenterChangePlaybackPositionEvent) 189 { 190 RefPtr<MediaHardwareKeysEventSourceMacMediaCenter> source = 191 new MediaHardwareKeysEventSourceMacMediaCenter(); 192 193 ASSERT_TRUE(source->GetListenersNum() == 0); 194 195 RefPtr<MediaKeyListenerTest> listener = new MediaKeyListenerTest(); 196 197 source->AddListener(listener.get()); 198 199 ASSERT_TRUE(source->Open()); 200 201 MediaCenterEventHandler changePositionHandler = 202 source->CreateChangePlaybackPositionHandler(); 203 204 double seekPosition = 5.0; 205 MockChangePlaybackPositionCommandEvent* event = 206 [[MockChangePlaybackPositionCommandEvent alloc] 207 initWithPositionTime:seekPosition]; 208 changePositionHandler(event); 209 210 ASSERT_TRUE(listener->IsKeyEqualTo(MediaControlKey::Seekto)); 211 mozilla::Maybe<SeekDetails> seekDetails = listener->GetSeekDetails(); 212 ASSERT_TRUE(seekDetails->mAbsolute->mSeekTime == seekPosition); 213 214 MPRemoteCommandCenter* commandCenter = 215 [MPRemoteCommandCenter sharedCommandCenter]; 216 217 ASSERT_TRUE(!commandCenter.changePlaybackPositionCommand.enabled); 218 219 source->SetSupportedMediaKeys({MediaControlKey::Seekto}); 220 221 ASSERT_TRUE(commandCenter.changePlaybackPositionCommand.enabled); 222 } 223 224 TEST(MediaHardwareKeysEventSourceMacMediaCenter, TestSetMetadata) 225 { 226 RefPtr<MediaHardwareKeysEventSourceMacMediaCenter> source = 227 new MediaHardwareKeysEventSourceMacMediaCenter(); 228 229 ASSERT_TRUE(source->GetListenersNum() == 0); 230 231 RefPtr<MediaKeyListenerTest> listener = new MediaKeyListenerTest(); 232 233 source->AddListener(listener.get()); 234 235 ASSERT_TRUE(source->Open()); 236 237 MediaMetadataBase metadata; 238 metadata.mTitle = u"MediaPlayback"; 239 metadata.mArtist = u"Firefox"; 240 metadata.mAlbum = u"Mozilla"; 241 source->SetMediaMetadata(metadata); 242 243 // The update procedure of nowPlayingInfo is async, so wait for a second 244 // before checking the result. 245 PR_Sleep(PR_SecondsToInterval(1)); 246 MPNowPlayingInfoCenter* center = [MPNowPlayingInfoCenter defaultCenter]; 247 ASSERT_TRUE([center.nowPlayingInfo[MPMediaItemPropertyTitle] 248 isEqualToString:@"MediaPlayback"]); 249 ASSERT_TRUE([center.nowPlayingInfo[MPMediaItemPropertyArtist] 250 isEqualToString:@"Firefox"]); 251 ASSERT_TRUE([center.nowPlayingInfo[MPMediaItemPropertyAlbumTitle] 252 isEqualToString:@"Mozilla"]); 253 254 source->Close(); 255 PR_Sleep(PR_SecondsToInterval(1)); 256 ASSERT_TRUE(center.nowPlayingInfo == nil); 257 } 258 259 TEST(MediaHardwareKeysEventSourceMacMediaCenter, TestMediaCenterSetPosition) 260 { 261 RefPtr<MediaHardwareKeysEventSourceMacMediaCenter> source = 262 new MediaHardwareKeysEventSourceMacMediaCenter(); 263 264 ASSERT_TRUE(source->GetListenersNum() == 0); 265 266 RefPtr<MediaKeyListenerTest> listener = new MediaKeyListenerTest(); 267 268 source->AddListener(listener.get()); 269 270 ASSERT_TRUE(source->Open()); 271 272 PositionState positionState; 273 positionState.mDuration = 10.0; 274 positionState.mPlaybackRate = 1.0; 275 positionState.mLastReportedPlaybackPosition = 5.0; 276 positionState.mPositionUpdatedTime = mozilla::TimeStamp::Now(); 277 source->SetPositionState(mozilla::Some(positionState)); 278 279 PR_Sleep(PR_SecondsToInterval(1)); 280 MPNowPlayingInfoCenter* center = [MPNowPlayingInfoCenter defaultCenter]; 281 ASSERT_TRUE([center.nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] 282 isEqualToNumber:@10.0]); 283 ASSERT_TRUE( 284 fabs([center.nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] 285 doubleValue] - 286 5.0) < 0.1); 287 ASSERT_TRUE([center.nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] 288 isEqualToNumber:@1.0]); 289 } 290 291 NS_ASSUME_NONNULL_END