OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <string> | 5 #include <string> |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
282 RouteResponseCallbackHandler handler; | 282 RouteResponseCallbackHandler handler; |
283 EXPECT_CALL(handler, Invoke(nullptr, "", kError)); | 283 EXPECT_CALL(handler, Invoke(nullptr, "", kError)); |
284 std::vector<MediaRouteResponseCallback> route_response_callbacks; | 284 std::vector<MediaRouteResponseCallback> route_response_callbacks; |
285 route_response_callbacks.push_back(base::Bind( | 285 route_response_callbacks.push_back(base::Bind( |
286 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); | 286 &RouteResponseCallbackHandler::Invoke, base::Unretained(&handler))); |
287 router()->JoinRoute(kSource, kPresentationId, GURL(kOrigin), nullptr, | 287 router()->JoinRoute(kSource, kPresentationId, GURL(kOrigin), nullptr, |
288 route_response_callbacks); | 288 route_response_callbacks); |
289 ProcessEventLoop(); | 289 ProcessEventLoop(); |
290 } | 290 } |
291 | 291 |
292 TEST_F(MediaRouterMojoImplTest, CloseRoute) { | 292 TEST_F(MediaRouterMojoImplTest, DetachRoute) { |
293 EXPECT_CALL(mock_media_route_provider_, CloseRoute(mojo::String(kRouteId))); | 293 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId))); |
294 router()->CloseRoute(kRouteId); | 294 router()->DetachRoute(kRouteId); |
295 ProcessEventLoop(); | 295 ProcessEventLoop(); |
296 } | 296 } |
297 | 297 |
| 298 TEST_F(MediaRouterMojoImplTest, TerminateRoute) { |
| 299 EXPECT_CALL(mock_media_route_provider_, |
| 300 TerminateRoute(mojo::String(kRouteId))); |
| 301 router()->TerminateRoute(kRouteId); |
| 302 ProcessEventLoop(); |
| 303 } |
| 304 |
298 TEST_F(MediaRouterMojoImplTest, HandleIssue) { | 305 TEST_F(MediaRouterMojoImplTest, HandleIssue) { |
299 MockIssuesObserver issue_observer1(router()); | 306 MockIssuesObserver issue_observer1(router()); |
300 MockIssuesObserver issue_observer2(router()); | 307 MockIssuesObserver issue_observer2(router()); |
301 issue_observer1.RegisterObserver(); | 308 issue_observer1.RegisterObserver(); |
302 issue_observer2.RegisterObserver(); | 309 issue_observer2.RegisterObserver(); |
303 | 310 |
304 interfaces::IssuePtr mojo_issue1 = CreateMojoIssue("title 1"); | 311 interfaces::IssuePtr mojo_issue1 = CreateMojoIssue("title 1"); |
305 const Issue& expected_issue1 = mojo_issue1.To<Issue>(); | 312 const Issue& expected_issue1 = mojo_issue1.To<Issue>(); |
306 | 313 |
307 const Issue* issue; | 314 const Issue* issue; |
(...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
832 EXPECT_TRUE(router()->HasLocalDisplayRoute()); | 839 EXPECT_TRUE(router()->HasLocalDisplayRoute()); |
833 } | 840 } |
834 | 841 |
835 TEST_F(MediaRouterMojoImplTest, QueuedWhileAsleep) { | 842 TEST_F(MediaRouterMojoImplTest, QueuedWhileAsleep) { |
836 EXPECT_CALL(mock_event_page_tracker_, IsEventPageSuspended(extension_id())) | 843 EXPECT_CALL(mock_event_page_tracker_, IsEventPageSuspended(extension_id())) |
837 .Times(2) | 844 .Times(2) |
838 .WillRepeatedly(Return(true)); | 845 .WillRepeatedly(Return(true)); |
839 EXPECT_CALL(mock_event_page_tracker_, WakeEventPage(extension_id(), _)) | 846 EXPECT_CALL(mock_event_page_tracker_, WakeEventPage(extension_id(), _)) |
840 .Times(2) | 847 .Times(2) |
841 .WillRepeatedly(Return(true)); | 848 .WillRepeatedly(Return(true)); |
842 router()->CloseRoute(kRouteId); | 849 router()->DetachRoute(kRouteId); |
843 router()->CloseRoute(kRouteId2); | 850 router()->DetachRoute(kRouteId2); |
844 ProcessEventLoop(); | 851 ProcessEventLoop(); |
845 EXPECT_CALL(mock_event_page_tracker_, IsEventPageSuspended(extension_id())) | 852 EXPECT_CALL(mock_event_page_tracker_, IsEventPageSuspended(extension_id())) |
846 .Times(1) | 853 .Times(1) |
847 .WillRepeatedly(Return(false)); | 854 .WillRepeatedly(Return(false)); |
848 EXPECT_CALL(mock_media_route_provider_, CloseRoute(mojo::String(kRouteId))); | 855 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId))); |
849 EXPECT_CALL(mock_media_route_provider_, CloseRoute(mojo::String(kRouteId2))); | 856 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId2))); |
850 ConnectProviderManagerService(); | 857 ConnectProviderManagerService(); |
851 ProcessEventLoop(); | 858 ProcessEventLoop(); |
852 } | 859 } |
853 | 860 |
854 class MediaRouterMojoExtensionTest : public ::testing::Test { | 861 class MediaRouterMojoExtensionTest : public ::testing::Test { |
855 public: | 862 public: |
856 MediaRouterMojoExtensionTest() | 863 MediaRouterMojoExtensionTest() |
857 : process_manager_(nullptr), | 864 : process_manager_(nullptr), |
858 message_loop_(mojo::common::MessagePumpMojo::Create()) | 865 message_loop_(mojo::common::MessagePumpMojo::Create()) |
859 {} | 866 {} |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
928 scoped_ptr<TestingProfile> profile_; | 935 scoped_ptr<TestingProfile> profile_; |
929 base::MessageLoop message_loop_; | 936 base::MessageLoop message_loop_; |
930 interfaces::MediaRouteProviderPtr media_route_provider_proxy_; | 937 interfaces::MediaRouteProviderPtr media_route_provider_proxy_; |
931 scoped_ptr<mojo::Binding<interfaces::MediaRouteProvider>> binding_; | 938 scoped_ptr<mojo::Binding<interfaces::MediaRouteProvider>> binding_; |
932 base::HistogramTester histogram_tester_; | 939 base::HistogramTester histogram_tester_; |
933 | 940 |
934 DISALLOW_COPY_AND_ASSIGN(MediaRouterMojoExtensionTest); | 941 DISALLOW_COPY_AND_ASSIGN(MediaRouterMojoExtensionTest); |
935 }; | 942 }; |
936 | 943 |
937 TEST_F(MediaRouterMojoExtensionTest, DeferredBindingAndSuspension) { | 944 TEST_F(MediaRouterMojoExtensionTest, DeferredBindingAndSuspension) { |
938 // CloseRoute is called before *any* extension has connected. | 945 // DetachRoute is called before *any* extension has connected. |
939 // It should be queued. | 946 // It should be queued. |
940 media_router_->CloseRoute(kRouteId); | 947 media_router_->DetachRoute(kRouteId); |
941 | 948 |
942 BindMediaRouteProvider(); | 949 BindMediaRouteProvider(); |
943 | 950 |
944 // |mojo_media_router| signals its readiness to the MR by registering | 951 // |mojo_media_router| signals its readiness to the MR by registering |
945 // itself via RegisterMediaRouteProvider(). | 952 // itself via RegisterMediaRouteProvider(). |
946 // Now that the |media_router| and |mojo_media_router| are fully initialized, | 953 // Now that the |media_router| and |mojo_media_router| are fully initialized, |
947 // the queued CloseRoute() call should be executed. | 954 // the queued DetachRoute() call should be executed. |
948 EXPECT_CALL(provide_handler_, Invoke(testing::Not(""))); | 955 EXPECT_CALL(provide_handler_, Invoke(testing::Not(""))); |
949 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) | 956 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) |
950 .WillOnce(Return(false)); | 957 .WillOnce(Return(false)); |
951 EXPECT_CALL(mock_media_route_provider_, CloseRoute(mojo::String(kRouteId))); | 958 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId))); |
952 RegisterMediaRouteProvider(); | 959 RegisterMediaRouteProvider(); |
953 ProcessEventLoop(); | 960 ProcessEventLoop(); |
954 | 961 |
955 // Extension is suspended and re-awoken. | 962 // Extension is suspended and re-awoken. |
956 ResetMediaRouteProvider(); | 963 ResetMediaRouteProvider(); |
957 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) | 964 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) |
958 .WillOnce(Return(true)); | 965 .WillOnce(Return(true)); |
959 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) | 966 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) |
960 .WillOnce(testing::DoAll(media::RunCallback<1>(true), Return(true))); | 967 .WillOnce(testing::DoAll(media::RunCallback<1>(true), Return(true))); |
961 media_router_->CloseRoute(kRouteId2); | 968 media_router_->DetachRoute(kRouteId2); |
962 ProcessEventLoop(); | 969 ProcessEventLoop(); |
963 | 970 |
964 // RegisterMediaRouteProvider() is called. | 971 // RegisterMediaRouteProvider() is called. |
965 // The queued CloseRoute(kRouteId2) call should be executed. | 972 // The queued DetachRoute(kRouteId2) call should be executed. |
966 EXPECT_CALL(provide_handler_, Invoke(testing::Not(""))); | 973 EXPECT_CALL(provide_handler_, Invoke(testing::Not(""))); |
967 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) | 974 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) |
968 .WillOnce(Return(false)); | 975 .WillOnce(Return(false)); |
969 EXPECT_CALL(mock_media_route_provider_, CloseRoute(mojo::String(kRouteId2))); | 976 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId2))); |
970 BindMediaRouteProvider(); | 977 BindMediaRouteProvider(); |
971 RegisterMediaRouteProvider(); | 978 RegisterMediaRouteProvider(); |
972 ProcessEventLoop(); | 979 ProcessEventLoop(); |
973 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::CLOSE_ROUTE, 1); | 980 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::DETACH_ROUTE, 1); |
974 } | 981 } |
975 | 982 |
976 TEST_F(MediaRouterMojoExtensionTest, AttemptedWakeupTooManyTimes) { | 983 TEST_F(MediaRouterMojoExtensionTest, AttemptedWakeupTooManyTimes) { |
977 BindMediaRouteProvider(); | 984 BindMediaRouteProvider(); |
978 | 985 |
979 // CloseRoute is called while extension is suspended. It should be queued. | 986 // DetachRoute is called while extension is suspended. It should be queued. |
980 // Schedule a component extension wakeup. | 987 // Schedule a component extension wakeup. |
981 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) | 988 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) |
982 .WillOnce(Return(true)); | 989 .WillOnce(Return(true)); |
983 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) | 990 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) |
984 .WillOnce(testing::DoAll(media::RunCallback<1>(true), Return(true))); | 991 .WillOnce(testing::DoAll(media::RunCallback<1>(true), Return(true))); |
985 media_router_->CloseRoute(kRouteId); | 992 media_router_->DetachRoute(kRouteId); |
986 EXPECT_EQ(1u, media_router_->pending_requests_.size()); | 993 EXPECT_EQ(1u, media_router_->pending_requests_.size()); |
987 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::CLOSE_ROUTE, 1); | 994 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::DETACH_ROUTE, 1); |
988 | 995 |
989 // Media route provider fails to connect to media router before extension is | 996 // Media route provider fails to connect to media router before extension is |
990 // suspended again, and |OnConnectionError| is invoked. Retry the wakeup. | 997 // suspended again, and |OnConnectionError| is invoked. Retry the wakeup. |
991 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) | 998 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) |
992 .Times(MediaRouterMojoImpl::kMaxWakeupAttemptCount - 1) | 999 .Times(MediaRouterMojoImpl::kMaxWakeupAttemptCount - 1) |
993 .WillRepeatedly( | 1000 .WillRepeatedly( |
994 testing::DoAll(media::RunCallback<1>(true), Return(true))); | 1001 testing::DoAll(media::RunCallback<1>(true), Return(true))); |
995 for (int i = 0; i < MediaRouterMojoImpl::kMaxWakeupAttemptCount - 1; ++i) | 1002 for (int i = 0; i < MediaRouterMojoImpl::kMaxWakeupAttemptCount - 1; ++i) |
996 media_router_->OnConnectionError(); | 1003 media_router_->OnConnectionError(); |
997 | 1004 |
998 // We have already tried |kMaxWakeupAttemptCount| times. If we get an error | 1005 // We have already tried |kMaxWakeupAttemptCount| times. If we get an error |
999 // again, we will give up and the pending request queue will be drained. | 1006 // again, we will give up and the pending request queue will be drained. |
1000 media_router_->OnConnectionError(); | 1007 media_router_->OnConnectionError(); |
1001 EXPECT_TRUE(media_router_->pending_requests_.empty()); | 1008 EXPECT_TRUE(media_router_->pending_requests_.empty()); |
1002 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::CONNECTION_ERROR, | 1009 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::CONNECTION_ERROR, |
1003 MediaRouterMojoImpl::kMaxWakeupAttemptCount - 1); | 1010 MediaRouterMojoImpl::kMaxWakeupAttemptCount - 1); |
1004 | 1011 |
1005 // Requests that comes in after queue is drained should be queued. | 1012 // Requests that comes in after queue is drained should be queued. |
1006 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) | 1013 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) |
1007 .WillOnce(Return(true)); | 1014 .WillOnce(Return(true)); |
1008 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) | 1015 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) |
1009 .WillOnce(testing::DoAll(media::RunCallback<1>(true), Return(true))); | 1016 .WillOnce(testing::DoAll(media::RunCallback<1>(true), Return(true))); |
1010 media_router_->CloseRoute(kRouteId); | 1017 media_router_->DetachRoute(kRouteId); |
1011 EXPECT_EQ(1u, media_router_->pending_requests_.size()); | 1018 EXPECT_EQ(1u, media_router_->pending_requests_.size()); |
1012 } | 1019 } |
1013 | 1020 |
1014 TEST_F(MediaRouterMojoExtensionTest, WakeupFailedDrainsQueue) { | 1021 TEST_F(MediaRouterMojoExtensionTest, WakeupFailedDrainsQueue) { |
1015 BindMediaRouteProvider(); | 1022 BindMediaRouteProvider(); |
1016 | 1023 |
1017 // CloseRoute is called while extension is suspended. It should be queued. | 1024 // DetachRoute is called while extension is suspended. It should be queued. |
1018 // Schedule a component extension wakeup. | 1025 // Schedule a component extension wakeup. |
1019 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) | 1026 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) |
1020 .WillOnce(Return(true)); | 1027 .WillOnce(Return(true)); |
1021 base::Callback<void(bool)> extension_wakeup_callback; | 1028 base::Callback<void(bool)> extension_wakeup_callback; |
1022 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) | 1029 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) |
1023 .WillOnce( | 1030 .WillOnce( |
1024 testing::DoAll(SaveArg<1>(&extension_wakeup_callback), Return(true))); | 1031 testing::DoAll(SaveArg<1>(&extension_wakeup_callback), Return(true))); |
1025 media_router_->CloseRoute(kRouteId); | 1032 media_router_->DetachRoute(kRouteId); |
1026 EXPECT_EQ(1u, media_router_->pending_requests_.size()); | 1033 EXPECT_EQ(1u, media_router_->pending_requests_.size()); |
1027 | 1034 |
1028 // Extension wakeup callback returning false is an non-retryable error. | 1035 // Extension wakeup callback returning false is an non-retryable error. |
1029 // Queue should be drained. | 1036 // Queue should be drained. |
1030 extension_wakeup_callback.Run(false); | 1037 extension_wakeup_callback.Run(false); |
1031 EXPECT_TRUE(media_router_->pending_requests_.empty()); | 1038 EXPECT_TRUE(media_router_->pending_requests_.empty()); |
1032 | 1039 |
1033 // Requests that comes in after queue is drained should be queued. | 1040 // Requests that comes in after queue is drained should be queued. |
1034 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) | 1041 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) |
1035 .WillOnce(Return(true)); | 1042 .WillOnce(Return(true)); |
1036 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) | 1043 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) |
1037 .WillOnce(testing::DoAll(media::RunCallback<1>(true), Return(true))); | 1044 .WillOnce(testing::DoAll(media::RunCallback<1>(true), Return(true))); |
1038 media_router_->CloseRoute(kRouteId); | 1045 media_router_->DetachRoute(kRouteId); |
1039 EXPECT_EQ(1u, media_router_->pending_requests_.size()); | 1046 EXPECT_EQ(1u, media_router_->pending_requests_.size()); |
1040 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::CLOSE_ROUTE, 1); | 1047 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::DETACH_ROUTE, 1); |
1041 } | 1048 } |
1042 | 1049 |
1043 TEST_F(MediaRouterMojoExtensionTest, DropOldestPendingRequest) { | 1050 TEST_F(MediaRouterMojoExtensionTest, DropOldestPendingRequest) { |
1044 const size_t kMaxPendingRequests = MediaRouterMojoImpl::kMaxPendingRequests; | 1051 const size_t kMaxPendingRequests = MediaRouterMojoImpl::kMaxPendingRequests; |
1045 | 1052 |
1046 // Request is queued. | 1053 // Request is queued. |
1047 media_router_->CloseRoute(kRouteId); | 1054 media_router_->DetachRoute(kRouteId); |
1048 EXPECT_EQ(1u, media_router_->pending_requests_.size()); | 1055 EXPECT_EQ(1u, media_router_->pending_requests_.size()); |
1049 | 1056 |
1050 for (size_t i = 0; i < kMaxPendingRequests; ++i) | 1057 for (size_t i = 0; i < kMaxPendingRequests; ++i) |
1051 media_router_->CloseRoute(kRouteId2); | 1058 media_router_->DetachRoute(kRouteId2); |
1052 | 1059 |
1053 // The request queue size should not exceed |kMaxPendingRequests|. | 1060 // The request queue size should not exceed |kMaxPendingRequests|. |
1054 EXPECT_EQ(kMaxPendingRequests, media_router_->pending_requests_.size()); | 1061 EXPECT_EQ(kMaxPendingRequests, media_router_->pending_requests_.size()); |
1055 | 1062 |
1056 // The oldest request should have been dropped, so we don't expect to see | 1063 // The oldest request should have been dropped, so we don't expect to see |
1057 // CloseRoute(kRouteId) here. | 1064 // DetachRoute(kRouteId) here. |
1058 BindMediaRouteProvider(); | 1065 BindMediaRouteProvider(); |
1059 EXPECT_CALL(provide_handler_, Invoke(testing::Not(""))); | 1066 EXPECT_CALL(provide_handler_, Invoke(testing::Not(""))); |
1060 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) | 1067 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) |
1061 .WillOnce(Return(false)); | 1068 .WillOnce(Return(false)); |
1062 EXPECT_CALL(mock_media_route_provider_, CloseRoute(mojo::String(kRouteId2))) | 1069 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId2))) |
1063 .Times(kMaxPendingRequests); | 1070 .Times(kMaxPendingRequests); |
1064 RegisterMediaRouteProvider(); | 1071 RegisterMediaRouteProvider(); |
1065 ProcessEventLoop(); | 1072 ProcessEventLoop(); |
1066 } | 1073 } |
1067 | 1074 |
1068 } // namespace media_router | 1075 } // namespace media_router |
OLD | NEW |