Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(310)

Side by Side Diff: chrome/browser/media/router/media_router_mojo_impl_unittest.cc

Issue 1765143002: [Media Router] Add UMA histograms tracking component extension version/wakeups (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Move media_router_metrics_unittest to non_android Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
OLDNEW
« no previous file with comments | « chrome/browser/media/router/media_router_mojo_impl.cc ('k') | chrome/browser/media/router/media_router_mojo_test.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698