| Index: chrome/browser/ui/toolbar/media_router_action_controller_unittest.cc
|
| diff --git a/chrome/browser/ui/toolbar/media_router_action_controller_unittest.cc b/chrome/browser/ui/toolbar/media_router_action_controller_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..b6777f0853e7a63d6ca97ab3e45b343ff4a83e54
|
| --- /dev/null
|
| +++ b/chrome/browser/ui/toolbar/media_router_action_controller_unittest.cc
|
| @@ -0,0 +1,217 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "chrome/browser/media/router/mock_media_router.h"
|
| +#include "chrome/browser/ui/toolbar/component_toolbar_actions_factory.h"
|
| +#include "chrome/browser/ui/toolbar/media_router_action_controller.h"
|
| +#include "chrome/browser/ui/webui/media_router/media_router_test.h"
|
| +#include "testing/gmock/include/gmock/gmock.h"
|
| +
|
| +using testing::_;
|
| +
|
| +class TestComponentActionDelegate
|
| + : public extensions::ComponentMigrationHelper::ComponentActionDelegate {
|
| + public:
|
| + TestComponentActionDelegate() : has_media_router_action_(false) {}
|
| + ~TestComponentActionDelegate() {}
|
| +
|
| + void AddComponentAction(const std::string& action_id) override {
|
| + if (action_id == ComponentToolbarActionsFactory::kMediaRouterActionId) {
|
| + EXPECT_FALSE(HasComponentAction(
|
| + ComponentToolbarActionsFactory::kMediaRouterActionId));
|
| + has_media_router_action_ = true;
|
| + }
|
| + }
|
| +
|
| + void RemoveComponentAction(const std::string& action_id) override {
|
| + if (action_id == ComponentToolbarActionsFactory::kMediaRouterActionId) {
|
| + EXPECT_TRUE(HasComponentAction(
|
| + ComponentToolbarActionsFactory::kMediaRouterActionId));
|
| + has_media_router_action_ = false;
|
| + }
|
| + }
|
| +
|
| + bool HasComponentAction(const std::string& action_id) const override {
|
| + if (action_id == ComponentToolbarActionsFactory::kMediaRouterActionId)
|
| + return has_media_router_action_;
|
| + return false;
|
| + }
|
| +
|
| + private:
|
| + bool has_media_router_action_;
|
| +};
|
| +
|
| +class MockMediaRouterActionObserver
|
| + : public MediaRouterActionController::Observer {
|
| + public:
|
| + MockMediaRouterActionObserver() {}
|
| + ~MockMediaRouterActionObserver() {}
|
| + MOCK_METHOD1(OnIssueUpdated, void(const media_router::Issue* issue));
|
| + MOCK_METHOD1(OnLocalRouteUpdated, void(bool has_local_route));
|
| +};
|
| +
|
| +class MediaRouterActionControllerUnitTest : public MediaRouterTest {
|
| + public:
|
| + MediaRouterActionControllerUnitTest()
|
| + : fake_issue_(media_router::Issue(
|
| + "title notification",
|
| + "message notification",
|
| + media_router::IssueAction(media_router::IssueAction::TYPE_DISMISS),
|
| + std::vector<media_router::IssueAction>(),
|
| + "route_id",
|
| + media_router::Issue::NOTIFICATION,
|
| + false,
|
| + -1)),
|
| + fake_source1_("fakeSource1"),
|
| + fake_source2_("fakeSource2") {}
|
| +
|
| + ~MediaRouterActionControllerUnitTest() override {}
|
| +
|
| + // MediaRouterTest:
|
| + void SetUp() override {
|
| + MediaRouterTest::SetUp();
|
| +
|
| + router_.reset(new media_router::MockMediaRouter());
|
| + controller_.reset(
|
| + new MediaRouterActionController(profile(), router_.get()));
|
| + delegate_.reset(new TestComponentActionDelegate());
|
| + observer_.reset(new MockMediaRouterActionObserver());
|
| +
|
| + controller_->delegate_ = delegate_.get();
|
| + controller_->AddObserver(observer_.get());
|
| +
|
| + local_display_route_list_.push_back(
|
| + media_router::MediaRoute("routeId1", fake_source1_, "sinkId1",
|
| + "description", true, std::string(), true));
|
| + non_local_display_route_list_.push_back(
|
| + media_router::MediaRoute("routeId2", fake_source1_, "sinkId2",
|
| + "description", false, std::string(), true));
|
| + non_local_display_route_list_.push_back(
|
| + media_router::MediaRoute("routeId3", fake_source2_, "sinkId3",
|
| + "description", true, std::string(), false));
|
| + }
|
| +
|
| + void TearDown() override {
|
| + controller_->RemoveObserver(observer_.get());
|
| + controller_.reset();
|
| + delegate_.reset();
|
| + router_.reset();
|
| + observer_.reset();
|
| + MediaRouterTest::TearDown();
|
| + }
|
| +
|
| + bool ActionExists() {
|
| + return delegate_->HasComponentAction(
|
| + ComponentToolbarActionsFactory::kMediaRouterActionId);
|
| + }
|
| +
|
| + MediaRouterActionController* controller() { return controller_.get(); }
|
| + MockMediaRouterActionObserver* observer() { return observer_.get(); }
|
| +
|
| + const media_router::Issue* fake_issue() {
|
| + return &fake_issue_;
|
| + }
|
| + const std::vector<media_router::MediaRoute>& local_display_route_list()
|
| + const {
|
| + return local_display_route_list_;
|
| + }
|
| + const std::vector<media_router::MediaRoute>& non_local_display_route_list()
|
| + const {
|
| + return non_local_display_route_list_;
|
| + }
|
| + const std::vector<media_router::MediaRoute::Id>& empty_route_id_list() const {
|
| + return empty_route_id_list_;
|
| + }
|
| +
|
| + private:
|
| + std::unique_ptr<MediaRouterActionController> controller_;
|
| + std::unique_ptr<media_router::MockMediaRouter> router_;
|
| + std::unique_ptr<TestComponentActionDelegate> delegate_;
|
| + std::unique_ptr<MockMediaRouterActionObserver> observer_;
|
| +
|
| + const media_router::Issue fake_issue_;
|
| +
|
| + // Fake Sources, used for the Routes.
|
| + const media_router::MediaSource fake_source1_;
|
| + const media_router::MediaSource fake_source2_;
|
| +
|
| + std::vector<media_router::MediaRoute> local_display_route_list_;
|
| + std::vector<media_router::MediaRoute> non_local_display_route_list_;
|
| + std::vector<media_router::MediaRoute::Id> empty_route_id_list_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(MediaRouterActionControllerUnitTest);
|
| +};
|
| +
|
| +TEST_F(MediaRouterActionControllerUnitTest, EphemeralIcon) {
|
| + EXPECT_FALSE(ActionExists());
|
| +
|
| + // Creating a local route should show the action icon.
|
| + controller()->OnRoutesUpdated(
|
| + local_display_route_list(), empty_route_id_list());
|
| + EXPECT_TRUE(controller()->HasLocalRoute());
|
| + EXPECT_TRUE(ActionExists());
|
| + // Removing the local route should hide the icon.
|
| + controller()->OnRoutesUpdated(
|
| + non_local_display_route_list(), empty_route_id_list());
|
| + EXPECT_FALSE(controller()->HasLocalRoute());
|
| + EXPECT_FALSE(ActionExists());
|
| +
|
| + // Creating an issue should show the action icon.
|
| + controller()->OnIssueUpdated(fake_issue());
|
| + EXPECT_TRUE(controller()->GetIssue()->Equals(*fake_issue()));
|
| + EXPECT_TRUE(ActionExists());
|
| + // Removing the issue should hide the icon.
|
| + controller()->OnIssueUpdated(nullptr);
|
| + EXPECT_EQ(controller()->GetIssue(), nullptr);
|
| + EXPECT_FALSE(ActionExists());
|
| +
|
| + controller()->OnIssueUpdated(fake_issue());
|
| + controller()->OnRoutesUpdated(
|
| + local_display_route_list(), empty_route_id_list());
|
| + controller()->OnIssueUpdated(nullptr);
|
| + // When the issue disappears, the icon should remain visible if there's
|
| + // a local route.
|
| + EXPECT_TRUE(ActionExists());
|
| + controller()->OnRoutesUpdated(
|
| + non_local_display_route_list(), empty_route_id_list());
|
| + EXPECT_FALSE(ActionExists());
|
| +}
|
| +
|
| +TEST_F(MediaRouterActionControllerUnitTest, ToggleIconVisibilityPreference) {
|
| + EXPECT_FALSE(ActionExists());
|
| +
|
| + // Turn on the "always show icon" setting.
|
| + controller()->ToggleActionVisibilityPreference();
|
| + EXPECT_TRUE(ActionExists());
|
| + controller()->OnRoutesUpdated(
|
| + local_display_route_list(), empty_route_id_list());
|
| + controller()->OnRoutesUpdated(
|
| + non_local_display_route_list(), empty_route_id_list());
|
| + // Removing the local route should not hide the icon.
|
| + EXPECT_TRUE(ActionExists());
|
| +
|
| + controller()->OnIssueUpdated(fake_issue());
|
| + controller()->OnIssueUpdated(nullptr);
|
| + // Removing the issue should not hide the icon.
|
| + EXPECT_TRUE(ActionExists());
|
| +
|
| + controller()->ToggleActionVisibilityPreference();
|
| + EXPECT_FALSE(ActionExists());
|
| +}
|
| +
|
| +TEST_F(MediaRouterActionControllerUnitTest, NotifyObservers) {
|
| + EXPECT_CALL(*observer(), OnIssueUpdated(_)).Times(1);
|
| + controller()->OnIssueUpdated(fake_issue());
|
| +
|
| + EXPECT_CALL(*observer(), OnIssueUpdated(nullptr)).Times(1);
|
| + controller()->OnIssueUpdated(nullptr);
|
| +
|
| + EXPECT_CALL(*observer(), OnLocalRouteUpdated(true)).Times(1);
|
| + controller()->OnRoutesUpdated(
|
| + local_display_route_list(), empty_route_id_list());
|
| +
|
| + EXPECT_CALL(*observer(), OnLocalRouteUpdated(false)).Times(1);
|
| + controller()->OnRoutesUpdated(
|
| + non_local_display_route_list(), empty_route_id_list());
|
| +}
|
|
|