Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(253)

Side by Side Diff: chrome/browser/media/router/mojo/media_router_mojo_impl_unittest.cc

Issue 2949933002: [Media Router] Factor extension-related logic out of MediaRouterMojoImpl (Closed)
Patch Set: Remove includes Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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(SetExtensionId, void(const std::string& extension_id));
128 void RunOrDefer(base::OnceClosure request,
129 MediaRouteProviderWakeReason wake_reason) override {
130 RunOrDeferInternal(request, wake_reason);
131 }
132 MOCK_METHOD2(RunOrDeferInternal,
133 void(base::OnceClosure& request,
134 MediaRouteProviderWakeReason wake_reason));
135 MOCK_METHOD0(OnMojoConnectionsReady, void());
136 MOCK_METHOD0(OnMojoConnectionError, void());
137
138 private:
139 DISALLOW_COPY_AND_ASSIGN(TestEventPageRequestManager);
140 };
141
114 class RouteResponseCallbackHandler { 142 class RouteResponseCallbackHandler {
115 public: 143 public:
116 void Invoke(const RouteRequestResult& result) { 144 void Invoke(const RouteRequestResult& result) {
117 DoInvoke(result.route(), result.presentation_id(), result.error(), 145 DoInvoke(result.route(), result.presentation_id(), result.error(),
118 result.result_code()); 146 result.result_code());
119 } 147 }
120 MOCK_METHOD4(DoInvoke, 148 MOCK_METHOD4(DoInvoke,
121 void(const MediaRoute* route, 149 void(const MediaRoute* route,
122 const std::string& presentation_id, 150 const std::string& presentation_id,
123 const std::string& error_text, 151 const std::string& error_text,
(...skipping 14 matching lines...) Expand all
138 void StoreAndRun(T* result, const base::Closure& closure, const T& result_val) { 166 void StoreAndRun(T* result, const base::Closure& closure, const T& result_val) {
139 *result = result_val; 167 *result = result_val;
140 closure.Run(); 168 closure.Run();
141 } 169 }
142 170
143 class MediaRouterMojoImplTest : public MediaRouterMojoTest { 171 class MediaRouterMojoImplTest : public MediaRouterMojoTest {
144 public: 172 public:
145 MediaRouterMojoImplTest() {} 173 MediaRouterMojoImplTest() {}
146 ~MediaRouterMojoImplTest() override {} 174 ~MediaRouterMojoImplTest() override {}
147 175
176 void SetUp() override {
177 EventPageRequestManagerFactory::GetInstance()->SetTestingFactory(
178 profile(), &TestEventPageRequestManager::Create);
179 request_manager_ = static_cast<TestEventPageRequestManager*>(
180 EventPageRequestManagerFactory::GetApiForBrowserContext(profile()));
181
182 MediaRouterMojoTest::SetUp();
183
184 ON_CALL(*request_manager_, RunOrDeferInternal(_, _))
185 .WillByDefault(Invoke([](base::OnceClosure& request,
186 MediaRouteProviderWakeReason wake_reason) {
187 std::move(request).Run();
188 }));
189 }
190
191 protected:
148 void ExpectResultBucketCount(const std::string& operation, 192 void ExpectResultBucketCount(const std::string& operation,
149 RouteRequestResult::ResultCode result_code, 193 RouteRequestResult::ResultCode result_code,
150 int expected_count) { 194 int expected_count) {
151 histogram_tester_.ExpectBucketCount( 195 histogram_tester_.ExpectBucketCount(
152 "MediaRouter.Provider." + operation + ".Result", 196 "MediaRouter.Provider." + operation + ".Result",
153 result_code, 197 result_code,
154 expected_count); 198 expected_count);
155 } 199 }
156 200
201 TestEventPageRequestManager* request_manager_ = nullptr;
202
157 private: 203 private:
158 base::HistogramTester histogram_tester_; 204 base::HistogramTester histogram_tester_;
159 }; 205 };
160 206
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) { 207 TEST_F(MediaRouterMojoImplTest, CreateRoute) {
188 MediaSource media_source(kSource); 208 MediaSource media_source(kSource);
189 MediaRoute expected_route(kRouteId, media_source, kSinkId, "", false, "", 209 MediaRoute expected_route(kRouteId, media_source, kSinkId, "", false, "",
190 false); 210 false);
191 211
192 // Use a lambda function as an invocation target here to work around 212 // 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 213 // a limitation with GMock::Invoke that prevents it from using move-only types
194 // in runnable parameter lists. 214 // in runnable parameter lists.
195 EXPECT_CALL( 215 EXPECT_CALL(
196 mock_media_route_provider_, 216 mock_media_route_provider_,
(...skipping 493 matching lines...) Expand 10 before | Expand all | Expand 10 after
690 TEST_F(MediaRouterMojoImplTest, RegisterAndUnregisterMediaSinksObserver) { 710 TEST_F(MediaRouterMojoImplTest, RegisterAndUnregisterMediaSinksObserver) {
691 router()->OnSinkAvailabilityUpdated( 711 router()->OnSinkAvailabilityUpdated(
692 mojom::MediaRouter::SinkAvailability::AVAILABLE); 712 mojom::MediaRouter::SinkAvailability::AVAILABLE);
693 MediaSource media_source(kSource); 713 MediaSource media_source(kSource);
694 714
695 // These should only be called once even if there is more than one observer 715 // These should only be called once even if there is more than one observer
696 // for a given source. 716 // for a given source.
697 EXPECT_CALL(mock_media_route_provider_, StartObservingMediaSinks(kSource)); 717 EXPECT_CALL(mock_media_route_provider_, StartObservingMediaSinks(kSource));
698 EXPECT_CALL(mock_media_route_provider_, StartObservingMediaSinks(kSource2)); 718 EXPECT_CALL(mock_media_route_provider_, StartObservingMediaSinks(kSource2));
699 719
700 std::unique_ptr<MockMediaSinksObserver> sinks_observer( 720 auto sinks_observer = base::MakeUnique<MockMediaSinksObserver>(
701 new MockMediaSinksObserver(router(), media_source, 721 router(), media_source, url::Origin(GURL(kOrigin)));
702 url::Origin(GURL(kOrigin))));
703 EXPECT_TRUE(sinks_observer->Init()); 722 EXPECT_TRUE(sinks_observer->Init());
704 std::unique_ptr<MockMediaSinksObserver> extra_sinks_observer( 723 auto extra_sinks_observer = base::MakeUnique<MockMediaSinksObserver>(
705 new MockMediaSinksObserver(router(), media_source, 724 router(), media_source, url::Origin(GURL(kOrigin)));
706 url::Origin(GURL(kOrigin))));
707 EXPECT_TRUE(extra_sinks_observer->Init()); 725 EXPECT_TRUE(extra_sinks_observer->Init());
708 std::unique_ptr<MockMediaSinksObserver> unrelated_sinks_observer( 726 auto unrelated_sinks_observer = base::MakeUnique<MockMediaSinksObserver>(
709 new MockMediaSinksObserver(router(), MediaSource(kSource2), 727 router(), MediaSource(kSource2), url::Origin(GURL(kOrigin)));
710 url::Origin(GURL(kOrigin))));
711 EXPECT_TRUE(unrelated_sinks_observer->Init()); 728 EXPECT_TRUE(unrelated_sinks_observer->Init());
712 ProcessEventLoop(); 729 ProcessEventLoop();
713 730
714 std::vector<MediaSink> expected_sinks; 731 std::vector<MediaSink> expected_sinks;
715 expected_sinks.push_back( 732 expected_sinks.push_back(
716 MediaSink(kSinkId, kSinkName, MediaSink::IconType::CAST)); 733 MediaSink(kSinkId, kSinkName, MediaSink::IconType::CAST));
717 expected_sinks.push_back( 734 expected_sinks.push_back(
718 MediaSink(kSinkId2, kSinkName, MediaSink::IconType::CAST)); 735 MediaSink(kSinkId2, kSinkName, MediaSink::IconType::CAST));
719 736
720 std::vector<MediaSinkInternal> sinks; 737 std::vector<MediaSinkInternal> sinks;
721 for (const auto& expected_sink : expected_sinks) { 738 for (const auto& expected_sink : expected_sinks) {
722 MediaSinkInternal sink_internal; 739 MediaSinkInternal sink_internal;
723 sink_internal.set_sink(expected_sink); 740 sink_internal.set_sink(expected_sink);
724 sinks.push_back(sink_internal); 741 sinks.push_back(sink_internal);
725 } 742 }
726 743
727 base::RunLoop run_loop; 744 base::RunLoop run_loop;
728 EXPECT_CALL(*sinks_observer, OnSinksReceived(SequenceEquals(expected_sinks))); 745 EXPECT_CALL(*sinks_observer, OnSinksReceived(SequenceEquals(expected_sinks)));
729 EXPECT_CALL(*extra_sinks_observer, 746 EXPECT_CALL(*extra_sinks_observer,
730 OnSinksReceived(SequenceEquals(expected_sinks))) 747 OnSinksReceived(SequenceEquals(expected_sinks)))
731 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); 748 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); }));
732 media_router_proxy_->OnSinksReceived( 749 media_router_proxy_->OnSinksReceived(
733 media_source.id(), sinks, 750 media_source.id(), sinks,
734 std::vector<url::Origin>(1, url::Origin(GURL(kOrigin)))); 751 std::vector<url::Origin>(1, url::Origin(GURL(kOrigin))));
735 run_loop.Run(); 752 run_loop.Run();
736 753
737 // Since the MediaRouterMojoImpl has already received results for 754 // Since the MediaRouterMojoImpl has already received results for
738 // |media_source|, return cached results to observers that are subsequently 755 // |media_source|, return cached results to observers that are subsequently
739 // registered. 756 // registered.
740 std::unique_ptr<MockMediaSinksObserver> cached_sinks_observer( 757 auto cached_sinks_observer = base::MakeUnique<MockMediaSinksObserver>(
741 new MockMediaSinksObserver(router(), media_source, 758 router(), media_source, url::Origin(GURL(kOrigin)));
742 url::Origin(GURL(kOrigin))));
743 EXPECT_CALL(*cached_sinks_observer, 759 EXPECT_CALL(*cached_sinks_observer,
744 OnSinksReceived(SequenceEquals(expected_sinks))); 760 OnSinksReceived(SequenceEquals(expected_sinks)));
745 EXPECT_TRUE(cached_sinks_observer->Init()); 761 EXPECT_TRUE(cached_sinks_observer->Init());
746 762
747 // Different origin from cached result. Empty list will be returned. 763 // Different origin from cached result. Empty list will be returned.
748 std::unique_ptr<MockMediaSinksObserver> cached_sinks_observer2( 764 auto cached_sinks_observer2 = base::MakeUnique<MockMediaSinksObserver>(
749 new MockMediaSinksObserver(router(), media_source, 765 router(), media_source, url::Origin(GURL("https://youtube.com")));
750 url::Origin(GURL("https://youtube.com"))));
751 EXPECT_CALL(*cached_sinks_observer2, OnSinksReceived(IsEmpty())); 766 EXPECT_CALL(*cached_sinks_observer2, OnSinksReceived(IsEmpty()));
752 EXPECT_TRUE(cached_sinks_observer2->Init()); 767 EXPECT_TRUE(cached_sinks_observer2->Init());
753 768
754 base::RunLoop run_loop2; 769 base::RunLoop run_loop2;
755 EXPECT_CALL(mock_media_route_provider_, StopObservingMediaSinks(kSource)); 770 EXPECT_CALL(mock_media_route_provider_, StopObservingMediaSinks(kSource));
756 EXPECT_CALL(mock_media_route_provider_, StopObservingMediaSinks(kSource2)) 771 EXPECT_CALL(mock_media_route_provider_, StopObservingMediaSinks(kSource2))
757 .WillOnce(InvokeWithoutArgs([&run_loop2]() { run_loop2.Quit(); })); 772 .WillOnce(InvokeWithoutArgs([&run_loop2]() { run_loop2.Quit(); }));
758 sinks_observer.reset(); 773 sinks_observer.reset();
759 extra_sinks_observer.reset(); 774 extra_sinks_observer.reset();
760 unrelated_sinks_observer.reset(); 775 unrelated_sinks_observer.reset();
761 cached_sinks_observer.reset(); 776 cached_sinks_observer.reset();
762 cached_sinks_observer2.reset(); 777 cached_sinks_observer2.reset();
763 run_loop2.Run(); 778 run_loop2.Run();
764 } 779 }
765 780
766 TEST_F(MediaRouterMojoImplTest, 781 TEST_F(MediaRouterMojoImplTest,
767 RegisterMediaSinksObserverWithAvailabilityChange) { 782 RegisterMediaSinksObserverWithAvailabilityChange) {
768 // When availability is UNAVAILABLE, no calls should be made to MRPM. 783 // When availability is UNAVAILABLE, no calls should be made to MRPM.
769 router()->OnSinkAvailabilityUpdated( 784 router()->OnSinkAvailabilityUpdated(
770 mojom::MediaRouter::SinkAvailability::UNAVAILABLE); 785 mojom::MediaRouter::SinkAvailability::UNAVAILABLE);
771 MediaSource media_source(kSource); 786 MediaSource media_source(kSource);
772 std::unique_ptr<MockMediaSinksObserver> sinks_observer( 787 auto sinks_observer = base::MakeUnique<MockMediaSinksObserver>(
773 new MockMediaSinksObserver(router(), media_source, 788 router(), media_source, url::Origin(GURL(kOrigin)));
774 url::Origin(GURL(kOrigin))));
775 EXPECT_CALL(*sinks_observer, OnSinksReceived(IsEmpty())); 789 EXPECT_CALL(*sinks_observer, OnSinksReceived(IsEmpty()));
776 EXPECT_TRUE(sinks_observer->Init()); 790 EXPECT_TRUE(sinks_observer->Init());
777 MediaSource media_source2(kSource2); 791 MediaSource media_source2(kSource2);
778 std::unique_ptr<MockMediaSinksObserver> sinks_observer2( 792 auto sinks_observer2 = base::MakeUnique<MockMediaSinksObserver>(
779 new MockMediaSinksObserver(router(), media_source2, 793 router(), media_source2, url::Origin(GURL(kOrigin)));
780 url::Origin(GURL(kOrigin))));
781 EXPECT_CALL(*sinks_observer2, OnSinksReceived(IsEmpty())); 794 EXPECT_CALL(*sinks_observer2, OnSinksReceived(IsEmpty()));
782 EXPECT_TRUE(sinks_observer2->Init()); 795 EXPECT_TRUE(sinks_observer2->Init());
783 EXPECT_CALL(mock_media_route_provider_, StartObservingMediaSinks(kSource)) 796 EXPECT_CALL(mock_media_route_provider_, StartObservingMediaSinks(kSource))
784 .Times(0); 797 .Times(0);
785 EXPECT_CALL(mock_media_route_provider_, StartObservingMediaSinks(kSource2)) 798 EXPECT_CALL(mock_media_route_provider_, StartObservingMediaSinks(kSource2))
786 .Times(0); 799 .Times(0);
787 ProcessEventLoop(); 800 ProcessEventLoop();
788 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&mock_media_route_provider_)); 801 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&mock_media_route_provider_));
789 802
790 // When availability transitions AVAILABLE, existing sink queries should be 803 // When availability transitions AVAILABLE, existing sink queries should be
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
907 expected_joinable_route_ids.push_back(kJoinableRouteId); 920 expected_joinable_route_ids.push_back(kJoinableRouteId);
908 921
909 Sequence sequence; 922 Sequence sequence;
910 923
911 // Creating the first observer will wake-up the provider and ask it to start 924 // 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 925 // observing routes having source |kSource|. The provider will respond with
913 // the existing route. 926 // the existing route.
914 EXPECT_CALL(mock_media_route_provider_, 927 EXPECT_CALL(mock_media_route_provider_,
915 StartObservingMediaRoutes(media_source.id())) 928 StartObservingMediaRoutes(media_source.id()))
916 .Times(1); 929 .Times(1);
917 std::unique_ptr<MockMediaRoutesObserver> observer1( 930 auto observer1 =
918 new MockMediaRoutesObserver(router(), media_source.id())); 931 base::MakeUnique<MockMediaRoutesObserver>(router(), media_source.id());
919 ProcessEventLoop(); 932 ProcessEventLoop();
920 EXPECT_CALL(*observer1, OnRoutesUpdated(SequenceEquals(expected_routes), 933 EXPECT_CALL(*observer1, OnRoutesUpdated(SequenceEquals(expected_routes),
921 expected_joinable_route_ids)) 934 expected_joinable_route_ids))
922 .Times(1); 935 .Times(1);
923 media_router_proxy_->OnRoutesUpdated(expected_routes, media_source.id(), 936 media_router_proxy_->OnRoutesUpdated(expected_routes, media_source.id(),
924 expected_joinable_route_ids); 937 expected_joinable_route_ids);
925 ProcessEventLoop(); 938 ProcessEventLoop();
926 939
927 // Creating two more observers will not wake up the provider. Instead, the 940 // Creating two more observers will not wake up the provider. Instead, the
928 // cached route list will be returned. 941 // cached route list will be returned.
929 std::unique_ptr<MockMediaRoutesObserver> observer2( 942 auto observer2 =
930 new MockMediaRoutesObserver(router(), media_source.id())); 943 base::MakeUnique<MockMediaRoutesObserver>(router(), media_source.id());
931 std::unique_ptr<MockMediaRoutesObserver> observer3( 944 auto observer3 =
932 new MockMediaRoutesObserver(router(), media_source.id())); 945 base::MakeUnique<MockMediaRoutesObserver>(router(), media_source.id());
933 EXPECT_CALL(*observer2, OnRoutesUpdated(SequenceEquals(expected_routes), 946 EXPECT_CALL(*observer2, OnRoutesUpdated(SequenceEquals(expected_routes),
934 expected_joinable_route_ids)) 947 expected_joinable_route_ids))
935 .Times(1); 948 .Times(1);
936 EXPECT_CALL(*observer3, OnRoutesUpdated(SequenceEquals(expected_routes), 949 EXPECT_CALL(*observer3, OnRoutesUpdated(SequenceEquals(expected_routes),
937 expected_joinable_route_ids)) 950 expected_joinable_route_ids))
938 .Times(1); 951 .Times(1);
939 ProcessEventLoop(); 952 ProcessEventLoop();
940 953
941 // Kill 2 of three observers, and expect nothing happens at the provider. 954 // Kill 2 of three observers, and expect nothing happens at the provider.
942 observer1.reset(); 955 observer1.reset();
(...skipping 22 matching lines...) Expand all
965 SendMessageCallbackHandler handler; 978 SendMessageCallbackHandler handler;
966 EXPECT_CALL(handler, Invoke(true)) 979 EXPECT_CALL(handler, Invoke(true))
967 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); 980 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); }));
968 router()->SendRouteMessage(kRouteId, kMessage, 981 router()->SendRouteMessage(kRouteId, kMessage,
969 base::Bind(&SendMessageCallbackHandler::Invoke, 982 base::Bind(&SendMessageCallbackHandler::Invoke,
970 base::Unretained(&handler))); 983 base::Unretained(&handler)));
971 run_loop.Run(); 984 run_loop.Run();
972 } 985 }
973 986
974 TEST_F(MediaRouterMojoImplTest, SendRouteBinaryMessage) { 987 TEST_F(MediaRouterMojoImplTest, SendRouteBinaryMessage) {
975 std::unique_ptr<std::vector<uint8_t>> expected_binary_data( 988 auto expected_binary_data = base::MakeUnique<std::vector<uint8_t>>(
976 new std::vector<uint8_t>(kBinaryMessage, 989 kBinaryMessage, kBinaryMessage + arraysize(kBinaryMessage));
977 kBinaryMessage + arraysize(kBinaryMessage)));
978
979 EXPECT_CALL(mock_media_route_provider_, 990 EXPECT_CALL(mock_media_route_provider_,
980 SendRouteBinaryMessageInternal(kRouteId, _, _)) 991 SendRouteBinaryMessageInternal(kRouteId, _, _))
981 .WillOnce(Invoke( 992 .WillOnce(Invoke(
982 [](const MediaRoute::Id& route_id, const std::vector<uint8_t>& data, 993 [](const MediaRoute::Id& route_id, const std::vector<uint8_t>& data,
983 mojom::MediaRouteProvider::SendRouteMessageCallback& cb) { 994 mojom::MediaRouteProvider::SendRouteMessageCallback& cb) {
984 EXPECT_EQ(0, memcmp(kBinaryMessage, &(data[0]), 995 EXPECT_EQ(0, memcmp(kBinaryMessage, &(data[0]),
985 arraysize(kBinaryMessage))); 996 arraysize(kBinaryMessage)));
986 std::move(cb).Run(true); 997 std::move(cb).Run(true);
987 })); 998 }));
988 999
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
1176 // Callback has been removed, so we don't expect it to be called anymore. 1187 // Callback has been removed, so we don't expect it to be called anymore.
1177 subscription.reset(); 1188 subscription.reset();
1178 EXPECT_TRUE(router()->presentation_connection_state_callbacks_.empty()); 1189 EXPECT_TRUE(router()->presentation_connection_state_callbacks_.empty());
1179 1190
1180 EXPECT_CALL(callback, Run(_)).Times(0); 1191 EXPECT_CALL(callback, Run(_)).Times(0);
1181 media_router_proxy_->OnPresentationConnectionStateChanged( 1192 media_router_proxy_->OnPresentationConnectionStateChanged(
1182 route_id, content::PRESENTATION_CONNECTION_STATE_TERMINATED); 1193 route_id, content::PRESENTATION_CONNECTION_STATE_TERMINATED);
1183 ProcessEventLoop(); 1194 ProcessEventLoop();
1184 } 1195 }
1185 1196
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) { 1197 TEST_F(MediaRouterMojoImplTest, SearchSinks) {
1209 std::string search_input("input"); 1198 std::string search_input("input");
1210 std::string domain("google.com"); 1199 std::string domain("google.com");
1211 MediaSource media_source(kSource); 1200 MediaSource media_source(kSource);
1212 1201
1213 EXPECT_CALL(mock_media_route_provider_, 1202 EXPECT_CALL(mock_media_route_provider_,
1214 SearchSinksInternal(kSinkId, kSource, _, _)) 1203 SearchSinksInternal(kSinkId, kSource, _, _))
1215 .WillOnce( 1204 .WillOnce(
1216 Invoke([&search_input, &domain]( 1205 Invoke([&search_input, &domain](
1217 const std::string& sink_id, const std::string& source, 1206 const std::string& sink_id, const std::string& source,
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
1397 1386
1398 // When the MediaRouter is notified that the MediaRouteProvider failed to 1387 // When the MediaRouter is notified that the MediaRouteProvider failed to
1399 // create a controller, the browser-side controller should be invalidated. 1388 // create a controller, the browser-side controller should be invalidated.
1400 EXPECT_CALL(observer, OnControllerInvalidated()); 1389 EXPECT_CALL(observer, OnControllerInvalidated());
1401 1390
1402 base::RunLoop().RunUntilIdle(); 1391 base::RunLoop().RunUntilIdle();
1403 } 1392 }
1404 1393
1405 class MediaRouterMojoExtensionTest : public ::testing::Test { 1394 class MediaRouterMojoExtensionTest : public ::testing::Test {
1406 public: 1395 public:
1407 MediaRouterMojoExtensionTest() : process_manager_(nullptr) {} 1396 MediaRouterMojoExtensionTest() {}
1408 1397
1409 ~MediaRouterMojoExtensionTest() override {} 1398 ~MediaRouterMojoExtensionTest() override {}
1410 1399
1411 protected: 1400 protected:
1412 void SetUp() override { 1401 void SetUp() override {
1413 // Set the extension's version number to be identical to the browser's. 1402 // Set the extension's version number to be identical to the browser's.
1414 extension_ = 1403 extension_ =
1415 extensions::test_util::BuildExtension(extensions::ExtensionBuilder()) 1404 extensions::test_util::BuildExtension(extensions::ExtensionBuilder())
1416 .MergeManifest(extensions::DictionaryBuilder() 1405 .MergeManifest(extensions::DictionaryBuilder()
1417 .Set("version", version_info::GetVersionNumber()) 1406 .Set("version", version_info::GetVersionNumber())
1418 .Build()) 1407 .Build())
1419 .Build(); 1408 .Build();
1420 1409
1421 profile_.reset(new TestingProfile); 1410 profile_ = base::MakeUnique<TestingProfile>();
1422 // Set up a mock ProcessManager instance. 1411 EventPageRequestManagerFactory::GetInstance()->SetTestingFactory(
1423 extensions::ProcessManagerFactory::GetInstance()->SetTestingFactory( 1412 profile_.get(), &TestEventPageRequestManager::Create);
1424 profile_.get(), &TestProcessManager::Create); 1413 request_manager_ = static_cast<TestEventPageRequestManager*>(
1425 process_manager_ = static_cast<TestProcessManager*>( 1414 EventPageRequestManagerFactory::GetApiForBrowserContext(
1426 extensions::ProcessManager::Get(profile_.get())); 1415 profile_.get()));
1427 DCHECK(process_manager_); 1416
1417 ON_CALL(*request_manager_, RunOrDeferInternal(_, _))
1418 .WillByDefault(Invoke([](base::OnceClosure& request,
1419 MediaRouteProviderWakeReason wake_reason) {
1420 std::move(request).Run();
1421 }));
1428 1422
1429 // Create MR and its proxy, so that it can be accessed through Mojo. 1423 // Create MR and its proxy, so that it can be accessed through Mojo.
1430 media_router_.reset(new MediaRouterMojoImpl( 1424 media_router_.reset(new MediaRouterMojoImpl(
1431 process_manager_, profile_.get(), 1425 profile_.get(), MediaRouterMojoImpl::FirewallCheck::SKIP_FOR_TESTING));
1432 MediaRouterMojoImpl::FirewallCheck::SKIP_FOR_TESTING));
1433 ProcessEventLoop(); 1426 ProcessEventLoop();
1434 } 1427 }
1435 1428
1436 void TearDown() override { 1429 void TearDown() override {
1437 media_router_.reset(); 1430 media_router_.reset();
1438 profile_.reset(); 1431 profile_.reset();
1439 } 1432 }
1440 1433
1441 // Constructs bindings so that |media_router_| delegates calls to 1434 // Constructs bindings so that |media_router_| delegates calls to
1442 // |mojo_media_router_|, which are then handled by 1435 // |mojo_media_router_|, which are then handled by
1443 // |mock_media_route_provider_service_|. 1436 // |mock_media_route_provider_service_|.
1444 void BindMediaRouteProvider() { 1437 void BindMediaRouteProvider() {
1445 binding_.reset(new mojo::Binding<mojom::MediaRouteProvider>( 1438 binding_ = base::MakeUnique<mojo::Binding<mojom::MediaRouteProvider>>(
1446 &mock_media_route_provider_, 1439 &mock_media_route_provider_,
1447 mojo::MakeRequest(&media_route_provider_proxy_))); 1440 mojo::MakeRequest(&media_route_provider_proxy_));
1448 media_router_->BindToMojoRequest(mojo::MakeRequest(&media_router_proxy_), 1441 media_router_->BindToMojoRequest(mojo::MakeRequest(&media_router_proxy_),
1449 *extension_); 1442 *extension_);
1450 } 1443 }
1451 1444
1452 void ResetMediaRouteProvider() { 1445 void ResetMediaRouteProvider() {
1453 binding_.reset(); 1446 binding_.reset();
1454 media_router_->BindToMojoRequest(mojo::MakeRequest(&media_router_proxy_), 1447 media_router_->BindToMojoRequest(mojo::MakeRequest(&media_router_proxy_),
1455 *extension_); 1448 *extension_);
1456 } 1449 }
1457 1450
1458 void RegisterMediaRouteProvider() { 1451 void RegisterMediaRouteProvider() {
1459 media_router_proxy_->RegisterMediaRouteProvider( 1452 media_router_proxy_->RegisterMediaRouteProvider(
1460 std::move(media_route_provider_proxy_), 1453 std::move(media_route_provider_proxy_),
1461 base::Bind(&RegisterMediaRouteProviderHandler::Invoke, 1454 base::Bind(&RegisterMediaRouteProviderHandler::Invoke,
1462 base::Unretained(&provide_handler_))); 1455 base::Unretained(&provider_handler_)));
1463 } 1456 }
1464 1457
1465 void ProcessEventLoop() { base::RunLoop().RunUntilIdle(); } 1458 void ProcessEventLoop() { base::RunLoop().RunUntilIdle(); }
1466 1459
1467 void ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason reason, 1460 void ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason reason,
1468 int expected_count) { 1461 int expected_count) {
1469 histogram_tester_.ExpectBucketCount("MediaRouter.Provider.WakeReason", 1462 histogram_tester_.ExpectBucketCount("MediaRouter.Provider.WakeReason",
1470 static_cast<int>(reason), 1463 static_cast<int>(reason),
1471 expected_count); 1464 expected_count);
1472 } 1465 }
1473 1466
1474 void ExpectVersionBucketCount(MediaRouteProviderVersion version, 1467 void ExpectVersionBucketCount(MediaRouteProviderVersion version,
1475 int expected_count) { 1468 int expected_count) {
1476 histogram_tester_.ExpectBucketCount("MediaRouter.Provider.Version", 1469 histogram_tester_.ExpectBucketCount("MediaRouter.Provider.Version",
1477 static_cast<int>(version), 1470 static_cast<int>(version),
1478 expected_count); 1471 expected_count);
1479 } 1472 }
1480 1473
1481 void ExpectWakeupBucketCount(MediaRouteProviderWakeup wakeup, 1474 void ExpectWakeupBucketCount(MediaRouteProviderWakeup wakeup,
1482 int expected_count) { 1475 int expected_count) {
1483 histogram_tester_.ExpectBucketCount("MediaRouter.Provider.Wakeup", 1476 histogram_tester_.ExpectBucketCount("MediaRouter.Provider.Wakeup",
1484 static_cast<int>(wakeup), 1477 static_cast<int>(wakeup),
1485 expected_count); 1478 expected_count);
1486 } 1479 }
1487 1480
1488 MediaRouterMojoImpl* router() const { return media_router_.get(); } 1481 MediaRouterMojoImpl* router() const { return media_router_.get(); }
1489 1482
1490 content::TestBrowserThreadBundle thread_bundle_; 1483 content::TestBrowserThreadBundle thread_bundle_;
1491 std::unique_ptr<MediaRouterMojoImpl> media_router_; 1484 std::unique_ptr<MediaRouterMojoImpl> media_router_;
1492 RegisterMediaRouteProviderHandler provide_handler_; 1485 RegisterMediaRouteProviderHandler provider_handler_;
1493 TestProcessManager* process_manager_; 1486 TestEventPageRequestManager* request_manager_ = nullptr;
1494 testing::StrictMock<MockMediaRouteProvider> mock_media_route_provider_; 1487 testing::StrictMock<MockMediaRouteProvider> mock_media_route_provider_;
1495 mojom::MediaRouterPtr media_router_proxy_; 1488 mojom::MediaRouterPtr media_router_proxy_;
1496 scoped_refptr<extensions::Extension> extension_; 1489 scoped_refptr<extensions::Extension> extension_;
1497 1490
1498 private: 1491 private:
1499 std::unique_ptr<TestingProfile> profile_; 1492 std::unique_ptr<TestingProfile> profile_;
1500 mojom::MediaRouteProviderPtr media_route_provider_proxy_; 1493 mojom::MediaRouteProviderPtr media_route_provider_proxy_;
1501 std::unique_ptr<mojo::Binding<mojom::MediaRouteProvider>> binding_; 1494 std::unique_ptr<mojo::Binding<mojom::MediaRouteProvider>> binding_;
1502 base::HistogramTester histogram_tester_; 1495 base::HistogramTester histogram_tester_;
1503 1496
1504 DISALLOW_COPY_AND_ASSIGN(MediaRouterMojoExtensionTest); 1497 DISALLOW_COPY_AND_ASSIGN(MediaRouterMojoExtensionTest);
1505 }; 1498 };
1506 1499
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) 1500 #if defined(OS_WIN)
1677 TEST_F(MediaRouterMojoExtensionTest, EnableMdnsAfterEachRegister) { 1501 TEST_F(MediaRouterMojoExtensionTest, EnableMdnsAfterEachRegister) {
1678 // This should be queued since no MRPM is registered yet. 1502 // EnableMdnsDiscovery)_ should not be called when no MRPM is registered yet.
1503 EXPECT_CALL(*request_manager_, RunOrDeferInternal(_, _))
1504 .WillRepeatedly(Return());
1679 media_router_->OnUserGesture(); 1505 media_router_->OnUserGesture();
1680 1506
1507 EXPECT_TRUE(Mock::VerifyAndClearExpectations(request_manager_));
1508 ON_CALL(*request_manager_, RunOrDeferInternal(_, _))
1509 .WillByDefault(Invoke([](base::OnceClosure& request,
1510 MediaRouteProviderWakeReason wake_reason) {
1511 std::move(request).Run();
1512 }));
1513
1681 BindMediaRouteProvider(); 1514 BindMediaRouteProvider();
1682 1515
1683 base::RunLoop run_loop; 1516 base::RunLoop run_loop;
1684 base::RunLoop run_loop2; 1517 base::RunLoop run_loop2;
1685 EXPECT_CALL(provide_handler_, InvokeInternal(testing::Not(""), _)) 1518 EXPECT_CALL(provider_handler_, InvokeInternal(testing::Not(""), _))
1686 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); 1519 .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_, 1520 EXPECT_CALL(mock_media_route_provider_,
1690 UpdateMediaSinks(MediaSourceForDesktop().id())) 1521 UpdateMediaSinks(MediaSourceForDesktop().id()))
1691 .Times(2); 1522 .Times(1);
1692 // EnableMdnsDiscovery() is never called except on Windows. 1523 // EnableMdnsDiscovery() is never called except on Windows.
1693 EXPECT_CALL(mock_media_route_provider_, EnableMdnsDiscovery()) 1524 EXPECT_CALL(mock_media_route_provider_, EnableMdnsDiscovery())
1694 .WillOnce(InvokeWithoutArgs([&run_loop2]() { 1525 .WillOnce(InvokeWithoutArgs([&run_loop2]() {
1695 run_loop2.Quit(); 1526 run_loop2.Quit();
1696 })); 1527 }));
1697 RegisterMediaRouteProvider(); 1528 RegisterMediaRouteProvider();
1698 run_loop.Run(); 1529 run_loop.Run();
1699 run_loop2.Run(); 1530 run_loop2.Run();
1700 // Should not call EnableMdnsDiscovery, but will call UpdateMediaSinks 1531 // Should not call EnableMdnsDiscovery(), but will call UpdateMediaSinks.
1701 media_router_->OnUserGesture(); 1532 media_router_->OnUserGesture();
1702 base::RunLoop run_loop3; 1533 base::RunLoop run_loop3;
1703 run_loop3.RunUntilIdle(); 1534 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 } 1535 }
1745 #endif 1536 #endif
1746 1537
1747 TEST_F(MediaRouterMojoExtensionTest, UpdateMediaSinksOnUserGesture) { 1538 TEST_F(MediaRouterMojoExtensionTest, UpdateMediaSinksOnUserGesture) {
1748 BindMediaRouteProvider(); 1539 BindMediaRouteProvider();
1749 1540
1750 base::RunLoop run_loop; 1541 base::RunLoop run_loop;
1751 EXPECT_CALL(provide_handler_, InvokeInternal(testing::Not(""), _)) 1542 EXPECT_CALL(provider_handler_, InvokeInternal(testing::Not(""), _))
1752 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); 1543 .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 1544
1764 RegisterMediaRouteProvider(); 1545 RegisterMediaRouteProvider();
1765 run_loop.Run(); 1546 run_loop.Run();
1766 1547
1767 media_router_->OnUserGesture(); 1548 media_router_->OnUserGesture();
1768 1549
1769 base::RunLoop run_loop2; 1550 base::RunLoop run_loop2;
1770 1551
1771 #if defined(OS_WIN) 1552 #if defined(OS_WIN)
1772 EXPECT_CALL(mock_media_route_provider_, EnableMdnsDiscovery()); 1553 EXPECT_CALL(mock_media_route_provider_, EnableMdnsDiscovery());
1773 #endif 1554 #endif
1774 EXPECT_CALL(mock_media_route_provider_, 1555 EXPECT_CALL(mock_media_route_provider_,
1775 UpdateMediaSinks(MediaSourceForDesktop().id())) 1556 UpdateMediaSinks(MediaSourceForDesktop().id()))
1776 .WillOnce(InvokeWithoutArgs([&run_loop2]() { 1557 .WillOnce(InvokeWithoutArgs([&run_loop2]() {
1777 run_loop2.Quit(); 1558 run_loop2.Quit();
1778 })); 1559 }));
1779 1560
1780 run_loop2.Run(); 1561 run_loop2.Run();
1781 } 1562 }
1782 1563
1783 TEST_F(MediaRouterMojoExtensionTest, SyncStateToMediaRouteProvider) { 1564 TEST_F(MediaRouterMojoExtensionTest, SyncStateToMediaRouteProvider) {
1784 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id()))
1785 .WillRepeatedly(Return(false));
1786 MediaSource media_source = MediaSource(kSource); 1565 MediaSource media_source = MediaSource(kSource);
1787 std::unique_ptr<MockMediaSinksObserver> sinks_observer; 1566 std::unique_ptr<MockMediaSinksObserver> sinks_observer;
1788 std::unique_ptr<MockMediaRoutesObserver> routes_observer; 1567 std::unique_ptr<MockMediaRoutesObserver> routes_observer;
1789 std::unique_ptr<NullMessageObserver> messages_observer; 1568 std::unique_ptr<NullMessageObserver> messages_observer;
1790 1569
1791 { 1570 {
1792 EXPECT_CALL(provide_handler_, InvokeInternal(testing::Not(""), _)); 1571 EXPECT_CALL(provider_handler_, InvokeInternal(testing::Not(""), _));
1793 BindMediaRouteProvider(); 1572 BindMediaRouteProvider();
1794 RegisterMediaRouteProvider(); 1573 RegisterMediaRouteProvider();
1795 base::RunLoop().RunUntilIdle(); 1574 base::RunLoop().RunUntilIdle();
1796 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&provide_handler_)); 1575 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&provider_handler_));
1797 } 1576 }
1798 1577
1799 { 1578 {
1800 media_router_->OnSinkAvailabilityUpdated( 1579 media_router_->OnSinkAvailabilityUpdated(
1801 mojom::MediaRouter::SinkAvailability::PER_SOURCE); 1580 mojom::MediaRouter::SinkAvailability::PER_SOURCE);
1802 EXPECT_CALL(mock_media_route_provider_, 1581 EXPECT_CALL(mock_media_route_provider_,
1803 StartObservingMediaSinks(media_source.id())); 1582 StartObservingMediaSinks(media_source.id()));
1804 sinks_observer.reset(new MockMediaSinksObserver( 1583 sinks_observer = base::MakeUnique<MockMediaSinksObserver>(
1805 router(), media_source, url::Origin(GURL(kOrigin)))); 1584 router(), media_source, url::Origin(GURL(kOrigin)));
1806 EXPECT_TRUE(sinks_observer->Init()); 1585 EXPECT_TRUE(sinks_observer->Init());
1807 1586
1808 EXPECT_CALL(mock_media_route_provider_, 1587 EXPECT_CALL(mock_media_route_provider_,
1809 StartObservingMediaRoutes(media_source.id())); 1588 StartObservingMediaRoutes(media_source.id()));
1810 routes_observer.reset( 1589 routes_observer =
1811 new MockMediaRoutesObserver(router(), media_source.id())); 1590 base::MakeUnique<MockMediaRoutesObserver>(router(), media_source.id());
1812 1591
1813 EXPECT_CALL(mock_media_route_provider_, 1592 EXPECT_CALL(mock_media_route_provider_,
1814 StartListeningForRouteMessages(media_source.id())); 1593 StartListeningForRouteMessages(media_source.id()));
1815 messages_observer.reset( 1594 messages_observer =
1816 new NullMessageObserver(router(), media_source.id())); 1595 base::MakeUnique<NullMessageObserver>(router(), media_source.id());
1817 base::RunLoop().RunUntilIdle(); 1596 base::RunLoop().RunUntilIdle();
1818 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&mock_media_route_provider_)); 1597 EXPECT_TRUE(Mock::VerifyAndClearExpectations(&mock_media_route_provider_));
1819 } 1598 }
1820 1599
1821 { 1600 {
1822 EXPECT_CALL(provide_handler_, InvokeInternal(testing::Not(""), _)); 1601 EXPECT_CALL(provider_handler_, InvokeInternal(testing::Not(""), _));
1823 EXPECT_CALL(mock_media_route_provider_, 1602 EXPECT_CALL(mock_media_route_provider_,
1824 StartObservingMediaSinks(media_source.id())); 1603 StartObservingMediaSinks(media_source.id()));
1825 EXPECT_CALL(mock_media_route_provider_, 1604 EXPECT_CALL(mock_media_route_provider_,
1826 StartObservingMediaRoutes(media_source.id())); 1605 StartObservingMediaRoutes(media_source.id()));
1827 EXPECT_CALL(mock_media_route_provider_, 1606 EXPECT_CALL(mock_media_route_provider_,
1828 StartListeningForRouteMessages(media_source.id())); 1607 StartListeningForRouteMessages(media_source.id()));
1829 media_router_->OnConnectionError(); 1608 media_router_->OnConnectionError();
1830 BindMediaRouteProvider(); 1609 BindMediaRouteProvider();
1831 RegisterMediaRouteProvider(); 1610 RegisterMediaRouteProvider();
1832 base::RunLoop().RunUntilIdle(); 1611 base::RunLoop().RunUntilIdle();
1833 } 1612 }
1834 } 1613 }
1835 1614
1836 } // namespace media_router 1615 } // namespace media_router
OLDNEW
« no previous file with comments | « chrome/browser/media/router/mojo/media_router_mojo_impl.cc ('k') | chrome/browser/media/router/mojo/media_router_mojo_test.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698