| // 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 <memory> |
| |
| #include "base/bind.h" |
| #include "base/values.h" |
| #include "chrome/browser/media/router/media_router_factory.h" |
| #include "chrome/browser/media/router/test/mock_media_router.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/ui/media_router/media_router_ui_service.h" |
| #include "chrome/browser/ui/media_router/media_router_ui_service_factory.h" |
| #include "chrome/browser/ui/toolbar/toolbar_actions_model.h" |
| #include "chrome/browser/ui/toolbar/toolbar_actions_model_factory.h" |
| #include "chrome/common/pref_names.h" |
| #include "chrome/test/base/testing_profile.h" |
| #include "components/sync_preferences/testing_pref_service_syncable.h" |
| #include "content/public/test/test_browser_thread_bundle.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace { |
| |
| class MockMediaRouterUIServiceObserver |
| : public media_router::MediaRouterUIService::Observer { |
| public: |
| MOCK_METHOD0(OnServiceDisabled, void()); |
| }; |
| |
| } // namespace |
| |
| namespace media_router { |
| |
| class MediaRouterUIServiceFactoryUnitTest : public testing::Test { |
| public: |
| MediaRouterUIServiceFactoryUnitTest() {} |
| ~MediaRouterUIServiceFactoryUnitTest() override {} |
| |
| void SetUp() override { |
| TestingProfile::Builder builder; |
| // MediaRouterUIService instantiates MediaRouterActionController, which |
| // requires ToolbarActionsModel. |
| builder.AddTestingFactory( |
| ToolbarActionsModelFactory::GetInstance(), |
| base::BindRepeating(&BuildFakeToolBarActionsModel)); |
| builder.AddTestingFactory(MediaRouterFactory::GetInstance(), |
| base::BindRepeating(&MockMediaRouter::Create)); |
| profile_ = builder.Build(); |
| } |
| |
| static std::unique_ptr<KeyedService> BuildFakeToolBarActionsModel( |
| content::BrowserContext* context) { |
| return std::unique_ptr<ToolbarActionsModel>( |
| new ToolbarActionsModel(static_cast<Profile*>(context), nullptr)); |
| } |
| |
| protected: |
| content::TestBrowserThreadBundle thread_bundle_; |
| std::unique_ptr<TestingProfile> profile_; |
| }; |
| |
| TEST_F(MediaRouterUIServiceFactoryUnitTest, CreateService) { |
| // We call BuildServiceInstanceFor() directly because |
| // MediaRouterUIServiceFactory::GetForBrowserContext() is set to return a |
| // nullptr for a test profile. |
| std::unique_ptr<MediaRouterUIService> service( |
| static_cast<MediaRouterUIService*>( |
| MediaRouterUIServiceFactory::GetInstance()->BuildServiceInstanceFor( |
| profile_.get()))); |
| ASSERT_TRUE(service); |
| ASSERT_TRUE(service->action_controller()); |
| } |
| |
| TEST_F(MediaRouterUIServiceFactoryUnitTest, |
| DoNotCreateActionControllerWhenDisabled) { |
| profile_->GetTestingPrefService()->SetManagedPref( |
| prefs::kEnableMediaRouter, std::make_unique<base::Value>(false)); |
| std::unique_ptr<MediaRouterUIService> service( |
| static_cast<MediaRouterUIService*>( |
| MediaRouterUIServiceFactory::GetInstance()->BuildServiceInstanceFor( |
| profile_.get()))); |
| ASSERT_TRUE(service); |
| EXPECT_EQ(nullptr, service->action_controller()); |
| } |
| |
| TEST_F(MediaRouterUIServiceFactoryUnitTest, DisablingMediaRouting) { |
| std::unique_ptr<MediaRouterUIService> service( |
| static_cast<MediaRouterUIService*>( |
| MediaRouterUIServiceFactory::GetInstance()->BuildServiceInstanceFor( |
| profile_.get()))); |
| ASSERT_TRUE(service); |
| ASSERT_TRUE(service->action_controller()); |
| |
| MockMediaRouterUIServiceObserver mock_observer; |
| service->AddObserver(&mock_observer); |
| EXPECT_CALL(mock_observer, OnServiceDisabled).Times(testing::Exactly(1)); |
| |
| profile_->GetTestingPrefService()->SetManagedPref( |
| prefs::kEnableMediaRouter, std::make_unique<base::Value>(false)); |
| EXPECT_EQ(nullptr, service->action_controller()); |
| service->RemoveObserver(&mock_observer); |
| } |
| |
| } // namespace media_router |