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

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

Issue 2949933002: [Media Router] Factor extension-related logic out of MediaRouterMojoImpl (Closed)
Patch Set: Remove includes Created 3 years, 5 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
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/media/router/event_page_request_manager.h"
6
7 #include <memory>
8
9 #include "base/macros.h"
10 #include "base/test/histogram_tester.h"
11 #include "base/test/mock_callback.h"
12 #include "chrome/browser/media/router/mojo/media_router_mojo_metrics.h"
13 #include "chrome/test/base/testing_profile.h"
14 #include "content/public/test/test_browser_thread_bundle.h"
15 #include "extensions/browser/event_page_tracker.h"
16 #include "extensions/browser/extension_registry.h"
17 #include "extensions/browser/process_manager.h"
18 #include "extensions/browser/process_manager_factory.h"
19 #include "media/base/gmock_callback_support.h"
20 #include "testing/gmock/include/gmock/gmock.h"
21 #include "testing/gtest/include/gtest/gtest.h"
22
23 using testing::_;
24 using testing::Invoke;
25 using testing::Return;
26 using testing::SaveArg;
27 using testing::StrictMock;
28
29 using MockRequest = base::MockCallback<base::OnceClosure>;
30
31 namespace media_router {
32
33 namespace {
34
35 constexpr char kExtensionId[] = "extension_id";
36
37 // ProcessManager with a mocked method subset, for testing extension suspension.
38 class TestProcessManager : public extensions::ProcessManager {
39 public:
40 explicit TestProcessManager(content::BrowserContext* context)
41 : extensions::ProcessManager(
42 context,
43 context,
44 extensions::ExtensionRegistry::Get(context)) {}
45 ~TestProcessManager() override = default;
46
47 static std::unique_ptr<KeyedService> Create(
48 content::BrowserContext* context) {
49 return base::MakeUnique<TestProcessManager>(context);
50 }
51
52 MOCK_METHOD1(IsEventPageSuspended, bool(const std::string& ext_id));
53 MOCK_METHOD2(WakeEventPage,
54 bool(const std::string& extension_id,
55 const base::Callback<void(bool)>& callback));
56
57 private:
58 DISALLOW_COPY_AND_ASSIGN(TestProcessManager);
59 };
60
61 } // namespace
62
63 class EventPageRequestManagerTest : public ::testing::Test {
64 public:
65 EventPageRequestManagerTest() = default;
66 ~EventPageRequestManagerTest() override = default;
67
68 protected:
69 void SetUp() override {
70 profile_ = base::MakeUnique<TestingProfile>();
71 // Set up a mock ProcessManager instance.
72 extensions::ProcessManagerFactory::GetInstance()->SetTestingFactory(
73 profile_.get(), &TestProcessManager::Create);
74 process_manager_ = static_cast<TestProcessManager*>(
75 extensions::ProcessManager::Get(profile_.get()));
76 DCHECK(process_manager_);
77
78 request_manager_.reset(new EventPageRequestManager(profile_.get()));
79 request_manager_->SetExtensionId(kExtensionId);
80 }
81
82 void TearDown() override {
83 request_manager_.reset();
84 profile_.reset();
85 }
86
87 void ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason reason,
88 int expected_count) {
89 histogram_tester_.ExpectBucketCount("MediaRouter.Provider.WakeReason",
90 static_cast<int>(reason),
91 expected_count);
92 }
93
94 void ExpectWakeupBucketCount(MediaRouteProviderWakeup wakeup,
95 int expected_count) {
96 histogram_tester_.ExpectBucketCount("MediaRouter.Provider.Wakeup",
97 static_cast<int>(wakeup),
98 expected_count);
99 }
100
101 TestProcessManager* process_manager_ = nullptr;
102 std::unique_ptr<EventPageRequestManager> request_manager_;
103
104 private:
105 std::unique_ptr<TestingProfile> profile_;
106 base::HistogramTester histogram_tester_;
107 content::TestBrowserThreadBundle thread_bundle_;
108
109 DISALLOW_COPY_AND_ASSIGN(EventPageRequestManagerTest);
110 };
111
112 TEST_F(EventPageRequestManagerTest, SetExtensionId) {
113 request_manager_->SetExtensionId(kExtensionId);
114 EXPECT_EQ(kExtensionId,
115 request_manager_->media_route_provider_extension_id());
116 }
117
118 TEST_F(EventPageRequestManagerTest, RunRequestImmediately) {
119 StrictMock<MockRequest> request;
120 request_manager_->OnMojoConnectionsReady();
121
122 EXPECT_CALL(request, Run());
123 request_manager_->RunOrDefer(
124 base::BindOnce(&MockRequest::Run, base::Unretained(&request)),
125 MediaRouteProviderWakeReason::DETACH_ROUTE);
126 }
127
128 TEST_F(EventPageRequestManagerTest, DoNotRunRequestAfterConnectionError) {
129 StrictMock<MockRequest> request;
130 request_manager_->OnMojoConnectionsReady();
131 request_manager_->OnMojoConnectionError();
132 request_manager_->RunOrDefer(
133 base::BindOnce(&MockRequest::Run, base::Unretained(&request)),
134 MediaRouteProviderWakeReason::DETACH_ROUTE);
135 }
136
137 TEST_F(EventPageRequestManagerTest, RunRequestsOnConnectionsReady) {
138 StrictMock<MockRequest> request1;
139 StrictMock<MockRequest> request2;
140
141 ON_CALL(*process_manager_, IsEventPageSuspended(kExtensionId))
142 .WillByDefault(Return(true));
143 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _))
144 .WillOnce(Invoke([](const std::string& extension_id,
145 const base::Callback<void(bool)>& callback) {
146 callback.Run(true);
147 return true;
148 }));
149 request_manager_->RunOrDefer(
150 base::BindOnce(&MockRequest::Run, base::Unretained(&request1)),
151 MediaRouteProviderWakeReason::DETACH_ROUTE);
152
153 ON_CALL(*process_manager_, IsEventPageSuspended(kExtensionId))
154 .WillByDefault(Return(false));
155 request_manager_->RunOrDefer(
156 base::BindOnce(&MockRequest::Run, base::Unretained(&request2)),
157 MediaRouteProviderWakeReason::DETACH_ROUTE);
158
159 EXPECT_CALL(request1, Run());
160 EXPECT_CALL(request2, Run());
161 request_manager_->OnMojoConnectionsReady();
162 ExpectWakeReasonBucketCount(MediaRouteProviderWakeReason::DETACH_ROUTE, 1);
163 ExpectWakeupBucketCount(MediaRouteProviderWakeup::SUCCESS, 1);
164 }
165
166 TEST_F(EventPageRequestManagerTest, DropOldestPendingRequest) {
167 StrictMock<MockRequest> request1;
168 MockRequest request2;
169 request_manager_->RunOrDefer(
170 base::BindOnce(&MockRequest::Run, base::Unretained(&request1)),
171 MediaRouteProviderWakeReason::DETACH_ROUTE);
172 for (int i = 0; i < EventPageRequestManager::kMaxPendingRequests; i++) {
173 request_manager_->RunOrDefer(
174 base::BindOnce(&MockRequest::Run, base::Unretained(&request2)),
175 MediaRouteProviderWakeReason::DETACH_ROUTE);
176 }
177 // Now the call on |request1| should have been pushed out of the queue and not
178 // be called.
179 EXPECT_CALL(request2, Run())
180 .Times(EventPageRequestManager::kMaxPendingRequests);
181 request_manager_->OnMojoConnectionsReady();
182 }
183
184 TEST_F(EventPageRequestManagerTest, FailedWakeupDrainsQueue) {
185 StrictMock<MockRequest> request1;
186 StrictMock<MockRequest> request2;
187
188 base::Callback<void(bool)> extension_wakeup_callback;
189 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId))
190 .WillOnce(Return(true));
191 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _))
192 .WillOnce(
193 testing::DoAll(SaveArg<1>(&extension_wakeup_callback), Return(true)));
194 request_manager_->RunOrDefer(
195 base::BindOnce(&MockRequest::Run, base::Unretained(&request1)),
196 MediaRouteProviderWakeReason::CREATE_ROUTE);
197 // Run the callback with false to indicate that the wakeup failed. This call
198 // drains the request queue, so |request1| won't be called.
199 extension_wakeup_callback.Run(false);
200
201 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId))
202 .WillRepeatedly(Return(false));
203 // Requests that come in after queue is drained should be queued.
204 request_manager_->RunOrDefer(
205 base::BindOnce(&MockRequest::Run, base::Unretained(&request2)),
206 MediaRouteProviderWakeReason::CREATE_ROUTE);
207 EXPECT_CALL(request2, Run());
208 request_manager_->OnMojoConnectionsReady();
209 }
210
211 TEST_F(EventPageRequestManagerTest, TooManyWakeupAttemptsDrainsQueue) {
212 StrictMock<MockRequest> request1;
213 StrictMock<MockRequest> request2;
214
215 // After these calls the request queue is drained, so |request1| won't be
216 // called.
217 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId))
218 .WillRepeatedly(Return(true));
219 EXPECT_CALL(*process_manager_, WakeEventPage(kExtensionId, _))
220 .WillRepeatedly(Return(true));
221 for (int i = 0; i <= EventPageRequestManager::kMaxWakeupAttemptCount; i++) {
222 request_manager_->RunOrDefer(
223 base::BindOnce(&MockRequest::Run, base::Unretained(&request1)),
224 MediaRouteProviderWakeReason::CREATE_ROUTE);
225 }
226 EXPECT_CALL(*process_manager_, IsEventPageSuspended(kExtensionId))
227 .WillRepeatedly(Return(false));
228
229 // Requests that come in after queue is drained should be queued.
230 request_manager_->RunOrDefer(
231 base::BindOnce(&MockRequest::Run, base::Unretained(&request2)),
232 MediaRouteProviderWakeReason::CREATE_ROUTE);
233 EXPECT_CALL(request2, Run());
234 request_manager_->OnMojoConnectionsReady();
235 }
236
237 } // namespace media_router
OLDNEW
« no previous file with comments | « chrome/browser/media/router/event_page_request_manager_factory.cc ('k') | chrome/browser/media/router/media_router_factory.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698