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

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: Respond to isherman@ comments 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 967 matching lines...) Expand 10 before | Expand all | Expand 10 after
1038 .WillRepeatedly(Return(false)); 1043 .WillRepeatedly(Return(false));
1039 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId))); 1044 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId)));
1040 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId2))); 1045 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId2)));
1041 ConnectProviderManagerService(); 1046 ConnectProviderManagerService();
1042 ProcessEventLoop(); 1047 ProcessEventLoop();
1043 } 1048 }
1044 1049
1045 class MediaRouterMojoExtensionTest : public ::testing::Test { 1050 class MediaRouterMojoExtensionTest : public ::testing::Test {
1046 public: 1051 public:
1047 MediaRouterMojoExtensionTest() 1052 MediaRouterMojoExtensionTest()
1048 : process_manager_(nullptr), 1053 : process_manager_(nullptr),
1049 message_loop_(mojo::common::MessagePumpMojo::Create()) 1054 message_loop_(mojo::common::MessagePumpMojo::Create()) {}
1050 {}
1051 1055
1052 ~MediaRouterMojoExtensionTest() override {} 1056 ~MediaRouterMojoExtensionTest() override {}
1053 1057
1054 protected: 1058 protected:
1055 void SetUp() override { 1059 void SetUp() override {
1060 // Set the extension's version number to be identical to the browser's.
1061 extension_ =
1062 extensions::test_util::BuildExtension(extensions::ExtensionBuilder())
1063 .MergeManifest(extensions::DictionaryBuilder()
1064 .Set("version", version_info::GetVersionNumber())
1065 .Build())
1066 .Build();
1067
1056 profile_.reset(new TestingProfile); 1068 profile_.reset(new TestingProfile);
1057 // Set up a mock ProcessManager instance. 1069 // Set up a mock ProcessManager instance.
1058 extensions::ProcessManagerFactory::GetInstance()->SetTestingFactory( 1070 extensions::ProcessManagerFactory::GetInstance()->SetTestingFactory(
1059 profile_.get(), &TestProcessManager::Create); 1071 profile_.get(), &TestProcessManager::Create);
1060 process_manager_ = static_cast<TestProcessManager*>( 1072 process_manager_ = static_cast<TestProcessManager*>(
1061 extensions::ProcessManager::Get(profile_.get())); 1073 extensions::ProcessManager::Get(profile_.get()));
1062 DCHECK(process_manager_); 1074 DCHECK(process_manager_);
1063 1075
1064 // Create MR and its proxy, so that it can be accessed through Mojo. 1076 // Create MR and its proxy, so that it can be accessed through Mojo.
1065 media_router_.reset(new MediaRouterMojoImpl(process_manager_)); 1077 media_router_.reset(new MediaRouterMojoImpl(process_manager_));
1066 ProcessEventLoop(); 1078 ProcessEventLoop();
1067 } 1079 }
1068 1080
1069 void TearDown() override { 1081 void TearDown() override {
1070 media_router_.reset(); 1082 media_router_.reset();
1071 profile_.reset(); 1083 profile_.reset();
1072 // Explicitly delete the TestingBrowserProcess before |message_loop_|. 1084 // Explicitly delete the TestingBrowserProcess before |message_loop_|.
1073 // This allows it to do cleanup before |message_loop_| goes away. 1085 // This allows it to do cleanup before |message_loop_| goes away.
1074 TestingBrowserProcess::DeleteInstance(); 1086 TestingBrowserProcess::DeleteInstance();
1075 } 1087 }
1076 1088
1077 // Constructs bindings so that |media_router_| delegates calls to 1089 // Constructs bindings so that |media_router_| delegates calls to
1078 // |mojo_media_router_|, which are then handled by 1090 // |mojo_media_router_|, which are then handled by
1079 // |mock_media_route_provider_service_|. 1091 // |mock_media_route_provider_service_|.
1080 void BindMediaRouteProvider() { 1092 void BindMediaRouteProvider() {
1081 binding_.reset(new mojo::Binding<interfaces::MediaRouteProvider>( 1093 binding_.reset(new mojo::Binding<interfaces::MediaRouteProvider>(
1082 &mock_media_route_provider_, 1094 &mock_media_route_provider_,
1083 mojo::GetProxy(&media_route_provider_proxy_))); 1095 mojo::GetProxy(&media_route_provider_proxy_)));
1084 media_router_->BindToMojoRequest(mojo::GetProxy(&media_router_proxy_), 1096 media_router_->BindToMojoRequest(mojo::GetProxy(&media_router_proxy_),
1085 kExtensionId); 1097 *extension_);
1086 } 1098 }
1087 1099
1088 void ResetMediaRouteProvider() { 1100 void ResetMediaRouteProvider() {
1089 binding_.reset(); 1101 binding_.reset();
1090 media_router_->BindToMojoRequest(mojo::GetProxy(&media_router_proxy_), 1102 media_router_->BindToMojoRequest(mojo::GetProxy(&media_router_proxy_),
1091 kExtensionId); 1103 *extension_);
1092 } 1104 }
1093 1105
1094 void RegisterMediaRouteProvider() { 1106 void RegisterMediaRouteProvider() {
1095 media_router_proxy_->RegisterMediaRouteProvider( 1107 media_router_proxy_->RegisterMediaRouteProvider(
1096 std::move(media_route_provider_proxy_), 1108 std::move(media_route_provider_proxy_),
1097 base::Bind(&RegisterMediaRouteProviderHandler::Invoke, 1109 base::Bind(&RegisterMediaRouteProviderHandler::Invoke,
1098 base::Unretained(&provide_handler_))); 1110 base::Unretained(&provide_handler_)));
1099 } 1111 }
1100 1112
1101 void ProcessEventLoop() { 1113 void ProcessEventLoop() {
1102 message_loop_.RunUntilIdle(); 1114 message_loop_.RunUntilIdle();
1103 } 1115 }
1104 1116
1105 void ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason reason, 1117 void ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason reason,
1106 int expected_count) { 1118 int expected_count) {
1107 histogram_tester_.ExpectBucketCount("MediaRouter.Provider.WakeReason", 1119 histogram_tester_.ExpectBucketCount("MediaRouter.Provider.WakeReason",
1108 static_cast<int>(reason), 1120 static_cast<int>(reason),
1109 expected_count); 1121 expected_count);
1110 } 1122 }
1111 1123
1124 void ExpectVersionBucketCount(MediaRouteProviderVersion version,
1125 int expected_count) {
1126 histogram_tester_.ExpectBucketCount("MediaRouter.Provider.Version",
1127 static_cast<int>(version),
1128 expected_count);
1129 }
1130
1131 void ExpectWakeupBucketCount(MediaRouteProviderWakeup wakeup,
1132 int expected_count) {
1133 histogram_tester_.ExpectBucketCount("MediaRouter.Provider.Wakeup",
1134 static_cast<int>(wakeup),
1135 expected_count);
1136 }
1137
1112 scoped_ptr<MediaRouterMojoImpl> media_router_; 1138 scoped_ptr<MediaRouterMojoImpl> media_router_;
1113 RegisterMediaRouteProviderHandler provide_handler_; 1139 RegisterMediaRouteProviderHandler provide_handler_;
1114 TestProcessManager* process_manager_; 1140 TestProcessManager* process_manager_;
1115 testing::StrictMock<MockMediaRouteProvider> mock_media_route_provider_; 1141 testing::StrictMock<MockMediaRouteProvider> mock_media_route_provider_;
1116 interfaces::MediaRouterPtr media_router_proxy_; 1142 interfaces::MediaRouterPtr media_router_proxy_;
1143 scoped_refptr<extensions::Extension> extension_;
1117 1144
1118 private: 1145 private:
1119 scoped_ptr<TestingProfile> profile_; 1146 scoped_ptr<TestingProfile> profile_;
1120 base::MessageLoop message_loop_; 1147 base::MessageLoop message_loop_;
1121 interfaces::MediaRouteProviderPtr media_route_provider_proxy_; 1148 interfaces::MediaRouteProviderPtr media_route_provider_proxy_;
1122 scoped_ptr<mojo::Binding<interfaces::MediaRouteProvider>> binding_; 1149 scoped_ptr<mojo::Binding<interfaces::MediaRouteProvider>> binding_;
1123 base::HistogramTester histogram_tester_; 1150 base::HistogramTester histogram_tester_;
1124 1151
1125 DISALLOW_COPY_AND_ASSIGN(MediaRouterMojoExtensionTest); 1152 DISALLOW_COPY_AND_ASSIGN(MediaRouterMojoExtensionTest);
1126 }; 1153 };
1127 1154
1128 TEST_F(MediaRouterMojoExtensionTest, DeferredBindingAndSuspension) { 1155 TEST_F(MediaRouterMojoExtensionTest, DeferredBindingAndSuspension) {
1129 // DetachRoute is called before *any* extension has connected. 1156 // DetachRoute is called before *any* extension has connected.
1130 // It should be queued. 1157 // It should be queued.
1131 media_router_->DetachRoute(kRouteId); 1158 media_router_->DetachRoute(kRouteId);
1132 1159
1133 BindMediaRouteProvider(); 1160 BindMediaRouteProvider();
1134 1161
1135 base::RunLoop run_loop, run_loop2; 1162 base::RunLoop run_loop, run_loop2;
1136 // |mojo_media_router| signals its readiness to the MR by registering 1163 // |mojo_media_router| signals its readiness to the MR by registering
1137 // itself via RegisterMediaRouteProvider(). 1164 // itself via RegisterMediaRouteProvider().
1138 // Now that the |media_router| and |mojo_media_router| are fully initialized, 1165 // Now that the |media_router| and |mojo_media_router| are fully initialized,
1139 // the queued DetachRoute() call should be executed. 1166 // the queued DetachRoute() call should be executed.
1140 EXPECT_CALL(provide_handler_, Invoke(testing::Not(""))) 1167 EXPECT_CALL(provide_handler_, Invoke(testing::Not("")))
1141 .WillOnce(InvokeWithoutArgs([&run_loop]() { 1168 .WillOnce(InvokeWithoutArgs([&run_loop]() {
1142 run_loop.Quit(); 1169 run_loop.Quit();
1143 })); 1170 }));
1144 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) 1171 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id()))
1145 .WillOnce(Return(false)); 1172 .WillOnce(Return(false));
1146 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId))) 1173 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId)))
1147 .WillOnce(InvokeWithoutArgs([&run_loop2]() { 1174 .WillOnce(InvokeWithoutArgs([&run_loop2]() {
1148 run_loop2.Quit(); 1175 run_loop2.Quit();
1149 })); 1176 }));
1150 RegisterMediaRouteProvider(); 1177 RegisterMediaRouteProvider();
1151 run_loop.Run(); 1178 run_loop.Run();
1152 run_loop2.Run(); 1179 run_loop2.Run();
1153 1180
1154 base::RunLoop run_loop3; 1181 base::RunLoop run_loop3;
1155 // Extension is suspended and re-awoken. 1182 // Extension is suspended and re-awoken.
1156 ResetMediaRouteProvider(); 1183 ResetMediaRouteProvider();
1157 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) 1184 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id()))
1158 .WillOnce(Return(true)); 1185 .WillOnce(Return(true));
1159 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) 1186 EXPECT_CALL(*process_manager_, WakeEventPage(extension_->id(), _))
1160 .WillOnce(testing::DoAll(media::RunCallback<1>(true), 1187 .WillOnce(testing::DoAll(
1161 InvokeWithoutArgs([&run_loop3]() { 1188 media::RunCallback<1>(true),
1162 run_loop3.Quit(); 1189 InvokeWithoutArgs([&run_loop3]() { run_loop3.Quit(); }),
1163 }), 1190 Return(true)));
1164 Return(true)));
1165 media_router_->DetachRoute(kRouteId2); 1191 media_router_->DetachRoute(kRouteId2);
1166 run_loop3.Run(); 1192 run_loop3.Run();
1167 1193
1168 base::RunLoop run_loop4, run_loop5; 1194 base::RunLoop run_loop4, run_loop5;
1169 // RegisterMediaRouteProvider() is called. 1195 // RegisterMediaRouteProvider() is called.
1170 // The queued DetachRoute(kRouteId2) call should be executed. 1196 // The queued DetachRoute(kRouteId2) call should be executed.
1171 EXPECT_CALL(provide_handler_, Invoke(testing::Not(""))) 1197 EXPECT_CALL(provide_handler_, Invoke(testing::Not("")))
1172 .WillOnce(InvokeWithoutArgs([&run_loop4]() { 1198 .WillOnce(InvokeWithoutArgs([&run_loop4]() {
1173 run_loop4.Quit(); 1199 run_loop4.Quit();
1174 })); 1200 }));
1175 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) 1201 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id()))
1176 .WillOnce(Return(false)); 1202 .WillOnce(Return(false));
1177 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId2))) 1203 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId2)))
1178 .WillOnce(InvokeWithoutArgs([&run_loop5]() { 1204 .WillOnce(InvokeWithoutArgs([&run_loop5]() {
1179 run_loop5.Quit(); 1205 run_loop5.Quit();
1180 })); 1206 }));
1181 BindMediaRouteProvider(); 1207 BindMediaRouteProvider();
1182 RegisterMediaRouteProvider(); 1208 RegisterMediaRouteProvider();
1183 run_loop4.Run(); 1209 run_loop4.Run();
1184 run_loop5.Run(); 1210 run_loop5.Run();
1185 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::DETACH_ROUTE, 1); 1211 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::DETACH_ROUTE, 1);
1212 ExpectWakeupBucketCount(MediaRouteProviderWakeup::SUCCESS, 1);
1213 ExpectVersionBucketCount(MediaRouteProviderVersion::SAME_VERSION_AS_CHROME,
1214 1);
1186 } 1215 }
1187 1216
1188 TEST_F(MediaRouterMojoExtensionTest, AttemptedWakeupTooManyTimes) { 1217 TEST_F(MediaRouterMojoExtensionTest, AttemptedWakeupTooManyTimes) {
1189 BindMediaRouteProvider(); 1218 BindMediaRouteProvider();
1190 1219
1191 // DetachRoute is called while extension is suspended. It should be queued. 1220 // DetachRoute is called while extension is suspended. It should be queued.
1192 // Schedule a component extension wakeup. 1221 // Schedule a component extension wakeup.
1193 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) 1222 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id()))
1194 .WillOnce(Return(true)); 1223 .WillOnce(Return(true));
1195 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) 1224 EXPECT_CALL(*process_manager_, WakeEventPage(extension_->id(), _))
1196 .WillOnce(testing::DoAll(media::RunCallback<1>(true), Return(true))); 1225 .WillOnce(testing::DoAll(media::RunCallback<1>(true), Return(true)));
1197 media_router_->DetachRoute(kRouteId); 1226 media_router_->DetachRoute(kRouteId);
1198 EXPECT_EQ(1u, media_router_->pending_requests_.size()); 1227 EXPECT_EQ(1u, media_router_->pending_requests_.size());
1199 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::DETACH_ROUTE, 1); 1228 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::DETACH_ROUTE, 1);
1229 ExpectWakeupBucketCount(MediaRouteProviderWakeup::SUCCESS, 1);
1200 1230
1201 // Media route provider fails to connect to media router before extension is 1231 // Media route provider fails to connect to media router before extension is
1202 // suspended again, and |OnConnectionError| is invoked. Retry the wakeup. 1232 // suspended again, and |OnConnectionError| is invoked. Retry the wakeup.
1203 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) 1233 EXPECT_CALL(*process_manager_, WakeEventPage(extension_->id(), _))
1204 .Times(MediaRouterMojoImpl::kMaxWakeupAttemptCount - 1) 1234 .Times(MediaRouterMojoImpl::kMaxWakeupAttemptCount - 1)
1205 .WillRepeatedly( 1235 .WillRepeatedly(
1206 testing::DoAll(media::RunCallback<1>(true), Return(true))); 1236 testing::DoAll(media::RunCallback<1>(true), Return(true)));
1207 for (int i = 0; i < MediaRouterMojoImpl::kMaxWakeupAttemptCount - 1; ++i) 1237 for (int i = 0; i < MediaRouterMojoImpl::kMaxWakeupAttemptCount - 1; ++i)
1208 media_router_->OnConnectionError(); 1238 media_router_->OnConnectionError();
1209 1239
1210 // We have already tried |kMaxWakeupAttemptCount| times. If we get an error 1240 // We have already tried |kMaxWakeupAttemptCount| times. If we get an error
1211 // again, we will give up and the pending request queue will be drained. 1241 // again, we will give up and the pending request queue will be drained.
1212 media_router_->OnConnectionError(); 1242 media_router_->OnConnectionError();
1213 EXPECT_TRUE(media_router_->pending_requests_.empty()); 1243 EXPECT_TRUE(media_router_->pending_requests_.empty());
1214 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::CONNECTION_ERROR, 1244 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::CONNECTION_ERROR,
1215 MediaRouterMojoImpl::kMaxWakeupAttemptCount - 1); 1245 MediaRouterMojoImpl::kMaxWakeupAttemptCount - 1);
1246 ExpectWakeupBucketCount(MediaRouteProviderWakeup::ERROR_TOO_MANY_RETRIES, 1);
1216 1247
1217 // Requests that comes in after queue is drained should be queued. 1248 // Requests that comes in after queue is drained should be queued.
1218 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) 1249 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id()))
1219 .WillOnce(Return(true)); 1250 .WillOnce(Return(true));
1220 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) 1251 EXPECT_CALL(*process_manager_, WakeEventPage(extension_->id(), _))
1221 .WillOnce(testing::DoAll(media::RunCallback<1>(true), Return(true))); 1252 .WillOnce(testing::DoAll(media::RunCallback<1>(true), Return(true)));
1222 media_router_->DetachRoute(kRouteId); 1253 media_router_->DetachRoute(kRouteId);
1223 EXPECT_EQ(1u, media_router_->pending_requests_.size()); 1254 EXPECT_EQ(1u, media_router_->pending_requests_.size());
1255 ExpectVersionBucketCount(MediaRouteProviderVersion::SAME_VERSION_AS_CHROME,
1256 1);
1224 } 1257 }
1225 1258
1226 TEST_F(MediaRouterMojoExtensionTest, WakeupFailedDrainsQueue) { 1259 TEST_F(MediaRouterMojoExtensionTest, WakeupFailedDrainsQueue) {
1227 BindMediaRouteProvider(); 1260 BindMediaRouteProvider();
1228 1261
1229 // DetachRoute is called while extension is suspended. It should be queued. 1262 // DetachRoute is called while extension is suspended. It should be queued.
1230 // Schedule a component extension wakeup. 1263 // Schedule a component extension wakeup.
1231 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) 1264 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id()))
1232 .WillOnce(Return(true)); 1265 .WillOnce(Return(true));
1233 base::Callback<void(bool)> extension_wakeup_callback; 1266 base::Callback<void(bool)> extension_wakeup_callback;
1234 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) 1267 EXPECT_CALL(*process_manager_, WakeEventPage(extension_->id(), _))
1235 .WillOnce( 1268 .WillOnce(
1236 testing::DoAll(SaveArg<1>(&extension_wakeup_callback), Return(true))); 1269 testing::DoAll(SaveArg<1>(&extension_wakeup_callback), Return(true)));
1237 media_router_->DetachRoute(kRouteId); 1270 media_router_->DetachRoute(kRouteId);
1238 EXPECT_EQ(1u, media_router_->pending_requests_.size()); 1271 EXPECT_EQ(1u, media_router_->pending_requests_.size());
1239 1272
1240 // Extension wakeup callback returning false is an non-retryable error. 1273 // Extension wakeup callback returning false is an non-retryable error.
1241 // Queue should be drained. 1274 // Queue should be drained.
1242 extension_wakeup_callback.Run(false); 1275 extension_wakeup_callback.Run(false);
1243 EXPECT_TRUE(media_router_->pending_requests_.empty()); 1276 EXPECT_TRUE(media_router_->pending_requests_.empty());
1244 1277
1245 // Requests that comes in after queue is drained should be queued. 1278 // Requests that comes in after queue is drained should be queued.
1246 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)) 1279 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id()))
1247 .WillOnce(Return(true)); 1280 .WillOnce(Return(true));
1248 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _)) 1281 EXPECT_CALL(*process_manager_, WakeEventPage(extension_->id(), _))
1249 .WillOnce(testing::DoAll(media::RunCallback<1>(true), Return(true))); 1282 .WillOnce(testing::DoAll(media::RunCallback<1>(true), Return(true)));
1250 media_router_->DetachRoute(kRouteId); 1283 media_router_->DetachRoute(kRouteId);
1251 EXPECT_EQ(1u, media_router_->pending_requests_.size()); 1284 EXPECT_EQ(1u, media_router_->pending_requests_.size());
1252 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::DETACH_ROUTE, 1); 1285 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::DETACH_ROUTE, 1);
1286 ExpectWakeupBucketCount(MediaRouteProviderWakeup::ERROR_UNKNOWN, 1);
1287 ExpectVersionBucketCount(MediaRouteProviderVersion::SAME_VERSION_AS_CHROME,
1288 1);
1253 } 1289 }
1254 1290
1255 TEST_F(MediaRouterMojoExtensionTest, DropOldestPendingRequest) { 1291 TEST_F(MediaRouterMojoExtensionTest, DropOldestPendingRequest) {
1256 const size_t kMaxPendingRequests = MediaRouterMojoImpl::kMaxPendingRequests; 1292 const size_t kMaxPendingRequests = MediaRouterMojoImpl::kMaxPendingRequests;
1257 1293
1258 // Request is queued. 1294 // Request is queued.
1259 media_router_->DetachRoute(kRouteId); 1295 media_router_->DetachRoute(kRouteId);
1260 EXPECT_EQ(1u, media_router_->pending_requests_.size()); 1296 EXPECT_EQ(1u, media_router_->pending_requests_.size());
1261 1297
1262 for (size_t i = 0; i < kMaxPendingRequests; ++i) 1298 for (size_t i = 0; i < kMaxPendingRequests; ++i)
1263 media_router_->DetachRoute(kRouteId2); 1299 media_router_->DetachRoute(kRouteId2);
1264 1300
1265 // The request queue size should not exceed |kMaxPendingRequests|. 1301 // The request queue size should not exceed |kMaxPendingRequests|.
1266 EXPECT_EQ(kMaxPendingRequests, media_router_->pending_requests_.size()); 1302 EXPECT_EQ(kMaxPendingRequests, media_router_->pending_requests_.size());
1267 1303
1268 base::RunLoop run_loop, run_loop2; 1304 base::RunLoop run_loop, run_loop2;
1269 size_t count = 0; 1305 size_t count = 0;
1270 // The oldest request should have been dropped, so we don't expect to see 1306 // The oldest request should have been dropped, so we don't expect to see
1271 // DetachRoute(kRouteId) here. 1307 // DetachRoute(kRouteId) here.
1272 BindMediaRouteProvider(); 1308 BindMediaRouteProvider();
1273 EXPECT_CALL(provide_handler_, Invoke(testing::Not(""))) 1309 EXPECT_CALL(provide_handler_, Invoke(testing::Not("")))
1274 .WillOnce(InvokeWithoutArgs([&run_loop]() { 1310 .WillOnce(InvokeWithoutArgs([&run_loop]() {
1275 run_loop.Quit(); 1311 run_loop.Quit();
1276 })); 1312 }));
1277 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId)); 1313 EXPECT_CALL(*process_manager_, IsEventPageSuspended(extension_->id()));
1278 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId2))) 1314 EXPECT_CALL(mock_media_route_provider_, DetachRoute(mojo::String(kRouteId2)))
1279 .Times(kMaxPendingRequests) 1315 .Times(kMaxPendingRequests)
1280 .WillRepeatedly(InvokeWithoutArgs([&run_loop2, &count]() { 1316 .WillRepeatedly(InvokeWithoutArgs([&run_loop2, &count]() {
1281 if (++count == MediaRouterMojoImpl::kMaxPendingRequests) 1317 if (++count == MediaRouterMojoImpl::kMaxPendingRequests)
1282 run_loop2.Quit(); 1318 run_loop2.Quit();
1283 })); 1319 }));
1284 RegisterMediaRouteProvider(); 1320 RegisterMediaRouteProvider();
1285 run_loop.Run(); 1321 run_loop.Run();
1286 run_loop2.Run(); 1322 run_loop2.Run();
1323 ExpectVersionBucketCount(MediaRouteProviderVersion::SAME_VERSION_AS_CHROME,
1324 1);
1287 } 1325 }
1288 1326
1289 } // namespace media_router 1327 } // namespace media_router
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698