Chromium Code Reviews| Index: chrome/browser/ui/webui/media_router/media_router_ui_unittest.cc |
| diff --git a/chrome/browser/ui/webui/media_router/media_router_ui_unittest.cc b/chrome/browser/ui/webui/media_router/media_router_ui_unittest.cc |
| index 716d1a78b68e84e3f9f86f3f921f8a7fd22c0dd6..413291f69863ac900114135f35203016413cd251 100644 |
| --- a/chrome/browser/ui/webui/media_router/media_router_ui_unittest.cc |
| +++ b/chrome/browser/ui/webui/media_router/media_router_ui_unittest.cc |
| @@ -11,6 +11,7 @@ |
| #include "base/strings/utf_string_conversions.h" |
| #include "chrome/browser/media/router/create_presentation_connection_request.h" |
| #include "chrome/browser/media/router/mock_media_router.h" |
| +#include "chrome/browser/media/router/mojo/media_router_mojo_test.h" |
| #include "chrome/browser/media/router/test_helper.h" |
| #include "chrome/browser/sessions/session_tab_helper.h" |
| #include "chrome/browser/ui/webui/media_router/media_router_webui_message_handler.h" |
| @@ -34,11 +35,22 @@ using content::WebContents; |
| using testing::_; |
| using testing::AnyNumber; |
| using testing::Invoke; |
| +using testing::Mock; |
| using testing::Return; |
| using testing::SaveArg; |
| namespace media_router { |
| +class MockMediaRouterWebUIMessageHandler |
| + : public MediaRouterWebUIMessageHandler { |
| + public: |
| + explicit MockMediaRouterWebUIMessageHandler(MediaRouterUI* media_router_ui) |
| + : MediaRouterWebUIMessageHandler(media_router_ui) {} |
| + ~MockMediaRouterWebUIMessageHandler() override {} |
| + |
| + MOCK_METHOD1(UpdateMediaRouteStatus, void(const MediaStatus& status)); |
| +}; |
| + |
| class PresentationRequestCallbacks { |
| public: |
| explicit PresentationRequestCallbacks( |
| @@ -88,9 +100,9 @@ class MediaRouterUITest : public ChromeRenderViewHostTestHarness { |
| web_ui_contents_.reset( |
| WebContents::Create(WebContents::CreateParams(profile))); |
| web_ui_.set_web_contents(web_ui_contents_.get()); |
| - media_router_ui_.reset(new MediaRouterUI(&web_ui_)); |
| - message_handler_.reset( |
| - new MediaRouterWebUIMessageHandler(media_router_ui_.get())); |
| + media_router_ui_ = base::MakeUnique<MediaRouterUI>(&web_ui_); |
| + message_handler_ = base::MakeUnique<MockMediaRouterWebUIMessageHandler>( |
| + media_router_ui_.get()); |
| EXPECT_CALL(mock_router_, RegisterMediaSinksObserver(_)) |
| .WillRepeatedly(Invoke([this](MediaSinksObserver* observer) { |
| this->media_sinks_observers_.push_back(observer); |
| @@ -111,13 +123,34 @@ class MediaRouterUITest : public ChromeRenderViewHostTestHarness { |
| return sink; |
| } |
| + // Notifies MediaRouterUI that a route details view has been opened. Expects |
| + // MediaRouterUI to request a MediaRouteController, and gives it a mock |
| + // controller. Returns a reference to the mock controller. |
| + scoped_refptr<MockMediaRouteController> OpenUIDetailsView( |
| + const MediaRoute::Id& route_id) { |
| + MediaSource media_source("mediaSource"); |
| + MediaRoute route(route_id, media_source, "sinkId", "", true, "", true); |
| + mojom::MediaControllerPtr mojo_media_controller; |
| + mojo::MakeRequest(&mojo_media_controller); |
| + scoped_refptr<MockMediaRouteController> controller = |
| + new MockMediaRouteController(route_id, std::move(mojo_media_controller), |
| + &mock_router_); |
| + |
| + media_router_ui_->OnRoutesUpdated({route}, std::vector<MediaRoute::Id>()); |
| + EXPECT_CALL(mock_router_, GetRouteController(route_id)) |
| + .WillOnce(Return(controller)); |
| + media_router_ui_->OnUIDetailsViewOpened(route_id); |
| + |
| + return controller; |
| + } |
| + |
| protected: |
| MockMediaRouter mock_router_; |
| content::TestWebUI web_ui_; |
| std::unique_ptr<WebContents> web_ui_contents_; |
| std::unique_ptr<CreatePresentationConnectionRequest> create_session_request_; |
| std::unique_ptr<MediaRouterUI> media_router_ui_; |
| - std::unique_ptr<MediaRouterWebUIMessageHandler> message_handler_; |
| + std::unique_ptr<MockMediaRouterWebUIMessageHandler> message_handler_; |
| std::vector<MediaSinksObserver*> media_sinks_observers_; |
| }; |
| @@ -600,4 +633,97 @@ TEST_F(MediaRouterUITest, RecordDesktopMirroringCastModeSelection) { |
| EXPECT_TRUE(media_router_ui_->UserSelectedTabMirroringForCurrentOrigin()); |
| } |
| +TEST_F(MediaRouterUITest, OpenAndCloseUIDetailsView) { |
| + const std::string route_id = "routeId"; |
| + CreateMediaRouterUI(profile()); |
| + OpenUIDetailsView(route_id); |
| + |
| + // When the route details view is closed, the route controller observer should |
| + // be destroyed, also triggering the destruction of the controller. |
| + EXPECT_CALL(mock_router_, DetachRouteController(route_id, _)); |
| + media_router_ui_->OnUIDetailsViewClosed(); |
| + |
| + EXPECT_TRUE(Mock::VerifyAndClearExpectations(&mock_router_)); |
| +} |
| + |
| +TEST_F(MediaRouterUITest, SendMediaCommands) { |
| + const base::TimeDelta time = base::TimeDelta::FromSeconds(123); |
| + const float volume = 0.7; |
| + CreateMediaRouterUI(profile()); |
| + scoped_refptr<MockMediaRouteController> controller = |
| + OpenUIDetailsView("routeId"); |
| + MediaStatus status; |
| + status.duration = base::TimeDelta::FromSeconds(200); |
| + controller->OnMediaStatusUpdated(status); |
| + |
| + EXPECT_CALL(*controller, Play()); |
| + media_router_ui_->PlayRoute(); |
| + EXPECT_CALL(*controller, Pause()); |
| + media_router_ui_->PauseRoute(); |
| + EXPECT_CALL(*controller, Seek(time)); |
| + media_router_ui_->SeekRoute(time); |
| + EXPECT_CALL(*controller, SetMute(true)); |
| + media_router_ui_->SetRouteMute(true); |
| + EXPECT_CALL(*controller, SetVolume(volume)); |
| + media_router_ui_->SetRouteVolume(volume); |
| +} |
| + |
| +TEST_F(MediaRouterUITest, DoNotSendMediaCommandsForInvalidArgs) { |
| + CreateMediaRouterUI(profile()); |
| + scoped_refptr<MockMediaRouteController> controller = |
| + OpenUIDetailsView("routeId"); |
| + MediaStatus status; |
| + status.duration = base::TimeDelta::FromSeconds(100); |
| + controller->OnMediaStatusUpdated(status); |
| + |
| + EXPECT_CALL(*controller, Seek(_)).Times(0); |
| + EXPECT_CALL(*controller, SetVolume(_)).Times(0); |
| + |
| + // Seek positions greater than the duration or negative should be ignored. |
|
mark a. foltz
2017/04/26 21:01:18
It seems like this is testing behavior of the cont
takumif
2017/04/27 03:04:17
The logic to reject invalid arguments was in MRUI
|
| + media_router_ui_->SeekRoute(base::TimeDelta::FromSeconds(101)); |
| + media_router_ui_->SeekRoute(base::TimeDelta::FromSeconds(-10)); |
| + |
| + // Volumes outside of the [0, 1] range should be ignored. |
| + media_router_ui_->SetRouteVolume(1.5); |
| + media_router_ui_->SetRouteVolume(-0.5); |
| +} |
| + |
| +TEST_F(MediaRouterUITest, SendMediaStatusUpdate) { |
| + MediaStatus status; |
| + status.title = "test title"; |
| + CreateMediaRouterUI(profile()); |
| + scoped_refptr<MockMediaRouteController> controller = |
| + OpenUIDetailsView("routeId"); |
| + |
| + // The route controller observer held by MediaRouterUI should send the status |
| + // update to the message handler. |
| + EXPECT_CALL(*message_handler_, UpdateMediaRouteStatus(status)); |
| + controller->OnMediaStatusUpdated(status); |
| + |
| + EXPECT_TRUE(Mock::VerifyAndClearExpectations(&mock_router_)); |
| +} |
| + |
| +TEST_F(MediaRouterUITest, IsValidRouteId) { |
| + const std::string route_id1 = "routeId1"; |
| + const std::string route_id2 = "routeId2"; |
| + const std::string route_id3 = "routeId3"; |
| + MediaSource media_source("mediaSource"); |
| + MediaRoute route1(route_id1, media_source, "sinkId", "", true, "", true); |
| + MediaRoute route2(route_id2, media_source, "sinkId", "", true, "", true); |
| + MediaRoute route3(route_id3, media_source, "sinkId", "", true, "", true); |
| + CreateMediaRouterUI(profile()); |
| + |
| + media_router_ui_->OnRoutesUpdated({route1, route2}, |
| + std::vector<MediaRoute::Id>()); |
| + EXPECT_TRUE(media_router_ui_->IsValidRouteId(route_id1)); |
| + EXPECT_TRUE(media_router_ui_->IsValidRouteId(route_id2)); |
| + EXPECT_FALSE(media_router_ui_->IsValidRouteId(route_id3)); |
| + |
| + media_router_ui_->OnRoutesUpdated({route2, route3}, |
| + std::vector<MediaRoute::Id>()); |
| + EXPECT_FALSE(media_router_ui_->IsValidRouteId(route_id1)); |
| + EXPECT_TRUE(media_router_ui_->IsValidRouteId(route_id2)); |
| + EXPECT_TRUE(media_router_ui_->IsValidRouteId(route_id3)); |
| +} |
| + |
| } // namespace media_router |