| 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 <stddef.h> | 5 #include <stddef.h> |
| 6 #include <stdint.h> | 6 #include <stdint.h> |
| 7 #include <string> | 7 #include <string> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/bind_helpers.h" | 11 #include "base/bind_helpers.h" |
| 12 #include "base/macros.h" | 12 #include "base/macros.h" |
| 13 #include "base/memory/ref_counted.h" |
| 13 #include "base/memory/scoped_ptr.h" | 14 #include "base/memory/scoped_ptr.h" |
| 14 #include "base/run_loop.h" | 15 #include "base/run_loop.h" |
| 15 #include "base/synchronization/waitable_event.h" | 16 #include "base/synchronization/waitable_event.h" |
| 16 #include "base/test/histogram_tester.h" | 17 #include "base/test/histogram_tester.h" |
| 17 #include "base/thread_task_runner_handle.h" | 18 #include "base/thread_task_runner_handle.h" |
| 18 #include "chrome/browser/media/router/issue.h" | 19 #include "chrome/browser/media/router/issue.h" |
| 19 #include "chrome/browser/media/router/media_route.h" | 20 #include "chrome/browser/media/router/media_route.h" |
| 20 #include "chrome/browser/media/router/media_router_metrics.h" | 21 #include "chrome/browser/media/router/media_router_metrics.h" |
| 21 #include "chrome/browser/media/router/media_router_mojo_test.h" | 22 #include "chrome/browser/media/router/media_router_mojo_test.h" |
| 22 #include "chrome/browser/media/router/media_router_type_converters.h" | 23 #include "chrome/browser/media/router/media_router_type_converters.h" |
| 23 #include "chrome/browser/media/router/mock_media_router.h" | 24 #include "chrome/browser/media/router/mock_media_router.h" |
| 24 #include "chrome/browser/media/router/presentation_session_messages_observer.h" | 25 #include "chrome/browser/media/router/presentation_session_messages_observer.h" |
| 25 #include "chrome/browser/media/router/test_helper.h" | 26 #include "chrome/browser/media/router/test_helper.h" |
| 26 #include "chrome/test/base/chrome_render_view_host_test_harness.h" | 27 #include "chrome/test/base/chrome_render_view_host_test_harness.h" |
| 27 #include "chrome/test/base/testing_browser_process.h" | 28 #include "chrome/test/base/testing_browser_process.h" |
| 28 #include "chrome/test/base/testing_profile.h" | 29 #include "chrome/test/base/testing_profile.h" |
| 30 #include "components/version_info/version_info.h" |
| 29 #include "extensions/browser/extension_registry.h" | 31 #include "extensions/browser/extension_registry.h" |
| 30 #include "extensions/browser/process_manager.h" | 32 #include "extensions/browser/process_manager.h" |
| 31 #include "extensions/browser/process_manager_factory.h" | 33 #include "extensions/browser/process_manager_factory.h" |
| 34 #include "extensions/common/extension.h" |
| 35 #include "extensions/common/extension_builder.h" |
| 36 #include "extensions/common/test_util.h" |
| 37 #include "extensions/common/value_builder.h" |
| 32 #include "media/base/gmock_callback_support.h" | 38 #include "media/base/gmock_callback_support.h" |
| 33 #include "mojo/message_pump/message_pump_mojo.h" | 39 #include "mojo/message_pump/message_pump_mojo.h" |
| 34 #include "testing/gmock/include/gmock/gmock.h" | 40 #include "testing/gmock/include/gmock/gmock.h" |
| 35 #include "testing/gtest/include/gtest/gtest.h" | 41 #include "testing/gtest/include/gtest/gtest.h" |
| 36 | 42 |
| 37 using testing::_; | 43 using testing::_; |
| 38 using testing::Eq; | 44 using testing::Eq; |
| 39 using testing::Invoke; | 45 using testing::Invoke; |
| 40 using testing::InvokeWithoutArgs; | 46 using testing::InvokeWithoutArgs; |
| 41 using testing::IsEmpty; | 47 using testing::IsEmpty; |
| 42 using testing::Mock; | 48 using testing::Mock; |
| 43 using testing::Not; | 49 using testing::Not; |
| 44 using testing::Pointee; | 50 using testing::Pointee; |
| 45 using testing::Return; | 51 using testing::Return; |
| 46 using testing::ReturnRef; | 52 using testing::ReturnRef; |
| 47 using testing::SaveArg; | 53 using testing::SaveArg; |
| 48 | 54 |
| 49 namespace media_router { | 55 namespace media_router { |
| 50 | 56 |
| 51 using PresentationConnectionState = | 57 using PresentationConnectionState = |
| 52 interfaces::MediaRouter::PresentationConnectionState; | 58 interfaces::MediaRouter::PresentationConnectionState; |
| 53 using PresentationConnectionCloseReason = | 59 using PresentationConnectionCloseReason = |
| 54 interfaces::MediaRouter::PresentationConnectionCloseReason; | 60 interfaces::MediaRouter::PresentationConnectionCloseReason; |
| 55 | 61 |
| 56 namespace { | 62 namespace { |
| 57 | 63 |
| 58 const char kDescription[] = "description"; | 64 const char kDescription[] = "description"; |
| 59 const char kError[] = "error"; | 65 const char kError[] = "error"; |
| 60 const char kExtensionId[] = "extension1234"; | |
| 61 const char kMessage[] = "message"; | 66 const char kMessage[] = "message"; |
| 62 const char kSource[] = "source1"; | 67 const char kSource[] = "source1"; |
| 63 const char kSource2[] = "source2"; | 68 const char kSource2[] = "source2"; |
| 64 const char kRouteId[] = "routeId"; | 69 const char kRouteId[] = "routeId"; |
| 65 const char kRouteId2[] = "routeId2"; | 70 const char kRouteId2[] = "routeId2"; |
| 66 const char kJoinableRouteId[] = "joinableRouteId"; | 71 const char kJoinableRouteId[] = "joinableRouteId"; |
| 67 const char kJoinableRouteId2[] = "joinableRouteId2"; | 72 const char kJoinableRouteId2[] = "joinableRouteId2"; |
| 68 const char kSinkId[] = "sink"; | 73 const char kSinkId[] = "sink"; |
| 69 const char kSinkId2[] = "sink2"; | 74 const char kSinkId2[] = "sink2"; |
| 70 const char kSinkName[] = "sinkName"; | 75 const char kSinkName[] = "sinkName"; |
| (...skipping 953 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1024 .WillRepeatedly(Return(false)); | 1029 .WillRepeatedly(Return(false)); |
| 1025 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId))); | 1030 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId))); |
| 1026 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId2))); | 1031 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId2))); |
| 1027 ConnectProviderManagerService(); | 1032 ConnectProviderManagerService(); |
| 1028 ProcessEventLoop(); | 1033 ProcessEventLoop(); |
| 1029 } | 1034 } |
| 1030 | 1035 |
| 1031 class MediaRouterMojoExtensionTest : public ::testing::Test { | 1036 class MediaRouterMojoExtensionTest : public ::testing::Test { |
| 1032 public: | 1037 public: |
| 1033 MediaRouterMojoExtensionTest() | 1038 MediaRouterMojoExtensionTest() |
| 1034 : process_manager_(nullptr), | 1039 : process_manager_(nullptr), |
| 1035 message_loop_(mojo::common::MessagePumpMojo::Create()) | 1040 message_loop_(mojo::common::MessagePumpMojo::Create()) {} |
| 1036 {} | |
| 1037 | 1041 |
| 1038 ~MediaRouterMojoExtensionTest() override {} | 1042 ~MediaRouterMojoExtensionTest() override {} |
| 1039 | 1043 |
| 1040 protected: | 1044 protected: |
| 1041 void SetUp() override { | 1045 void SetUp() override { |
| 1046 // Set the extension's version number to be identical to the browser's. |
| 1047 extension_ = |
| 1048 extensions::test_util::BuildExtension(extensions::ExtensionBuilder()) |
| 1049 .MergeManifest(extensions::DictionaryBuilder() |
| 1050 .Set("version", version_info::GetVersionNumber()) |
| 1051 .Build()) |
| 1052 .Build(); |
| 1053 |
| 1042 profile_.reset(new TestingProfile); | 1054 profile_.reset(new TestingProfile); |
| 1043 // Set up a mock ProcessManager instance. | 1055 // Set up a mock ProcessManager instance. |
| 1044 extensions::ProcessManagerFactory::GetInstance()->SetTestingFactory( | 1056 extensions::ProcessManagerFactory::GetInstance()->SetTestingFactory( |
| 1045 profile_.get(), &TestProcessManager::Create); | 1057 profile_.get(), &TestProcessManager::Create); |
| 1046 process_manager_ = static_cast<TestProcessManager*>( | 1058 process_manager_ = static_cast<TestProcessManager*>( |
| 1047 extensions::ProcessManager::Get(profile_.get())); | 1059 extensions::ProcessManager::Get(profile_.get())); |
| 1048 DCHECK(process_manager_); | 1060 DCHECK(process_manager_); |
| 1049 | 1061 |
| 1050 // Create MR and its proxy, so that it can be accessed through Mojo. | 1062 // Create MR and its proxy, so that it can be accessed through Mojo. |
| 1051 media_router_.reset(new MediaRouterMojoImpl(process_manager_)); | 1063 media_router_.reset(new MediaRouterMojoImpl(process_manager_)); |
| 1052 ProcessEventLoop(); | 1064 ProcessEventLoop(); |
| 1053 } | 1065 } |
| 1054 | 1066 |
| 1055 void TearDown() override { | 1067 void TearDown() override { |
| 1056 media_router_.reset(); | 1068 media_router_.reset(); |
| 1057 profile_.reset(); | 1069 profile_.reset(); |
| 1058 // Explicitly delete the TestingBrowserProcess before |message_loop_|. | 1070 // Explicitly delete the TestingBrowserProcess before |message_loop_|. |
| 1059 // This allows it to do cleanup before |message_loop_| goes away. | 1071 // This allows it to do cleanup before |message_loop_| goes away. |
| 1060 TestingBrowserProcess::DeleteInstance(); | 1072 TestingBrowserProcess::DeleteInstance(); |
| 1061 } | 1073 } |
| 1062 | 1074 |
| 1063 // Constructs bindings so that |media_router_| delegates calls to | 1075 // Constructs bindings so that |media_router_| delegates calls to |
| 1064 // |mojo_media_router_|, which are then handled by | 1076 // |mojo_media_router_|, which are then handled by |
| 1065 // |mock_media_route_provider_service_|. | 1077 // |mock_media_route_provider_service_|. |
| 1066 void BindMediaRouteProvider() { | 1078 void BindMediaRouteProvider() { |
| 1067 binding_.reset(new mojo::Binding<interfaces::MediaRouteProvider>( | 1079 binding_.reset(new mojo::Binding<interfaces::MediaRouteProvider>( |
| 1068 &mock_media_route_provider_, | 1080 &mock_media_route_provider_, |
| 1069 mojo::GetProxy(&media_route_provider_proxy_))); | 1081 mojo::GetProxy(&media_route_provider_proxy_))); |
| 1070 media_router_->BindToMojoRequest(mojo::GetProxy(&media_router_proxy_), | 1082 media_router_->BindToMojoRequest(mojo::GetProxy(&media_router_proxy_), |
| 1071 kExtensionId); | 1083 *extension_); |
| 1072 } | 1084 } |
| 1073 | 1085 |
| 1074 void ResetMediaRouteProvider() { | 1086 void ResetMediaRouteProvider() { |
| 1075 binding_.reset(); | 1087 binding_.reset(); |
| 1076 media_router_->BindToMojoRequest(mojo::GetProxy(&media_router_proxy_), | 1088 media_router_->BindToMojoRequest(mojo::GetProxy(&media_router_proxy_), |
| 1077 kExtensionId); | 1089 *extension_); |
| 1078 } | 1090 } |
| 1079 | 1091 |
| 1080 void RegisterMediaRouteProvider() { | 1092 void RegisterMediaRouteProvider() { |
| 1081 media_router_proxy_->RegisterMediaRouteProvider( | 1093 media_router_proxy_->RegisterMediaRouteProvider( |
| 1082 std::move(media_route_provider_proxy_), | 1094 std::move(media_route_provider_proxy_), |
| 1083 base::Bind(&RegisterMediaRouteProviderHandler::Invoke, | 1095 base::Bind(&RegisterMediaRouteProviderHandler::Invoke, |
| 1084 base::Unretained(&provide_handler_))); | 1096 base::Unretained(&provide_handler_))); |
| 1085 } | 1097 } |
| 1086 | 1098 |
| 1087 void ProcessEventLoop() { | 1099 void ProcessEventLoop() { |
| 1088 message_loop_.RunUntilIdle(); | 1100 message_loop_.RunUntilIdle(); |
| 1089 } | 1101 } |
| 1090 | 1102 |
| 1091 void ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason reason, | 1103 void ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason reason, |
| 1092 int expected_count) { | 1104 int expected_count) { |
| 1093 histogram_tester_.ExpectBucketCount("MediaRouter.Provider.WakeReason", | 1105 histogram_tester_.ExpectBucketCount("MediaRouter.Provider.WakeReason", |
| 1094 static_cast<int>(reason), | 1106 static_cast<int>(reason), |
| 1095 expected_count); | 1107 expected_count); |
| 1096 } | 1108 } |
| 1097 | 1109 |
| 1110 void ExpectVersionBucketCount(MediaRouteProviderVersion version, |
| 1111 int expected_count) { |
| 1112 histogram_tester_.ExpectBucketCount("MediaRouter.Provider.Version", |
| 1113 static_cast<int>(version), |
| 1114 expected_count); |
| 1115 } |
| 1116 |
| 1117 void ExpectWakeupBucketCount(MediaRouteProviderWakeup wakeup, |
| 1118 int expected_count) { |
| 1119 histogram_tester_.ExpectBucketCount("MediaRouter.Provider.Wakeup", |
| 1120 static_cast<int>(wakeup), |
| 1121 expected_count); |
| 1122 } |
| 1123 |
| 1098 scoped_ptr<MediaRouterMojoImpl> media_router_; | 1124 scoped_ptr<MediaRouterMojoImpl> media_router_; |
| 1099 RegisterMediaRouteProviderHandler provide_handler_; | 1125 RegisterMediaRouteProviderHandler provide_handler_; |
| 1100 TestProcessManager* process_manager_; | 1126 TestProcessManager* process_manager_; |
| 1101 testing::StrictMock<MockMediaRouteProvider> mock_media_route_provider_; | 1127 testing::StrictMock<MockMediaRouteProvider> mock_media_route_provider_; |
| 1102 interfaces::MediaRouterPtr media_router_proxy_; | 1128 interfaces::MediaRouterPtr media_router_proxy_; |
| 1129 scoped_refptr<extensions::Extension> extension_; |
| 1103 | 1130 |
| 1104 private: | 1131 private: |
| 1105 scoped_ptr<TestingProfile> profile_; | 1132 scoped_ptr<TestingProfile> profile_; |
| 1106 base::MessageLoop message_loop_; | 1133 base::MessageLoop message_loop_; |
| 1107 interfaces::MediaRouteProviderPtr media_route_provider_proxy_; | 1134 interfaces::MediaRouteProviderPtr media_route_provider_proxy_; |
| 1108 scoped_ptr<mojo::Binding<interfaces::MediaRouteProvider>> binding_; | 1135 scoped_ptr<mojo::Binding<interfaces::MediaRouteProvider>> binding_; |
| 1109 base::HistogramTester histogram_tester_; | 1136 base::HistogramTester histogram_tester_; |
| 1110 | 1137 |
| 1111 DISALLOW_COPY_AND_ASSIGN(MediaRouterMojoExtensionTest); | 1138 DISALLOW_COPY_AND_ASSIGN(MediaRouterMojoExtensionTest); |
| 1112 }; | 1139 }; |
| 1113 | 1140 |
| 1114 TEST_F(MediaRouterMojoExtensionTest, DeferredBindingAndSuspension) { | 1141 TEST_F(MediaRouterMojoExtensionTest, DeferredBindingAndSuspension) { |
| 1115 // DetachRoute is called before *any* extension has connected. | 1142 // DetachRoute is called before *any* extension has connected. |
| 1116 // It should be queued. | 1143 // It should be queued. |
| 1117 media_router_->DetachRoute(kRouteId); | 1144 media_router_->DetachRoute(kRouteId); |
| 1118 | 1145 |
| 1119 BindMediaRouteProvider(); | 1146 BindMediaRouteProvider(); |
| 1120 | 1147 |
| 1121 base::RunLoop run_loop, run_loop2; | 1148 base::RunLoop run_loop, run_loop2; |
| 1122 // |mojo_media_router| signals its readiness to the MR by registering | 1149 // |mojo_media_router| signals its readiness to the MR by registering |
| 1123 // itself via RegisterMediaRouteProvider(). | 1150 // itself via RegisterMediaRouteProvider(). |
| 1124 // Now that the |media_router| and |mojo_media_router| are fully initialized, | 1151 // Now that the |media_router| and |mojo_media_router| are fully initialized, |
| 1125 // the queued DetachRoute() call should be executed. | 1152 // the queued DetachRoute() call should be executed. |
| 1126 EXPECT_CALL(provide_handler_, Invoke(testing::Not(""))) | 1153 EXPECT_CALL(provide_handler_, Invoke(testing::Not(""))) |
| 1127 .WillOnce(InvokeWithoutArgs([&run_loop]() { | 1154 .WillOnce(InvokeWithoutArgs([&run_loop]() { |
| 1128 run_loop.Quit(); | 1155 run_loop.Quit(); |
| 1129 })); | 1156 })); |
| 1130 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) | 1157 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id())) |
| 1131 .WillOnce(Return(false)); | 1158 .WillOnce(Return(false)); |
| 1132 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId))) | 1159 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId))) |
| 1133 .WillOnce(InvokeWithoutArgs([&run_loop2]() { | 1160 .WillOnce(InvokeWithoutArgs([&run_loop2]() { |
| 1134 run_loop2.Quit(); | 1161 run_loop2.Quit(); |
| 1135 })); | 1162 })); |
| 1136 RegisterMediaRouteProvider(); | 1163 RegisterMediaRouteProvider(); |
| 1137 run_loop.Run(); | 1164 run_loop.Run(); |
| 1138 run_loop2.Run(); | 1165 run_loop2.Run(); |
| 1139 | 1166 |
| 1140 base::RunLoop run_loop3; | 1167 base::RunLoop run_loop3; |
| 1141 // Extension is suspended and re-awoken. | 1168 // Extension is suspended and re-awoken. |
| 1142 ResetMediaRouteProvider(); | 1169 ResetMediaRouteProvider(); |
| 1143 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) | 1170 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id())) |
| 1144 .WillOnce(Return(true)); | 1171 .WillOnce(Return(true)); |
| 1145 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) | 1172 EXPECT_CALL(*process_manager_, WakeEventPage(extension_->id(), _)) |
| 1146 .WillOnce(testing::DoAll(media::RunCallback<1>(true), | 1173 .WillOnce(testing::DoAll( |
| 1147 InvokeWithoutArgs([&run_loop3]() { | 1174 media::RunCallback<1>(true), |
| 1148 run_loop3.Quit(); | 1175 InvokeWithoutArgs([&run_loop3]() { run_loop3.Quit(); }), |
| 1149 }), | 1176 Return(true))); |
| 1150 Return(true))); | |
| 1151 media_router_->DetachRoute(kRouteId2); | 1177 media_router_->DetachRoute(kRouteId2); |
| 1152 run_loop3.Run(); | 1178 run_loop3.Run(); |
| 1153 | 1179 |
| 1154 base::RunLoop run_loop4, run_loop5; | 1180 base::RunLoop run_loop4, run_loop5; |
| 1155 // RegisterMediaRouteProvider() is called. | 1181 // RegisterMediaRouteProvider() is called. |
| 1156 // The queued DetachRoute(kRouteId2) call should be executed. | 1182 // The queued DetachRoute(kRouteId2) call should be executed. |
| 1157 EXPECT_CALL(provide_handler_, Invoke(testing::Not(""))) | 1183 EXPECT_CALL(provide_handler_, Invoke(testing::Not(""))) |
| 1158 .WillOnce(InvokeWithoutArgs([&run_loop4]() { | 1184 .WillOnce(InvokeWithoutArgs([&run_loop4]() { |
| 1159 run_loop4.Quit(); | 1185 run_loop4.Quit(); |
| 1160 })); | 1186 })); |
| 1161 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) | 1187 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id())) |
| 1162 .WillOnce(Return(false)); | 1188 .WillOnce(Return(false)); |
| 1163 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId2))) | 1189 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId2))) |
| 1164 .WillOnce(InvokeWithoutArgs([&run_loop5]() { | 1190 .WillOnce(InvokeWithoutArgs([&run_loop5]() { |
| 1165 run_loop5.Quit(); | 1191 run_loop5.Quit(); |
| 1166 })); | 1192 })); |
| 1167 BindMediaRouteProvider(); | 1193 BindMediaRouteProvider(); |
| 1168 RegisterMediaRouteProvider(); | 1194 RegisterMediaRouteProvider(); |
| 1169 run_loop4.Run(); | 1195 run_loop4.Run(); |
| 1170 run_loop5.Run(); | 1196 run_loop5.Run(); |
| 1171 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::DETACH_ROUTE, 1); | 1197 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::DETACH_ROUTE, 1); |
| 1198 ExpectWakeupBucketCount(MediaRouteProviderWakeup::SUCCESS, 1); |
| 1199 ExpectVersionBucketCount(MediaRouteProviderVersion::SAME_VERSION, 1); |
| 1172 } | 1200 } |
| 1173 | 1201 |
| 1174 TEST_F(MediaRouterMojoExtensionTest, AttemptedWakeupTooManyTimes) { | 1202 TEST_F(MediaRouterMojoExtensionTest, AttemptedWakeupTooManyTimes) { |
| 1175 BindMediaRouteProvider(); | 1203 BindMediaRouteProvider(); |
| 1176 | 1204 |
| 1177 // DetachRoute is called while extension is suspended. It should be queued. | 1205 // DetachRoute is called while extension is suspended. It should be queued. |
| 1178 // Schedule a component extension wakeup. | 1206 // Schedule a component extension wakeup. |
| 1179 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) | 1207 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id())) |
| 1180 .WillOnce(Return(true)); | 1208 .WillOnce(Return(true)); |
| 1181 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) | 1209 EXPECT_CALL(*process_manager_, WakeEventPage(extension_->id(), _)) |
| 1182 .WillOnce(testing::DoAll(media::RunCallback<1>(true), Return(true))); | 1210 .WillOnce(testing::DoAll(media::RunCallback<1>(true), Return(true))); |
| 1183 media_router_->DetachRoute(kRouteId); | 1211 media_router_->DetachRoute(kRouteId); |
| 1184 EXPECT_EQ(1u, media_router_->pending_requests_.size()); | 1212 EXPECT_EQ(1u, media_router_->pending_requests_.size()); |
| 1185 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::DETACH_ROUTE, 1); | 1213 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::DETACH_ROUTE, 1); |
| 1214 ExpectWakeupBucketCount(MediaRouteProviderWakeup::SUCCESS, 1); |
| 1186 | 1215 |
| 1187 // Media route provider fails to connect to media router before extension is | 1216 // Media route provider fails to connect to media router before extension is |
| 1188 // suspended again, and |OnConnectionError| is invoked. Retry the wakeup. | 1217 // suspended again, and |OnConnectionError| is invoked. Retry the wakeup. |
| 1189 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) | 1218 EXPECT_CALL(*process_manager_, WakeEventPage(extension_->id(), _)) |
| 1190 .Times(MediaRouterMojoImpl::kMaxWakeupAttemptCount - 1) | 1219 .Times(MediaRouterMojoImpl::kMaxWakeupAttemptCount - 1) |
| 1191 .WillRepeatedly( | 1220 .WillRepeatedly( |
| 1192 testing::DoAll(media::RunCallback<1>(true), Return(true))); | 1221 testing::DoAll(media::RunCallback<1>(true), Return(true))); |
| 1193 for (int i = 0; i < MediaRouterMojoImpl::kMaxWakeupAttemptCount - 1; ++i) | 1222 for (int i = 0; i < MediaRouterMojoImpl::kMaxWakeupAttemptCount - 1; ++i) |
| 1194 media_router_->OnConnectionError(); | 1223 media_router_->OnConnectionError(); |
| 1195 | 1224 |
| 1196 // We have already tried |kMaxWakeupAttemptCount| times. If we get an error | 1225 // We have already tried |kMaxWakeupAttemptCount| times. If we get an error |
| 1197 // again, we will give up and the pending request queue will be drained. | 1226 // again, we will give up and the pending request queue will be drained. |
| 1198 media_router_->OnConnectionError(); | 1227 media_router_->OnConnectionError(); |
| 1199 EXPECT_TRUE(media_router_->pending_requests_.empty()); | 1228 EXPECT_TRUE(media_router_->pending_requests_.empty()); |
| 1200 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::CONNECTION_ERROR, | 1229 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::CONNECTION_ERROR, |
| 1201 MediaRouterMojoImpl::kMaxWakeupAttemptCount - 1); | 1230 MediaRouterMojoImpl::kMaxWakeupAttemptCount - 1); |
| 1231 ExpectWakeupBucketCount(MediaRouteProviderWakeup::ERROR_TOO_MANY_RETRIES, 1); |
| 1202 | 1232 |
| 1203 // Requests that comes in after queue is drained should be queued. | 1233 // Requests that comes in after queue is drained should be queued. |
| 1204 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) | 1234 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id())) |
| 1205 .WillOnce(Return(true)); | 1235 .WillOnce(Return(true)); |
| 1206 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) | 1236 EXPECT_CALL(*process_manager_, WakeEventPage(extension_->id(), _)) |
| 1207 .WillOnce(testing::DoAll(media::RunCallback<1>(true), Return(true))); | 1237 .WillOnce(testing::DoAll(media::RunCallback<1>(true), Return(true))); |
| 1208 media_router_->DetachRoute(kRouteId); | 1238 media_router_->DetachRoute(kRouteId); |
| 1209 EXPECT_EQ(1u, media_router_->pending_requests_.size()); | 1239 EXPECT_EQ(1u, media_router_->pending_requests_.size()); |
| 1240 ExpectVersionBucketCount(MediaRouteProviderVersion::SAME_VERSION, 1); |
| 1210 } | 1241 } |
| 1211 | 1242 |
| 1212 TEST_F(MediaRouterMojoExtensionTest, WakeupFailedDrainsQueue) { | 1243 TEST_F(MediaRouterMojoExtensionTest, WakeupFailedDrainsQueue) { |
| 1213 BindMediaRouteProvider(); | 1244 BindMediaRouteProvider(); |
| 1214 | 1245 |
| 1215 // DetachRoute is called while extension is suspended. It should be queued. | 1246 // DetachRoute is called while extension is suspended. It should be queued. |
| 1216 // Schedule a component extension wakeup. | 1247 // Schedule a component extension wakeup. |
| 1217 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) | 1248 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id())) |
| 1218 .WillOnce(Return(true)); | 1249 .WillOnce(Return(true)); |
| 1219 base::Callback<void(bool)> extension_wakeup_callback; | 1250 base::Callback<void(bool)> extension_wakeup_callback; |
| 1220 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) | 1251 EXPECT_CALL(*process_manager_, WakeEventPage(extension_->id(), _)) |
| 1221 .WillOnce( | 1252 .WillOnce( |
| 1222 testing::DoAll(SaveArg<1>(&extension_wakeup_callback), Return(true))); | 1253 testing::DoAll(SaveArg<1>(&extension_wakeup_callback), Return(true))); |
| 1223 media_router_->DetachRoute(kRouteId); | 1254 media_router_->DetachRoute(kRouteId); |
| 1224 EXPECT_EQ(1u, media_router_->pending_requests_.size()); | 1255 EXPECT_EQ(1u, media_router_->pending_requests_.size()); |
| 1225 | 1256 |
| 1226 // Extension wakeup callback returning false is an non-retryable error. | 1257 // Extension wakeup callback returning false is an non-retryable error. |
| 1227 // Queue should be drained. | 1258 // Queue should be drained. |
| 1228 extension_wakeup_callback.Run(false); | 1259 extension_wakeup_callback.Run(false); |
| 1229 EXPECT_TRUE(media_router_->pending_requests_.empty()); | 1260 EXPECT_TRUE(media_router_->pending_requests_.empty()); |
| 1230 | 1261 |
| 1231 // Requests that comes in after queue is drained should be queued. | 1262 // Requests that comes in after queue is drained should be queued. |
| 1232 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) | 1263 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id())) |
| 1233 .WillOnce(Return(true)); | 1264 .WillOnce(Return(true)); |
| 1234 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) | 1265 EXPECT_CALL(*process_manager_, WakeEventPage(extension_->id(), _)) |
| 1235 .WillOnce(testing::DoAll(media::RunCallback<1>(true), Return(true))); | 1266 .WillOnce(testing::DoAll(media::RunCallback<1>(true), Return(true))); |
| 1236 media_router_->DetachRoute(kRouteId); | 1267 media_router_->DetachRoute(kRouteId); |
| 1237 EXPECT_EQ(1u, media_router_->pending_requests_.size()); | 1268 EXPECT_EQ(1u, media_router_->pending_requests_.size()); |
| 1238 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::DETACH_ROUTE, 1); | 1269 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::DETACH_ROUTE, 1); |
| 1270 ExpectWakeupBucketCount(MediaRouteProviderWakeup::ERROR_UNKNOWN, 1); |
| 1271 ExpectVersionBucketCount(MediaRouteProviderVersion::SAME_VERSION, 1); |
| 1239 } | 1272 } |
| 1240 | 1273 |
| 1241 TEST_F(MediaRouterMojoExtensionTest, DropOldestPendingRequest) { | 1274 TEST_F(MediaRouterMojoExtensionTest, DropOldestPendingRequest) { |
| 1242 const size_t kMaxPendingRequests = MediaRouterMojoImpl::kMaxPendingRequests; | 1275 const size_t kMaxPendingRequests = MediaRouterMojoImpl::kMaxPendingRequests; |
| 1243 | 1276 |
| 1244 // Request is queued. | 1277 // Request is queued. |
| 1245 media_router_->DetachRoute(kRouteId); | 1278 media_router_->DetachRoute(kRouteId); |
| 1246 EXPECT_EQ(1u, media_router_->pending_requests_.size()); | 1279 EXPECT_EQ(1u, media_router_->pending_requests_.size()); |
| 1247 | 1280 |
| 1248 for (size_t i = 0; i < kMaxPendingRequests; ++i) | 1281 for (size_t i = 0; i < kMaxPendingRequests; ++i) |
| 1249 media_router_->DetachRoute(kRouteId2); | 1282 media_router_->DetachRoute(kRouteId2); |
| 1250 | 1283 |
| 1251 // The request queue size should not exceed |kMaxPendingRequests|. | 1284 // The request queue size should not exceed |kMaxPendingRequests|. |
| 1252 EXPECT_EQ(kMaxPendingRequests, media_router_->pending_requests_.size()); | 1285 EXPECT_EQ(kMaxPendingRequests, media_router_->pending_requests_.size()); |
| 1253 | 1286 |
| 1254 base::RunLoop run_loop, run_loop2; | 1287 base::RunLoop run_loop, run_loop2; |
| 1255 size_t count = 0; | 1288 size_t count = 0; |
| 1256 // The oldest request should have been dropped, so we don't expect to see | 1289 // The oldest request should have been dropped, so we don't expect to see |
| 1257 // DetachRoute(kRouteId) here. | 1290 // DetachRoute(kRouteId) here. |
| 1258 BindMediaRouteProvider(); | 1291 BindMediaRouteProvider(); |
| 1259 EXPECT_CALL(provide_handler_, Invoke(testing::Not(""))) | 1292 EXPECT_CALL(provide_handler_, Invoke(testing::Not(""))) |
| 1260 .WillOnce(InvokeWithoutArgs([&run_loop]() { | 1293 .WillOnce(InvokeWithoutArgs([&run_loop]() { |
| 1261 run_loop.Quit(); | 1294 run_loop.Quit(); |
| 1262 })); | 1295 })); |
| 1263 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)); | 1296 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id())); |
| 1264 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId2))) | 1297 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId2))) |
| 1265 .Times(kMaxPendingRequests) | 1298 .Times(kMaxPendingRequests) |
| 1266 .WillRepeatedly(InvokeWithoutArgs([&run_loop2, &count]() { | 1299 .WillRepeatedly(InvokeWithoutArgs([&run_loop2, &count]() { |
| 1267 if (++count == MediaRouterMojoImpl::kMaxPendingRequests) | 1300 if (++count == MediaRouterMojoImpl::kMaxPendingRequests) |
| 1268 run_loop2.Quit(); | 1301 run_loop2.Quit(); |
| 1269 })); | 1302 })); |
| 1270 RegisterMediaRouteProvider(); | 1303 RegisterMediaRouteProvider(); |
| 1271 run_loop.Run(); | 1304 run_loop.Run(); |
| 1272 run_loop2.Run(); | 1305 run_loop2.Run(); |
| 1306 ExpectVersionBucketCount(MediaRouteProviderVersion::SAME_VERSION, 1); |
| 1273 } | 1307 } |
| 1274 | 1308 |
| 1275 } // namespace media_router | 1309 } // namespace media_router |
| OLD | NEW |