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

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: Cleanups 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 953 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698