Index: chrome/browser/ui/webui/media_router/media_router_webui_message_handler_unittest.cc |
diff --git a/chrome/browser/ui/webui/media_router/media_router_webui_message_handler_unittest.cc b/chrome/browser/ui/webui/media_router/media_router_webui_message_handler_unittest.cc |
index 5d53704782b38890ba477a1b321f40148d9def74..5b346b2351065754bb091c1fab37a43eddcdc2e2 100644 |
--- a/chrome/browser/ui/webui/media_router/media_router_webui_message_handler_unittest.cc |
+++ b/chrome/browser/ui/webui/media_router/media_router_webui_message_handler_unittest.cc |
@@ -2,29 +2,88 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+#include "chrome/browser/ui/webui/media_router/media_router_webui_message_handler.h" |
#include "base/macros.h" |
#include "base/strings/stringprintf.h" |
+#include "chrome/browser/media/router/mock_media_router.h" |
+#include "chrome/browser/media/router/mojo/media_router_mojo_test.h" |
#include "chrome/browser/ui/browser_commands.h" |
#include "chrome/browser/ui/tabs/tab_strip_model.h" |
#include "chrome/browser/ui/webui/media_router/media_router_ui.h" |
#include "chrome/browser/ui/webui/media_router/media_router_web_ui_test.h" |
-#include "chrome/browser/ui/webui/media_router/media_router_webui_message_handler.h" |
#include "content/public/browser/browser_context.h" |
#include "content/public/test/test_web_ui.h" |
#include "extensions/common/constants.h" |
#include "testing/gmock/include/gmock/gmock.h" |
#include "testing/gtest/include/gtest/gtest.h" |
+using testing::_; |
using testing::Return; |
using testing::ReturnRef; |
namespace media_router { |
+namespace { |
+ |
const char kProviderExtensionIdForTesting[] = "test_id"; |
const char kControllerPathForTesting[] = "test_path"; |
const char kUserEmailForTesting[] = "nobody@example.com"; |
const char kUserDomainForTesting[] = "example.com"; |
+bool GetBooleanFromDict(const base::DictionaryValue* dict, |
+ const std::string& key) { |
+ bool value = false; |
+ EXPECT_TRUE(dict->GetBoolean(key, &value)); |
+ return value; |
+} |
+ |
+double GetDoubleFromDict(const base::DictionaryValue* dict, |
+ const std::string& key) { |
+ double value = 0; |
+ EXPECT_TRUE(dict->GetDouble(key, &value)); |
+ return value; |
+} |
+ |
+int GetIntegerFromDict(const base::DictionaryValue* dict, |
+ const std::string& key) { |
+ int value = 0; |
+ EXPECT_TRUE(dict->GetInteger(key, &value)); |
+ return value; |
+} |
+ |
+std::string GetStringFromDict(const base::DictionaryValue* dict, |
+ const std::string& key) { |
+ std::string value; |
+ EXPECT_TRUE(dict->GetString(key, &value)); |
+ return value; |
+} |
+ |
+// Creates a local route for display. |
+MediaRoute CreateRoute() { |
+ MediaRoute::Id route_id("routeId123"); |
+ MediaSink::Id sink_id("sinkId123"); |
+ MediaSink sink(sink_id, "The sink", MediaSink::IconType::CAST); |
+ std::string description("This is a route"); |
+ bool is_local = true; |
+ bool is_for_display = true; |
+ MediaRoute route(route_id, MediaSource("mediaSource"), sink_id, description, |
+ is_local, kControllerPathForTesting, is_for_display); |
+ |
+ return route; |
+} |
+ |
+MediaSinkWithCastModes CreateMediaSinkWithCastMode(const std::string& sink_id, |
+ MediaCastMode cast_mode) { |
+ std::string sink_name("The sink"); |
+ MediaSinkWithCastModes media_sink_with_cast_modes( |
+ MediaSink(sink_id, sink_name, MediaSink::IconType::CAST)); |
+ media_sink_with_cast_modes.cast_modes.insert(cast_mode); |
+ |
+ return media_sink_with_cast_modes; |
+} |
+ |
+} // namespace |
+ |
class MockMediaRouterUI : public MediaRouterUI { |
public: |
explicit MockMediaRouterUI(content::WebUI* web_ui) |
@@ -36,6 +95,15 @@ class MockMediaRouterUI : public MediaRouterUI { |
MOCK_METHOD1(RecordCastModeSelection, void(MediaCastMode cast_mode)); |
MOCK_CONST_METHOD0(cast_modes, const std::set<MediaCastMode>&()); |
MOCK_CONST_METHOD0(GetRouteProviderExtensionId, const std::string&()); |
+ MOCK_METHOD1(OnMediaControllerUIAvailable, |
+ void(const MediaRoute::Id& route_id)); |
+ MOCK_METHOD0(OnMediaControllerUIClosed, void()); |
+ MOCK_METHOD0(PlayRoute, void()); |
+ MOCK_METHOD0(PauseRoute, void()); |
+ MOCK_METHOD1(SeekRoute, void(base::TimeDelta time)); |
+ MOCK_METHOD1(SetRouteMute, void(bool mute)); |
+ MOCK_METHOD1(SetRouteVolume, void(float volume)); |
+ MOCK_CONST_METHOD0(GetMediaRouteController, const MediaRouteController*()); |
}; |
class TestMediaRouterWebUIMessageHandler |
@@ -71,8 +139,8 @@ class TestMediaRouterWebUIMessageHandler |
class MediaRouterWebUIMessageHandlerTest : public MediaRouterWebUITest { |
public: |
MediaRouterWebUIMessageHandlerTest() |
- : web_ui_(new content::TestWebUI()), |
- provider_extension_id_(kProviderExtensionIdForTesting) {} |
+ : web_ui_(base::MakeUnique<content::TestWebUI>()), |
+ provider_extension_id_(kProviderExtensionIdForTesting) {} |
~MediaRouterWebUIMessageHandlerTest() override {} |
// BrowserWithTestWindowTest: |
@@ -81,9 +149,9 @@ class MediaRouterWebUIMessageHandlerTest : public MediaRouterWebUITest { |
chrome::NewTab(browser()); |
web_ui_->set_web_contents( |
browser()->tab_strip_model()->GetActiveWebContents()); |
- mock_media_router_ui_.reset(new MockMediaRouterUI(web_ui_.get())); |
- handler_.reset( |
- new TestMediaRouterWebUIMessageHandler(mock_media_router_ui_.get())); |
+ mock_media_router_ui_ = base::MakeUnique<MockMediaRouterUI>(web_ui_.get()); |
+ handler_ = base::MakeUnique<TestMediaRouterWebUIMessageHandler>( |
+ mock_media_router_ui_.get()); |
handler_->SetWebUIForTest(web_ui_.get()); |
} |
@@ -98,6 +166,45 @@ class MediaRouterWebUIMessageHandlerTest : public MediaRouterWebUITest { |
return provider_extension_id_; |
} |
+ // Gets the call data for the function call made to |web_ui_|. There needs |
+ // to be one call made, and its function name must be |function_name|. |
+ const content::TestWebUI::CallData& GetCallData( |
+ const std::string& function_name) { |
+ EXPECT_EQ(1u, web_ui_->call_data().size()); |
+ const content::TestWebUI::CallData& call_data = *web_ui_->call_data()[0]; |
+ EXPECT_EQ(function_name, call_data.function_name()); |
+ |
+ return call_data; |
+ } |
+ |
+ // Gets the dictionary passed into a call to the |web_ui_| as the argument. |
+ // There needs to be one call made, and its function name must be |
+ // |function_name|. |
+ const base::DictionaryValue* ExtractDictFromCallArg( |
+ const std::string& function_name) { |
+ const content::TestWebUI::CallData& call_data = GetCallData(function_name); |
+ const base::Value* arg1 = call_data.arg1(); |
+ const base::DictionaryValue* dict_value = nullptr; |
+ CHECK(arg1->GetAsDictionary(&dict_value)); |
+ |
+ return dict_value; |
+ } |
+ |
+ // Gets the first element of the list passed in as the argument to a call to |
+ // the |web_ui_| as a dictionary. There needs to be one call made, and its |
+ // function name must be |function_name|. |
+ const base::DictionaryValue* ExtractDictFromListFromCallArg( |
+ const std::string& function_name) { |
+ const content::TestWebUI::CallData& call_data = GetCallData(function_name); |
+ const base::Value* arg1 = call_data.arg1(); |
+ const base::ListValue* list_value = nullptr; |
+ CHECK(arg1->GetAsList(&list_value)); |
+ const base::DictionaryValue* dict_value = nullptr; |
+ CHECK(list_value->GetDictionary(0, &dict_value)); |
+ |
+ return dict_value; |
+ } |
+ |
protected: |
std::unique_ptr<content::TestWebUI> web_ui_; |
std::unique_ptr<MockMediaRouterUI> mock_media_router_ui_; |
@@ -107,173 +214,86 @@ class MediaRouterWebUIMessageHandlerTest : public MediaRouterWebUITest { |
TEST_F(MediaRouterWebUIMessageHandlerTest, UpdateSinks) { |
MediaSink::Id sink_id("sinkId123"); |
- std::string sink_name("The sink"); |
+ MediaSinkWithCastModes media_sink_with_cast_modes = |
+ CreateMediaSinkWithCastMode(sink_id, MediaCastMode::TAB_MIRROR); |
- std::vector<MediaSinkWithCastModes> media_sink_with_cast_modes_list; |
- MediaSinkWithCastModes media_sink_with_cast_modes( |
- MediaSink(sink_id, sink_name, MediaSink::IconType::CAST)); |
- media_sink_with_cast_modes.cast_modes.insert(MediaCastMode::TAB_MIRROR); |
- media_sink_with_cast_modes_list.push_back(media_sink_with_cast_modes); |
- |
- handler_->UpdateSinks(media_sink_with_cast_modes_list); |
- EXPECT_EQ(1u, web_ui_->call_data().size()); |
- const content::TestWebUI::CallData& call_data = *web_ui_->call_data()[0]; |
- EXPECT_EQ("media_router.ui.setSinkListAndIdentity", |
- call_data.function_name()); |
- const base::Value* arg1 = call_data.arg1(); |
- const base::DictionaryValue* sinks_with_identity_value = nullptr; |
- ASSERT_TRUE(arg1->GetAsDictionary(&sinks_with_identity_value)); |
+ handler_->UpdateSinks({media_sink_with_cast_modes}); |
+ const base::DictionaryValue* sinks_with_identity_value = |
+ ExtractDictFromCallArg("media_router.ui.setSinkListAndIdentity"); |
// Email is not displayed if there is no sinks with domain. |
- bool show_email = false; |
- bool actual_show_email = false; |
- EXPECT_TRUE( |
- sinks_with_identity_value->GetBoolean("showEmail", &actual_show_email)); |
- EXPECT_EQ(show_email, actual_show_email); |
+ EXPECT_FALSE(GetBooleanFromDict(sinks_with_identity_value, "showEmail")); |
// Domain is not displayed if there is no sinks with domain. |
- bool show_domain = false; |
- bool actual_show_domain = false; |
- EXPECT_TRUE( |
- sinks_with_identity_value->GetBoolean("showDomain", &actual_show_domain)); |
- EXPECT_EQ(show_domain, actual_show_domain); |
+ EXPECT_FALSE(GetBooleanFromDict(sinks_with_identity_value, "showDomain")); |
const base::ListValue* sinks_list_value = nullptr; |
ASSERT_TRUE(sinks_with_identity_value->GetList("sinks", &sinks_list_value)); |
const base::DictionaryValue* sink_value = nullptr; |
ASSERT_TRUE(sinks_list_value->GetDictionary(0, &sink_value)); |
- std::string value; |
- EXPECT_TRUE(sink_value->GetString("id", &value)); |
- EXPECT_EQ(sink_id, value); |
- |
- EXPECT_TRUE(sink_value->GetString("name", &value)); |
- EXPECT_EQ(sink_name, value); |
- |
- int cast_mode_bits = -1; |
- ASSERT_TRUE(sink_value->GetInteger("castModes", &cast_mode_bits)); |
- EXPECT_EQ(static_cast<int>(MediaCastMode::TAB_MIRROR), cast_mode_bits); |
+ EXPECT_EQ(sink_id, GetStringFromDict(sink_value, "id")); |
+ EXPECT_EQ(media_sink_with_cast_modes.sink.name(), |
+ GetStringFromDict(sink_value, "name")); |
+ EXPECT_EQ(static_cast<int>(MediaCastMode::TAB_MIRROR), |
+ GetIntegerFromDict(sink_value, "castModes")); |
} |
TEST_F(MediaRouterWebUIMessageHandlerTest, UpdateSinksWithIdentity) { |
- MediaSink::Id sink_id("sinkId123"); |
- std::string sink_name("The sink"); |
- |
- std::vector<MediaSinkWithCastModes> media_sink_with_cast_modes_list; |
- MediaSinkWithCastModes media_sink_with_cast_modes( |
- MediaSink(sink_id, sink_name, MediaSink::IconType::CAST)); |
+ MediaSinkWithCastModes media_sink_with_cast_modes = |
+ CreateMediaSinkWithCastMode("sinkId123", MediaCastMode::TAB_MIRROR); |
media_sink_with_cast_modes.sink.set_domain(kUserDomainForTesting); |
- media_sink_with_cast_modes.cast_modes.insert(MediaCastMode::TAB_MIRROR); |
- media_sink_with_cast_modes_list.push_back(media_sink_with_cast_modes); |
- |
- handler_->UpdateSinks(media_sink_with_cast_modes_list); |
- EXPECT_EQ(1u, web_ui_->call_data().size()); |
- const content::TestWebUI::CallData& call_data = *web_ui_->call_data()[0]; |
- EXPECT_EQ("media_router.ui.setSinkListAndIdentity", |
- call_data.function_name()); |
- const base::Value* arg1 = call_data.arg1(); |
- const base::DictionaryValue* sinks_with_identity_value = nullptr; |
- ASSERT_TRUE(arg1->GetAsDictionary(&sinks_with_identity_value)); |
- bool show_email = true; |
- bool actual_show_email = false; |
- EXPECT_TRUE( |
- sinks_with_identity_value->GetBoolean("showEmail", &actual_show_email)); |
- EXPECT_EQ(show_email, actual_show_email); |
+ handler_->UpdateSinks({media_sink_with_cast_modes}); |
+ const base::DictionaryValue* sinks_with_identity_value = |
+ ExtractDictFromCallArg("media_router.ui.setSinkListAndIdentity"); |
+ EXPECT_TRUE(GetBooleanFromDict(sinks_with_identity_value, "showEmail")); |
// Sink domain is not displayed if it matches user domain. |
- bool show_domain = false; |
- bool actual_show_domain = false; |
- EXPECT_TRUE( |
- sinks_with_identity_value->GetBoolean("showDomain", &actual_show_domain)); |
- EXPECT_EQ(show_domain, actual_show_domain); |
- |
- std::string value; |
- EXPECT_TRUE(sinks_with_identity_value->GetString("userEmail", &value)); |
- EXPECT_EQ(kUserEmailForTesting, value); |
+ EXPECT_FALSE(GetBooleanFromDict(sinks_with_identity_value, "showDomain")); |
+ EXPECT_EQ(kUserEmailForTesting, |
+ GetStringFromDict(sinks_with_identity_value, "userEmail")); |
} |
TEST_F(MediaRouterWebUIMessageHandlerTest, |
UpdateSinksWithIdentityAndPseudoSink) { |
- MediaSink::Id sink_id("pseudo:sinkId123"); |
- std::string sink_name("The sink"); |
- |
- std::vector<MediaSinkWithCastModes> media_sink_with_cast_modes_list; |
- MediaSinkWithCastModes media_sink_with_cast_modes( |
- MediaSink(sink_id, sink_name, MediaSink::IconType::CAST)); |
+ MediaSinkWithCastModes media_sink_with_cast_modes = |
+ CreateMediaSinkWithCastMode("pseudo:sinkId1", MediaCastMode::TAB_MIRROR); |
media_sink_with_cast_modes.sink.set_domain(kUserDomainForTesting); |
- media_sink_with_cast_modes.cast_modes.insert(MediaCastMode::TAB_MIRROR); |
- media_sink_with_cast_modes_list.push_back(media_sink_with_cast_modes); |
- handler_->UpdateSinks(media_sink_with_cast_modes_list); |
- EXPECT_EQ(1u, web_ui_->call_data().size()); |
- const content::TestWebUI::CallData& call_data = *web_ui_->call_data()[0]; |
- EXPECT_EQ("media_router.ui.setSinkListAndIdentity", |
- call_data.function_name()); |
- const base::Value* arg1 = call_data.arg1(); |
- const base::DictionaryValue* sinks_with_identity_value = nullptr; |
- ASSERT_TRUE(arg1->GetAsDictionary(&sinks_with_identity_value)); |
- |
- bool show_email = false; |
- bool actual_show_email = true; |
- EXPECT_TRUE( |
- sinks_with_identity_value->GetBoolean("showEmail", &actual_show_email)); |
- EXPECT_EQ(show_email, actual_show_email); |
+ handler_->UpdateSinks({media_sink_with_cast_modes}); |
+ const base::DictionaryValue* sinks_with_identity_value = |
+ ExtractDictFromCallArg("media_router.ui.setSinkListAndIdentity"); |
+ |
+ EXPECT_FALSE(GetBooleanFromDict(sinks_with_identity_value, "showEmail")); |
} |
TEST_F(MediaRouterWebUIMessageHandlerTest, UpdateSinksWithIdentityAndDomain) { |
- MediaSink::Id sink_id("sinkId123"); |
- std::string sink_name("The sink"); |
+ MediaSinkWithCastModes media_sink_with_cast_modes = |
+ CreateMediaSinkWithCastMode("sinkId123", MediaCastMode::TAB_MIRROR); |
std::string domain_name("google.com"); |
- |
- std::vector<MediaSinkWithCastModes> media_sink_with_cast_modes_list; |
- MediaSinkWithCastModes media_sink_with_cast_modes( |
- MediaSink(sink_id, sink_name, MediaSink::IconType::CAST)); |
media_sink_with_cast_modes.sink.set_domain(domain_name); |
- media_sink_with_cast_modes.cast_modes.insert(MediaCastMode::TAB_MIRROR); |
- media_sink_with_cast_modes_list.push_back(media_sink_with_cast_modes); |
- handler_->UpdateSinks(media_sink_with_cast_modes_list); |
- EXPECT_EQ(1u, web_ui_->call_data().size()); |
- const content::TestWebUI::CallData& call_data = *web_ui_->call_data()[0]; |
- EXPECT_EQ("media_router.ui.setSinkListAndIdentity", |
- call_data.function_name()); |
- const base::Value* arg1 = call_data.arg1(); |
- const base::DictionaryValue* sinks_with_identity_value = nullptr; |
- ASSERT_TRUE(arg1->GetAsDictionary(&sinks_with_identity_value)); |
+ handler_->UpdateSinks({media_sink_with_cast_modes}); |
+ const base::DictionaryValue* sinks_with_identity_value = |
+ ExtractDictFromCallArg("media_router.ui.setSinkListAndIdentity"); |
// Domain is displayed for sinks with domains that are not the user domain. |
- bool show_domain = true; |
- bool actual_show_domain = false; |
- EXPECT_TRUE( |
- sinks_with_identity_value->GetBoolean("showDomain", &actual_show_domain)); |
- EXPECT_EQ(show_domain, actual_show_domain); |
+ EXPECT_TRUE(GetBooleanFromDict(sinks_with_identity_value, "showDomain")); |
} |
TEST_F(MediaRouterWebUIMessageHandlerTest, UpdateSinksWithNoDomain) { |
- MediaSink::Id sink_id("sinkId123"); |
- std::string sink_name("The sink"); |
+ MediaSinkWithCastModes media_sink_with_cast_modes = |
+ CreateMediaSinkWithCastMode("sinkId123", MediaCastMode::TAB_MIRROR); |
std::string user_email("nobody@gmail.com"); |
std::string user_domain("NO_HOSTED_DOMAIN"); |
std::string domain_name("default"); |
- |
- handler_->SetEmailAndDomain(user_email, user_domain); |
- |
- std::vector<MediaSinkWithCastModes> media_sink_with_cast_modes_list; |
- MediaSinkWithCastModes media_sink_with_cast_modes( |
- MediaSink(sink_id, sink_name, MediaSink::IconType::CAST)); |
media_sink_with_cast_modes.sink.set_domain(domain_name); |
- media_sink_with_cast_modes.cast_modes.insert(MediaCastMode::TAB_MIRROR); |
- media_sink_with_cast_modes_list.push_back(media_sink_with_cast_modes); |
- handler_->UpdateSinks(media_sink_with_cast_modes_list); |
- EXPECT_EQ(1u, web_ui_->call_data().size()); |
- const content::TestWebUI::CallData& call_data = *web_ui_->call_data()[0]; |
- EXPECT_EQ("media_router.ui.setSinkListAndIdentity", |
- call_data.function_name()); |
- const base::Value* arg1 = call_data.arg1(); |
- const base::DictionaryValue* sinks_with_identity_value = nullptr; |
- ASSERT_TRUE(arg1->GetAsDictionary(&sinks_with_identity_value)); |
+ handler_->SetEmailAndDomain(user_email, user_domain); |
+ handler_->UpdateSinks({media_sink_with_cast_modes}); |
+ const base::DictionaryValue* sinks_with_identity_value = |
+ ExtractDictFromCallArg("media_router.ui.setSinkListAndIdentity"); |
const base::ListValue* sinks_list_value = nullptr; |
ASSERT_TRUE(sinks_with_identity_value->GetList("sinks", &sinks_list_value)); |
@@ -281,38 +301,21 @@ TEST_F(MediaRouterWebUIMessageHandlerTest, UpdateSinksWithNoDomain) { |
ASSERT_TRUE(sinks_list_value->GetDictionary(0, &sink_value)); |
// Domain should not be shown if there were only default sink domains. |
- bool show_domain = false; |
- bool actual_show_domain = false; |
- EXPECT_TRUE( |
- sinks_with_identity_value->GetBoolean("showDomain", &actual_show_domain)); |
- EXPECT_EQ(show_domain, actual_show_domain); |
+ EXPECT_FALSE(GetBooleanFromDict(sinks_with_identity_value, "showDomain")); |
// Sink domain should be empty if user has no hosted domain. |
- std::string value; |
- EXPECT_TRUE(sink_value->GetString("domain", &value)); |
- EXPECT_EQ(std::string(), value); |
+ EXPECT_EQ(std::string(), GetStringFromDict(sink_value, "domain")); |
} |
TEST_F(MediaRouterWebUIMessageHandlerTest, UpdateSinksWithDefaultDomain) { |
- MediaSink::Id sink_id("sinkId123"); |
- std::string sink_name("The sink"); |
+ MediaSinkWithCastModes media_sink_with_cast_modes = |
+ CreateMediaSinkWithCastMode("sinkId123", MediaCastMode::TAB_MIRROR); |
std::string domain_name("default"); |
- |
- std::vector<MediaSinkWithCastModes> media_sink_with_cast_modes_list; |
- MediaSinkWithCastModes media_sink_with_cast_modes( |
- MediaSink(sink_id, sink_name, MediaSink::IconType::CAST)); |
media_sink_with_cast_modes.sink.set_domain(domain_name); |
- media_sink_with_cast_modes.cast_modes.insert(MediaCastMode::TAB_MIRROR); |
- media_sink_with_cast_modes_list.push_back(media_sink_with_cast_modes); |
- handler_->UpdateSinks(media_sink_with_cast_modes_list); |
- EXPECT_EQ(1u, web_ui_->call_data().size()); |
- const content::TestWebUI::CallData& call_data = *web_ui_->call_data()[0]; |
- EXPECT_EQ("media_router.ui.setSinkListAndIdentity", |
- call_data.function_name()); |
- const base::Value* arg1 = call_data.arg1(); |
- const base::DictionaryValue* sinks_with_identity_value = nullptr; |
- ASSERT_TRUE(arg1->GetAsDictionary(&sinks_with_identity_value)); |
+ handler_->UpdateSinks({media_sink_with_cast_modes}); |
+ const base::DictionaryValue* sinks_with_identity_value = |
+ ExtractDictFromCallArg("media_router.ui.setSinkListAndIdentity"); |
const base::ListValue* sinks_list_value = nullptr; |
ASSERT_TRUE(sinks_with_identity_value->GetList("sinks", &sinks_list_value)); |
@@ -320,224 +323,157 @@ TEST_F(MediaRouterWebUIMessageHandlerTest, UpdateSinksWithDefaultDomain) { |
ASSERT_TRUE(sinks_list_value->GetDictionary(0, &sink_value)); |
// Domain should not be shown if there were only default sink domains. |
- bool show_domain = false; |
- bool actual_show_domain = false; |
- EXPECT_TRUE( |
- sinks_with_identity_value->GetBoolean("showDomain", &actual_show_domain)); |
- EXPECT_EQ(show_domain, actual_show_domain); |
+ EXPECT_FALSE(GetBooleanFromDict(sinks_with_identity_value, "showDomain")); |
// Sink domain should be updated from 'default' to user domain. |
- std::string value; |
- EXPECT_TRUE(sink_value->GetString("domain", &value)); |
- EXPECT_EQ(kUserDomainForTesting, value); |
+ EXPECT_EQ(kUserDomainForTesting, GetStringFromDict(sink_value, "domain")); |
} |
TEST_F(MediaRouterWebUIMessageHandlerTest, UpdateRoutes) { |
- MediaRoute::Id route_id("routeId123"); |
- MediaSink::Id sink_id("sinkId123"); |
- MediaSink sink(sink_id, "The sink", MediaSink::IconType::CAST); |
- MediaSource media_source("mediaSource"); |
- std::string description("This is a route"); |
- bool is_local = true; |
- std::vector<MediaRoute> routes; |
- routes.push_back(MediaRoute(route_id, media_source, sink_id, description, |
- is_local, kControllerPathForTesting, true)); |
- std::vector<MediaRoute::Id> joinable_route_ids; |
- joinable_route_ids.push_back(route_id); |
+ const MediaRoute route = CreateRoute(); |
+ std::vector<MediaRoute::Id> joinable_route_ids = {route.media_route_id()}; |
std::unordered_map<MediaRoute::Id, MediaCastMode> current_cast_modes; |
- current_cast_modes.insert(std::make_pair(route_id, MediaCastMode::DEFAULT)); |
+ current_cast_modes.insert( |
+ std::make_pair(route.media_route_id(), MediaCastMode::DEFAULT)); |
EXPECT_CALL(*mock_media_router_ui_, GetRouteProviderExtensionId()).WillOnce( |
ReturnRef(provider_extension_id())); |
- handler_->UpdateRoutes(routes, joinable_route_ids, current_cast_modes); |
- EXPECT_EQ(1u, web_ui_->call_data().size()); |
- const content::TestWebUI::CallData& call_data = *web_ui_->call_data()[0]; |
- EXPECT_EQ("media_router.ui.setRouteList", call_data.function_name()); |
- const base::Value* arg1 = call_data.arg1(); |
- const base::ListValue* routes_list_value = nullptr; |
- ASSERT_TRUE(arg1->GetAsList(&routes_list_value)); |
- const base::DictionaryValue* route_value = nullptr; |
- ASSERT_TRUE(routes_list_value->GetDictionary(0, &route_value)); |
- |
- std::string value; |
- EXPECT_TRUE(route_value->GetString("id", &value)); |
- EXPECT_EQ(route_id, value); |
- EXPECT_TRUE(route_value->GetString("sinkId", &value)); |
- EXPECT_EQ(sink_id, value); |
- EXPECT_TRUE(route_value->GetString("description", &value)); |
- EXPECT_EQ(description, value); |
- |
- bool actual_is_local = false; |
- EXPECT_TRUE(route_value->GetBoolean("isLocal", &actual_is_local)); |
- EXPECT_EQ(is_local, actual_is_local); |
- bool actual_can_join = false; |
- EXPECT_TRUE(route_value->GetBoolean("canJoin", &actual_can_join)); |
- EXPECT_TRUE(actual_can_join); |
- int actual_current_cast_mode = -1; |
- EXPECT_TRUE( |
- route_value->GetInteger("currentCastMode", &actual_current_cast_mode)); |
- EXPECT_EQ(MediaCastMode::DEFAULT, actual_current_cast_mode); |
- |
- std::string custom_controller_path; |
- EXPECT_TRUE(route_value->GetString("customControllerPath", |
- &custom_controller_path)); |
+ handler_->UpdateRoutes({route}, joinable_route_ids, current_cast_modes); |
+ const base::DictionaryValue* route_value = |
+ ExtractDictFromListFromCallArg("media_router.ui.setRouteList"); |
+ |
+ EXPECT_EQ(route.media_route_id(), GetStringFromDict(route_value, "id")); |
+ EXPECT_EQ(route.media_sink_id(), GetStringFromDict(route_value, "sinkId")); |
+ EXPECT_EQ(route.description(), GetStringFromDict(route_value, "description")); |
+ EXPECT_EQ(route.is_local(), GetBooleanFromDict(route_value, "isLocal")); |
+ EXPECT_TRUE(GetBooleanFromDict(route_value, "canJoin")); |
+ EXPECT_EQ(MediaCastMode::DEFAULT, |
+ GetIntegerFromDict(route_value, "currentCastMode")); |
std::string expected_path = base::StringPrintf("%s://%s/%s", |
extensions::kExtensionScheme, |
kProviderExtensionIdForTesting, |
kControllerPathForTesting); |
- EXPECT_EQ(expected_path, custom_controller_path); |
+ EXPECT_EQ(expected_path, |
+ GetStringFromDict(route_value, "customControllerPath")); |
} |
TEST_F(MediaRouterWebUIMessageHandlerTest, UpdateRoutesIncognito) { |
handler_->set_incognito_for_test(true); |
- |
- MediaRoute::Id route_id("routeId123"); |
- MediaSink::Id sink_id("sinkId123"); |
- MediaSink sink(sink_id, "The sink", MediaSink::IconType::CAST); |
- MediaSource media_source("mediaSource"); |
- std::string description("This is a route"); |
- bool is_local = true; |
- std::vector<MediaRoute> routes; |
- routes.push_back(MediaRoute(route_id, media_source, sink_id, description, |
- is_local, kControllerPathForTesting, true)); |
+ const MediaRoute route = CreateRoute(); |
EXPECT_CALL(*mock_media_router_ui_, GetRouteProviderExtensionId()) |
.WillOnce(ReturnRef(provider_extension_id())); |
- handler_->UpdateRoutes(routes, std::vector<MediaRoute::Id>(), |
+ handler_->UpdateRoutes({route}, std::vector<MediaRoute::Id>(), |
std::unordered_map<MediaRoute::Id, MediaCastMode>()); |
- EXPECT_EQ(1u, web_ui_->call_data().size()); |
- const content::TestWebUI::CallData& call_data = *web_ui_->call_data()[0]; |
- EXPECT_EQ("media_router.ui.setRouteList", call_data.function_name()); |
- const base::Value* arg1 = call_data.arg1(); |
- const base::ListValue* routes_list_value = nullptr; |
- ASSERT_TRUE(arg1->GetAsList(&routes_list_value)); |
- const base::DictionaryValue* route_value = nullptr; |
- ASSERT_TRUE(routes_list_value->GetDictionary(0, &route_value)); |
+ const base::DictionaryValue* route_value = |
+ ExtractDictFromListFromCallArg("media_router.ui.setRouteList"); |
+ |
+ EXPECT_EQ(route.media_route_id(), GetStringFromDict(route_value, "id")); |
+ EXPECT_EQ(route.media_sink_id(), GetStringFromDict(route_value, "sinkId")); |
+ EXPECT_EQ(route.description(), GetStringFromDict(route_value, "description")); |
+ EXPECT_EQ(route.is_local(), GetBooleanFromDict(route_value, "isLocal")); |
+ EXPECT_FALSE(GetBooleanFromDict(route_value, "canJoin")); |
- std::string value; |
- EXPECT_TRUE(route_value->GetString("id", &value)); |
- EXPECT_EQ(route_id, value); |
- EXPECT_TRUE(route_value->GetString("sinkId", &value)); |
- EXPECT_EQ(sink_id, value); |
- EXPECT_TRUE(route_value->GetString("description", &value)); |
- EXPECT_EQ(description, value); |
- |
- bool actual_is_local = false; |
- EXPECT_TRUE(route_value->GetBoolean("isLocal", &actual_is_local)); |
- EXPECT_EQ(is_local, actual_is_local); |
- bool actual_can_join = false; |
- EXPECT_TRUE(route_value->GetBoolean("canJoin", &actual_can_join)); |
- EXPECT_FALSE(actual_can_join); |
int actual_current_cast_mode = -1; |
EXPECT_FALSE( |
route_value->GetInteger("currentCastMode", &actual_current_cast_mode)); |
- |
std::string custom_controller_path; |
EXPECT_FALSE( |
route_value->GetString("customControllerPath", &custom_controller_path)); |
} |
+TEST_F(MediaRouterWebUIMessageHandlerTest, UpdateMediaRouteStatus) { |
+ MediaStatus status; |
+ status.title = "test title"; |
+ status.description = "test description"; |
+ status.can_play_pause = true; |
+ status.can_set_volume = true; |
+ status.is_paused = true; |
+ status.duration = base::TimeDelta::FromSeconds(90); |
+ status.current_time = base::TimeDelta::FromSeconds(80); |
+ status.volume = 0.9; |
+ |
+ handler_->UpdateMediaRouteStatus(status); |
+ const base::DictionaryValue* status_value = |
+ ExtractDictFromCallArg("media_router.ui.updateRouteStatus"); |
+ |
+ EXPECT_EQ(status.title, GetStringFromDict(status_value, "title")); |
+ EXPECT_EQ(status.description, GetStringFromDict(status_value, "description")); |
+ EXPECT_EQ(status.can_play_pause, |
+ GetBooleanFromDict(status_value, "canPlayPause")); |
+ EXPECT_EQ(status.can_mute, GetBooleanFromDict(status_value, "canMute")); |
+ EXPECT_EQ(status.can_set_volume, |
+ GetBooleanFromDict(status_value, "canSetVolume")); |
+ EXPECT_EQ(status.can_seek, GetBooleanFromDict(status_value, "canSeek")); |
+ EXPECT_EQ(status.is_paused, GetBooleanFromDict(status_value, "isPaused")); |
+ EXPECT_EQ(status.is_muted, GetBooleanFromDict(status_value, "isMuted")); |
+ EXPECT_EQ(status.duration.InSeconds(), |
+ GetIntegerFromDict(status_value, "duration")); |
+ EXPECT_EQ(status.current_time.InSeconds(), |
+ GetIntegerFromDict(status_value, "currentTime")); |
+ EXPECT_EQ(status.volume, GetDoubleFromDict(status_value, "volume")); |
+} |
+ |
TEST_F(MediaRouterWebUIMessageHandlerTest, OnCreateRouteResponseReceived) { |
- MediaRoute::Id route_id("routeId123"); |
- MediaSink::Id sink_id("sinkId123"); |
- MediaSink sink(sink_id, "The sink", MediaSink::IconType::CAST); |
- std::string description("This is a route"); |
- bool is_local = true; |
- bool is_for_display = true; |
+ MediaRoute route = CreateRoute(); |
bool incognito = false; |
- MediaRoute route(route_id, MediaSource("mediaSource"), sink_id, description, |
- is_local, kControllerPathForTesting, is_for_display); |
route.set_incognito(incognito); |
EXPECT_CALL(*mock_media_router_ui_, GetRouteProviderExtensionId()) |
.WillOnce(ReturnRef(provider_extension_id())); |
- handler_->OnCreateRouteResponseReceived(sink_id, &route); |
- EXPECT_EQ(1u, web_ui_->call_data().size()); |
- const content::TestWebUI::CallData& call_data = *web_ui_->call_data()[0]; |
- EXPECT_EQ("media_router.ui.onCreateRouteResponseReceived", |
- call_data.function_name()); |
- const base::Value* arg1 = call_data.arg1(); |
+ handler_->OnCreateRouteResponseReceived(route.media_sink_id(), &route); |
+ const content::TestWebUI::CallData& call_data = |
+ GetCallData("media_router.ui.onCreateRouteResponseReceived"); |
const base::Value* sink_id_value = nullptr; |
- ASSERT_TRUE(arg1->GetAsString(&sink_id_value)); |
- EXPECT_EQ(sink_id, sink_id_value->GetString()); |
+ ASSERT_TRUE(call_data.arg1()->GetAsString(&sink_id_value)); |
+ EXPECT_EQ(route.media_sink_id(), sink_id_value->GetString()); |
- const base::Value* arg2 = call_data.arg2(); |
const base::DictionaryValue* route_value = nullptr; |
- ASSERT_TRUE(arg2->GetAsDictionary(&route_value)); |
- std::string value; |
- EXPECT_TRUE(route_value->GetString("id", &value)); |
- EXPECT_EQ(route_id, value); |
- EXPECT_TRUE(route_value->GetString("sinkId", &value)); |
- EXPECT_EQ(sink_id, value); |
- EXPECT_TRUE(route_value->GetString("description", &value)); |
- EXPECT_EQ(description, value); |
- |
- bool actual_is_local = false; |
- EXPECT_TRUE(route_value->GetBoolean("isLocal", &actual_is_local)); |
- EXPECT_EQ(is_local, actual_is_local); |
- |
- std::string actual_path; |
- EXPECT_TRUE(route_value->GetString("customControllerPath", &actual_path)); |
+ ASSERT_TRUE(call_data.arg2()->GetAsDictionary(&route_value)); |
+ EXPECT_EQ(route.media_route_id(), GetStringFromDict(route_value, "id")); |
+ EXPECT_EQ(route.media_sink_id(), GetStringFromDict(route_value, "sinkId")); |
+ EXPECT_EQ(route.description(), GetStringFromDict(route_value, "description")); |
+ EXPECT_EQ(route.is_local(), GetBooleanFromDict(route_value, "isLocal")); |
std::string expected_path = base::StringPrintf( |
"%s://%s/%s", extensions::kExtensionScheme, |
kProviderExtensionIdForTesting, kControllerPathForTesting); |
- EXPECT_EQ(expected_path, actual_path); |
+ EXPECT_EQ(expected_path, |
+ GetStringFromDict(route_value, "customControllerPath")); |
- const base::Value* arg3 = call_data.arg3(); |
bool route_for_display = false; |
- ASSERT_TRUE(arg3->GetAsBoolean(&route_for_display)); |
- EXPECT_EQ(is_for_display, route_for_display); |
+ ASSERT_TRUE(call_data.arg3()->GetAsBoolean(&route_for_display)); |
+ EXPECT_TRUE(route_for_display); |
} |
TEST_F(MediaRouterWebUIMessageHandlerTest, |
OnCreateRouteResponseReceivedIncognito) { |
handler_->set_incognito_for_test(true); |
- |
- MediaRoute::Id route_id("routeId123"); |
- MediaSink::Id sink_id("sinkId123"); |
- MediaSink sink(sink_id, "The sink", MediaSink::IconType::CAST); |
- std::string description("This is a route"); |
- bool is_local = true; |
- bool is_for_display = true; |
+ MediaRoute route = CreateRoute(); |
bool incognito = true; |
- MediaRoute route(route_id, MediaSource("mediaSource"), sink_id, description, |
- is_local, kControllerPathForTesting, is_for_display); |
route.set_incognito(incognito); |
EXPECT_CALL(*mock_media_router_ui_, GetRouteProviderExtensionId()).WillOnce( |
ReturnRef(provider_extension_id())); |
- handler_->OnCreateRouteResponseReceived(sink_id, &route); |
- EXPECT_EQ(1u, web_ui_->call_data().size()); |
- const content::TestWebUI::CallData& call_data = *web_ui_->call_data()[0]; |
- EXPECT_EQ("media_router.ui.onCreateRouteResponseReceived", |
- call_data.function_name()); |
- const base::Value* arg1 = call_data.arg1(); |
+ handler_->OnCreateRouteResponseReceived(route.media_sink_id(), &route); |
+ const content::TestWebUI::CallData& call_data = |
+ GetCallData("media_router.ui.onCreateRouteResponseReceived"); |
const base::Value* sink_id_value = nullptr; |
- ASSERT_TRUE(arg1->GetAsString(&sink_id_value)); |
- EXPECT_EQ(sink_id, sink_id_value->GetString()); |
+ ASSERT_TRUE(call_data.arg1()->GetAsString(&sink_id_value)); |
+ EXPECT_EQ(route.media_sink_id(), sink_id_value->GetString()); |
- const base::Value* arg2 = call_data.arg2(); |
const base::DictionaryValue* route_value = nullptr; |
- ASSERT_TRUE(arg2->GetAsDictionary(&route_value)); |
- std::string value; |
- EXPECT_TRUE(route_value->GetString("id", &value)); |
- EXPECT_EQ(route_id, value); |
- EXPECT_TRUE(route_value->GetString("sinkId", &value)); |
- EXPECT_EQ(sink_id, value); |
- EXPECT_TRUE(route_value->GetString("description", &value)); |
- EXPECT_EQ(description, value); |
- |
- bool actual_is_local = false; |
- EXPECT_TRUE(route_value->GetBoolean("isLocal", &actual_is_local)); |
- EXPECT_EQ(is_local, actual_is_local); |
+ ASSERT_TRUE(call_data.arg2()->GetAsDictionary(&route_value)); |
+ EXPECT_EQ(route.media_route_id(), GetStringFromDict(route_value, "id")); |
+ EXPECT_EQ(route.media_sink_id(), GetStringFromDict(route_value, "sinkId")); |
+ EXPECT_EQ(route.description(), GetStringFromDict(route_value, "description")); |
+ EXPECT_EQ(route.is_local(), GetBooleanFromDict(route_value, "isLocal")); |
std::string actual_path; |
EXPECT_FALSE(route_value->GetString("customControllerPath", &actual_path)); |
- const base::Value* arg3 = call_data.arg3(); |
bool route_for_display = false; |
- ASSERT_TRUE(arg3->GetAsBoolean(&route_for_display)); |
- EXPECT_EQ(is_for_display, route_for_display); |
+ ASSERT_TRUE(call_data.arg3()->GetAsBoolean(&route_for_display)); |
+ EXPECT_TRUE(route_for_display); |
} |
TEST_F(MediaRouterWebUIMessageHandlerTest, UpdateIssue) { |
@@ -555,50 +491,36 @@ TEST_F(MediaRouterWebUIMessageHandlerTest, UpdateIssue) { |
const Issue::Id& issue_id = issue.id(); |
handler_->UpdateIssue(issue); |
- EXPECT_EQ(1u, web_ui_->call_data().size()); |
- const content::TestWebUI::CallData& call_data = *web_ui_->call_data()[0]; |
- EXPECT_EQ("media_router.ui.setIssue", call_data.function_name()); |
- const base::Value* arg1 = call_data.arg1(); |
- const base::DictionaryValue* issue_value = nullptr; |
- ASSERT_TRUE(arg1->GetAsDictionary(&issue_value)); |
+ const base::DictionaryValue* issue_value = |
+ ExtractDictFromCallArg("media_router.ui.setIssue"); |
// Initialized to invalid issue id. |
- int actual_issue_id = -1; |
- std::string value; |
- EXPECT_TRUE(issue_value->GetInteger("id", &actual_issue_id)); |
- EXPECT_EQ(issue_id, actual_issue_id); |
- EXPECT_TRUE(issue_value->GetString("title", &value)); |
- EXPECT_EQ(issue_title, value); |
- EXPECT_TRUE(issue_value->GetString("message", &value)); |
- EXPECT_EQ(issue_message, value); |
+ EXPECT_EQ(issue_id, GetIntegerFromDict(issue_value, "id")); |
+ EXPECT_EQ(issue_title, GetStringFromDict(issue_value, "title")); |
+ EXPECT_EQ(issue_message, GetStringFromDict(issue_value, "message")); |
// Initialized to invalid action type. |
- int action_type_num = -1; |
- EXPECT_TRUE(issue_value->GetInteger("defaultActionType", &action_type_num)); |
- EXPECT_EQ(static_cast<int>(default_action), action_type_num); |
- EXPECT_TRUE(issue_value->GetInteger("secondaryActionType", &action_type_num)); |
- EXPECT_EQ(static_cast<int>(secondary_actions[0]), action_type_num); |
- |
- EXPECT_TRUE(issue_value->GetString("routeId", &value)); |
- EXPECT_EQ(route_id, value); |
+ EXPECT_EQ(static_cast<int>(default_action), |
+ GetIntegerFromDict(issue_value, "defaultActionType")); |
+ EXPECT_EQ(static_cast<int>(secondary_actions[0]), |
+ GetIntegerFromDict(issue_value, "secondaryActionType")); |
+ EXPECT_EQ(route_id, GetStringFromDict(issue_value, "routeId")); |
// The issue is blocking since it is FATAL. |
- bool actual_is_blocking = false; |
- EXPECT_TRUE(issue_value->GetBoolean("isBlocking", &actual_is_blocking)); |
- EXPECT_TRUE(actual_is_blocking); |
+ EXPECT_TRUE(GetBooleanFromDict(issue_value, "isBlocking")); |
} |
TEST_F(MediaRouterWebUIMessageHandlerTest, RecordCastModeSelection) { |
base::ListValue args; |
args.AppendInteger(MediaCastMode::DEFAULT); |
- EXPECT_CALL(*mock_media_router_ui_.get(), |
+ EXPECT_CALL(*mock_media_router_ui_, |
RecordCastModeSelection(MediaCastMode::DEFAULT)) |
.Times(1); |
handler_->OnReportSelectedCastMode(&args); |
args.Clear(); |
args.AppendInteger(MediaCastMode::TAB_MIRROR); |
- EXPECT_CALL(*mock_media_router_ui_.get(), |
+ EXPECT_CALL(*mock_media_router_ui_, |
RecordCastModeSelection(MediaCastMode::TAB_MIRROR)) |
.Times(1); |
handler_->OnReportSelectedCastMode(&args); |
@@ -620,9 +542,7 @@ TEST_F(MediaRouterWebUIMessageHandlerTest, RetrieveCastModeSelection) { |
ASSERT_EQ("media_router.ui.setInitialData", call_data1.function_name()); |
const base::DictionaryValue* initial_data = nullptr; |
ASSERT_TRUE(call_data1.arg1()->GetAsDictionary(&initial_data)); |
- bool use_tab_mirroring = false; |
- EXPECT_TRUE(initial_data->GetBoolean("useTabMirroring", &use_tab_mirroring)); |
- EXPECT_TRUE(use_tab_mirroring); |
+ EXPECT_TRUE(GetBooleanFromDict(initial_data, "useTabMirroring")); |
EXPECT_CALL(*mock_media_router_ui_, |
UserSelectedTabMirroringForCurrentOrigin()) |
@@ -631,8 +551,111 @@ TEST_F(MediaRouterWebUIMessageHandlerTest, RetrieveCastModeSelection) { |
const content::TestWebUI::CallData& call_data2 = *web_ui_->call_data()[1]; |
ASSERT_EQ("media_router.ui.setInitialData", call_data2.function_name()); |
ASSERT_TRUE(call_data2.arg1()->GetAsDictionary(&initial_data)); |
- EXPECT_TRUE(initial_data->GetBoolean("useTabMirroring", &use_tab_mirroring)); |
- EXPECT_FALSE(use_tab_mirroring); |
+ EXPECT_FALSE(GetBooleanFromDict(initial_data, "useTabMirroring")); |
+} |
+ |
+TEST_F(MediaRouterWebUIMessageHandlerTest, OnRouteDetailsOpenedAndClosed) { |
+ const std::string route_id = "routeId123"; |
+ base::ListValue args_list; |
+ base::DictionaryValue* args; |
+ args_list.Append(base::MakeUnique<base::DictionaryValue>()); |
+ args_list.GetDictionary(0, &args); |
+ args->SetString("routeId", route_id); |
+ |
+ EXPECT_CALL(*mock_media_router_ui_, OnMediaControllerUIAvailable(route_id)); |
+ handler_->OnMediaControllerAvailable(&args_list); |
+ |
+ args_list.Clear(); |
+ EXPECT_CALL(*mock_media_router_ui_, OnMediaControllerUIClosed()); |
+ handler_->OnMediaControllerClosed(&args_list); |
+} |
+ |
+TEST_F(MediaRouterWebUIMessageHandlerTest, OnMediaCommandsReceived) { |
+ mojom::MediaControllerPtr mojo_media_controller; |
+ mojo::MakeRequest(&mojo_media_controller); |
+ MockMediaRouter media_router; |
+ scoped_refptr<MockMediaRouteController> controller = |
+ new MockMediaRouteController("routeId", std::move(mojo_media_controller), |
+ &media_router); |
+ EXPECT_CALL(*mock_media_router_ui_, GetMediaRouteController()) |
+ .WillRepeatedly(Return(controller.get())); |
+ MediaStatus status; |
+ status.duration = base::TimeDelta::FromSeconds(100); |
+ handler_->UpdateMediaRouteStatus(status); |
+ |
+ base::ListValue args_list; |
+ |
+ EXPECT_CALL(*controller, Play()); |
+ handler_->OnPlayCurrentMedia(&args_list); |
+ |
+ EXPECT_CALL(*controller, Pause()); |
+ handler_->OnPauseCurrentMedia(&args_list); |
+ |
+ base::DictionaryValue* args; |
+ args_list.Append(base::MakeUnique<base::DictionaryValue>()); |
+ args_list.GetDictionary(0, &args); |
+ |
+ const int time = 50; |
+ args->SetInteger("time", time); |
+ EXPECT_CALL(*controller, Seek(base::TimeDelta::FromSeconds(time))); |
+ handler_->OnSeekCurrentMedia(&args_list); |
+ |
+ args->Clear(); |
+ args->SetBoolean("mute", true); |
+ EXPECT_CALL(*controller, SetMute(true)); |
+ handler_->OnSetCurrentMediaMute(&args_list); |
+ |
+ const double volume = 0.4; |
+ args->Clear(); |
+ args->SetDouble("volume", volume); |
+ EXPECT_CALL(*controller, SetVolume(volume)); |
+ handler_->OnSetCurrentMediaVolume(&args_list); |
+} |
+ |
+TEST_F(MediaRouterWebUIMessageHandlerTest, OnInvalidMediaCommandsReceived) { |
+ mojom::MediaControllerPtr mojo_media_controller; |
+ mojo::MakeRequest(&mojo_media_controller); |
+ MockMediaRouter media_router; |
+ scoped_refptr<MockMediaRouteController> controller = |
+ new MockMediaRouteController("routeId", std::move(mojo_media_controller), |
+ &media_router); |
+ EXPECT_CALL(*mock_media_router_ui_, GetMediaRouteController()) |
+ .WillRepeatedly(Return(controller.get())); |
+ |
+ MediaStatus status; |
+ status.duration = base::TimeDelta::FromSeconds(100); |
+ handler_->UpdateMediaRouteStatus(status); |
+ |
+ EXPECT_CALL(*controller, Seek(_)).Times(0); |
+ EXPECT_CALL(*controller, SetVolume(_)).Times(0); |
+ |
+ base::ListValue args_list; |
+ |
+ base::DictionaryValue* args; |
+ args_list.Append(base::MakeUnique<base::DictionaryValue>()); |
+ args_list.GetDictionary(0, &args); |
+ |
+ // Seek positions greater than the duration or negative should be ignored. |
+ args->SetInteger("time", 101); |
+ handler_->OnSeekCurrentMedia(&args_list); |
+ args->SetInteger("time", -10); |
+ handler_->OnSeekCurrentMedia(&args_list); |
+ |
+ args->Clear(); |
+ |
+ // Volumes outside of the [0, 1] range should be ignored. |
+ args->SetDouble("volume", 1.5); |
+ handler_->OnSetCurrentMediaVolume(&args_list); |
+ args->SetDouble("volume", 1.5); |
+ handler_->OnSetCurrentMediaVolume(&args_list); |
+} |
+ |
+TEST_F(MediaRouterWebUIMessageHandlerTest, OnRouteControllerInvalidated) { |
+ handler_->OnRouteControllerInvalidated(); |
+ EXPECT_EQ(1u, web_ui_->call_data().size()); |
+ const content::TestWebUI::CallData& call_data = *web_ui_->call_data()[0]; |
+ EXPECT_EQ("media_router.ui.onRouteControllerInvalidated", |
+ call_data.function_name()); |
} |
} // namespace media_router |