OLD | NEW |
---|---|
(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_device_count_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(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 } | |
Vladislav Kaznacheev
2014/06/02 18:09:43
Lets test device list listeners as well. Maybe in
vkuzkokov
2014/06/03 09:20:50
There's another CL such test could be based on:
ht
| |
OLD | NEW |