| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stddef.h> | 5 #include <stddef.h> |
| 6 #include <stdint.h> | 6 #include <stdint.h> |
| 7 | 7 |
| 8 #include <memory> | 8 #include <memory> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <utility> | 10 #include <utility> |
| 11 | 11 |
| 12 #include "base/bind.h" | 12 #include "base/bind.h" |
| 13 #include "base/bind_helpers.h" | 13 #include "base/bind_helpers.h" |
| 14 #include "base/macros.h" | 14 #include "base/macros.h" |
| 15 #include "base/memory/ptr_util.h" | 15 #include "base/memory/ptr_util.h" |
| 16 #include "base/memory/ref_counted.h" | 16 #include "base/memory/ref_counted.h" |
| 17 #include "base/run_loop.h" | 17 #include "base/run_loop.h" |
| 18 #include "base/test/histogram_tester.h" | 18 #include "base/test/histogram_tester.h" |
| 19 #include "base/test/mock_callback.h" | 19 #include "base/test/mock_callback.h" |
| 20 #include "base/threading/thread_task_runner_handle.h" | 20 #include "base/threading/thread_task_runner_handle.h" |
| 21 #include "chrome/browser/media/router/event_page_request_manager.h" |
| 22 #include "chrome/browser/media/router/event_page_request_manager_factory.h" |
| 21 #include "chrome/browser/media/router/mock_media_router.h" | 23 #include "chrome/browser/media/router/mock_media_router.h" |
| 22 #include "chrome/browser/media/router/mojo/media_router_mojo_metrics.h" | 24 #include "chrome/browser/media/router/mojo/media_router_mojo_metrics.h" |
| 23 #include "chrome/browser/media/router/mojo/media_router_mojo_test.h" | 25 #include "chrome/browser/media/router/mojo/media_router_mojo_test.h" |
| 24 #include "chrome/browser/media/router/route_message_observer.h" | 26 #include "chrome/browser/media/router/route_message_observer.h" |
| 25 #include "chrome/browser/media/router/test_helper.h" | 27 #include "chrome/browser/media/router/test_helper.h" |
| 26 #include "chrome/common/media_router/issue.h" | 28 #include "chrome/common/media_router/issue.h" |
| 27 #include "chrome/common/media_router/media_route.h" | 29 #include "chrome/common/media_router/media_route.h" |
| 28 #include "chrome/common/media_router/media_source_helper.h" | 30 #include "chrome/common/media_router/media_source_helper.h" |
| 29 #include "chrome/common/media_router/route_message.h" | 31 #include "chrome/common/media_router/route_message.h" |
| 30 #include "chrome/test/base/chrome_render_view_host_test_harness.h" | 32 #include "chrome/test/base/chrome_render_view_host_test_harness.h" |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 104 void OnCreateMediaRouteController( | 106 void OnCreateMediaRouteController( |
| 105 Unused, | 107 Unused, |
| 106 Unused, | 108 Unused, |
| 107 Unused, | 109 Unused, |
| 108 mojom::MediaRouteProvider::CreateMediaRouteControllerCallback& cb) { | 110 mojom::MediaRouteProvider::CreateMediaRouteControllerCallback& cb) { |
| 109 std::move(cb).Run(true); | 111 std::move(cb).Run(true); |
| 110 } | 112 } |
| 111 | 113 |
| 112 } // namespace | 114 } // namespace |
| 113 | 115 |
| 116 class TestEventPageRequestManager : public EventPageRequestManager { |
| 117 public: |
| 118 static std::unique_ptr<KeyedService> Create( |
| 119 content::BrowserContext* context) { |
| 120 return base::MakeUnique<TestEventPageRequestManager>(context); |
| 121 } |
| 122 |
| 123 explicit TestEventPageRequestManager(content::BrowserContext* context) |
| 124 : EventPageRequestManager(context) {} |
| 125 ~TestEventPageRequestManager() = default; |
| 126 |
| 127 MOCK_METHOD1(SetWakeReason, void(MediaRouteProviderWakeReason reason)); |
| 128 MOCK_METHOD1(SetExtensionId, void(const std::string& extension_id)); |
| 129 void RunOrDefer(base::OnceClosure request) override { |
| 130 RunOrDeferInternal(request); |
| 131 } |
| 132 MOCK_METHOD1(RunOrDeferInternal, void(base::OnceClosure& request)); |
| 133 MOCK_METHOD0(OnMojoConnectionsReady, void()); |
| 134 MOCK_METHOD0(OnMojoConnectionError, void()); |
| 135 |
| 136 private: |
| 137 DISALLOW_COPY_AND_ASSIGN(TestEventPageRequestManager); |
| 138 }; |
| 139 |
| 114 class RouteResponseCallbackHandler { | 140 class RouteResponseCallbackHandler { |
| 115 public: | 141 public: |
| 116 void Invoke(const RouteRequestResult& result) { | 142 void Invoke(const RouteRequestResult& result) { |
| 117 DoInvoke(result.route(), result.presentation_id(), result.error(), | 143 DoInvoke(result.route(), result.presentation_id(), result.error(), |
| 118 result.result_code()); | 144 result.result_code()); |
| 119 } | 145 } |
| 120 MOCK_METHOD4(DoInvoke, | 146 MOCK_METHOD4(DoInvoke, |
| 121 void(const MediaRoute* route, | 147 void(const MediaRoute* route, |
| 122 const std::string& presentation_id, | 148 const std::string& presentation_id, |
| 123 const std::string& error_text, | 149 const std::string& error_text, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 138 void StoreAndRun(T* result, const base::Closure& closure, const T& result_val) { | 164 void StoreAndRun(T* result, const base::Closure& closure, const T& result_val) { |
| 139 *result = result_val; | 165 *result = result_val; |
| 140 closure.Run(); | 166 closure.Run(); |
| 141 } | 167 } |
| 142 | 168 |
| 143 class MediaRouterMojoImplTest : public MediaRouterMojoTest { | 169 class MediaRouterMojoImplTest : public MediaRouterMojoTest { |
| 144 public: | 170 public: |
| 145 MediaRouterMojoImplTest() {} | 171 MediaRouterMojoImplTest() {} |
| 146 ~MediaRouterMojoImplTest() override {} | 172 ~MediaRouterMojoImplTest() override {} |
| 147 | 173 |
| 174 void SetUp() override { |
| 175 EventPageRequestManagerFactory::GetInstance()->SetTestingFactory( |
| 176 profile(), &TestEventPageRequestManager::Create); |
| 177 request_manager_ = static_cast<TestEventPageRequestManager*>( |
| 178 EventPageRequestManagerFactory::GetApiForBrowserContext(profile())); |
| 179 |
| 180 MediaRouterMojoTest::SetUp(); |
| 181 |
| 182 ON_CALL(*request_manager_, RunOrDeferInternal(_)) |
| 183 .WillByDefault(Invoke( |
| 184 [](base::OnceClosure& request) { std::move(request).Run(); })); |
| 185 } |
| 186 |
| 187 protected: |
| 148 void ExpectResultBucketCount(const std::string& operation, | 188 void ExpectResultBucketCount(const std::string& operation, |
| 149 RouteRequestResult::ResultCode result_code, | 189 RouteRequestResult::ResultCode result_code, |
| 150 int expected_count) { | 190 int expected_count) { |
| 151 histogram_tester_.ExpectBucketCount( | 191 histogram_tester_.ExpectBucketCount( |
| 152 "MediaRouter.Provider." + operation + ".Result", | 192 "MediaRouter.Provider." + operation + ".Result", |
| 153 result_code, | 193 result_code, |
| 154 expected_count); | 194 expected_count); |
| 155 } | 195 } |
| 156 | 196 |
| 197 TestEventPageRequestManager* request_manager_ = nullptr; |
| 198 |
| 157 private: | 199 private: |
| 158 base::HistogramTester histogram_tester_; | 200 base::HistogramTester histogram_tester_; |
| 159 }; | 201 }; |
| 160 | 202 |
| 161 // ProcessManager with a mocked method subset, for testing extension suspend | |
| 162 // handling. | |
| 163 class TestProcessManager : public extensions::ProcessManager { | |
| 164 public: | |
| 165 explicit TestProcessManager(content::BrowserContext* context) | |
| 166 : extensions::ProcessManager( | |
| 167 context, | |
| 168 context, | |
| 169 extensions::ExtensionRegistry::Get(context)) {} | |
| 170 ~TestProcessManager() override {} | |
| 171 | |
| 172 static std::unique_ptr<KeyedService> Create( | |
| 173 content::BrowserContext* context) { | |
| 174 return base::MakeUnique<TestProcessManager>(context); | |
| 175 } | |
| 176 | |
| 177 MOCK_METHOD1(IsEventPageSuspended, bool(const std::string& ext_id)); | |
| 178 | |
| 179 MOCK_METHOD2(WakeEventPage, | |
| 180 bool(const std::string& extension_id, | |
| 181 const base::Callback<void(bool)>& callback)); | |
| 182 | |
| 183 private: | |
| 184 DISALLOW_COPY_AND_ASSIGN(TestProcessManager); | |
| 185 }; | |
| 186 | |
| 187 TEST_F(MediaRouterMojoImplTest, CreateRoute) { | 203 TEST_F(MediaRouterMojoImplTest, CreateRoute) { |
| 188 MediaSource media_source(kSource); | 204 MediaSource media_source(kSource); |
| 189 MediaRoute expected_route(kRouteId, media_source, kSinkId, "", false, "", | 205 MediaRoute expected_route(kRouteId, media_source, kSinkId, "", false, "", |
| 190 false); | 206 false); |
| 191 | 207 |
| 192 // Use a lambda function as an invocation target here to work around | 208 // Use a lambda function as an invocation target here to work around |
| 193 // a limitation with GMock::Invoke that prevents it from using move-only types | 209 // a limitation with GMock::Invoke that prevents it from using move-only types |
| 194 // in runnable parameter lists. | 210 // in runnable parameter lists. |
| 195 EXPECT_CALL( | 211 EXPECT_CALL( |
| 196 mock_media_route_provider_, | 212 mock_media_route_provider_, |
| (...skipping 493 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 690 TEST_F(MediaRouterMojoImplTest, RegisterAndUnregisterMediaSinksObserver) { | 706 TEST_F(MediaRouterMojoImplTest, RegisterAndUnregisterMediaSinksObserver) { |
| 691 router()->OnSinkAvailabilityUpdated( | 707 router()->OnSinkAvailabilityUpdated( |
| 692 mojom::MediaRouter::SinkAvailability::AVAILABLE); | 708 mojom::MediaRouter::SinkAvailability::AVAILABLE); |
| 693 MediaSource media_source(kSource); | 709 MediaSource media_source(kSource); |
| 694 | 710 |
| 695 // These should only be called once even if there is more than one observer | 711 // These should only be called once even if there is more than one observer |
| 696 // for a given source. | 712 // for a given source. |
| 697 EXPECT_CALL(mock_media_route_provider_, StartObservingMediaSinks(kSource)); | 713 EXPECT_CALL(mock_media_route_provider_, StartObservingMediaSinks(kSource)); |
| 698 EXPECT_CALL(mock_media_route_provider_, StartObservingMediaSinks(kSource2)); | 714 EXPECT_CALL(mock_media_route_provider_, StartObservingMediaSinks(kSource2)); |
| 699 | 715 |
| 700 std::unique_ptr<MockMediaSinksObserver> sinks_observer( | 716 auto sinks_observer = base::MakeUnique<MockMediaSinksObserver>( |
| 701 new MockMediaSinksObserver(router(), media_source, | 717 router(), media_source, url::Origin(GURL(kOrigin))); |
| 702 url::Origin(GURL(kOrigin)))); | |
| 703 EXPECT_TRUE(sinks_observer->Init()); | 718 EXPECT_TRUE(sinks_observer->Init()); |
| 704 std::unique_ptr<MockMediaSinksObserver> extra_sinks_observer( | 719 auto extra_sinks_observer = base::MakeUnique<MockMediaSinksObserver>( |
| 705 new MockMediaSinksObserver(router(), media_source, | 720 router(), media_source, url::Origin(GURL(kOrigin))); |
| 706 url::Origin(GURL(kOrigin)))); | |
| 707 EXPECT_TRUE(extra_sinks_observer->Init()); | 721 EXPECT_TRUE(extra_sinks_observer->Init()); |
| 708 std::unique_ptr<MockMediaSinksObserver> unrelated_sinks_observer( | 722 auto unrelated_sinks_observer = base::MakeUnique<MockMediaSinksObserver>( |
| 709 new MockMediaSinksObserver(router(), MediaSource(kSource2), | 723 router(), MediaSource(kSource2), url::Origin(GURL(kOrigin))); |
| 710 url::Origin(GURL(kOrigin)))); | |
| 711 EXPECT_TRUE(unrelated_sinks_observer->Init()); | 724 EXPECT_TRUE(unrelated_sinks_observer->Init()); |
| 712 ProcessEventLoop(); | 725 ProcessEventLoop(); |
| 713 | 726 |
| 714 std::vector<MediaSink> expected_sinks; | 727 std::vector<MediaSink> expected_sinks; |
| 715 expected_sinks.push_back( | 728 expected_sinks.push_back( |
| 716 MediaSink(kSinkId, kSinkName, MediaSink::IconType::CAST)); | 729 MediaSink(kSinkId, kSinkName, MediaSink::IconType::CAST)); |
| 717 expected_sinks.push_back( | 730 expected_sinks.push_back( |
| 718 MediaSink(kSinkId2, kSinkName, MediaSink::IconType::CAST)); | 731 MediaSink(kSinkId2, kSinkName, MediaSink::IconType::CAST)); |
| 719 | 732 |
| 720 std::vector<MediaSinkInternal> sinks; | 733 std::vector<MediaSinkInternal> sinks; |
| 721 for (const auto& expected_sink : expected_sinks) { | 734 for (const auto& expected_sink : expected_sinks) { |
| 722 MediaSinkInternal sink_internal; | 735 MediaSinkInternal sink_internal; |
| 723 sink_internal.set_sink(expected_sink); | 736 sink_internal.set_sink(expected_sink); |
| 724 sinks.push_back(sink_internal); | 737 sinks.push_back(sink_internal); |
| 725 } | 738 } |
| 726 | 739 |
| 727 base::RunLoop run_loop; | 740 base::RunLoop run_loop; |
| 728 EXPECT_CALL(*sinks_observer, OnSinksReceived(SequenceEquals(expected_sinks))); | 741 EXPECT_CALL(*sinks_observer, OnSinksReceived(SequenceEquals(expected_sinks))); |
| 729 EXPECT_CALL(*extra_sinks_observer, | 742 EXPECT_CALL(*extra_sinks_observer, |
| 730 OnSinksReceived(SequenceEquals(expected_sinks))) | 743 OnSinksReceived(SequenceEquals(expected_sinks))) |
| 731 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 744 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 732 media_router_proxy_->OnSinksReceived( | 745 media_router_proxy_->OnSinksReceived( |
| 733 media_source.id(), sinks, | 746 media_source.id(), sinks, |
| 734 std::vector<url::Origin>(1, url::Origin(GURL(kOrigin)))); | 747 std::vector<url::Origin>(1, url::Origin(GURL(kOrigin)))); |
| 735 run_loop.Run(); | 748 run_loop.Run(); |
| 736 | 749 |
| 737 // Since the MediaRouterMojoImpl has already received results for | 750 // Since the MediaRouterMojoImpl has already received results for |
| 738 // |media_source|, return cached results to observers that are subsequently | 751 // |media_source|, return cached results to observers that are subsequently |
| 739 // registered. | 752 // registered. |
| 740 std::unique_ptr<MockMediaSinksObserver> cached_sinks_observer( | 753 auto cached_sinks_observer = base::MakeUnique<MockMediaSinksObserver>( |
| 741 new MockMediaSinksObserver(router(), media_source, | 754 router(), media_source, url::Origin(GURL(kOrigin))); |
| 742 url::Origin(GURL(kOrigin)))); | |
| 743 EXPECT_CALL(*cached_sinks_observer, | 755 EXPECT_CALL(*cached_sinks_observer, |
| 744 OnSinksReceived(SequenceEquals(expected_sinks))); | 756 OnSinksReceived(SequenceEquals(expected_sinks))); |
| 745 EXPECT_TRUE(cached_sinks_observer->Init()); | 757 EXPECT_TRUE(cached_sinks_observer->Init()); |
| 746 | 758 |
| 747 // Different origin from cached result. Empty list will be returned. | 759 // Different origin from cached result. Empty list will be returned. |
| 748 std::unique_ptr<MockMediaSinksObserver> cached_sinks_observer2( | 760 auto cached_sinks_observer2 = base::MakeUnique<MockMediaSinksObserver>( |
| 749 new MockMediaSinksObserver(router(), media_source, | 761 router(), media_source, url::Origin(GURL("https://youtube.com"))); |
| 750 url::Origin(GURL("https://youtube.com")))); | |
| 751 EXPECT_CALL(*cached_sinks_observer2, OnSinksReceived(IsEmpty())); | 762 EXPECT_CALL(*cached_sinks_observer2, OnSinksReceived(IsEmpty())); |
| 752 EXPECT_TRUE(cached_sinks_observer2->Init()); | 763 EXPECT_TRUE(cached_sinks_observer2->Init()); |
| 753 | 764 |
| 754 base::RunLoop run_loop2; | 765 base::RunLoop run_loop2; |
| 755 EXPECT_CALL(mock_media_route_provider_, StopObservingMediaSinks(kSource)); | 766 EXPECT_CALL(mock_media_route_provider_, StopObservingMediaSinks(kSource)); |
| 756 EXPECT_CALL(mock_media_route_provider_, StopObservingMediaSinks(kSource2)) | 767 EXPECT_CALL(mock_media_route_provider_, StopObservingMediaSinks(kSource2)) |
| 757 .WillOnce(InvokeWithoutArgs([&run_loop2]() { run_loop2.Quit(); })); | 768 .WillOnce(InvokeWithoutArgs([&run_loop2]() { run_loop2.Quit(); })); |
| 758 sinks_observer.reset(); | 769 sinks_observer.reset(); |
| 759 extra_sinks_observer.reset(); | 770 extra_sinks_observer.reset(); |
| 760 unrelated_sinks_observer.reset(); | 771 unrelated_sinks_observer.reset(); |
| 761 cached_sinks_observer.reset(); | 772 cached_sinks_observer.reset(); |
| 762 cached_sinks_observer2.reset(); | 773 cached_sinks_observer2.reset(); |
| 763 run_loop2.Run(); | 774 run_loop2.Run(); |
| 764 } | 775 } |
| 765 | 776 |
| 766 TEST_F(MediaRouterMojoImplTest, | 777 TEST_F(MediaRouterMojoImplTest, |
| 767 RegisterMediaSinksObserverWithAvailabilityChange) { | 778 RegisterMediaSinksObserverWithAvailabilityChange) { |
| 768 // When availability is UNAVAILABLE, no calls should be made to MRPM. | 779 // When availability is UNAVAILABLE, no calls should be made to MRPM. |
| 769 router()->OnSinkAvailabilityUpdated( | 780 router()->OnSinkAvailabilityUpdated( |
| 770 mojom::MediaRouter::SinkAvailability::UNAVAILABLE); | 781 mojom::MediaRouter::SinkAvailability::UNAVAILABLE); |
| 771 MediaSource media_source(kSource); | 782 MediaSource media_source(kSource); |
| 772 std::unique_ptr<MockMediaSinksObserver> sinks_observer( | 783 auto sinks_observer = base::MakeUnique<MockMediaSinksObserver>( |
| 773 new MockMediaSinksObserver(router(), media_source, | 784 router(), media_source, url::Origin(GURL(kOrigin))); |
| 774 url::Origin(GURL(kOrigin)))); | |
| 775 EXPECT_CALL(*sinks_observer, OnSinksReceived(IsEmpty())); | 785 EXPECT_CALL(*sinks_observer, OnSinksReceived(IsEmpty())); |
| 776 EXPECT_TRUE(sinks_observer->Init()); | 786 EXPECT_TRUE(sinks_observer->Init()); |
| 777 MediaSource media_source2(kSource2); | 787 MediaSource media_source2(kSource2); |
| 778 std::unique_ptr<MockMediaSinksObserver> sinks_observer2( | 788 auto sinks_observer2 = base::MakeUnique<MockMediaSinksObserver>( |
| 779 new MockMediaSinksObserver(router(), media_source2, | 789 router(), media_source2, url::Origin(GURL(kOrigin))); |
| 780 url::Origin(GURL(kOrigin)))); | |
| 781 EXPECT_CALL(*sinks_observer2, OnSinksReceived(IsEmpty())); | 790 EXPECT_CALL(*sinks_observer2, OnSinksReceived(IsEmpty())); |
| 782 EXPECT_TRUE(sinks_observer2->Init()); | 791 EXPECT_TRUE(sinks_observer2->Init()); |
| 783 EXPECT_CALL(mock_media_route_provider_, StartObservingMediaSinks(kSource)) | 792 EXPECT_CALL(mock_media_route_provider_, StartObservingMediaSinks(kSource)) |
| 784 .Times(0); | 793 .Times(0); |
| 785 EXPECT_CALL(mock_media_route_provider_, StartObservingMediaSinks(kSource2)) | 794 EXPECT_CALL(mock_media_route_provider_, StartObservingMediaSinks(kSource2)) |
| 786 .Times(0); | 795 .Times(0); |
| 787 ProcessEventLoop(); | 796 ProcessEventLoop(); |
| 788 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&mock_media_route_provider_)); | 797 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&mock_media_route_provider_)); |
| 789 | 798 |
| 790 // When availability transitions AVAILABLE, existing sink queries should be | 799 // When availability transitions AVAILABLE, existing sink queries should be |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 907 expected_joinable_route_ids.push_back(kJoinableRouteId); | 916 expected_joinable_route_ids.push_back(kJoinableRouteId); |
| 908 | 917 |
| 909 Sequence sequence; | 918 Sequence sequence; |
| 910 | 919 |
| 911 // Creating the first observer will wake-up the provider and ask it to start | 920 // Creating the first observer will wake-up the provider and ask it to start |
| 912 // observing routes having source |kSource|. The provider will respond with | 921 // observing routes having source |kSource|. The provider will respond with |
| 913 // the existing route. | 922 // the existing route. |
| 914 EXPECT_CALL(mock_media_route_provider_, | 923 EXPECT_CALL(mock_media_route_provider_, |
| 915 StartObservingMediaRoutes(media_source.id())) | 924 StartObservingMediaRoutes(media_source.id())) |
| 916 .Times(1); | 925 .Times(1); |
| 917 std::unique_ptr<MockMediaRoutesObserver> observer1( | 926 auto observer1 = |
| 918 new MockMediaRoutesObserver(router(), media_source.id())); | 927 base::MakeUnique<MockMediaRoutesObserver>(router(), media_source.id()); |
| 919 ProcessEventLoop(); | 928 ProcessEventLoop(); |
| 920 EXPECT_CALL(*observer1, OnRoutesUpdated(SequenceEquals(expected_routes), | 929 EXPECT_CALL(*observer1, OnRoutesUpdated(SequenceEquals(expected_routes), |
| 921 expected_joinable_route_ids)) | 930 expected_joinable_route_ids)) |
| 922 .Times(1); | 931 .Times(1); |
| 923 media_router_proxy_->OnRoutesUpdated(expected_routes, media_source.id(), | 932 media_router_proxy_->OnRoutesUpdated(expected_routes, media_source.id(), |
| 924 expected_joinable_route_ids); | 933 expected_joinable_route_ids); |
| 925 ProcessEventLoop(); | 934 ProcessEventLoop(); |
| 926 | 935 |
| 927 // Creating two more observers will not wake up the provider. Instead, the | 936 // Creating two more observers will not wake up the provider. Instead, the |
| 928 // cached route list will be returned. | 937 // cached route list will be returned. |
| 929 std::unique_ptr<MockMediaRoutesObserver> observer2( | 938 auto observer2 = |
| 930 new MockMediaRoutesObserver(router(), media_source.id())); | 939 base::MakeUnique<MockMediaRoutesObserver>(router(), media_source.id()); |
| 931 std::unique_ptr<MockMediaRoutesObserver> observer3( | 940 auto observer3 = |
| 932 new MockMediaRoutesObserver(router(), media_source.id())); | 941 base::MakeUnique<MockMediaRoutesObserver>(router(), media_source.id()); |
| 933 EXPECT_CALL(*observer2, OnRoutesUpdated(SequenceEquals(expected_routes), | 942 EXPECT_CALL(*observer2, OnRoutesUpdated(SequenceEquals(expected_routes), |
| 934 expected_joinable_route_ids)) | 943 expected_joinable_route_ids)) |
| 935 .Times(1); | 944 .Times(1); |
| 936 EXPECT_CALL(*observer3, OnRoutesUpdated(SequenceEquals(expected_routes), | 945 EXPECT_CALL(*observer3, OnRoutesUpdated(SequenceEquals(expected_routes), |
| 937 expected_joinable_route_ids)) | 946 expected_joinable_route_ids)) |
| 938 .Times(1); | 947 .Times(1); |
| 939 ProcessEventLoop(); | 948 ProcessEventLoop(); |
| 940 | 949 |
| 941 // Kill 2 of three observers, and expect nothing happens at the provider. | 950 // Kill 2 of three observers, and expect nothing happens at the provider. |
| 942 observer1.reset(); | 951 observer1.reset(); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 965 SendMessageCallbackHandler handler; | 974 SendMessageCallbackHandler handler; |
| 966 EXPECT_CALL(handler, Invoke(true)) | 975 EXPECT_CALL(handler, Invoke(true)) |
| 967 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 976 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 968 router()->SendRouteMessage(kRouteId, kMessage, | 977 router()->SendRouteMessage(kRouteId, kMessage, |
| 969 base::Bind(&SendMessageCallbackHandler::Invoke, | 978 base::Bind(&SendMessageCallbackHandler::Invoke, |
| 970 base::Unretained(&handler))); | 979 base::Unretained(&handler))); |
| 971 run_loop.Run(); | 980 run_loop.Run(); |
| 972 } | 981 } |
| 973 | 982 |
| 974 TEST_F(MediaRouterMojoImplTest, SendRouteBinaryMessage) { | 983 TEST_F(MediaRouterMojoImplTest, SendRouteBinaryMessage) { |
| 975 std::unique_ptr<std::vector<uint8_t>> expected_binary_data( | 984 auto expected_binary_data = base::MakeUnique<std::vector<uint8_t>>( |
| 976 new std::vector<uint8_t>(kBinaryMessage, | 985 kBinaryMessage, kBinaryMessage + arraysize(kBinaryMessage)); |
| 977 kBinaryMessage + arraysize(kBinaryMessage))); | |
| 978 | |
| 979 EXPECT_CALL(mock_media_route_provider_, | 986 EXPECT_CALL(mock_media_route_provider_, |
| 980 SendRouteBinaryMessageInternal(kRouteId, _, _)) | 987 SendRouteBinaryMessageInternal(kRouteId, _, _)) |
| 981 .WillOnce(Invoke( | 988 .WillOnce(Invoke( |
| 982 [](const MediaRoute::Id& route_id, const std::vector<uint8_t>& data, | 989 [](const MediaRoute::Id& route_id, const std::vector<uint8_t>& data, |
| 983 mojom::MediaRouteProvider::SendRouteMessageCallback& cb) { | 990 mojom::MediaRouteProvider::SendRouteMessageCallback& cb) { |
| 984 EXPECT_EQ(0, memcmp(kBinaryMessage, &(data[0]), | 991 EXPECT_EQ(0, memcmp(kBinaryMessage, &(data[0]), |
| 985 arraysize(kBinaryMessage))); | 992 arraysize(kBinaryMessage))); |
| 986 std::move(cb).Run(true); | 993 std::move(cb).Run(true); |
| 987 })); | 994 })); |
| 988 | 995 |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1176 // Callback has been removed, so we don't expect it to be called anymore. | 1183 // Callback has been removed, so we don't expect it to be called anymore. |
| 1177 subscription.reset(); | 1184 subscription.reset(); |
| 1178 EXPECT_TRUE(router()->presentation_connection_state_callbacks_.empty()); | 1185 EXPECT_TRUE(router()->presentation_connection_state_callbacks_.empty()); |
| 1179 | 1186 |
| 1180 EXPECT_CALL(callback, Run(_)).Times(0); | 1187 EXPECT_CALL(callback, Run(_)).Times(0); |
| 1181 media_router_proxy_->OnPresentationConnectionStateChanged( | 1188 media_router_proxy_->OnPresentationConnectionStateChanged( |
| 1182 route_id, content::PRESENTATION_CONNECTION_STATE_TERMINATED); | 1189 route_id, content::PRESENTATION_CONNECTION_STATE_TERMINATED); |
| 1183 ProcessEventLoop(); | 1190 ProcessEventLoop(); |
| 1184 } | 1191 } |
| 1185 | 1192 |
| 1186 TEST_F(MediaRouterMojoImplTest, QueuedWhileAsleep) { | |
| 1187 base::RunLoop run_loop; | |
| 1188 EXPECT_CALL(mock_event_page_tracker_, IsEventPageSuspended(extension_id())) | |
| 1189 .Times(2) | |
| 1190 .WillRepeatedly(Return(true)); | |
| 1191 EXPECT_CALL(mock_event_page_tracker_, WakeEventPage(extension_id(), _)) | |
| 1192 .Times(2) | |
| 1193 .WillOnce(Return(true)) | |
| 1194 .WillOnce(DoAll(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); }), | |
| 1195 Return(true))); | |
| 1196 router()->DetachRoute(kRouteId); | |
| 1197 router()->DetachRoute(kRouteId2); | |
| 1198 run_loop.Run(); | |
| 1199 EXPECT_CALL(mock_event_page_tracker_, IsEventPageSuspended(extension_id())) | |
| 1200 .Times(2) | |
| 1201 .WillRepeatedly(Return(false)); | |
| 1202 EXPECT_CALL(mock_media_route_provider_, DetachRoute(kRouteId)); | |
| 1203 EXPECT_CALL(mock_media_route_provider_, DetachRoute(kRouteId2)); | |
| 1204 ConnectProviderManagerService(); | |
| 1205 ProcessEventLoop(); | |
| 1206 } | |
| 1207 | |
| 1208 TEST_F(MediaRouterMojoImplTest, SearchSinks) { | 1193 TEST_F(MediaRouterMojoImplTest, SearchSinks) { |
| 1209 std::string search_input("input"); | 1194 std::string search_input("input"); |
| 1210 std::string domain("google.com"); | 1195 std::string domain("google.com"); |
| 1211 MediaSource media_source(kSource); | 1196 MediaSource media_source(kSource); |
| 1212 | 1197 |
| 1213 EXPECT_CALL(mock_media_route_provider_, | 1198 EXPECT_CALL(mock_media_route_provider_, |
| 1214 SearchSinksInternal(kSinkId, kSource, _, _)) | 1199 SearchSinksInternal(kSinkId, kSource, _, _)) |
| 1215 .WillOnce( | 1200 .WillOnce( |
| 1216 Invoke([&search_input, &domain]( | 1201 Invoke([&search_input, &domain]( |
| 1217 const std::string& sink_id, const std::string& source, | 1202 const std::string& sink_id, const std::string& source, |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1397 | 1382 |
| 1398 // When the MediaRouter is notified that the MediaRouteProvider failed to | 1383 // When the MediaRouter is notified that the MediaRouteProvider failed to |
| 1399 // create a controller, the browser-side controller should be invalidated. | 1384 // create a controller, the browser-side controller should be invalidated. |
| 1400 EXPECT_CALL(observer, OnControllerInvalidated()); | 1385 EXPECT_CALL(observer, OnControllerInvalidated()); |
| 1401 | 1386 |
| 1402 base::RunLoop().RunUntilIdle(); | 1387 base::RunLoop().RunUntilIdle(); |
| 1403 } | 1388 } |
| 1404 | 1389 |
| 1405 class MediaRouterMojoExtensionTest : public ::testing::Test { | 1390 class MediaRouterMojoExtensionTest : public ::testing::Test { |
| 1406 public: | 1391 public: |
| 1407 MediaRouterMojoExtensionTest() : process_manager_(nullptr) {} | 1392 MediaRouterMojoExtensionTest() {} |
| 1408 | 1393 |
| 1409 ~MediaRouterMojoExtensionTest() override {} | 1394 ~MediaRouterMojoExtensionTest() override {} |
| 1410 | 1395 |
| 1411 protected: | 1396 protected: |
| 1412 void SetUp() override { | 1397 void SetUp() override { |
| 1413 // Set the extension's version number to be identical to the browser's. | 1398 // Set the extension's version number to be identical to the browser's. |
| 1414 extension_ = | 1399 extension_ = |
| 1415 extensions::test_util::BuildExtension(extensions::ExtensionBuilder()) | 1400 extensions::test_util::BuildExtension(extensions::ExtensionBuilder()) |
| 1416 .MergeManifest(extensions::DictionaryBuilder() | 1401 .MergeManifest(extensions::DictionaryBuilder() |
| 1417 .Set("version", version_info::GetVersionNumber()) | 1402 .Set("version", version_info::GetVersionNumber()) |
| 1418 .Build()) | 1403 .Build()) |
| 1419 .Build(); | 1404 .Build(); |
| 1420 | 1405 |
| 1421 profile_.reset(new TestingProfile); | 1406 profile_ = base::MakeUnique<TestingProfile>(); |
| 1422 // Set up a mock ProcessManager instance. | 1407 EventPageRequestManagerFactory::GetInstance()->SetTestingFactory( |
| 1423 extensions::ProcessManagerFactory::GetInstance()->SetTestingFactory( | 1408 profile_.get(), &TestEventPageRequestManager::Create); |
| 1424 profile_.get(), &TestProcessManager::Create); | 1409 request_manager_ = static_cast<TestEventPageRequestManager*>( |
| 1425 process_manager_ = static_cast<TestProcessManager*>( | 1410 EventPageRequestManagerFactory::GetApiForBrowserContext( |
| 1426 extensions::ProcessManager::Get(profile_.get())); | 1411 profile_.get())); |
| 1427 DCHECK(process_manager_); | 1412 |
| 1413 ON_CALL(*request_manager_, RunOrDeferInternal(_)) |
| 1414 .WillByDefault(Invoke( |
| 1415 [](base::OnceClosure& request) { std::move(request).Run(); })); |
| 1428 | 1416 |
| 1429 // Create MR and its proxy, so that it can be accessed through Mojo. | 1417 // Create MR and its proxy, so that it can be accessed through Mojo. |
| 1430 media_router_.reset(new MediaRouterMojoImpl( | 1418 media_router_.reset(new MediaRouterMojoImpl( |
| 1431 process_manager_, profile_.get(), | 1419 profile_.get(), MediaRouterMojoImpl::FirewallCheck::SKIP_FOR_TESTING)); |
| 1432 MediaRouterMojoImpl::FirewallCheck::SKIP_FOR_TESTING)); | |
| 1433 ProcessEventLoop(); | 1420 ProcessEventLoop(); |
| 1434 } | 1421 } |
| 1435 | 1422 |
| 1436 void TearDown() override { | 1423 void TearDown() override { |
| 1437 media_router_.reset(); | 1424 media_router_.reset(); |
| 1438 profile_.reset(); | 1425 profile_.reset(); |
| 1439 } | 1426 } |
| 1440 | 1427 |
| 1441 // Constructs bindings so that |media_router_| delegates calls to | 1428 // Constructs bindings so that |media_router_| delegates calls to |
| 1442 // |mojo_media_router_|, which are then handled by | 1429 // |mojo_media_router_|, which are then handled by |
| 1443 // |mock_media_route_provider_service_|. | 1430 // |mock_media_route_provider_service_|. |
| 1444 void BindMediaRouteProvider() { | 1431 void BindMediaRouteProvider() { |
| 1445 binding_.reset(new mojo::Binding<mojom::MediaRouteProvider>( | 1432 binding_ = base::MakeUnique<mojo::Binding<mojom::MediaRouteProvider>>( |
| 1446 &mock_media_route_provider_, | 1433 &mock_media_route_provider_, |
| 1447 mojo::MakeRequest(&media_route_provider_proxy_))); | 1434 mojo::MakeRequest(&media_route_provider_proxy_)); |
| 1448 media_router_->BindToMojoRequest(mojo::MakeRequest(&media_router_proxy_), | 1435 media_router_->BindToMojoRequest(mojo::MakeRequest(&media_router_proxy_), |
| 1449 *extension_); | 1436 *extension_); |
| 1450 } | 1437 } |
| 1451 | 1438 |
| 1452 void ResetMediaRouteProvider() { | 1439 void ResetMediaRouteProvider() { |
| 1453 binding_.reset(); | 1440 binding_.reset(); |
| 1454 media_router_->BindToMojoRequest(mojo::MakeRequest(&media_router_proxy_), | 1441 media_router_->BindToMojoRequest(mojo::MakeRequest(&media_router_proxy_), |
| 1455 *extension_); | 1442 *extension_); |
| 1456 } | 1443 } |
| 1457 | 1444 |
| 1458 void RegisterMediaRouteProvider() { | 1445 void RegisterMediaRouteProvider() { |
| 1459 media_router_proxy_->RegisterMediaRouteProvider( | 1446 media_router_proxy_->RegisterMediaRouteProvider( |
| 1460 std::move(media_route_provider_proxy_), | 1447 std::move(media_route_provider_proxy_), |
| 1461 base::Bind(&RegisterMediaRouteProviderHandler::Invoke, | 1448 base::Bind(&RegisterMediaRouteProviderHandler::Invoke, |
| 1462 base::Unretained(&provide_handler_))); | 1449 base::Unretained(&provider_handler_))); |
| 1463 } | 1450 } |
| 1464 | 1451 |
| 1465 void ProcessEventLoop() { base::RunLoop().RunUntilIdle(); } | 1452 void ProcessEventLoop() { base::RunLoop().RunUntilIdle(); } |
| 1466 | 1453 |
| 1467 void ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason reason, | 1454 void ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason reason, |
| 1468 int expected_count) { | 1455 int expected_count) { |
| 1469 histogram_tester_.ExpectBucketCount("MediaRouter.Provider.WakeReason", | 1456 histogram_tester_.ExpectBucketCount("MediaRouter.Provider.WakeReason", |
| 1470 static_cast<int>(reason), | 1457 static_cast<int>(reason), |
| 1471 expected_count); | 1458 expected_count); |
| 1472 } | 1459 } |
| 1473 | 1460 |
| 1474 void ExpectVersionBucketCount(MediaRouteProviderVersion version, | 1461 void ExpectVersionBucketCount(MediaRouteProviderVersion version, |
| 1475 int expected_count) { | 1462 int expected_count) { |
| 1476 histogram_tester_.ExpectBucketCount("MediaRouter.Provider.Version", | 1463 histogram_tester_.ExpectBucketCount("MediaRouter.Provider.Version", |
| 1477 static_cast<int>(version), | 1464 static_cast<int>(version), |
| 1478 expected_count); | 1465 expected_count); |
| 1479 } | 1466 } |
| 1480 | 1467 |
| 1481 void ExpectWakeupBucketCount(MediaRouteProviderWakeup wakeup, | 1468 void ExpectWakeupBucketCount(MediaRouteProviderWakeup wakeup, |
| 1482 int expected_count) { | 1469 int expected_count) { |
| 1483 histogram_tester_.ExpectBucketCount("MediaRouter.Provider.Wakeup", | 1470 histogram_tester_.ExpectBucketCount("MediaRouter.Provider.Wakeup", |
| 1484 static_cast<int>(wakeup), | 1471 static_cast<int>(wakeup), |
| 1485 expected_count); | 1472 expected_count); |
| 1486 } | 1473 } |
| 1487 | 1474 |
| 1488 MediaRouterMojoImpl* router() const { return media_router_.get(); } | 1475 MediaRouterMojoImpl* router() const { return media_router_.get(); } |
| 1489 | 1476 |
| 1490 content::TestBrowserThreadBundle thread_bundle_; | 1477 content::TestBrowserThreadBundle thread_bundle_; |
| 1491 std::unique_ptr<MediaRouterMojoImpl> media_router_; | 1478 std::unique_ptr<MediaRouterMojoImpl> media_router_; |
| 1492 RegisterMediaRouteProviderHandler provide_handler_; | 1479 RegisterMediaRouteProviderHandler provider_handler_; |
| 1493 TestProcessManager* process_manager_; | 1480 TestEventPageRequestManager* request_manager_ = nullptr; |
| 1494 testing::StrictMock<MockMediaRouteProvider> mock_media_route_provider_; | 1481 testing::StrictMock<MockMediaRouteProvider> mock_media_route_provider_; |
| 1495 mojom::MediaRouterPtr media_router_proxy_; | 1482 mojom::MediaRouterPtr media_router_proxy_; |
| 1496 scoped_refptr<extensions::Extension> extension_; | 1483 scoped_refptr<extensions::Extension> extension_; |
| 1497 | 1484 |
| 1498 private: | 1485 private: |
| 1499 std::unique_ptr<TestingProfile> profile_; | 1486 std::unique_ptr<TestingProfile> profile_; |
| 1500 mojom::MediaRouteProviderPtr media_route_provider_proxy_; | 1487 mojom::MediaRouteProviderPtr media_route_provider_proxy_; |
| 1501 std::unique_ptr<mojo::Binding<mojom::MediaRouteProvider>> binding_; | 1488 std::unique_ptr<mojo::Binding<mojom::MediaRouteProvider>> binding_; |
| 1502 base::HistogramTester histogram_tester_; | 1489 base::HistogramTester histogram_tester_; |
| 1503 | 1490 |
| 1504 DISALLOW_COPY_AND_ASSIGN(MediaRouterMojoExtensionTest); | 1491 DISALLOW_COPY_AND_ASSIGN(MediaRouterMojoExtensionTest); |
| 1505 }; | 1492 }; |
| 1506 | 1493 |
| 1507 TEST_F(MediaRouterMojoExtensionTest, DeferredBindingAndSuspension) { | |
| 1508 // DetachRoute is called before *any* extension has connected. | |
| 1509 // It should be queued. | |
| 1510 media_router_->DetachRoute(kRouteId); | |
| 1511 | |
| 1512 BindMediaRouteProvider(); | |
| 1513 | |
| 1514 base::RunLoop run_loop, run_loop2; | |
| 1515 // |mojo_media_router| signals its readiness to the MR by registering | |
| 1516 // itself via RegisterMediaRouteProvider(). | |
| 1517 // Now that the |media_router| and |mojo_media_router| are fully initialized, | |
| 1518 // the queued DetachRoute() call should be executed. | |
| 1519 EXPECT_CALL(provide_handler_, InvokeInternal(testing::Not(""), _)) | |
| 1520 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | |
| 1521 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id())) | |
| 1522 .WillOnce(Return(false)); | |
| 1523 EXPECT_CALL(mock_media_route_provider_, EnableMdnsDiscovery()) | |
| 1524 .Times(AtMost(1)); | |
| 1525 EXPECT_CALL(mock_media_route_provider_, DetachRoute(kRouteId)) | |
| 1526 .WillOnce(InvokeWithoutArgs([&run_loop2]() { run_loop2.Quit(); })); | |
| 1527 RegisterMediaRouteProvider(); | |
| 1528 run_loop.Run(); | |
| 1529 run_loop2.Run(); | |
| 1530 | |
| 1531 base::RunLoop run_loop3; | |
| 1532 // Extension is suspended and re-awoken. | |
| 1533 ResetMediaRouteProvider(); | |
| 1534 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id())) | |
| 1535 .WillOnce(Return(true)); | |
| 1536 EXPECT_CALL(*process_manager_, WakeEventPage(extension_->id(), _)) | |
| 1537 .WillOnce(testing::DoAll( | |
| 1538 media::RunCallback<1>(true), | |
| 1539 InvokeWithoutArgs([&run_loop3]() { run_loop3.Quit(); }), | |
| 1540 Return(true))); | |
| 1541 media_router_->DetachRoute(kRouteId2); | |
| 1542 run_loop3.Run(); | |
| 1543 | |
| 1544 base::RunLoop run_loop4, run_loop5; | |
| 1545 // RegisterMediaRouteProvider() is called. | |
| 1546 // The queued DetachRoute(kRouteId2) call should be executed. | |
| 1547 EXPECT_CALL(provide_handler_, InvokeInternal(testing::Not(""), _)) | |
| 1548 .WillOnce(InvokeWithoutArgs([&run_loop4]() { run_loop4.Quit(); })); | |
| 1549 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id())) | |
| 1550 .WillOnce(Return(false)); | |
| 1551 EXPECT_CALL(mock_media_route_provider_, EnableMdnsDiscovery()) | |
| 1552 .Times(AtMost(1)); | |
| 1553 EXPECT_CALL(mock_media_route_provider_, DetachRoute(kRouteId2)) | |
| 1554 .WillOnce(InvokeWithoutArgs([&run_loop5]() { run_loop5.Quit(); })); | |
| 1555 BindMediaRouteProvider(); | |
| 1556 RegisterMediaRouteProvider(); | |
| 1557 run_loop4.Run(); | |
| 1558 run_loop5.Run(); | |
| 1559 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::DETACH_ROUTE, 1); | |
| 1560 ExpectWakeupBucketCount(MediaRouteProviderWakeup::SUCCESS, 1); | |
| 1561 ExpectVersionBucketCount(MediaRouteProviderVersion::SAME_VERSION_AS_CHROME, | |
| 1562 1); | |
| 1563 } | |
| 1564 | |
| 1565 TEST_F(MediaRouterMojoExtensionTest, AttemptedWakeupTooManyTimes) { | |
| 1566 BindMediaRouteProvider(); | |
| 1567 | |
| 1568 // DetachRoute is called while extension is suspended. It should be queued. | |
| 1569 // Schedule a component extension wakeup. | |
| 1570 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id())) | |
| 1571 .WillOnce(Return(true)); | |
| 1572 EXPECT_CALL(*process_manager_, WakeEventPage(extension_->id(), _)) | |
| 1573 .WillOnce(testing::DoAll(media::RunCallback<1>(true), Return(true))); | |
| 1574 ASSERT_TRUE(media_router_->pending_requests_.empty()); | |
| 1575 media_router_->DetachRoute(kRouteId); | |
| 1576 EXPECT_EQ(1u, media_router_->pending_requests_.size()); | |
| 1577 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::DETACH_ROUTE, 1); | |
| 1578 ExpectWakeupBucketCount(MediaRouteProviderWakeup::SUCCESS, 1); | |
| 1579 | |
| 1580 // Media route provider fails to connect to media router before extension is | |
| 1581 // suspended again, and |OnConnectionError| is invoked. Retry the wakeup. | |
| 1582 EXPECT_CALL(*process_manager_, WakeEventPage(extension_->id(), _)) | |
| 1583 .Times(MediaRouterMojoImpl::kMaxWakeupAttemptCount - 1) | |
| 1584 .WillRepeatedly( | |
| 1585 testing::DoAll(media::RunCallback<1>(true), Return(true))); | |
| 1586 for (int i = 0; i < MediaRouterMojoImpl::kMaxWakeupAttemptCount - 1; ++i) | |
| 1587 media_router_->OnConnectionError(); | |
| 1588 | |
| 1589 // We have already tried |kMaxWakeupAttemptCount| times. If we get an error | |
| 1590 // again, we will give up and the pending request queue will be drained. | |
| 1591 media_router_->OnConnectionError(); | |
| 1592 EXPECT_TRUE(media_router_->pending_requests_.empty()); | |
| 1593 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::CONNECTION_ERROR, | |
| 1594 MediaRouterMojoImpl::kMaxWakeupAttemptCount - 1); | |
| 1595 ExpectWakeupBucketCount(MediaRouteProviderWakeup::ERROR_TOO_MANY_RETRIES, 1); | |
| 1596 | |
| 1597 // Requests that comes in after queue is drained should be queued. | |
| 1598 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id())) | |
| 1599 .WillOnce(Return(true)); | |
| 1600 EXPECT_CALL(*process_manager_, WakeEventPage(extension_->id(), _)) | |
| 1601 .WillOnce(testing::DoAll(media::RunCallback<1>(true), Return(true))); | |
| 1602 media_router_->DetachRoute(kRouteId); | |
| 1603 EXPECT_EQ(1u, media_router_->pending_requests_.size()); | |
| 1604 ExpectVersionBucketCount(MediaRouteProviderVersion::SAME_VERSION_AS_CHROME, | |
| 1605 1); | |
| 1606 } | |
| 1607 | |
| 1608 TEST_F(MediaRouterMojoExtensionTest, WakeupFailedDrainsQueue) { | |
| 1609 BindMediaRouteProvider(); | |
| 1610 | |
| 1611 // DetachRoute is called while extension is suspended. It should be queued. | |
| 1612 // Schedule a component extension wakeup. | |
| 1613 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id())) | |
| 1614 .WillOnce(Return(true)); | |
| 1615 base::Callback<void(bool)> extension_wakeup_callback; | |
| 1616 EXPECT_CALL(*process_manager_, WakeEventPage(extension_->id(), _)) | |
| 1617 .WillOnce( | |
| 1618 testing::DoAll(SaveArg<1>(&extension_wakeup_callback), Return(true))); | |
| 1619 media_router_->DetachRoute(kRouteId); | |
| 1620 EXPECT_EQ(1u, media_router_->pending_requests_.size()); | |
| 1621 | |
| 1622 // Extension wakeup callback returning false is an non-retryable error. | |
| 1623 // Queue should be drained. | |
| 1624 extension_wakeup_callback.Run(false); | |
| 1625 EXPECT_TRUE(media_router_->pending_requests_.empty()); | |
| 1626 | |
| 1627 // Requests that comes in after queue is drained should be queued. | |
| 1628 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id())) | |
| 1629 .WillOnce(Return(true)); | |
| 1630 EXPECT_CALL(*process_manager_, WakeEventPage(extension_->id(), _)) | |
| 1631 .WillOnce(testing::DoAll(media::RunCallback<1>(true), Return(true))); | |
| 1632 media_router_->DetachRoute(kRouteId); | |
| 1633 EXPECT_EQ(1u, media_router_->pending_requests_.size()); | |
| 1634 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::DETACH_ROUTE, 1); | |
| 1635 ExpectWakeupBucketCount(MediaRouteProviderWakeup::ERROR_UNKNOWN, 1); | |
| 1636 ExpectVersionBucketCount(MediaRouteProviderVersion::SAME_VERSION_AS_CHROME, | |
| 1637 1); | |
| 1638 } | |
| 1639 | |
| 1640 TEST_F(MediaRouterMojoExtensionTest, DropOldestPendingRequest) { | |
| 1641 const size_t kMaxPendingRequests = MediaRouterMojoImpl::kMaxPendingRequests; | |
| 1642 | |
| 1643 // Request is queued. | |
| 1644 media_router_->DetachRoute(kRouteId); | |
| 1645 EXPECT_EQ(1u, media_router_->pending_requests_.size()); | |
| 1646 | |
| 1647 for (size_t i = 0; i < kMaxPendingRequests; ++i) | |
| 1648 media_router_->DetachRoute(kRouteId2); | |
| 1649 | |
| 1650 // The request queue size should not exceed |kMaxPendingRequests|. | |
| 1651 EXPECT_EQ(kMaxPendingRequests, media_router_->pending_requests_.size()); | |
| 1652 | |
| 1653 base::RunLoop run_loop, run_loop2; | |
| 1654 size_t count = 0; | |
| 1655 // The oldest request should have been dropped, so we don't expect to see | |
| 1656 // DetachRoute(kRouteId) here. | |
| 1657 BindMediaRouteProvider(); | |
| 1658 EXPECT_CALL(provide_handler_, InvokeInternal(testing::Not(""), _)) | |
| 1659 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | |
| 1660 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id())); | |
| 1661 EXPECT_CALL(mock_media_route_provider_, EnableMdnsDiscovery()) | |
| 1662 .Times(AtMost(1)); | |
| 1663 EXPECT_CALL(mock_media_route_provider_, DetachRoute(kRouteId2)) | |
| 1664 .Times(kMaxPendingRequests) | |
| 1665 .WillRepeatedly(InvokeWithoutArgs([&run_loop2, &count]() { | |
| 1666 if (++count == MediaRouterMojoImpl::kMaxPendingRequests) | |
| 1667 run_loop2.Quit(); | |
| 1668 })); | |
| 1669 RegisterMediaRouteProvider(); | |
| 1670 run_loop.Run(); | |
| 1671 run_loop2.Run(); | |
| 1672 ExpectVersionBucketCount(MediaRouteProviderVersion::SAME_VERSION_AS_CHROME, | |
| 1673 1); | |
| 1674 } | |
| 1675 | |
| 1676 #if defined(OS_WIN) | 1494 #if defined(OS_WIN) |
| 1677 TEST_F(MediaRouterMojoExtensionTest, EnableMdnsAfterEachRegister) { | 1495 TEST_F(MediaRouterMojoExtensionTest, EnableMdnsAfterEachRegister) { |
| 1678 // This should be queued since no MRPM is registered yet. | 1496 // EnableMdnsDiscovery)_ should not be called when no MRPM is registered yet. |
| 1497 EXPECT_CALL(*request_manager_, RunOrDeferInternal(_)) |
| 1498 .WillRepeatedly(Return()); |
| 1679 media_router_->OnUserGesture(); | 1499 media_router_->OnUserGesture(); |
| 1680 | 1500 |
| 1501 EXPECT_TRUE(Mock::VerifyAndClearExpectations(request_manager_)); |
| 1502 ON_CALL(*request_manager_, RunOrDeferInternal(_)) |
| 1503 .WillByDefault( |
| 1504 Invoke([](base::OnceClosure& request) { std::move(request).Run(); })); |
| 1505 |
| 1681 BindMediaRouteProvider(); | 1506 BindMediaRouteProvider(); |
| 1682 | 1507 |
| 1683 base::RunLoop run_loop; | 1508 base::RunLoop run_loop; |
| 1684 base::RunLoop run_loop2; | 1509 base::RunLoop run_loop2; |
| 1685 EXPECT_CALL(provide_handler_, InvokeInternal(testing::Not(""), _)) | 1510 EXPECT_CALL(provider_handler_, InvokeInternal(testing::Not(""), _)) |
| 1686 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 1511 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 1687 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id())) | |
| 1688 .WillOnce(Return(false)).WillOnce(Return(false)); | |
| 1689 EXPECT_CALL(mock_media_route_provider_, | 1512 EXPECT_CALL(mock_media_route_provider_, |
| 1690 UpdateMediaSinks(MediaSourceForDesktop().id())) | 1513 UpdateMediaSinks(MediaSourceForDesktop().id())) |
| 1691 .Times(2); | 1514 .Times(1); |
| 1692 // EnableMdnsDiscovery() is never called except on Windows. | 1515 // EnableMdnsDiscovery() is never called except on Windows. |
| 1693 EXPECT_CALL(mock_media_route_provider_, EnableMdnsDiscovery()) | 1516 EXPECT_CALL(mock_media_route_provider_, EnableMdnsDiscovery()) |
| 1694 .WillOnce(InvokeWithoutArgs([&run_loop2]() { | 1517 .WillOnce(InvokeWithoutArgs([&run_loop2]() { |
| 1695 run_loop2.Quit(); | 1518 run_loop2.Quit(); |
| 1696 })); | 1519 })); |
| 1697 RegisterMediaRouteProvider(); | 1520 RegisterMediaRouteProvider(); |
| 1698 run_loop.Run(); | 1521 run_loop.Run(); |
| 1699 run_loop2.Run(); | 1522 run_loop2.Run(); |
| 1700 // Should not call EnableMdnsDiscovery, but will call UpdateMediaSinks | 1523 // Should not call EnableMdnsDiscovery(), but will call UpdateMediaSinks. |
| 1701 media_router_->OnUserGesture(); | 1524 media_router_->OnUserGesture(); |
| 1702 base::RunLoop run_loop3; | 1525 base::RunLoop run_loop3; |
| 1703 run_loop3.RunUntilIdle(); | 1526 run_loop3.RunUntilIdle(); |
| 1704 | |
| 1705 // Reset the extension by "suspending" and notifying MR. | |
| 1706 base::RunLoop run_loop4; | |
| 1707 ResetMediaRouteProvider(); | |
| 1708 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id())) | |
| 1709 .WillOnce(Return(true)); | |
| 1710 EXPECT_CALL(*process_manager_, WakeEventPage(extension_->id(), _)) | |
| 1711 .WillOnce(testing::DoAll( | |
| 1712 media::RunCallback<1>(true), | |
| 1713 InvokeWithoutArgs([&run_loop4]() { run_loop4.Quit(); }), | |
| 1714 Return(true))); | |
| 1715 // Use DetachRoute because it unconditionally calls RunOrDefer(). | |
| 1716 media_router_->DetachRoute(kRouteId); | |
| 1717 run_loop4.Run(); | |
| 1718 | |
| 1719 base::RunLoop run_loop5; | |
| 1720 base::RunLoop run_loop6; | |
| 1721 // RegisterMediaRouteProvider() is called. | |
| 1722 // The queued DetachRoute(kRouteId) call should be executed. | |
| 1723 EXPECT_CALL(provide_handler_, InvokeInternal(testing::Not(""), _)) | |
| 1724 .WillOnce(InvokeWithoutArgs([&run_loop5]() { run_loop5.Quit(); })); | |
| 1725 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id())) | |
| 1726 .WillOnce(Return(false)).WillOnce(Return(false)); | |
| 1727 // Expected because it was used to wake up the page. | |
| 1728 EXPECT_CALL(mock_media_route_provider_, DetachRoute(kRouteId)); | |
| 1729 EXPECT_CALL(mock_media_route_provider_, | |
| 1730 UpdateMediaSinks(MediaSourceForDesktop().id())); | |
| 1731 // EnableMdnsDiscovery() is never called except on Windows. | |
| 1732 EXPECT_CALL(mock_media_route_provider_, EnableMdnsDiscovery()) | |
| 1733 .WillOnce(InvokeWithoutArgs([&run_loop6]() { | |
| 1734 run_loop6.Quit(); | |
| 1735 })); | |
| 1736 BindMediaRouteProvider(); | |
| 1737 RegisterMediaRouteProvider(); | |
| 1738 run_loop5.Run(); | |
| 1739 run_loop6.Run(); | |
| 1740 // Should not call EnableMdnsDiscovery, but will call UpdateMediaSinks | |
| 1741 media_router_->OnUserGesture(); | |
| 1742 base::RunLoop run_loop7; | |
| 1743 run_loop7.RunUntilIdle(); | |
| 1744 } | 1527 } |
| 1745 #endif | 1528 #endif |
| 1746 | 1529 |
| 1747 TEST_F(MediaRouterMojoExtensionTest, UpdateMediaSinksOnUserGesture) { | 1530 TEST_F(MediaRouterMojoExtensionTest, UpdateMediaSinksOnUserGesture) { |
| 1748 BindMediaRouteProvider(); | 1531 BindMediaRouteProvider(); |
| 1749 | 1532 |
| 1750 base::RunLoop run_loop; | 1533 base::RunLoop run_loop; |
| 1751 EXPECT_CALL(provide_handler_, InvokeInternal(testing::Not(""), _)) | 1534 EXPECT_CALL(provider_handler_, InvokeInternal(testing::Not(""), _)) |
| 1752 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 1535 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 1753 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id())) | |
| 1754 #if defined(OS_WIN) | |
| 1755 // Windows calls once for EnableMdnsDiscovery | |
| 1756 .Times(3) | |
| 1757 #else | |
| 1758 // All others call once for registration, and once for the user gesture. | |
| 1759 .Times(2) | |
| 1760 #endif | |
| 1761 .WillRepeatedly(Return(false)); | |
| 1762 | |
| 1763 | 1536 |
| 1764 RegisterMediaRouteProvider(); | 1537 RegisterMediaRouteProvider(); |
| 1765 run_loop.Run(); | 1538 run_loop.Run(); |
| 1766 | 1539 |
| 1767 media_router_->OnUserGesture(); | 1540 media_router_->OnUserGesture(); |
| 1768 | 1541 |
| 1769 base::RunLoop run_loop2; | 1542 base::RunLoop run_loop2; |
| 1770 | 1543 |
| 1771 #if defined(OS_WIN) | 1544 #if defined(OS_WIN) |
| 1772 EXPECT_CALL(mock_media_route_provider_, EnableMdnsDiscovery()); | 1545 EXPECT_CALL(mock_media_route_provider_, EnableMdnsDiscovery()); |
| 1773 #endif | 1546 #endif |
| 1774 EXPECT_CALL(mock_media_route_provider_, | 1547 EXPECT_CALL(mock_media_route_provider_, |
| 1775 UpdateMediaSinks(MediaSourceForDesktop().id())) | 1548 UpdateMediaSinks(MediaSourceForDesktop().id())) |
| 1776 .WillOnce(InvokeWithoutArgs([&run_loop2]() { | 1549 .WillOnce(InvokeWithoutArgs([&run_loop2]() { |
| 1777 run_loop2.Quit(); | 1550 run_loop2.Quit(); |
| 1778 })); | 1551 })); |
| 1779 | 1552 |
| 1780 run_loop2.Run(); | 1553 run_loop2.Run(); |
| 1781 } | 1554 } |
| 1782 | 1555 |
| 1783 TEST_F(MediaRouterMojoExtensionTest, SyncStateToMediaRouteProvider) { | 1556 TEST_F(MediaRouterMojoExtensionTest, SyncStateToMediaRouteProvider) { |
| 1784 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id())) | |
| 1785 .WillRepeatedly(Return(false)); | |
| 1786 MediaSource media_source = MediaSource(kSource); | 1557 MediaSource media_source = MediaSource(kSource); |
| 1787 std::unique_ptr<MockMediaSinksObserver> sinks_observer; | 1558 std::unique_ptr<MockMediaSinksObserver> sinks_observer; |
| 1788 std::unique_ptr<MockMediaRoutesObserver> routes_observer; | 1559 std::unique_ptr<MockMediaRoutesObserver> routes_observer; |
| 1789 std::unique_ptr<NullMessageObserver> messages_observer; | 1560 std::unique_ptr<NullMessageObserver> messages_observer; |
| 1790 | 1561 |
| 1791 { | 1562 { |
| 1792 EXPECT_CALL(provide_handler_, InvokeInternal(testing::Not(""), _)); | 1563 EXPECT_CALL(provider_handler_, InvokeInternal(testing::Not(""), _)); |
| 1793 BindMediaRouteProvider(); | 1564 BindMediaRouteProvider(); |
| 1794 RegisterMediaRouteProvider(); | 1565 RegisterMediaRouteProvider(); |
| 1795 base::RunLoop().RunUntilIdle(); | 1566 base::RunLoop().RunUntilIdle(); |
| 1796 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&provide_handler_)); | 1567 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&provider_handler_)); |
| 1797 } | 1568 } |
| 1798 | 1569 |
| 1799 { | 1570 { |
| 1800 media_router_->OnSinkAvailabilityUpdated( | 1571 media_router_->OnSinkAvailabilityUpdated( |
| 1801 mojom::MediaRouter::SinkAvailability::PER_SOURCE); | 1572 mojom::MediaRouter::SinkAvailability::PER_SOURCE); |
| 1802 EXPECT_CALL(mock_media_route_provider_, | 1573 EXPECT_CALL(mock_media_route_provider_, |
| 1803 StartObservingMediaSinks(media_source.id())); | 1574 StartObservingMediaSinks(media_source.id())); |
| 1804 sinks_observer.reset(new MockMediaSinksObserver( | 1575 sinks_observer = base::MakeUnique<MockMediaSinksObserver>( |
| 1805 router(), media_source, url::Origin(GURL(kOrigin)))); | 1576 router(), media_source, url::Origin(GURL(kOrigin))); |
| 1806 EXPECT_TRUE(sinks_observer->Init()); | 1577 EXPECT_TRUE(sinks_observer->Init()); |
| 1807 | 1578 |
| 1808 EXPECT_CALL(mock_media_route_provider_, | 1579 EXPECT_CALL(mock_media_route_provider_, |
| 1809 StartObservingMediaRoutes(media_source.id())); | 1580 StartObservingMediaRoutes(media_source.id())); |
| 1810 routes_observer.reset( | 1581 routes_observer = |
| 1811 new MockMediaRoutesObserver(router(), media_source.id())); | 1582 base::MakeUnique<MockMediaRoutesObserver>(router(), media_source.id()); |
| 1812 | 1583 |
| 1813 EXPECT_CALL(mock_media_route_provider_, | 1584 EXPECT_CALL(mock_media_route_provider_, |
| 1814 StartListeningForRouteMessages(media_source.id())); | 1585 StartListeningForRouteMessages(media_source.id())); |
| 1815 messages_observer.reset( | 1586 messages_observer = |
| 1816 new NullMessageObserver(router(), media_source.id())); | 1587 base::MakeUnique<NullMessageObserver>(router(), media_source.id()); |
| 1817 base::RunLoop().RunUntilIdle(); | 1588 base::RunLoop().RunUntilIdle(); |
| 1818 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&mock_media_route_provider_)); | 1589 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&mock_media_route_provider_)); |
| 1819 } | 1590 } |
| 1820 | 1591 |
| 1821 { | 1592 { |
| 1822 EXPECT_CALL(provide_handler_, InvokeInternal(testing::Not(""), _)); | 1593 EXPECT_CALL(provider_handler_, InvokeInternal(testing::Not(""), _)); |
| 1823 EXPECT_CALL(mock_media_route_provider_, | 1594 EXPECT_CALL(mock_media_route_provider_, |
| 1824 StartObservingMediaSinks(media_source.id())); | 1595 StartObservingMediaSinks(media_source.id())); |
| 1825 EXPECT_CALL(mock_media_route_provider_, | 1596 EXPECT_CALL(mock_media_route_provider_, |
| 1826 StartObservingMediaRoutes(media_source.id())); | 1597 StartObservingMediaRoutes(media_source.id())); |
| 1827 EXPECT_CALL(mock_media_route_provider_, | 1598 EXPECT_CALL(mock_media_route_provider_, |
| 1828 StartListeningForRouteMessages(media_source.id())); | 1599 StartListeningForRouteMessages(media_source.id())); |
| 1829 media_router_->OnConnectionError(); | 1600 media_router_->OnConnectionError(); |
| 1830 BindMediaRouteProvider(); | 1601 BindMediaRouteProvider(); |
| 1831 RegisterMediaRouteProvider(); | 1602 RegisterMediaRouteProvider(); |
| 1832 base::RunLoop().RunUntilIdle(); | 1603 base::RunLoop().RunUntilIdle(); |
| 1833 } | 1604 } |
| 1834 } | 1605 } |
| 1835 | 1606 |
| 1836 } // namespace media_router | 1607 } // namespace media_router |
| OLD | NEW |