| 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 1130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1201 .WillRepeatedly(Return(false)); | 1206 .WillRepeatedly(Return(false)); |
| 1202 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId))); | 1207 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId))); |
| 1203 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId2))); | 1208 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId2))); |
| 1204 ConnectProviderManagerService(); | 1209 ConnectProviderManagerService(); |
| 1205 ProcessEventLoop(); | 1210 ProcessEventLoop(); |
| 1206 } | 1211 } |
| 1207 | 1212 |
| 1208 class MediaRouterMojoExtensionTest : public ::testing::Test { | 1213 class MediaRouterMojoExtensionTest : public ::testing::Test { |
| 1209 public: | 1214 public: |
| 1210 MediaRouterMojoExtensionTest() | 1215 MediaRouterMojoExtensionTest() |
| 1211 : process_manager_(nullptr), | 1216 : process_manager_(nullptr), |
| 1212 message_loop_(mojo::common::MessagePumpMojo::Create()) | 1217 message_loop_(mojo::common::MessagePumpMojo::Create()) {} |
| 1213 {} | |
| 1214 | 1218 |
| 1215 ~MediaRouterMojoExtensionTest() override {} | 1219 ~MediaRouterMojoExtensionTest() override {} |
| 1216 | 1220 |
| 1217 protected: | 1221 protected: |
| 1218 void SetUp() override { | 1222 void SetUp() override { |
| 1223 // Set the extension's version number to be identical to the browser's. |
| 1224 extension_ = |
| 1225 extensions::test_util::BuildExtension(extensions::ExtensionBuilder()) |
| 1226 .MergeManifest(extensions::DictionaryBuilder() |
| 1227 .Set("version", version_info::GetVersionNumber()) |
| 1228 .Build()) |
| 1229 .Build(); |
| 1230 |
| 1219 profile_.reset(new TestingProfile); | 1231 profile_.reset(new TestingProfile); |
| 1220 // Set up a mock ProcessManager instance. | 1232 // Set up a mock ProcessManager instance. |
| 1221 extensions::ProcessManagerFactory::GetInstance()->SetTestingFactory( | 1233 extensions::ProcessManagerFactory::GetInstance()->SetTestingFactory( |
| 1222 profile_.get(), &TestProcessManager::Create); | 1234 profile_.get(), &TestProcessManager::Create); |
| 1223 process_manager_ = static_cast<TestProcessManager*>( | 1235 process_manager_ = static_cast<TestProcessManager*>( |
| 1224 extensions::ProcessManager::Get(profile_.get())); | 1236 extensions::ProcessManager::Get(profile_.get())); |
| 1225 DCHECK(process_manager_); | 1237 DCHECK(process_manager_); |
| 1226 | 1238 |
| 1227 // Create MR and its proxy, so that it can be accessed through Mojo. | 1239 // Create MR and its proxy, so that it can be accessed through Mojo. |
| 1228 media_router_.reset(new MediaRouterMojoImpl(process_manager_)); | 1240 media_router_.reset(new MediaRouterMojoImpl(process_manager_)); |
| 1229 ProcessEventLoop(); | 1241 ProcessEventLoop(); |
| 1230 } | 1242 } |
| 1231 | 1243 |
| 1232 void TearDown() override { | 1244 void TearDown() override { |
| 1233 media_router_.reset(); | 1245 media_router_.reset(); |
| 1234 profile_.reset(); | 1246 profile_.reset(); |
| 1235 // Explicitly delete the TestingBrowserProcess before |message_loop_|. | 1247 // Explicitly delete the TestingBrowserProcess before |message_loop_|. |
| 1236 // This allows it to do cleanup before |message_loop_| goes away. | 1248 // This allows it to do cleanup before |message_loop_| goes away. |
| 1237 TestingBrowserProcess::DeleteInstance(); | 1249 TestingBrowserProcess::DeleteInstance(); |
| 1238 } | 1250 } |
| 1239 | 1251 |
| 1240 // Constructs bindings so that |media_router_| delegates calls to | 1252 // Constructs bindings so that |media_router_| delegates calls to |
| 1241 // |mojo_media_router_|, which are then handled by | 1253 // |mojo_media_router_|, which are then handled by |
| 1242 // |mock_media_route_provider_service_|. | 1254 // |mock_media_route_provider_service_|. |
| 1243 void BindMediaRouteProvider() { | 1255 void BindMediaRouteProvider() { |
| 1244 binding_.reset(new mojo::Binding<interfaces::MediaRouteProvider>( | 1256 binding_.reset(new mojo::Binding<interfaces::MediaRouteProvider>( |
| 1245 &mock_media_route_provider_, | 1257 &mock_media_route_provider_, |
| 1246 mojo::GetProxy(&media_route_provider_proxy_))); | 1258 mojo::GetProxy(&media_route_provider_proxy_))); |
| 1247 media_router_->BindToMojoRequest(mojo::GetProxy(&media_router_proxy_), | 1259 media_router_->BindToMojoRequest(mojo::GetProxy(&media_router_proxy_), |
| 1248 kExtensionId); | 1260 *extension_); |
| 1249 } | 1261 } |
| 1250 | 1262 |
| 1251 void ResetMediaRouteProvider() { | 1263 void ResetMediaRouteProvider() { |
| 1252 binding_.reset(); | 1264 binding_.reset(); |
| 1253 media_router_->BindToMojoRequest(mojo::GetProxy(&media_router_proxy_), | 1265 media_router_->BindToMojoRequest(mojo::GetProxy(&media_router_proxy_), |
| 1254 kExtensionId); | 1266 *extension_); |
| 1255 } | 1267 } |
| 1256 | 1268 |
| 1257 void RegisterMediaRouteProvider() { | 1269 void RegisterMediaRouteProvider() { |
| 1258 media_router_proxy_->RegisterMediaRouteProvider( | 1270 media_router_proxy_->RegisterMediaRouteProvider( |
| 1259 std::move(media_route_provider_proxy_), | 1271 std::move(media_route_provider_proxy_), |
| 1260 base::Bind(&RegisterMediaRouteProviderHandler::Invoke, | 1272 base::Bind(&RegisterMediaRouteProviderHandler::Invoke, |
| 1261 base::Unretained(&provide_handler_))); | 1273 base::Unretained(&provide_handler_))); |
| 1262 } | 1274 } |
| 1263 | 1275 |
| 1264 void ProcessEventLoop() { | 1276 void ProcessEventLoop() { |
| 1265 message_loop_.RunUntilIdle(); | 1277 message_loop_.RunUntilIdle(); |
| 1266 } | 1278 } |
| 1267 | 1279 |
| 1268 void ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason reason, | 1280 void ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason reason, |
| 1269 int expected_count) { | 1281 int expected_count) { |
| 1270 histogram_tester_.ExpectBucketCount("MediaRouter.Provider.WakeReason", | 1282 histogram_tester_.ExpectBucketCount("MediaRouter.Provider.WakeReason", |
| 1271 static_cast<int>(reason), | 1283 static_cast<int>(reason), |
| 1272 expected_count); | 1284 expected_count); |
| 1273 } | 1285 } |
| 1274 | 1286 |
| 1287 void ExpectVersionBucketCount(MediaRouteProviderVersion version, |
| 1288 int expected_count) { |
| 1289 histogram_tester_.ExpectBucketCount("MediaRouter.Provider.Version", |
| 1290 static_cast<int>(version), |
| 1291 expected_count); |
| 1292 } |
| 1293 |
| 1294 void ExpectWakeupBucketCount(MediaRouteProviderWakeup wakeup, |
| 1295 int expected_count) { |
| 1296 histogram_tester_.ExpectBucketCount("MediaRouter.Provider.Wakeup", |
| 1297 static_cast<int>(wakeup), |
| 1298 expected_count); |
| 1299 } |
| 1300 |
| 1275 scoped_ptr<MediaRouterMojoImpl> media_router_; | 1301 scoped_ptr<MediaRouterMojoImpl> media_router_; |
| 1276 RegisterMediaRouteProviderHandler provide_handler_; | 1302 RegisterMediaRouteProviderHandler provide_handler_; |
| 1277 TestProcessManager* process_manager_; | 1303 TestProcessManager* process_manager_; |
| 1278 testing::StrictMock<MockMediaRouteProvider> mock_media_route_provider_; | 1304 testing::StrictMock<MockMediaRouteProvider> mock_media_route_provider_; |
| 1279 interfaces::MediaRouterPtr media_router_proxy_; | 1305 interfaces::MediaRouterPtr media_router_proxy_; |
| 1306 scoped_refptr<extensions::Extension> extension_; |
| 1280 | 1307 |
| 1281 private: | 1308 private: |
| 1282 scoped_ptr<TestingProfile> profile_; | 1309 scoped_ptr<TestingProfile> profile_; |
| 1283 base::MessageLoop message_loop_; | 1310 base::MessageLoop message_loop_; |
| 1284 interfaces::MediaRouteProviderPtr media_route_provider_proxy_; | 1311 interfaces::MediaRouteProviderPtr media_route_provider_proxy_; |
| 1285 scoped_ptr<mojo::Binding<interfaces::MediaRouteProvider>> binding_; | 1312 scoped_ptr<mojo::Binding<interfaces::MediaRouteProvider>> binding_; |
| 1286 base::HistogramTester histogram_tester_; | 1313 base::HistogramTester histogram_tester_; |
| 1287 | 1314 |
| 1288 DISALLOW_COPY_AND_ASSIGN(MediaRouterMojoExtensionTest); | 1315 DISALLOW_COPY_AND_ASSIGN(MediaRouterMojoExtensionTest); |
| 1289 }; | 1316 }; |
| 1290 | 1317 |
| 1291 TEST_F(MediaRouterMojoExtensionTest, DeferredBindingAndSuspension) { | 1318 TEST_F(MediaRouterMojoExtensionTest, DeferredBindingAndSuspension) { |
| 1292 // DetachRoute is called before *any* extension has connected. | 1319 // DetachRoute is called before *any* extension has connected. |
| 1293 // It should be queued. | 1320 // It should be queued. |
| 1294 media_router_->DetachRoute(kRouteId); | 1321 media_router_->DetachRoute(kRouteId); |
| 1295 | 1322 |
| 1296 BindMediaRouteProvider(); | 1323 BindMediaRouteProvider(); |
| 1297 | 1324 |
| 1298 base::RunLoop run_loop, run_loop2; | 1325 base::RunLoop run_loop, run_loop2; |
| 1299 // |mojo_media_router| signals its readiness to the MR by registering | 1326 // |mojo_media_router| signals its readiness to the MR by registering |
| 1300 // itself via RegisterMediaRouteProvider(). | 1327 // itself via RegisterMediaRouteProvider(). |
| 1301 // Now that the |media_router| and |mojo_media_router| are fully initialized, | 1328 // Now that the |media_router| and |mojo_media_router| are fully initialized, |
| 1302 // the queued DetachRoute() call should be executed. | 1329 // the queued DetachRoute() call should be executed. |
| 1303 EXPECT_CALL(provide_handler_, Invoke(testing::Not(""))) | 1330 EXPECT_CALL(provide_handler_, Invoke(testing::Not(""))) |
| 1304 .WillOnce(InvokeWithoutArgs([&run_loop]() { | 1331 .WillOnce(InvokeWithoutArgs([&run_loop]() { |
| 1305 run_loop.Quit(); | 1332 run_loop.Quit(); |
| 1306 })); | 1333 })); |
| 1307 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) | 1334 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id())) |
| 1308 .WillOnce(Return(false)); | 1335 .WillOnce(Return(false)); |
| 1309 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId))) | 1336 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId))) |
| 1310 .WillOnce(InvokeWithoutArgs([&run_loop2]() { | 1337 .WillOnce(InvokeWithoutArgs([&run_loop2]() { |
| 1311 run_loop2.Quit(); | 1338 run_loop2.Quit(); |
| 1312 })); | 1339 })); |
| 1313 RegisterMediaRouteProvider(); | 1340 RegisterMediaRouteProvider(); |
| 1314 run_loop.Run(); | 1341 run_loop.Run(); |
| 1315 run_loop2.Run(); | 1342 run_loop2.Run(); |
| 1316 | 1343 |
| 1317 base::RunLoop run_loop3; | 1344 base::RunLoop run_loop3; |
| 1318 // Extension is suspended and re-awoken. | 1345 // Extension is suspended and re-awoken. |
| 1319 ResetMediaRouteProvider(); | 1346 ResetMediaRouteProvider(); |
| 1320 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) | 1347 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id())) |
| 1321 .WillOnce(Return(true)); | 1348 .WillOnce(Return(true)); |
| 1322 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) | 1349 EXPECT_CALL(*process_manager_, WakeEventPage(extension_->id(), _)) |
| 1323 .WillOnce(testing::DoAll(media::RunCallback<1>(true), | 1350 .WillOnce(testing::DoAll( |
| 1324 InvokeWithoutArgs([&run_loop3]() { | 1351 media::RunCallback<1>(true), |
| 1325 run_loop3.Quit(); | 1352 InvokeWithoutArgs([&run_loop3]() { run_loop3.Quit(); }), |
| 1326 }), | 1353 Return(true))); |
| 1327 Return(true))); | |
| 1328 media_router_->DetachRoute(kRouteId2); | 1354 media_router_->DetachRoute(kRouteId2); |
| 1329 run_loop3.Run(); | 1355 run_loop3.Run(); |
| 1330 | 1356 |
| 1331 base::RunLoop run_loop4, run_loop5; | 1357 base::RunLoop run_loop4, run_loop5; |
| 1332 // RegisterMediaRouteProvider() is called. | 1358 // RegisterMediaRouteProvider() is called. |
| 1333 // The queued DetachRoute(kRouteId2) call should be executed. | 1359 // The queued DetachRoute(kRouteId2) call should be executed. |
| 1334 EXPECT_CALL(provide_handler_, Invoke(testing::Not(""))) | 1360 EXPECT_CALL(provide_handler_, Invoke(testing::Not(""))) |
| 1335 .WillOnce(InvokeWithoutArgs([&run_loop4]() { | 1361 .WillOnce(InvokeWithoutArgs([&run_loop4]() { |
| 1336 run_loop4.Quit(); | 1362 run_loop4.Quit(); |
| 1337 })); | 1363 })); |
| 1338 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) | 1364 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id())) |
| 1339 .WillOnce(Return(false)); | 1365 .WillOnce(Return(false)); |
| 1340 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId2))) | 1366 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId2))) |
| 1341 .WillOnce(InvokeWithoutArgs([&run_loop5]() { | 1367 .WillOnce(InvokeWithoutArgs([&run_loop5]() { |
| 1342 run_loop5.Quit(); | 1368 run_loop5.Quit(); |
| 1343 })); | 1369 })); |
| 1344 BindMediaRouteProvider(); | 1370 BindMediaRouteProvider(); |
| 1345 RegisterMediaRouteProvider(); | 1371 RegisterMediaRouteProvider(); |
| 1346 run_loop4.Run(); | 1372 run_loop4.Run(); |
| 1347 run_loop5.Run(); | 1373 run_loop5.Run(); |
| 1348 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::DETACH_ROUTE, 1); | 1374 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::DETACH_ROUTE, 1); |
| 1375 ExpectWakeupBucketCount(MediaRouteProviderWakeup::SUCCESS, 1); |
| 1376 ExpectVersionBucketCount(MediaRouteProviderVersion::SAME_VERSION_AS_CHROME, |
| 1377 1); |
| 1349 } | 1378 } |
| 1350 | 1379 |
| 1351 TEST_F(MediaRouterMojoExtensionTest, AttemptedWakeupTooManyTimes) { | 1380 TEST_F(MediaRouterMojoExtensionTest, AttemptedWakeupTooManyTimes) { |
| 1352 BindMediaRouteProvider(); | 1381 BindMediaRouteProvider(); |
| 1353 | 1382 |
| 1354 // DetachRoute is called while extension is suspended. It should be queued. | 1383 // DetachRoute is called while extension is suspended. It should be queued. |
| 1355 // Schedule a component extension wakeup. | 1384 // Schedule a component extension wakeup. |
| 1356 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) | 1385 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id())) |
| 1357 .WillOnce(Return(true)); | 1386 .WillOnce(Return(true)); |
| 1358 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) | 1387 EXPECT_CALL(*process_manager_, WakeEventPage(extension_->id(), _)) |
| 1359 .WillOnce(testing::DoAll(media::RunCallback<1>(true), Return(true))); | 1388 .WillOnce(testing::DoAll(media::RunCallback<1>(true), Return(true))); |
| 1360 media_router_->DetachRoute(kRouteId); | 1389 media_router_->DetachRoute(kRouteId); |
| 1361 EXPECT_EQ(1u, media_router_->pending_requests_.size()); | 1390 EXPECT_EQ(1u, media_router_->pending_requests_.size()); |
| 1362 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::DETACH_ROUTE, 1); | 1391 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::DETACH_ROUTE, 1); |
| 1392 ExpectWakeupBucketCount(MediaRouteProviderWakeup::SUCCESS, 1); |
| 1363 | 1393 |
| 1364 // Media route provider fails to connect to media router before extension is | 1394 // Media route provider fails to connect to media router before extension is |
| 1365 // suspended again, and |OnConnectionError| is invoked. Retry the wakeup. | 1395 // suspended again, and |OnConnectionError| is invoked. Retry the wakeup. |
| 1366 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) | 1396 EXPECT_CALL(*process_manager_, WakeEventPage(extension_->id(), _)) |
| 1367 .Times(MediaRouterMojoImpl::kMaxWakeupAttemptCount - 1) | 1397 .Times(MediaRouterMojoImpl::kMaxWakeupAttemptCount - 1) |
| 1368 .WillRepeatedly( | 1398 .WillRepeatedly( |
| 1369 testing::DoAll(media::RunCallback<1>(true), Return(true))); | 1399 testing::DoAll(media::RunCallback<1>(true), Return(true))); |
| 1370 for (int i = 0; i < MediaRouterMojoImpl::kMaxWakeupAttemptCount - 1; ++i) | 1400 for (int i = 0; i < MediaRouterMojoImpl::kMaxWakeupAttemptCount - 1; ++i) |
| 1371 media_router_->OnConnectionError(); | 1401 media_router_->OnConnectionError(); |
| 1372 | 1402 |
| 1373 // We have already tried |kMaxWakeupAttemptCount| times. If we get an error | 1403 // We have already tried |kMaxWakeupAttemptCount| times. If we get an error |
| 1374 // again, we will give up and the pending request queue will be drained. | 1404 // again, we will give up and the pending request queue will be drained. |
| 1375 media_router_->OnConnectionError(); | 1405 media_router_->OnConnectionError(); |
| 1376 EXPECT_TRUE(media_router_->pending_requests_.empty()); | 1406 EXPECT_TRUE(media_router_->pending_requests_.empty()); |
| 1377 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::CONNECTION_ERROR, | 1407 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::CONNECTION_ERROR, |
| 1378 MediaRouterMojoImpl::kMaxWakeupAttemptCount - 1); | 1408 MediaRouterMojoImpl::kMaxWakeupAttemptCount - 1); |
| 1409 ExpectWakeupBucketCount(MediaRouteProviderWakeup::ERROR_TOO_MANY_RETRIES, 1); |
| 1379 | 1410 |
| 1380 // Requests that comes in after queue is drained should be queued. | 1411 // Requests that comes in after queue is drained should be queued. |
| 1381 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) | 1412 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id())) |
| 1382 .WillOnce(Return(true)); | 1413 .WillOnce(Return(true)); |
| 1383 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) | 1414 EXPECT_CALL(*process_manager_, WakeEventPage(extension_->id(), _)) |
| 1384 .WillOnce(testing::DoAll(media::RunCallback<1>(true), Return(true))); | 1415 .WillOnce(testing::DoAll(media::RunCallback<1>(true), Return(true))); |
| 1385 media_router_->DetachRoute(kRouteId); | 1416 media_router_->DetachRoute(kRouteId); |
| 1386 EXPECT_EQ(1u, media_router_->pending_requests_.size()); | 1417 EXPECT_EQ(1u, media_router_->pending_requests_.size()); |
| 1418 ExpectVersionBucketCount(MediaRouteProviderVersion::SAME_VERSION_AS_CHROME, |
| 1419 1); |
| 1387 } | 1420 } |
| 1388 | 1421 |
| 1389 TEST_F(MediaRouterMojoExtensionTest, WakeupFailedDrainsQueue) { | 1422 TEST_F(MediaRouterMojoExtensionTest, WakeupFailedDrainsQueue) { |
| 1390 BindMediaRouteProvider(); | 1423 BindMediaRouteProvider(); |
| 1391 | 1424 |
| 1392 // DetachRoute is called while extension is suspended. It should be queued. | 1425 // DetachRoute is called while extension is suspended. It should be queued. |
| 1393 // Schedule a component extension wakeup. | 1426 // Schedule a component extension wakeup. |
| 1394 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) | 1427 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id())) |
| 1395 .WillOnce(Return(true)); | 1428 .WillOnce(Return(true)); |
| 1396 base::Callback<void(bool)> extension_wakeup_callback; | 1429 base::Callback<void(bool)> extension_wakeup_callback; |
| 1397 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) | 1430 EXPECT_CALL(*process_manager_, WakeEventPage(extension_->id(), _)) |
| 1398 .WillOnce( | 1431 .WillOnce( |
| 1399 testing::DoAll(SaveArg<1>(&extension_wakeup_callback), Return(true))); | 1432 testing::DoAll(SaveArg<1>(&extension_wakeup_callback), Return(true))); |
| 1400 media_router_->DetachRoute(kRouteId); | 1433 media_router_->DetachRoute(kRouteId); |
| 1401 EXPECT_EQ(1u, media_router_->pending_requests_.size()); | 1434 EXPECT_EQ(1u, media_router_->pending_requests_.size()); |
| 1402 | 1435 |
| 1403 // Extension wakeup callback returning false is an non-retryable error. | 1436 // Extension wakeup callback returning false is an non-retryable error. |
| 1404 // Queue should be drained. | 1437 // Queue should be drained. |
| 1405 extension_wakeup_callback.Run(false); | 1438 extension_wakeup_callback.Run(false); |
| 1406 EXPECT_TRUE(media_router_->pending_requests_.empty()); | 1439 EXPECT_TRUE(media_router_->pending_requests_.empty()); |
| 1407 | 1440 |
| 1408 // Requests that comes in after queue is drained should be queued. | 1441 // Requests that comes in after queue is drained should be queued. |
| 1409 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) | 1442 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id())) |
| 1410 .WillOnce(Return(true)); | 1443 .WillOnce(Return(true)); |
| 1411 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) | 1444 EXPECT_CALL(*process_manager_, WakeEventPage(extension_->id(), _)) |
| 1412 .WillOnce(testing::DoAll(media::RunCallback<1>(true), Return(true))); | 1445 .WillOnce(testing::DoAll(media::RunCallback<1>(true), Return(true))); |
| 1413 media_router_->DetachRoute(kRouteId); | 1446 media_router_->DetachRoute(kRouteId); |
| 1414 EXPECT_EQ(1u, media_router_->pending_requests_.size()); | 1447 EXPECT_EQ(1u, media_router_->pending_requests_.size()); |
| 1415 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::DETACH_ROUTE, 1); | 1448 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::DETACH_ROUTE, 1); |
| 1449 ExpectWakeupBucketCount(MediaRouteProviderWakeup::ERROR_UNKNOWN, 1); |
| 1450 ExpectVersionBucketCount(MediaRouteProviderVersion::SAME_VERSION_AS_CHROME, |
| 1451 1); |
| 1416 } | 1452 } |
| 1417 | 1453 |
| 1418 TEST_F(MediaRouterMojoExtensionTest, DropOldestPendingRequest) { | 1454 TEST_F(MediaRouterMojoExtensionTest, DropOldestPendingRequest) { |
| 1419 const size_t kMaxPendingRequests = MediaRouterMojoImpl::kMaxPendingRequests; | 1455 const size_t kMaxPendingRequests = MediaRouterMojoImpl::kMaxPendingRequests; |
| 1420 | 1456 |
| 1421 // Request is queued. | 1457 // Request is queued. |
| 1422 media_router_->DetachRoute(kRouteId); | 1458 media_router_->DetachRoute(kRouteId); |
| 1423 EXPECT_EQ(1u, media_router_->pending_requests_.size()); | 1459 EXPECT_EQ(1u, media_router_->pending_requests_.size()); |
| 1424 | 1460 |
| 1425 for (size_t i = 0; i < kMaxPendingRequests; ++i) | 1461 for (size_t i = 0; i < kMaxPendingRequests; ++i) |
| 1426 media_router_->DetachRoute(kRouteId2); | 1462 media_router_->DetachRoute(kRouteId2); |
| 1427 | 1463 |
| 1428 // The request queue size should not exceed |kMaxPendingRequests|. | 1464 // The request queue size should not exceed |kMaxPendingRequests|. |
| 1429 EXPECT_EQ(kMaxPendingRequests, media_router_->pending_requests_.size()); | 1465 EXPECT_EQ(kMaxPendingRequests, media_router_->pending_requests_.size()); |
| 1430 | 1466 |
| 1431 base::RunLoop run_loop, run_loop2; | 1467 base::RunLoop run_loop, run_loop2; |
| 1432 size_t count = 0; | 1468 size_t count = 0; |
| 1433 // The oldest request should have been dropped, so we don't expect to see | 1469 // The oldest request should have been dropped, so we don't expect to see |
| 1434 // DetachRoute(kRouteId) here. | 1470 // DetachRoute(kRouteId) here. |
| 1435 BindMediaRouteProvider(); | 1471 BindMediaRouteProvider(); |
| 1436 EXPECT_CALL(provide_handler_, Invoke(testing::Not(""))) | 1472 EXPECT_CALL(provide_handler_, Invoke(testing::Not(""))) |
| 1437 .WillOnce(InvokeWithoutArgs([&run_loop]() { | 1473 .WillOnce(InvokeWithoutArgs([&run_loop]() { |
| 1438 run_loop.Quit(); | 1474 run_loop.Quit(); |
| 1439 })); | 1475 })); |
| 1440 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)); | 1476 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id())); |
| 1441 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId2))) | 1477 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId2))) |
| 1442 .Times(kMaxPendingRequests) | 1478 .Times(kMaxPendingRequests) |
| 1443 .WillRepeatedly(InvokeWithoutArgs([&run_loop2, &count]() { | 1479 .WillRepeatedly(InvokeWithoutArgs([&run_loop2, &count]() { |
| 1444 if (++count == MediaRouterMojoImpl::kMaxPendingRequests) | 1480 if (++count == MediaRouterMojoImpl::kMaxPendingRequests) |
| 1445 run_loop2.Quit(); | 1481 run_loop2.Quit(); |
| 1446 })); | 1482 })); |
| 1447 RegisterMediaRouteProvider(); | 1483 RegisterMediaRouteProvider(); |
| 1448 run_loop.Run(); | 1484 run_loop.Run(); |
| 1449 run_loop2.Run(); | 1485 run_loop2.Run(); |
| 1486 ExpectVersionBucketCount(MediaRouteProviderVersion::SAME_VERSION_AS_CHROME, |
| 1487 1); |
| 1450 } | 1488 } |
| 1451 | 1489 |
| 1452 } // namespace media_router | 1490 } // namespace media_router |
| OLD | NEW |