cast_media_blocker_unittest.cc 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. // Copyright 2016 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "chromecast/browser/cast_media_blocker.h"
  5. #include <memory>
  6. #include <utility>
  7. #include "base/time/time.h"
  8. #include "content/public/browser/media_session.h"
  9. #include "content/public/browser/web_contents.h"
  10. #include "content/public/test/test_content_client_initializer.h"
  11. #include "content/public/test/test_renderer_host.h"
  12. #include "testing/gmock/include/gmock/gmock.h"
  13. #include "testing/gtest/include/gtest/gtest.h"
  14. #include "ui/gl/test/gl_surface_test_support.h"
  15. namespace chromecast {
  16. namespace shell {
  17. using ::testing::_;
  18. using ::testing::Invoke;
  19. namespace {
  20. class MockMediaSession : public content::MediaSession {
  21. public:
  22. MockMediaSession() {}
  23. MockMediaSession(const MockMediaSession&) = delete;
  24. MockMediaSession& operator=(const MockMediaSession&) = delete;
  25. ~MockMediaSession() override {}
  26. MOCK_METHOD1(Resume, void(content::MediaSession::SuspendType));
  27. MOCK_METHOD1(Suspend, void(content::MediaSession::SuspendType));
  28. MOCK_METHOD1(Stop, void(content::MediaSession::SuspendType));
  29. MOCK_METHOD1(Seek, void(base::TimeDelta));
  30. MOCK_METHOD0(StartDucking, void());
  31. MOCK_METHOD0(StopDucking, void());
  32. MOCK_METHOD1(SetDuckingVolumeMultiplier, void(double));
  33. MOCK_METHOD1(DidReceiveAction,
  34. void(media_session::mojom::MediaSessionAction));
  35. MOCK_METHOD1(
  36. AddObserver,
  37. void(mojo::PendingRemote<media_session::mojom::MediaSessionObserver>));
  38. MOCK_METHOD1(GetMediaSessionInfo, void(GetMediaSessionInfoCallback));
  39. MOCK_METHOD1(GetDebugInfo, void(GetDebugInfoCallback));
  40. MOCK_METHOD0(PreviousTrack, void());
  41. MOCK_METHOD0(NextTrack, void());
  42. MOCK_METHOD0(SkipAd, void());
  43. MOCK_METHOD1(SetAudioFocusGroupId, void(const base::UnguessableToken&));
  44. MOCK_METHOD4(GetMediaImageBitmap,
  45. void(const media_session::MediaImage&,
  46. int minimum_size_px,
  47. int desired_size_px,
  48. GetMediaImageBitmapCallback callback));
  49. MOCK_METHOD1(SeekTo, void(base::TimeDelta));
  50. MOCK_METHOD1(ScrubTo, void(base::TimeDelta));
  51. MOCK_METHOD0(EnterPictureInPicture, void());
  52. MOCK_METHOD0(ExitPictureInPicture, void());
  53. MOCK_METHOD1(SetAudioSinkId, void(const absl::optional<std::string>& id));
  54. MOCK_METHOD0(ToggleMicrophone, void());
  55. MOCK_METHOD0(ToggleCamera, void());
  56. MOCK_METHOD0(HangUp, void());
  57. MOCK_METHOD0(Raise, void());
  58. MOCK_METHOD1(SetMute, void(bool));
  59. };
  60. } // namespace
  61. class CastMediaBlockerTest : public content::RenderViewHostTestHarness {
  62. public:
  63. CastMediaBlockerTest() {}
  64. CastMediaBlockerTest(const CastMediaBlockerTest&) = delete;
  65. CastMediaBlockerTest& operator=(const CastMediaBlockerTest&) = delete;
  66. ~CastMediaBlockerTest() override {}
  67. void SetUp() override {
  68. gl::GLSurfaceTestSupport::InitializeOneOff();
  69. initializer_ = std::make_unique<content::TestContentClientInitializer>();
  70. content::RenderViewHostTestHarness::SetUp();
  71. web_contents_ = CreateTestWebContents();
  72. media_session_ = std::make_unique<MockMediaSession>();
  73. media_blocker_ = std::make_unique<CastMediaBlocker>(web_contents_.get());
  74. media_blocker_->SetMediaSessionForTesting(media_session_.get());
  75. }
  76. void MediaSessionChanged(bool controllable, bool suspended) {
  77. media_session::mojom::MediaSessionInfoPtr session_info(
  78. media_session::mojom::MediaSessionInfo::New());
  79. session_info->is_controllable = controllable;
  80. session_info->playback_state =
  81. suspended ? media_session::mojom::MediaPlaybackState::kPaused
  82. : media_session::mojom::MediaPlaybackState::kPlaying;
  83. media_blocker_->MediaSessionInfoChanged(std::move(session_info));
  84. }
  85. void TearDown() override {
  86. media_blocker_.reset();
  87. web_contents_.reset();
  88. content::RenderViewHostTestHarness::TearDown();
  89. }
  90. protected:
  91. std::unique_ptr<content::TestContentClientInitializer> initializer_;
  92. std::unique_ptr<MockMediaSession> media_session_;
  93. std::unique_ptr<CastMediaBlocker> media_blocker_;
  94. std::unique_ptr<content::WebContents> web_contents_;
  95. };
  96. TEST_F(CastMediaBlockerTest, Block_Unblock_Suspended) {
  97. // Testing block/unblock operations do nothing if media never plays.
  98. EXPECT_CALL(*media_session_, Suspend(_)).Times(0);
  99. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  100. media_blocker_->BlockMediaLoading(true);
  101. media_blocker_->BlockMediaLoading(false);
  102. MediaSessionChanged(true, true);
  103. media_blocker_->BlockMediaLoading(true);
  104. media_blocker_->BlockMediaLoading(false);
  105. media_blocker_->BlockMediaLoading(true);
  106. MediaSessionChanged(false, true);
  107. media_blocker_->BlockMediaLoading(false);
  108. }
  109. TEST_F(CastMediaBlockerTest, No_Block) {
  110. // Tests CastMediaBlocker does nothing if block/unblock is not called.
  111. EXPECT_CALL(*media_session_, Suspend(_)).Times(0);
  112. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  113. // Media becomes controllable/uncontrollable.
  114. MediaSessionChanged(true, true);
  115. MediaSessionChanged(false, true);
  116. // Media starts and stops.
  117. MediaSessionChanged(false, false);
  118. MediaSessionChanged(false, true);
  119. // Media starts, changes controllability and stops.
  120. MediaSessionChanged(false, false);
  121. MediaSessionChanged(true, false);
  122. MediaSessionChanged(false, false);
  123. MediaSessionChanged(false, true);
  124. // Media starts, changes controllability and stops.
  125. MediaSessionChanged(false, false);
  126. MediaSessionChanged(true, false);
  127. MediaSessionChanged(true, true);
  128. }
  129. TEST_F(CastMediaBlockerTest, Block_Before_Controllable) {
  130. // Tests CastMediaBlocker only suspends when controllable.
  131. EXPECT_CALL(*media_session_, Suspend(_)).Times(0);
  132. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  133. media_blocker_->BlockMediaLoading(true);
  134. testing::Mock::VerifyAndClearExpectations(media_session_.get());
  135. // Session becomes controllable
  136. EXPECT_CALL(*media_session_, Suspend(_)).Times(1);
  137. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  138. MediaSessionChanged(true, false);
  139. }
  140. TEST_F(CastMediaBlockerTest, Block_After_Controllable) {
  141. // Tests CastMediaBlocker suspends immediately on block if controllable.
  142. EXPECT_CALL(*media_session_, Suspend(_)).Times(0);
  143. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  144. MediaSessionChanged(true, false);
  145. testing::Mock::VerifyAndClearExpectations(media_session_.get());
  146. // Block when media is playing
  147. EXPECT_CALL(*media_session_, Suspend(_)).Times(1);
  148. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  149. media_blocker_->BlockMediaLoading(true);
  150. MediaSessionChanged(true, true);
  151. testing::Mock::VerifyAndClearExpectations(media_session_.get());
  152. // Unblock
  153. EXPECT_CALL(*media_session_, Suspend(_)).Times(0);
  154. EXPECT_CALL(*media_session_, Resume(_)).Times(1);
  155. media_blocker_->BlockMediaLoading(false);
  156. }
  157. TEST_F(CastMediaBlockerTest, Block_Multiple) {
  158. // Tests CastMediaBlocker repeatively suspends when blocked.
  159. EXPECT_CALL(*media_session_, Suspend(_)).Times(0);
  160. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  161. media_blocker_->BlockMediaLoading(true);
  162. MediaSessionChanged(false, false);
  163. testing::Mock::VerifyAndClearExpectations(media_session_.get());
  164. EXPECT_CALL(*media_session_, Suspend(_)).Times(1);
  165. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  166. MediaSessionChanged(true, false);
  167. MediaSessionChanged(true, true);
  168. testing::Mock::VerifyAndClearExpectations(media_session_.get());
  169. EXPECT_CALL(*media_session_, Suspend(_)).Times(1);
  170. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  171. MediaSessionChanged(true, false);
  172. testing::Mock::VerifyAndClearExpectations(media_session_.get());
  173. MediaSessionChanged(true, true);
  174. EXPECT_CALL(*media_session_, Suspend(_)).Times(0);
  175. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  176. MediaSessionChanged(false, true);
  177. MediaSessionChanged(false, false);
  178. MediaSessionChanged(false, true);
  179. testing::Mock::VerifyAndClearExpectations(media_session_.get());
  180. }
  181. TEST_F(CastMediaBlockerTest, Block_Unblock_Uncontrollable) {
  182. // Tests CastMediaBlocker does not suspend or resume when uncontrollable.
  183. EXPECT_CALL(*media_session_, Suspend(_)).Times(0);
  184. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  185. media_blocker_->BlockMediaLoading(true);
  186. MediaSessionChanged(false, false);
  187. media_blocker_->BlockMediaLoading(false);
  188. media_blocker_->BlockMediaLoading(true);
  189. MediaSessionChanged(false, true);
  190. media_blocker_->BlockMediaLoading(false);
  191. media_blocker_->BlockMediaLoading(true);
  192. testing::Mock::VerifyAndClearExpectations(media_session_.get());
  193. }
  194. TEST_F(CastMediaBlockerTest, Block_Unblock_Uncontrollable2) {
  195. EXPECT_CALL(*media_session_, Suspend(_)).Times(1);
  196. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  197. MediaSessionChanged(true, true);
  198. media_blocker_->BlockMediaLoading(true);
  199. MediaSessionChanged(false, true);
  200. MediaSessionChanged(true, true);
  201. MediaSessionChanged(true, false);
  202. testing::Mock::VerifyAndClearExpectations(media_session_.get());
  203. EXPECT_CALL(*media_session_, Suspend(_)).Times(1);
  204. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  205. MediaSessionChanged(false, false);
  206. MediaSessionChanged(false, true);
  207. MediaSessionChanged(true, true);
  208. MediaSessionChanged(true, false);
  209. testing::Mock::VerifyAndClearExpectations(media_session_.get());
  210. EXPECT_CALL(*media_session_, Suspend(_)).Times(0);
  211. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  212. media_blocker_->BlockMediaLoading(false);
  213. }
  214. TEST_F(CastMediaBlockerTest, Resume_When_Controllable) {
  215. // Tests CastMediaBlocker will only resume after unblock when controllable.
  216. EXPECT_CALL(*media_session_, Suspend(_)).Times(1);
  217. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  218. MediaSessionChanged(true, false);
  219. media_blocker_->BlockMediaLoading(true);
  220. MediaSessionChanged(true, true);
  221. MediaSessionChanged(false, true);
  222. media_blocker_->BlockMediaLoading(false);
  223. testing::Mock::VerifyAndClearExpectations(media_session_.get());
  224. EXPECT_CALL(*media_session_, Suspend(_)).Times(0);
  225. EXPECT_CALL(*media_session_, Resume(_)).Times(1);
  226. MediaSessionChanged(true, true);
  227. }
  228. TEST_F(CastMediaBlockerTest, No_Resume) {
  229. // Tests CastMediaBlocker will not resume if media starts playing by itself
  230. // after unblock.
  231. EXPECT_CALL(*media_session_, Suspend(_)).Times(1);
  232. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  233. MediaSessionChanged(true, false);
  234. media_blocker_->BlockMediaLoading(true);
  235. MediaSessionChanged(true, true);
  236. MediaSessionChanged(false, true);
  237. media_blocker_->BlockMediaLoading(false);
  238. testing::Mock::VerifyAndClearExpectations(media_session_.get());
  239. EXPECT_CALL(*media_session_, Suspend(_)).Times(0);
  240. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  241. MediaSessionChanged(false, false);
  242. }
  243. TEST_F(CastMediaBlockerTest, Block_Before_Resume) {
  244. // Tests CastMediaBlocker does not resume if blocked again after an unblock.
  245. EXPECT_CALL(*media_session_, Suspend(_)).Times(1);
  246. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  247. MediaSessionChanged(true, false);
  248. media_blocker_->BlockMediaLoading(true);
  249. MediaSessionChanged(true, true);
  250. MediaSessionChanged(false, true);
  251. media_blocker_->BlockMediaLoading(false);
  252. testing::Mock::VerifyAndClearExpectations(media_session_.get());
  253. EXPECT_CALL(*media_session_, Suspend(_)).Times(0);
  254. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  255. media_blocker_->BlockMediaLoading(true);
  256. MediaSessionChanged(true, true);
  257. }
  258. TEST_F(CastMediaBlockerTest, Unblocked_Already_Playing) {
  259. // Tests CastMediaBlocker does not resume if unblocked and media is playing.
  260. EXPECT_CALL(*media_session_, Suspend(_)).Times(1);
  261. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  262. MediaSessionChanged(true, false);
  263. media_blocker_->BlockMediaLoading(true);
  264. media_blocker_->BlockMediaLoading(false);
  265. }
  266. TEST_F(CastMediaBlockerTest, BlockStarting_UnblockStarting_Suspended) {
  267. // Testing block/unblock operations do nothing if media never plays.
  268. EXPECT_CALL(*media_session_, Suspend(_)).Times(0);
  269. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  270. media_blocker_->BlockMediaStarting(true);
  271. media_blocker_->BlockMediaStarting(false);
  272. MediaSessionChanged(true, true);
  273. media_blocker_->BlockMediaStarting(true);
  274. media_blocker_->BlockMediaStarting(false);
  275. media_blocker_->BlockMediaStarting(true);
  276. MediaSessionChanged(false, true);
  277. media_blocker_->BlockMediaStarting(false);
  278. }
  279. TEST_F(CastMediaBlockerTest, BlockStarting_Before_Controllable) {
  280. // Tests CastMediaBlocker only suspends when controllable.
  281. EXPECT_CALL(*media_session_, Suspend(_)).Times(0);
  282. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  283. media_blocker_->BlockMediaStarting(true);
  284. testing::Mock::VerifyAndClearExpectations(media_session_.get());
  285. // Session becomes controllable
  286. EXPECT_CALL(*media_session_, Suspend(_)).Times(1);
  287. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  288. MediaSessionChanged(true, false);
  289. }
  290. TEST_F(CastMediaBlockerTest, BlockStarting_After_Controllable) {
  291. // Tests CastMediaBlocker suspends immediately on block if controllable.
  292. EXPECT_CALL(*media_session_, Suspend(_)).Times(0);
  293. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  294. MediaSessionChanged(true, false);
  295. testing::Mock::VerifyAndClearExpectations(media_session_.get());
  296. // Block when media is playing
  297. EXPECT_CALL(*media_session_, Suspend(_)).Times(1);
  298. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  299. media_blocker_->BlockMediaStarting(true);
  300. MediaSessionChanged(true, true);
  301. testing::Mock::VerifyAndClearExpectations(media_session_.get());
  302. // Unblock
  303. EXPECT_CALL(*media_session_, Suspend(_)).Times(0);
  304. EXPECT_CALL(*media_session_, Resume(_)).Times(1);
  305. media_blocker_->BlockMediaStarting(false);
  306. }
  307. TEST_F(CastMediaBlockerTest, BlockStarting_Unblock_Suspended) {
  308. // Testing block/unblock operations do nothing if media never plays.
  309. EXPECT_CALL(*media_session_, Suspend(_)).Times(0);
  310. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  311. media_blocker_->BlockMediaStarting(true);
  312. media_blocker_->BlockMediaStarting(false);
  313. MediaSessionChanged(true, true);
  314. media_blocker_->BlockMediaStarting(true);
  315. media_blocker_->BlockMediaStarting(false);
  316. media_blocker_->BlockMediaStarting(true);
  317. MediaSessionChanged(false, true);
  318. media_blocker_->BlockMediaStarting(false);
  319. }
  320. TEST_F(CastMediaBlockerTest, BlockLoading_BlockStarting_After_Controllable) {
  321. // Tests CastMediaBlocker suspends immediately on block if controllable.
  322. EXPECT_CALL(*media_session_, Suspend(_)).Times(0);
  323. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  324. MediaSessionChanged(true, false);
  325. testing::Mock::VerifyAndClearExpectations(media_session_.get());
  326. // Block when media is playing
  327. EXPECT_CALL(*media_session_, Suspend(_)).Times(1);
  328. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  329. media_blocker_->BlockMediaLoading(true);
  330. MediaSessionChanged(true, true);
  331. testing::Mock::VerifyAndClearExpectations(media_session_.get());
  332. EXPECT_CALL(*media_session_, Suspend(_)).Times(0);
  333. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  334. media_blocker_->BlockMediaStarting(true);
  335. testing::Mock::VerifyAndClearExpectations(media_session_.get());
  336. // Unblock
  337. EXPECT_CALL(*media_session_, Suspend(_)).Times(0);
  338. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  339. media_blocker_->BlockMediaLoading(false);
  340. testing::Mock::VerifyAndClearExpectations(media_session_.get());
  341. EXPECT_CALL(*media_session_, Suspend(_)).Times(0);
  342. EXPECT_CALL(*media_session_, Resume(_)).Times(1);
  343. media_blocker_->BlockMediaStarting(false);
  344. }
  345. TEST_F(CastMediaBlockerTest, BlockStarting_BlockLoading_After_Controllable) {
  346. // Tests CastMediaBlocker suspends immediately on block if controllable.
  347. EXPECT_CALL(*media_session_, Suspend(_)).Times(0);
  348. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  349. MediaSessionChanged(true, false);
  350. testing::Mock::VerifyAndClearExpectations(media_session_.get());
  351. // Block when media is playing
  352. EXPECT_CALL(*media_session_, Suspend(_)).Times(1);
  353. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  354. media_blocker_->BlockMediaStarting(true);
  355. MediaSessionChanged(true, true);
  356. testing::Mock::VerifyAndClearExpectations(media_session_.get());
  357. EXPECT_CALL(*media_session_, Suspend(_)).Times(0);
  358. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  359. media_blocker_->BlockMediaLoading(true);
  360. testing::Mock::VerifyAndClearExpectations(media_session_.get());
  361. // Unblock
  362. EXPECT_CALL(*media_session_, Suspend(_)).Times(0);
  363. EXPECT_CALL(*media_session_, Resume(_)).Times(0);
  364. media_blocker_->BlockMediaStarting(false);
  365. testing::Mock::VerifyAndClearExpectations(media_session_.get());
  366. EXPECT_CALL(*media_session_, Suspend(_)).Times(0);
  367. EXPECT_CALL(*media_session_, Resume(_)).Times(1);
  368. media_blocker_->BlockMediaLoading(false);
  369. }
  370. } // namespace shell
  371. } // namespace chromecast