|  | // Copyright 2018 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "content/browser/media/flinging_renderer.h" | 
|  |  | 
|  | #include "base/callback_helpers.h" | 
|  | #include "base/memory/ptr_util.h" | 
|  | #include "base/memory/raw_ptr.h" | 
|  | #include "base/time/time.h" | 
|  | #include "base/version.h" | 
|  | #include "media/base/media_controller.h" | 
|  | #include "media/base/mock_filters.h" | 
|  | #include "mojo/public/cpp/bindings/pending_remote.h" | 
|  | #include "testing/gmock/include/gmock/gmock.h" | 
|  | #include "testing/gtest/include/gtest/gtest.h" | 
|  |  | 
|  | using ::testing::_; | 
|  | using ::testing::StrictMock; | 
|  | using ::testing::NiceMock; | 
|  |  | 
|  | namespace content { | 
|  |  | 
|  | class MockMediaController : public media::MediaController { | 
|  | public: | 
|  | MOCK_METHOD0(Play, void()); | 
|  | MOCK_METHOD0(Pause, void()); | 
|  | MOCK_METHOD1(SetMute, void(bool)); | 
|  | MOCK_METHOD1(SetVolume, void(float)); | 
|  | MOCK_METHOD1(Seek, void(base::TimeDelta)); | 
|  | }; | 
|  |  | 
|  | class MockFlingingController : public media::FlingingController { | 
|  | public: | 
|  | explicit MockFlingingController(media::MediaController* media_controller) | 
|  | : media_controller_(media_controller) {} | 
|  |  | 
|  | media::MediaController* GetMediaController() override { | 
|  | return media_controller_; | 
|  | } | 
|  |  | 
|  | MOCK_METHOD1(AddMediaStatusObserver, void(media::MediaStatusObserver*)); | 
|  | MOCK_METHOD1(RemoveMediaStatusObserver, void(media::MediaStatusObserver*)); | 
|  | MOCK_METHOD0(GetApproximateCurrentTime, base::TimeDelta()); | 
|  |  | 
|  | private: | 
|  | raw_ptr<media::MediaController> media_controller_; | 
|  | }; | 
|  |  | 
|  | class FlingingRendererTest : public testing::Test { | 
|  | public: | 
|  | FlingingRendererTest() | 
|  | : media_controller_(new StrictMock<MockMediaController>()), | 
|  | flinging_controller_( | 
|  | new StrictMock<MockFlingingController>(media_controller_.get())) { | 
|  | EXPECT_CALL(*flinging_controller_, AddMediaStatusObserver(_)); | 
|  | EXPECT_CALL(*flinging_controller_, RemoveMediaStatusObserver(_)); | 
|  |  | 
|  | renderer_ = base::WrapUnique(new FlingingRenderer( | 
|  | std::unique_ptr<media::FlingingController>(flinging_controller_), | 
|  | mojo::NullRemote())); | 
|  |  | 
|  | renderer_->Initialize(nullptr, &renderer_client_, base::DoNothing()); | 
|  | } | 
|  |  | 
|  | protected: | 
|  | NiceMock<media::MockRendererClient> renderer_client_; | 
|  | std::unique_ptr<MockMediaController> media_controller_; | 
|  | raw_ptr<StrictMock<MockFlingingController>> flinging_controller_; | 
|  | std::unique_ptr<FlingingRenderer> renderer_; | 
|  | }; | 
|  |  | 
|  | TEST_F(FlingingRendererTest, StartPlayingFromTime) { | 
|  | base::TimeDelta seek_time = base::Seconds(10); | 
|  | EXPECT_CALL(*media_controller_, Seek(seek_time)); | 
|  |  | 
|  | renderer_->StartPlayingFrom(seek_time); | 
|  | } | 
|  |  | 
|  | TEST_F(FlingingRendererTest, StartPlayingFromBeginning) { | 
|  | EXPECT_CALL(*media_controller_, Seek(base::TimeDelta())); | 
|  |  | 
|  | renderer_->StartPlayingFrom(base::TimeDelta()); | 
|  | } | 
|  |  | 
|  | TEST_F(FlingingRendererTest, SetPlaybackRate) { | 
|  | double playback_rate = 1.0; | 
|  | EXPECT_CALL(*media_controller_, Play()); | 
|  |  | 
|  | renderer_->SetPlaybackRate(playback_rate); | 
|  | } | 
|  |  | 
|  | TEST_F(FlingingRendererTest, SetPlaybackRateToZero) { | 
|  | double playback_rate = 0.0; | 
|  | EXPECT_CALL(*media_controller_, Pause()); | 
|  |  | 
|  | renderer_->SetPlaybackRate(playback_rate); | 
|  | } | 
|  |  | 
|  | // Setting the volume to a positive value should not change the mute state. | 
|  | TEST_F(FlingingRendererTest, SetVolume) { | 
|  | float volume = 0.5; | 
|  | EXPECT_CALL(*media_controller_, SetVolume(volume)); | 
|  | EXPECT_CALL(*media_controller_, SetMute(_)).Times(0); | 
|  |  | 
|  | renderer_->SetVolume(volume); | 
|  | } | 
|  |  | 
|  | // Setting the volume to 0 should not set the mute state. | 
|  | TEST_F(FlingingRendererTest, SetVolumeToZero) { | 
|  | float volume = 0; | 
|  | EXPECT_CALL(*media_controller_, SetVolume(volume)); | 
|  | EXPECT_CALL(*media_controller_, SetMute(_)).Times(0); | 
|  |  | 
|  | renderer_->SetVolume(volume); | 
|  | } | 
|  |  | 
|  | }  // namespace content |