| 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 |