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

Side by Side Diff: chrome/browser/devtools/device/usb/devtools_android_bridge_browsertest.cc

Issue 305013013: DevTools: DevToolsAndroidBridge polling loops (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Force destruction on UI Created 6 years, 6 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
« no previous file with comments | « chrome/browser/devtools/device/devtools_android_bridge.cc ('k') | chrome/chrome_tests.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2014 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 <algorithm>
6
7 #include "base/message_loop/message_loop.h"
8 #include "chrome/browser/devtools/device/devtools_android_bridge.h"
9 #include "chrome/browser/ui/browser.h"
10 #include "chrome/test/base/in_process_browser_test.h"
11 #include "components/usb_service/usb_device.h"
12 #include "components/usb_service/usb_service.h"
13 #include "content/public/browser/browser_thread.h"
14 #include "content/public/test/test_utils.h"
15 #include "testing/gmock/include/gmock/gmock.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17
18 using testing::_;
19 using content::BrowserThread;
20 using usb_service::UsbService;
21 using usb_service::UsbDevice;
22
23 class DevToolsAndroidBridgeWarmUp
24 : public DevToolsAndroidBridge::DeviceCountListener {
25 public:
26 DevToolsAndroidBridgeWarmUp(base::Closure closure,
27 scoped_refptr<DevToolsAndroidBridge> adb_bridge)
28 : closure_(closure), adb_bridge_(adb_bridge) {}
29
30 virtual void DeviceCountChanged(int count) OVERRIDE {
31 adb_bridge_->RemoveDeviceCountListener(this);
32 closure_.Run();
33 }
34
35 base::Closure closure_;
36 scoped_refptr<DevToolsAndroidBridge> adb_bridge_;
37 };
38
39 class MockCountListener : public DevToolsAndroidBridge::DeviceCountListener {
40 public:
41 explicit MockCountListener(scoped_refptr<DevToolsAndroidBridge> adb_bridge)
42 : adb_bridge_(adb_bridge),
43 reposts_left_(10),
44 invoked_(0) {
45 }
46
47 virtual void DeviceCountChanged(int count) OVERRIDE {
48 ++invoked_;
49 adb_bridge_->RemoveDeviceCountListener(this);
50 Shutdown();
51 }
52
53 void Shutdown() {
54 ShutdownOnUIThread();
55 };
56
57 void ShutdownOnUIThread() {
58 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
59 if (reposts_left_-- == 0) {
60 base::MessageLoop::current()->Quit();
61 } else {
62 BrowserThread::PostTask(
63 BrowserThread::FILE,
64 FROM_HERE,
65 base::Bind(&MockCountListener::ShutdownOnFileThread,
66 base::Unretained(this)));
67 }
68 }
69
70 void ShutdownOnFileThread() {
71 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
72 BrowserThread::PostTask(BrowserThread::UI,
73 FROM_HERE,
74 base::Bind(&MockCountListener::ShutdownOnUIThread,
75 base::Unretained(this)));
76 }
77
78 scoped_refptr<DevToolsAndroidBridge> adb_bridge_;
79 int reposts_left_;
80 int invoked_;
81 };
82
83 class MockCountListenerWithReAdd : public MockCountListener {
84 public:
85 explicit MockCountListenerWithReAdd(
86 scoped_refptr<DevToolsAndroidBridge> adb_bridge)
87 : MockCountListener(adb_bridge),
88 readd_count_(2) {
89 }
90
91 virtual void DeviceCountChanged(int count) OVERRIDE {
92 ++invoked_;
93 adb_bridge_->RemoveDeviceCountListener(this);
94 if (readd_count_ > 0) {
95 readd_count_--;
96 adb_bridge_->AddDeviceCountListener(this);
97 adb_bridge_->RemoveDeviceCountListener(this);
98 adb_bridge_->AddDeviceCountListener(this);
99 } else {
100 Shutdown();
101 }
102 }
103
104 int readd_count_;
105 };
106
107 class MockCountListenerWithReAddWhileQueued : public MockCountListener {
108 public:
109 MockCountListenerWithReAddWhileQueued(
110 scoped_refptr<DevToolsAndroidBridge> adb_bridge)
111 : MockCountListener(adb_bridge),
112 readded_(false) {
113 }
114
115 virtual void DeviceCountChanged(int count) OVERRIDE {
116 ++invoked_;
117 if (!readded_) {
118 readded_ = true;
119 base::MessageLoop::current()->PostTask(
120 FROM_HERE,
121 base::Bind(&MockCountListenerWithReAddWhileQueued::ReAdd,
122 base::Unretained(this)));
123 } else {
124 adb_bridge_->RemoveDeviceCountListener(this);
125 Shutdown();
126 }
127 }
128
129 void ReAdd() {
130 adb_bridge_->RemoveDeviceCountListener(this);
131 adb_bridge_->AddDeviceCountListener(this);
132 }
133
134 bool readded_;
135 };
136
137 class MockUsbService : public UsbService {
138 public:
139 MOCK_METHOD1(GetDeviceById, scoped_refptr<UsbDevice>(uint32 unique_id));
140 virtual void GetDevices(
141 std::vector<scoped_refptr<UsbDevice> >* devices) OVERRIDE {}
142 };
143
144 class DevtoolsAndroidBridgeBrowserTest : public InProcessBrowserTest {
145 protected:
146 DevtoolsAndroidBridgeBrowserTest()
147 : scheduler_invoked_(0) {
148 }
149
150 virtual void SetUpOnMainThread() OVERRIDE {
151 scoped_refptr<content::MessageLoopRunner> runner =
152 new content::MessageLoopRunner;
153
154 BrowserThread::PostTaskAndReply(
155 BrowserThread::FILE,
156 FROM_HERE,
157 base::Bind(&DevtoolsAndroidBridgeBrowserTest::SetUpService, this),
158 runner->QuitClosure());
159 runner->Run();
160
161 adb_bridge_ =
162 DevToolsAndroidBridge::Factory::GetForProfile(browser()->profile());
163 DCHECK(adb_bridge_);
164 adb_bridge_->set_task_scheduler_for_test(base::Bind(
165 &DevtoolsAndroidBridgeBrowserTest::ScheduleDeviceCountRequest, this));
166
167 runner = new content::MessageLoopRunner;
168
169 DevToolsAndroidBridgeWarmUp warmup(runner->QuitClosure(), adb_bridge_);
170 adb_bridge_->AddDeviceCountListener(&warmup);
171 runner->Run();
172
173 runner_ = new content::MessageLoopRunner;
174 }
175
176 void ScheduleDeviceCountRequest(const base::Closure& request) {
177 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
178 scheduler_invoked_++;
179 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, request);
180 }
181
182 void SetUpService() {
183 service_ = new MockUsbService();
184 UsbService::SetInstanceForTest(service_);
185 }
186
187 virtual void CleanUpOnMainThread() OVERRIDE {
188 scoped_refptr<content::MessageLoopRunner> runner =
189 new content::MessageLoopRunner;
190 UsbService* service = NULL;
191 BrowserThread::PostTaskAndReply(
192 BrowserThread::FILE,
193 FROM_HERE,
194 base::Bind(&UsbService::SetInstanceForTest, service),
195 runner->QuitClosure());
196 runner->Run();
197 }
198
199 MockUsbService* service_;
200 int scheduler_invoked_;
201 scoped_refptr<content::MessageLoopRunner> runner_;
202 scoped_refptr<DevToolsAndroidBridge> adb_bridge_;
203 };
204
205 IN_PROC_BROWSER_TEST_F(DevtoolsAndroidBridgeBrowserTest,
206 TestNoMultipleCallsRemoveInCallback) {
207 scoped_ptr<MockCountListener> listener(new MockCountListener(adb_bridge_));
208
209 adb_bridge_->AddDeviceCountListener(listener.get());
210
211 runner_->Run();
212 EXPECT_EQ(1, listener->invoked_);
213 EXPECT_EQ(listener->invoked_ - 1, scheduler_invoked_);
214 }
215
216 IN_PROC_BROWSER_TEST_F(DevtoolsAndroidBridgeBrowserTest,
217 TestNoMultipleCallsRemoveAddInCallback) {
218 scoped_ptr<MockCountListener> listener(
219 new MockCountListenerWithReAdd(adb_bridge_));
220
221 adb_bridge_->AddDeviceCountListener(listener.get());
222
223 runner_->Run();
224 EXPECT_EQ(3, listener->invoked_);
225 EXPECT_EQ(listener->invoked_ - 1, scheduler_invoked_);
226 }
227
228 IN_PROC_BROWSER_TEST_F(DevtoolsAndroidBridgeBrowserTest,
229 TestNoMultipleCallsRemoveAddOnStart) {
230 scoped_ptr<MockCountListener> listener(new MockCountListener(adb_bridge_));
231
232 adb_bridge_->AddDeviceCountListener(listener.get());
233 adb_bridge_->RemoveDeviceCountListener(listener.get());
234 adb_bridge_->AddDeviceCountListener(listener.get());
235
236 runner_->Run();
237 EXPECT_EQ(1, listener->invoked_);
238 EXPECT_EQ(listener->invoked_ - 1, scheduler_invoked_);
239 }
240
241 IN_PROC_BROWSER_TEST_F(DevtoolsAndroidBridgeBrowserTest,
242 TestNoMultipleCallsRemoveAddWhileQueued) {
243 scoped_ptr<MockCountListener> listener(
244 new MockCountListenerWithReAddWhileQueued(adb_bridge_));
245
246 adb_bridge_->AddDeviceCountListener(listener.get());
247
248 runner_->Run();
249 EXPECT_EQ(2, listener->invoked_);
250 EXPECT_EQ(listener->invoked_ - 1, scheduler_invoked_);
251 }
OLDNEW
« no previous file with comments | « chrome/browser/devtools/device/devtools_android_bridge.cc ('k') | chrome/chrome_tests.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698