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

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: . 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(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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698