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

Side by Side Diff: chrome/browser/devtools/device/devtools_android_bridge_browser_test.cc

Issue 286993003: Fixed case when DevtoolsAdbBridge may start few polling loops. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Removed explicit timeouts. 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 | Annotate | Revision Log
« 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 (c) 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
44 virtual void DeviceCountChanged(int count) OVERRIDE {
45 ++invoked;
46 adb_bridge_->RemoveDeviceCountListener(this);
47 Shutdown();
48 }
49
50 void Shutdown() {
51 ShutdownOnUIThread();
52 };
53
54 void ShutdownOnUIThread() {
55 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
56 if (repostsLeft-- == 0) {
57 base::MessageLoop::current()->Quit();
58 } else {
59 BrowserThread::PostTask(
60 BrowserThread::FILE,
61 FROM_HERE,
62 base::Bind(&MockCountListener::ShutdownOnFileThread,
63 base::Unretained(this)));
64 }
65 }
66
67 void ShutdownOnFileThread() {
68 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
69 BrowserThread::PostTask(BrowserThread::UI,
70 FROM_HERE,
71 base::Bind(&MockCountListener::ShutdownOnUIThread,
72 base::Unretained(this)));
73 }
74
75 int repostsLeft = 10;
76 scoped_refptr<DevToolsAndroidBridge> adb_bridge_;
77 int invoked = 0;
78 };
79
80 class MockCountListenerWithReAdd : public MockCountListener {
81 public:
82 explicit MockCountListenerWithReAdd(
83 scoped_refptr<DevToolsAndroidBridge> adb_bridge)
84 : MockCountListener(adb_bridge) {}
85
86 virtual void DeviceCountChanged(int count) OVERRIDE {
87 ++invoked;
88 adb_bridge_->RemoveDeviceCountListener(this);
89 if (readd_count_ > 0) {
90 readd_count_--;
91 adb_bridge_->AddDeviceCountListener(this);
92 adb_bridge_->RemoveDeviceCountListener(this);
93 adb_bridge_->AddDeviceCountListener(this);
94 } else {
95 Shutdown();
96 }
97 }
98
99 int readd_count_ = 2;
100 };
101
102 class MockCountListenerWithReAddWhileQueued : public MockCountListener {
103 public:
104 MockCountListenerWithReAddWhileQueued(
105 scoped_refptr<DevToolsAndroidBridge> adb_bridge)
106 : MockCountListener(adb_bridge) {}
107
108 virtual void DeviceCountChanged(int count) OVERRIDE {
109 ++invoked;
110 if (!readded) {
111 readded = true;
112 base::MessageLoop::current()->PostTask(
113 FROM_HERE,
114 base::Bind(&MockCountListenerWithReAddWhileQueued::ReAdd,
115 base::Unretained(this)));
116 } else {
117 adb_bridge_->RemoveDeviceCountListener(this);
118 Shutdown();
119 }
120 }
121
122 void ReAdd() {
123 adb_bridge_->RemoveDeviceCountListener(this);
124 adb_bridge_->AddDeviceCountListener(this);
125 }
126
127 bool readded = false;
128 };
129
130 class MockUsbService : public UsbService {
131 public:
132 MOCK_METHOD1(GetDeviceById, scoped_refptr<UsbDevice>(uint32 unique_id));
133 virtual void GetDevices(
134 std::vector<scoped_refptr<UsbDevice> >* devices) OVERRIDE {}
135 };
136
137 class DevtoolsAndroidBridgeBrowserTest : public InProcessBrowserTest {
138 protected:
139 DevtoolsAndroidBridgeBrowserTest() {}
140
141 virtual void SetUpOnMainThread() OVERRIDE {
142 scoped_refptr<content::MessageLoopRunner> runner =
143 new content::MessageLoopRunner;
144
145 BrowserThread::PostTaskAndReply(
146 BrowserThread::FILE,
147 FROM_HERE,
148 base::Bind(&DevtoolsAndroidBridgeBrowserTest::SetUpService, this),
149 runner->QuitClosure());
150 runner->Run();
151
152 adb_bridge_ =
153 DevToolsAndroidBridge::Factory::GetForProfile(browser()->profile());
154 DCHECK(adb_bridge_);
155 adb_bridge_->set_device_count_request_scheduler_for_test(base::Bind(
156 &DevtoolsAndroidBridgeBrowserTest::ScheduleDeviceCountRequest, this));
157
158 runner = new content::MessageLoopRunner;
159
160 DevToolsAndroidBridgeWarmUp warmup(runner->QuitClosure(), adb_bridge_);
161 adb_bridge_->AddDeviceCountListener(&warmup);
162 runner->Run();
163
164 runner_ = new content::MessageLoopRunner;
165 }
166
167 void ScheduleDeviceCountRequest(base::Closure request) {
168 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
169 scheduler_invoked_++;
170 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, request);
171 }
172
173 void SetUpService() {
174 service_ = new MockUsbService();
175 UsbService::SetInstanceForTest(service_);
176 }
177
178 virtual void CleanUpOnMainThread() OVERRIDE {
179 scoped_refptr<content::MessageLoopRunner> runner =
180 new content::MessageLoopRunner;
181 UsbService* service = NULL;
182 BrowserThread::PostTaskAndReply(
183 BrowserThread::FILE,
184 FROM_HERE,
185 base::Bind(&UsbService::SetInstanceForTest, service),
186 runner->QuitClosure());
187 runner->Run();
188 }
189
190 MockUsbService* service_;
191 int scheduler_invoked_ = 0;
192 scoped_refptr<content::MessageLoopRunner> runner_;
193 scoped_refptr<DevToolsAndroidBridge> adb_bridge_;
194 };
195
196 IN_PROC_BROWSER_TEST_F(DevtoolsAndroidBridgeBrowserTest,
197 TestNoMultipleCallsRemoveInCallback) {
198 scoped_ptr<MockCountListener> listener(new MockCountListener(adb_bridge_));
199
200 adb_bridge_->AddDeviceCountListener(listener.get());
201
202 runner_->Run();
203 EXPECT_EQ(1, listener->invoked);
204 EXPECT_EQ(listener->invoked - 1, scheduler_invoked_);
205 }
206
207 IN_PROC_BROWSER_TEST_F(DevtoolsAndroidBridgeBrowserTest,
208 TestNoMultipleCallsRemoveAddInCallback) {
209 scoped_ptr<MockCountListener> listener(
210 new MockCountListenerWithReAdd(adb_bridge_));
211
212 adb_bridge_->AddDeviceCountListener(listener.get());
213
214 runner_->Run();
215 EXPECT_EQ(3, listener->invoked);
216 EXPECT_EQ(listener->invoked - 1, scheduler_invoked_);
217 }
218
219 IN_PROC_BROWSER_TEST_F(DevtoolsAndroidBridgeBrowserTest,
220 TestNoMultipleCallsRemoveAddOnStart) {
221 scoped_ptr<MockCountListener> listener(new MockCountListener(adb_bridge_));
222
223 adb_bridge_->AddDeviceCountListener(listener.get());
224 adb_bridge_->RemoveDeviceCountListener(listener.get());
225 adb_bridge_->AddDeviceCountListener(listener.get());
226
227 runner_->Run();
228 EXPECT_EQ(1, listener->invoked);
229 EXPECT_EQ(listener->invoked - 1, scheduler_invoked_);
230 }
231
232 IN_PROC_BROWSER_TEST_F(DevtoolsAndroidBridgeBrowserTest,
233 TestNoMultipleCallsRemoveAddWhileQueued) {
234 scoped_ptr<MockCountListener> listener(
235 new MockCountListenerWithReAddWhileQueued(adb_bridge_));
236
237 adb_bridge_->AddDeviceCountListener(listener.get());
238
239 runner_->Run();
240 EXPECT_EQ(2, listener->invoked);
241 EXPECT_EQ(listener->invoked - 1, scheduler_invoked_);
242 }
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