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 8e21520ac61810855d79fa6e93221637204872df..f8958e2dc8607a408983227cb9ed209a4e26d8dc 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 |
@@ -7,6 +7,7 @@ |
#include "base/bind.h" |
#include "base/memory/ptr_util.h" |
#include "base/strings/utf_string_conversions.h" |
+#include "chrome/browser/media/router/create_presentation_connection_request.h" |
#include "chrome/browser/media/router/media_route.h" |
#include "chrome/browser/media/router/media_source_helper.h" |
#include "chrome/browser/media/router/mock_media_router.h" |
@@ -29,11 +30,30 @@ |
using testing::_; |
using testing::AnyNumber; |
+using testing::Invoke; |
using testing::SaveArg; |
using testing::Return; |
namespace media_router { |
+class PresentationRequestCallbacks { |
+public: |
+ explicit PresentationRequestCallbacks( |
+ const content::PresentationError& expected_error) |
+ : expected_error_(expected_error) {} |
+ |
+ void Success(const content::PresentationSessionInfo&, const MediaRoute::Id&) { |
+ } |
+ |
+ void Error(const content::PresentationError& error) { |
+ EXPECT_EQ(expected_error_.error_type, error.error_type); |
+ EXPECT_EQ(expected_error_.message, error.message); |
+ } |
+ |
+private: |
+ content::PresentationError expected_error_; |
+}; |
+ |
class MockRoutesUpdatedCallback { |
public: |
MOCK_METHOD2(OnRoutesUpdated, |
@@ -61,11 +81,15 @@ class MediaRouterUITest : public ::testing::Test { |
message_handler_.reset( |
new MediaRouterWebUIMessageHandler(media_router_ui_.get())); |
EXPECT_CALL(mock_router_, RegisterMediaSinksObserver(_)) |
- .WillRepeatedly(Return(true)); |
+ .WillRepeatedly(Invoke([this](MediaSinksObserver* observer) { |
+ this->media_sinks_observers_.push_back(observer); |
+ return true; |
+ })); |
EXPECT_CALL(mock_router_, RegisterMediaRoutesObserver(_)) |
.Times(AnyNumber()); |
media_router_ui_->InitForTest(&mock_router_, initiator_.get(), |
- message_handler_.get()); |
+ message_handler_.get(), |
+ std::move(create_session_request_)); |
message_handler_->SetWebUIForTest(&web_ui_); |
} |
@@ -76,8 +100,10 @@ class MediaRouterUITest : public ::testing::Test { |
std::unique_ptr<content::WebContents> initiator_; |
content::TestWebUI web_ui_; |
std::unique_ptr<content::WebContents> web_contents_; |
+ std::unique_ptr<CreatePresentationConnectionRequest> create_session_request_; |
std::unique_ptr<MediaRouterUI> media_router_ui_; |
std::unique_ptr<MediaRouterWebUIMessageHandler> message_handler_; |
+ std::vector<MediaSinksObserver*> media_sinks_observers_; |
}; |
TEST_F(MediaRouterUITest, RouteCreationTimeoutForTab) { |
@@ -406,4 +432,81 @@ TEST_F(MediaRouterUITest, GetExtensionNameEmptyWhenNotExtensionURL) { |
EXPECT_EQ("", MediaRouterUI::GetExtensionName(url, registry.get())); |
} |
+ |
+TEST_F(MediaRouterUITest, NotFoundErrorOnCloseWithNoSinks) { |
+ content::PresentationError expected_error( |
+ content::PresentationErrorType::PRESENTATION_ERROR_NO_AVAILABLE_SCREENS, |
+ "No screens found."); |
+ PresentationRequestCallbacks request_callbacks(expected_error); |
+ create_session_request_.reset(new CreatePresentationConnectionRequest( |
+ RenderFrameHostId(0, 0), std::string("http://google.com/presentation"), |
+ GURL("http://google.com"), |
+ base::Bind(&PresentationRequestCallbacks::Success, |
+ base::Unretained(&request_callbacks)), |
+ base::Bind(&PresentationRequestCallbacks::Error, |
+ base::Unretained(&request_callbacks)))); |
+ CreateMediaRouterUI(&profile_); |
+ // Destroying the UI should return the expected error from above to the error |
+ // callback. |
+ media_router_ui_.reset(); |
+} |
+ |
+TEST_F(MediaRouterUITest, NotFoundErrorOnCloseWithNoCompatibleSinks) { |
+ content::PresentationError expected_error( |
+ content::PresentationErrorType::PRESENTATION_ERROR_NO_AVAILABLE_SCREENS, |
+ "No screens found."); |
+ PresentationRequestCallbacks request_callbacks(expected_error); |
+ std::string presentation_url("http://google.com/presentation"); |
+ create_session_request_.reset(new CreatePresentationConnectionRequest( |
+ RenderFrameHostId(0, 0), presentation_url, GURL("http://google.com"), |
+ base::Bind(&PresentationRequestCallbacks::Success, |
+ base::Unretained(&request_callbacks)), |
+ base::Bind(&PresentationRequestCallbacks::Error, |
+ base::Unretained(&request_callbacks)))); |
+ CreateMediaRouterUI(&profile_); |
+ |
+ // Send a sink to the UI that is compatible with sources other than the |
+ // presentation url to cause a NotFoundError. |
+ std::vector<MediaSink> sinks; |
+ sinks.emplace_back("sink id", "sink name", MediaSink::GENERIC); |
+ std::vector<GURL> origins; |
+ for (auto& observer : media_sinks_observers_) { |
+ if (observer->source().id() != presentation_url) { |
+ observer->OnSinksUpdated(sinks, origins); |
+ } |
+ } |
+ // Destroying the UI should return the expected error from above to the error |
+ // callback. |
+ media_router_ui_.reset(); |
+} |
+ |
+TEST_F(MediaRouterUITest, AbortErrorOnClose) { |
+ content::PresentationError expected_error( |
+ content::PresentationErrorType:: |
+ PRESENTATION_ERROR_SESSION_REQUEST_CANCELLED, |
+ "Dialog closed."); |
+ PresentationRequestCallbacks request_callbacks(expected_error); |
+ std::string presentation_url("http://google.com/presentation"); |
+ create_session_request_.reset(new CreatePresentationConnectionRequest( |
+ RenderFrameHostId(0, 0), presentation_url, GURL("http://google.com"), |
+ base::Bind(&PresentationRequestCallbacks::Success, |
+ base::Unretained(&request_callbacks)), |
+ base::Bind(&PresentationRequestCallbacks::Error, |
+ base::Unretained(&request_callbacks)))); |
+ CreateMediaRouterUI(&profile_); |
+ |
+ // Send a sink to the UI that is compatible with the presentation url to avoid |
+ // a NotFoundError. |
+ std::vector<MediaSink> sinks; |
+ sinks.emplace_back("sink id", "sink name", MediaSink::GENERIC); |
+ std::vector<GURL> origins; |
+ for (auto& observer : media_sinks_observers_) { |
+ if (observer->source().id() == presentation_url) { |
+ observer->OnSinksUpdated(sinks, origins); |
+ } |
+ } |
+ // Destroying the UI should return the expected error from above to the error |
+ // callback. |
+ media_router_ui_.reset(); |
+} |
} // namespace media_router |