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 757 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
768 process_manager_ = static_cast<TestProcessManager*>( | 768 process_manager_ = static_cast<TestProcessManager*>( |
769 extensions::ProcessManager::Get(profile_.get())); | 769 extensions::ProcessManager::Get(profile_.get())); |
770 DCHECK(process_manager_); | 770 DCHECK(process_manager_); |
771 | 771 |
772 // Create MR and its proxy, so that it can be accessed through Mojo. | 772 // Create MR and its proxy, so that it can be accessed through Mojo. |
773 media_router_.reset(new MediaRouterMojoImpl(process_manager_)); | 773 media_router_.reset(new MediaRouterMojoImpl(process_manager_)); |
774 ProcessEventLoop(); | 774 ProcessEventLoop(); |
775 } | 775 } |
776 | 776 |
777 void TearDown() override { | 777 void TearDown() override { |
| 778 media_router_.reset(); |
778 profile_.reset(); | 779 profile_.reset(); |
779 // Explicitly delete the TestingBrowserProcess before |message_loop_|. | 780 // Explicitly delete the TestingBrowserProcess before |message_loop_|. |
780 // This allows it to do cleanup before |message_loop_| goes away. | 781 // This allows it to do cleanup before |message_loop_| goes away. |
781 TestingBrowserProcess::DeleteInstance(); | 782 TestingBrowserProcess::DeleteInstance(); |
782 } | 783 } |
783 | 784 |
784 // Constructs bindings so that |media_router_| delegates calls to | 785 // Constructs bindings so that |media_router_| delegates calls to |
785 // |mojo_media_router_|, which are then handled by | 786 // |mojo_media_router_|, which are then handled by |
786 // |mock_media_route_provider_service_|. | 787 // |mock_media_route_provider_service_|. |
787 void BindMediaRouteProvider() { | 788 void BindMediaRouteProvider() { |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
856 // The queued CloseRoute(kRouteId2) call should be executed. | 857 // The queued CloseRoute(kRouteId2) call should be executed. |
857 EXPECT_CALL(provide_handler_, Invoke(testing::Not(""))); | 858 EXPECT_CALL(provide_handler_, Invoke(testing::Not(""))); |
858 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) | 859 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) |
859 .WillOnce(Return(false)); | 860 .WillOnce(Return(false)); |
860 EXPECT_CALL(mock_media_route_provider_, CloseRoute(mojo::String(kRouteId2))); | 861 EXPECT_CALL(mock_media_route_provider_, CloseRoute(mojo::String(kRouteId2))); |
861 BindMediaRouteProvider(); | 862 BindMediaRouteProvider(); |
862 RegisterMediaRouteProvider(); | 863 RegisterMediaRouteProvider(); |
863 ProcessEventLoop(); | 864 ProcessEventLoop(); |
864 } | 865 } |
865 | 866 |
| 867 TEST_F(MediaRouterMojoExtensionTest, AttemptedWakeupTooManyTimes) { |
| 868 BindMediaRouteProvider(); |
| 869 |
| 870 // CloseRoute is called while extension is suspended. It should be queued. |
| 871 // Schedule a component extension wakeup. |
| 872 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) |
| 873 .WillOnce(Return(true)); |
| 874 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) |
| 875 .WillOnce(testing::DoAll(media::RunCallback<1>(true), Return(true))); |
| 876 media_router_->CloseRoute(kRouteId); |
| 877 EXPECT_EQ(1u, media_router_->pending_requests_.size()); |
| 878 |
| 879 // Media route provider fails to connect to media router before extension is |
| 880 // suspended again, and |OnConnectionError| is invoked. Retry the wakeup. |
| 881 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) |
| 882 .Times(MediaRouterMojoImpl::kMaxWakeupAttemptCount - 1) |
| 883 .WillRepeatedly( |
| 884 testing::DoAll(media::RunCallback<1>(true), Return(true))); |
| 885 for (int i = 0; i < MediaRouterMojoImpl::kMaxWakeupAttemptCount - 1; ++i) |
| 886 media_router_->OnConnectionError(); |
| 887 |
| 888 // We have already tried |kMaxWakeupAttemptCount| times. If we get an error |
| 889 // again, we will give up and the pending request queue will be drained. |
| 890 media_router_->OnConnectionError(); |
| 891 EXPECT_TRUE(media_router_->pending_requests_.empty()); |
| 892 |
| 893 // Requests that comes in after queue is drained should be queued. |
| 894 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) |
| 895 .WillOnce(Return(true)); |
| 896 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) |
| 897 .WillOnce(testing::DoAll(media::RunCallback<1>(true), Return(true))); |
| 898 media_router_->CloseRoute(kRouteId); |
| 899 EXPECT_EQ(1u, media_router_->pending_requests_.size()); |
| 900 } |
| 901 |
| 902 TEST_F(MediaRouterMojoExtensionTest, WakeupFailedDrainsQueue) { |
| 903 BindMediaRouteProvider(); |
| 904 |
| 905 // CloseRoute is called while extension is suspended. It should be queued. |
| 906 // Schedule a component extension wakeup. |
| 907 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) |
| 908 .WillOnce(Return(true)); |
| 909 base::Callback<void(bool)> extension_wakeup_callback; |
| 910 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) |
| 911 .WillOnce( |
| 912 testing::DoAll(SaveArg<1>(&extension_wakeup_callback), Return(true))); |
| 913 media_router_->CloseRoute(kRouteId); |
| 914 EXPECT_EQ(1u, media_router_->pending_requests_.size()); |
| 915 |
| 916 // Extension wakeup callback returning false is an non-retryable error. |
| 917 // Queue should be drained. |
| 918 extension_wakeup_callback.Run(false); |
| 919 EXPECT_TRUE(media_router_->pending_requests_.empty()); |
| 920 |
| 921 // Requests that comes in after queue is drained should be queued. |
| 922 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) |
| 923 .WillOnce(Return(true)); |
| 924 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) |
| 925 .WillOnce(testing::DoAll(media::RunCallback<1>(true), Return(true))); |
| 926 media_router_->CloseRoute(kRouteId); |
| 927 EXPECT_EQ(1u, media_router_->pending_requests_.size()); |
| 928 } |
| 929 |
| 930 TEST_F(MediaRouterMojoExtensionTest, DropOldestPendingRequest) { |
| 931 const size_t kMaxPendingRequests = MediaRouterMojoImpl::kMaxPendingRequests; |
| 932 |
| 933 // Request is queued. |
| 934 media_router_->CloseRoute(kRouteId); |
| 935 EXPECT_EQ(1u, media_router_->pending_requests_.size()); |
| 936 |
| 937 for (size_t i = 0; i < kMaxPendingRequests; ++i) |
| 938 media_router_->CloseRoute(kRouteId2); |
| 939 |
| 940 // The request queue size should not exceed |kMaxPendingRequests|. |
| 941 EXPECT_EQ(kMaxPendingRequests, media_router_->pending_requests_.size()); |
| 942 |
| 943 // The oldest request should have been dropped, so we don't expect to see |
| 944 // CloseRoute(kRouteId) here. |
| 945 BindMediaRouteProvider(); |
| 946 EXPECT_CALL(provide_handler_, Invoke(testing::Not(""))); |
| 947 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) |
| 948 .WillOnce(Return(false)); |
| 949 EXPECT_CALL(mock_media_route_provider_, CloseRoute(mojo::String(kRouteId2))) |
| 950 .Times(kMaxPendingRequests); |
| 951 RegisterMediaRouteProvider(); |
| 952 ProcessEventLoop(); |
| 953 } |
| 954 |
866 } // namespace media_router | 955 } // namespace media_router |
OLD | NEW |