OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 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 <algorithm> | 5 #include <algorithm> |
6 | 6 |
7 #include "base/containers/scoped_ptr_hash_map.h" | 7 #include "base/containers/scoped_ptr_hash_map.h" |
8 #include "base/strings/utf_string_conversions.h" | 8 #include "base/strings/utf_string_conversions.h" |
9 #include "chrome/browser/devtools/device/adb/mock_adb_server.h" | 9 #include "chrome/browser/devtools/device/adb/mock_adb_server.h" |
10 #include "chrome/browser/devtools/device/devtools_android_bridge.h" | 10 #include "chrome/browser/devtools/device/devtools_android_bridge.h" |
(...skipping 11 matching lines...) Expand all Loading... | |
22 | 22 |
23 using content::BrowserThread; | 23 using content::BrowserThread; |
24 using device::UsbConfigDescriptor; | 24 using device::UsbConfigDescriptor; |
25 using device::UsbDevice; | 25 using device::UsbDevice; |
26 using device::UsbDeviceHandle; | 26 using device::UsbDeviceHandle; |
27 using device::UsbEndpointDescriptor; | 27 using device::UsbEndpointDescriptor; |
28 using device::UsbEndpointDirection; | 28 using device::UsbEndpointDirection; |
29 using device::UsbInterfaceDescriptor; | 29 using device::UsbInterfaceDescriptor; |
30 using device::UsbService; | 30 using device::UsbService; |
31 using device::UsbSynchronizationType; | 31 using device::UsbSynchronizationType; |
32 using device::UsbTransferCallback; | |
33 using device::UsbTransferType; | 32 using device::UsbTransferType; |
34 using device::UsbUsageType; | 33 using device::UsbUsageType; |
35 | 34 |
36 namespace { | 35 namespace { |
37 | 36 |
38 struct NoConfigTraits { | 37 struct NoConfigTraits { |
39 static const int kClass = 0xff; | 38 static const int kClass = 0xff; |
40 static const int kSubclass = 0x42; | 39 static const int kSubclass = 0x42; |
41 static const int kProtocol = 0x1; | 40 static const int kProtocol = 0x1; |
42 static const bool kBreaks = false; | 41 static const bool kBreaks = false; |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
120 last_local_socket_(0), | 119 last_local_socket_(0), |
121 broken_(false) { | 120 broken_(false) { |
122 } | 121 } |
123 | 122 |
124 virtual scoped_refptr<UsbDevice> GetDevice() const override { | 123 virtual scoped_refptr<UsbDevice> GetDevice() const override { |
125 return device_; | 124 return device_; |
126 } | 125 } |
127 | 126 |
128 virtual void Close() override { device_ = nullptr; } | 127 virtual void Close() override { device_ = nullptr; } |
129 | 128 |
130 bool SetConfiguration(int configuration_value) override { return true; } | 129 void SetConfiguration(int configuration_value, |
130 const ResultCallback& callback) override { | |
131 NOTIMPLEMENTED(); | |
132 } | |
131 | 133 |
132 bool ClaimInterface(int interface_number) override { | 134 void ClaimInterface(int interface_number, |
133 if (device_->claimed_interfaces_.find(interface_number) != | 135 const ResultCallback& callback) override { |
134 device_->claimed_interfaces_.end()) | 136 bool success = false; |
135 return false; | 137 if (device_->claimed_interfaces_.find(interface_number) == |
138 device_->claimed_interfaces_.end()) { | |
139 device_->claimed_interfaces_.insert(interface_number); | |
140 success = true; | |
141 } | |
136 | 142 |
137 device_->claimed_interfaces_.insert(interface_number); | 143 base::MessageLoop::current()->PostTask(FROM_HERE, |
138 return true; | 144 base::Bind(callback, success)); |
139 } | 145 } |
140 | 146 |
141 bool ReleaseInterface(int interface_number) override { | 147 bool ReleaseInterface(int interface_number) override { |
142 if (device_->claimed_interfaces_.find(interface_number) == | 148 if (device_->claimed_interfaces_.find(interface_number) == |
143 device_->claimed_interfaces_.end()) | 149 device_->claimed_interfaces_.end()) |
144 return false; | 150 return false; |
145 | 151 |
146 device_->claimed_interfaces_.erase(interface_number); | 152 device_->claimed_interfaces_.erase(interface_number); |
147 return true; | 153 return true; |
148 } | 154 } |
149 | 155 |
150 virtual bool SetInterfaceAlternateSetting(int interface_number, | 156 void SetInterfaceAlternateSetting(int interface_number, |
151 int alternate_setting) override { | 157 int alternate_setting, |
152 return true; | 158 const ResultCallback& callback) override { |
159 NOTIMPLEMENTED(); | |
153 } | 160 } |
154 | 161 |
155 virtual bool ResetDevice() override { return true; } | 162 void ResetDevice(const ResultCallback& callback) override { |
156 bool GetStringDescriptor(uint8_t string_id, | 163 NOTIMPLEMENTED(); |
157 base::string16* content) override { | |
158 return false; | |
159 } | 164 } |
160 | 165 |
161 // Async IO. Can be called on any thread. | 166 // Async IO. Can be called on any thread. |
162 virtual void ControlTransfer(UsbEndpointDirection direction, | 167 void ControlTransfer(UsbEndpointDirection direction, |
163 TransferRequestType request_type, | 168 TransferRequestType request_type, |
164 TransferRecipient recipient, | 169 TransferRecipient recipient, |
165 uint8 request, | 170 uint8 request, |
166 uint16 value, | 171 uint16 value, |
167 uint16 index, | 172 uint16 index, |
168 net::IOBuffer* buffer, | 173 scoped_refptr<net::IOBuffer> buffer, |
169 size_t length, | 174 size_t length, |
170 unsigned int timeout, | 175 unsigned int timeout, |
171 const UsbTransferCallback& callback) override {} | 176 const TransferCallback& callback) override {} |
172 | 177 |
173 virtual void BulkTransfer(UsbEndpointDirection direction, | 178 void BulkTransfer(UsbEndpointDirection direction, |
174 uint8 endpoint, | 179 uint8 endpoint, |
175 net::IOBuffer* buffer, | 180 scoped_refptr<net::IOBuffer> buffer, |
176 size_t length, | 181 size_t length, |
177 unsigned int timeout, | 182 unsigned int timeout, |
178 const UsbTransferCallback& callback) override { | 183 const TransferCallback& callback) override { |
179 if (direction == device::USB_DIRECTION_OUTBOUND) { | 184 if (direction == device::USB_DIRECTION_OUTBOUND) { |
180 if (remaining_body_length_ == 0) { | 185 if (remaining_body_length_ == 0) { |
181 std::vector<uint32> header(6); | 186 std::vector<uint32> header(6); |
182 memcpy(&header[0], buffer->data(), length); | 187 memcpy(&header[0], buffer->data(), length); |
183 current_message_.reset( | 188 current_message_.reset( |
184 new AdbMessage(header[0], header[1], header[2], std::string())); | 189 new AdbMessage(header[0], header[1], header[2], std::string())); |
185 remaining_body_length_ = header[3]; | 190 remaining_body_length_ = header[3]; |
186 uint32 magic = header[5]; | 191 uint32 magic = header[5]; |
187 if ((current_message_->command ^ 0xffffffff) != magic) { | 192 if ((current_message_->command ^ 0xffffffff) != magic) { |
188 DCHECK(false) << "Header checksum error"; | 193 DCHECK(false) << "Header checksum error"; |
189 return; | 194 return; |
190 } | 195 } |
191 } else { | 196 } else { |
192 DCHECK(current_message_.get()); | 197 DCHECK(current_message_.get()); |
193 current_message_->body += std::string(buffer->data(), length); | 198 current_message_->body += std::string(buffer->data(), length); |
194 remaining_body_length_ -= length; | 199 remaining_body_length_ -= length; |
195 } | 200 } |
196 | 201 |
197 if (remaining_body_length_ == 0) { | 202 if (remaining_body_length_ == 0) { |
198 ProcessIncoming(); | 203 ProcessIncoming(); |
199 } | 204 } |
200 | 205 |
201 device::UsbTransferStatus status = | 206 device::UsbTransferStatus status = |
202 broken_ ? device::USB_TRANSFER_ERROR : device::USB_TRANSFER_COMPLETED; | 207 broken_ ? device::USB_TRANSFER_ERROR : device::USB_TRANSFER_COMPLETED; |
203 base::MessageLoop::current()->PostTask( | 208 base::MessageLoop::current()->PostTask( |
204 FROM_HERE, | 209 FROM_HERE, base::Bind(callback, status, nullptr, 0)); |
205 base::Bind(callback, status, scoped_refptr<net::IOBuffer>(), 0)); | |
206 ProcessQueries(); | 210 ProcessQueries(); |
207 } else if (direction == device::USB_DIRECTION_INBOUND) { | 211 } else if (direction == device::USB_DIRECTION_INBOUND) { |
208 queries_.push(Query(callback, make_scoped_refptr(buffer), length)); | 212 queries_.push(Query(callback, buffer, length)); |
209 ProcessQueries(); | 213 ProcessQueries(); |
210 } | 214 } |
211 } | 215 } |
212 | 216 |
213 template <class D> | 217 template <class D> |
214 void append(D data) { | 218 void append(D data) { |
215 std::copy(reinterpret_cast<char*>(&data), | 219 std::copy(reinterpret_cast<char*>(&data), |
216 (reinterpret_cast<char*>(&data)) + sizeof(D), | 220 (reinterpret_cast<char*>(&data)) + sizeof(D), |
217 std::back_inserter(output_buffer_)); | 221 std::back_inserter(output_buffer_)); |
218 } | 222 } |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
329 output_buffer_.begin() + query.size); | 333 output_buffer_.begin() + query.size); |
330 base::MessageLoop::current()->PostTask( | 334 base::MessageLoop::current()->PostTask( |
331 FROM_HERE, | 335 FROM_HERE, |
332 base::Bind(query.callback, | 336 base::Bind(query.callback, |
333 device::USB_TRANSFER_COMPLETED, | 337 device::USB_TRANSFER_COMPLETED, |
334 query.buffer, | 338 query.buffer, |
335 query.size)); | 339 query.size)); |
336 | 340 |
337 } | 341 } |
338 | 342 |
339 virtual void InterruptTransfer(UsbEndpointDirection direction, | 343 void InterruptTransfer(UsbEndpointDirection direction, |
340 uint8 endpoint, | 344 uint8 endpoint, |
341 net::IOBuffer* buffer, | 345 scoped_refptr<net::IOBuffer> buffer, |
342 size_t length, | 346 size_t length, |
343 unsigned int timeout, | 347 unsigned int timeout, |
344 const UsbTransferCallback& callback) override { | 348 const TransferCallback& callback) override {} |
345 } | |
346 | 349 |
347 virtual void IsochronousTransfer( | 350 void IsochronousTransfer(UsbEndpointDirection direction, |
348 UsbEndpointDirection direction, | 351 uint8 endpoint, |
349 uint8 endpoint, | 352 scoped_refptr<net::IOBuffer> buffer, |
350 net::IOBuffer* buffer, | 353 size_t length, |
351 size_t length, | 354 unsigned int packets, |
352 unsigned int packets, | 355 unsigned int packet_length, |
353 unsigned int packet_length, | 356 unsigned int timeout, |
354 unsigned int timeout, | 357 const TransferCallback& callback) override {} |
355 const UsbTransferCallback& callback) override {} | |
356 | 358 |
357 protected: | 359 protected: |
358 virtual ~MockUsbDeviceHandle() {} | 360 virtual ~MockUsbDeviceHandle() {} |
359 | 361 |
360 struct Query { | 362 struct Query { |
361 UsbTransferCallback callback; | 363 TransferCallback callback; |
362 scoped_refptr<net::IOBuffer> buffer; | 364 scoped_refptr<net::IOBuffer> buffer; |
363 size_t size; | 365 size_t size; |
364 | 366 |
365 Query(UsbTransferCallback callback, | 367 Query(TransferCallback callback, |
366 scoped_refptr<net::IOBuffer> buffer, | 368 scoped_refptr<net::IOBuffer> buffer, |
367 int size) | 369 int size) |
368 : callback(callback), buffer(buffer), size(size) {}; | 370 : callback(callback), buffer(buffer), size(size) {} |
369 }; | 371 }; |
370 | 372 |
371 scoped_refptr<MockUsbDevice<T> > device_; | 373 scoped_refptr<MockUsbDevice<T> > device_; |
372 uint32 remaining_body_length_; | 374 uint32 remaining_body_length_; |
373 scoped_ptr<AdbMessage> current_message_; | 375 scoped_ptr<AdbMessage> current_message_; |
374 std::vector<char> output_buffer_; | 376 std::vector<char> output_buffer_; |
375 std::queue<Query> queries_; | 377 std::queue<Query> queries_; |
376 base::ScopedPtrHashMap<int, MockLocalSocket> local_sockets_; | 378 base::ScopedPtrHashMap<int, MockLocalSocket> local_sockets_; |
377 int last_local_socket_; | 379 int last_local_socket_; |
378 bool broken_; | 380 bool broken_; |
379 }; | 381 }; |
380 | 382 |
381 template <class T> | 383 template <class T> |
382 class MockUsbDevice : public UsbDevice { | 384 class MockUsbDevice : public UsbDevice { |
383 public: | 385 public: |
384 MockUsbDevice() : UsbDevice(0, 0, 0) { | 386 MockUsbDevice() |
387 : UsbDevice(0, | |
388 0, | |
389 0, | |
390 base::UTF8ToUTF16(kDeviceManufacturer), | |
391 base::UTF8ToUTF16(kDeviceModel), | |
392 base::UTF8ToUTF16(kDeviceSerial)) { | |
385 UsbEndpointDescriptor bulk_in; | 393 UsbEndpointDescriptor bulk_in; |
386 bulk_in.address = 0x81; | 394 bulk_in.address = 0x81; |
387 bulk_in.direction = device::USB_DIRECTION_INBOUND; | 395 bulk_in.direction = device::USB_DIRECTION_INBOUND; |
388 bulk_in.maximum_packet_size = 512; | 396 bulk_in.maximum_packet_size = 512; |
389 bulk_in.transfer_type = device::USB_TRANSFER_BULK; | 397 bulk_in.transfer_type = device::USB_TRANSFER_BULK; |
390 | 398 |
391 UsbEndpointDescriptor bulk_out; | 399 UsbEndpointDescriptor bulk_out; |
392 bulk_out.address = 0x01; | 400 bulk_out.address = 0x01; |
393 bulk_out.direction = device::USB_DIRECTION_OUTBOUND; | 401 bulk_out.direction = device::USB_DIRECTION_OUTBOUND; |
394 bulk_out.maximum_packet_size = 512; | 402 bulk_out.maximum_packet_size = 512; |
395 bulk_out.transfer_type = device::USB_TRANSFER_BULK; | 403 bulk_out.transfer_type = device::USB_TRANSFER_BULK; |
396 | 404 |
397 UsbInterfaceDescriptor interface_desc; | 405 UsbInterfaceDescriptor interface_desc; |
398 interface_desc.interface_number = 0; | 406 interface_desc.interface_number = 0; |
399 interface_desc.alternate_setting = 0; | 407 interface_desc.alternate_setting = 0; |
400 interface_desc.interface_class = T::kClass; | 408 interface_desc.interface_class = T::kClass; |
401 interface_desc.interface_subclass = T::kSubclass; | 409 interface_desc.interface_subclass = T::kSubclass; |
402 interface_desc.interface_protocol = T::kProtocol; | 410 interface_desc.interface_protocol = T::kProtocol; |
403 interface_desc.endpoints.push_back(bulk_in); | 411 interface_desc.endpoints.push_back(bulk_in); |
404 interface_desc.endpoints.push_back(bulk_out); | 412 interface_desc.endpoints.push_back(bulk_out); |
405 | 413 |
406 config_desc_.interfaces.push_back(interface_desc); | 414 config_desc_.interfaces.push_back(interface_desc); |
407 } | 415 } |
408 | 416 |
409 virtual scoped_refptr<UsbDeviceHandle> Open() override { | 417 void Open(const OpenCallback& callback) override { |
410 return new MockUsbDeviceHandle<T>(this); | 418 base::MessageLoop::current()->PostTask( |
419 FROM_HERE, base::Bind(callback, make_scoped_refptr( | |
420 new MockUsbDeviceHandle<T>(this)))); | |
411 } | 421 } |
412 | 422 |
413 virtual const UsbConfigDescriptor* GetConfiguration() override { | 423 const UsbConfigDescriptor* GetConfiguration() override { |
414 return T::kConfigured ? &config_desc_ : nullptr; | 424 return T::kConfigured ? &config_desc_ : nullptr; |
415 } | 425 } |
416 | 426 |
417 virtual bool GetManufacturer(base::string16* manufacturer) override { | 427 bool Close(scoped_refptr<UsbDeviceHandle> handle) override { return true; } |
vkuzkokov
2015/04/15 14:15:46
nit: keep it on three separate lines.
Reilly Grant (use Gerrit)
2015/04/15 20:03:47
I'll try but clang-format likes to put such defini
| |
418 *manufacturer = base::UTF8ToUTF16(kDeviceManufacturer); | |
419 return true; | |
420 } | |
421 | |
422 virtual bool GetProduct(base::string16* product) override { | |
423 *product = base::UTF8ToUTF16(kDeviceModel); | |
424 return true; | |
425 } | |
426 | |
427 virtual bool GetSerialNumber(base::string16* serial) override { | |
428 *serial = base::UTF8ToUTF16(kDeviceSerial); | |
429 return true; | |
430 } | |
431 | |
432 virtual bool Close(scoped_refptr<UsbDeviceHandle> handle) override { | |
433 return true; | |
434 } | |
435 | 428 |
436 std::set<int> claimed_interfaces_; | 429 std::set<int> claimed_interfaces_; |
437 | 430 |
438 protected: | 431 protected: |
439 virtual ~MockUsbDevice() {} | 432 virtual ~MockUsbDevice() {} |
440 | 433 |
441 private: | 434 private: |
442 UsbConfigDescriptor config_desc_; | 435 UsbConfigDescriptor config_desc_; |
443 }; | 436 }; |
444 | 437 |
445 class MockUsbService : public UsbService { | 438 class MockUsbService : public UsbService { |
446 public: | 439 public: |
447 MockUsbService() { | 440 MockUsbService() { |
448 devices_.push_back(new MockUsbDevice<AndroidTraits>()); | 441 devices_.push_back(new MockUsbDevice<AndroidTraits>()); |
449 } | 442 } |
450 | 443 |
451 scoped_refptr<UsbDevice> GetDeviceById(uint32 unique_id) override { | 444 scoped_refptr<UsbDevice> GetDeviceById(uint32 unique_id) override { |
452 NOTIMPLEMENTED(); | 445 NOTIMPLEMENTED(); |
453 return nullptr; | 446 return nullptr; |
454 } | 447 } |
455 | 448 |
456 void GetDevices(std::vector<scoped_refptr<UsbDevice>>* devices) override { | 449 void GetDevices(const GetDevicesCallback& callback) override { |
457 STLClearObject(devices); | 450 callback.Run(devices_); |
458 std::copy(devices_.begin(), devices_.end(), back_inserter(*devices)); | |
459 } | 451 } |
460 | 452 |
461 std::vector<scoped_refptr<UsbDevice> > devices_; | 453 std::vector<scoped_refptr<UsbDevice> > devices_; |
462 }; | 454 }; |
463 | 455 |
464 class MockBreakingUsbService : public UsbService { | 456 class MockBreakingUsbService : public MockUsbService { |
465 public: | 457 public: |
466 scoped_refptr<UsbDevice> GetDeviceById(uint32 unique_id) override { | 458 MockBreakingUsbService() { |
467 NOTIMPLEMENTED(); | 459 devices_.clear(); |
468 return nullptr; | 460 devices_.push_back(new MockUsbDevice<BreakingAndroidTraits>()); |
469 } | |
470 | |
471 void GetDevices(std::vector<scoped_refptr<UsbDevice>>* devices) override { | |
472 STLClearObject(devices); | |
473 devices->push_back(new MockUsbDevice<BreakingAndroidTraits>()); | |
474 } | 461 } |
475 }; | 462 }; |
476 | 463 |
477 class MockNoConfigUsbService : public UsbService { | 464 class MockNoConfigUsbService : public MockUsbService { |
478 public: | 465 public: |
479 scoped_refptr<UsbDevice> GetDeviceById(uint32 unique_id) override { | 466 MockNoConfigUsbService() { |
480 NOTIMPLEMENTED(); | 467 devices_.push_back(new MockUsbDevice<NoConfigTraits>()); |
481 return nullptr; | |
482 } | |
483 | |
484 void GetDevices(std::vector<scoped_refptr<UsbDevice>>* devices) override { | |
485 STLClearObject(devices); | |
486 devices->push_back(new MockUsbDevice<AndroidTraits>()); | |
487 devices->push_back(new MockUsbDevice<NoConfigTraits>()); | |
488 } | 468 } |
489 }; | 469 }; |
490 | 470 |
491 class MockUsbServiceForCheckingTraits : public UsbService { | 471 class MockUsbServiceForCheckingTraits : public MockUsbService { |
492 public: | 472 public: |
493 MockUsbServiceForCheckingTraits() : step_(0) {} | 473 MockUsbServiceForCheckingTraits() : step_(0) {} |
494 | 474 |
495 scoped_refptr<UsbDevice> GetDeviceById(uint32 unique_id) override { | 475 void GetDevices(const GetDevicesCallback& callback) override { |
496 NOTIMPLEMENTED(); | 476 std::vector<scoped_refptr<UsbDevice>> devices; |
497 return nullptr; | |
498 } | |
499 | |
500 void GetDevices(std::vector<scoped_refptr<UsbDevice>>* devices) override { | |
501 STLClearObject(devices); | |
502 // This switch should be kept in sync with | 477 // This switch should be kept in sync with |
503 // AndroidUsbBrowserTest::DeviceCountChanged. | 478 // AndroidUsbBrowserTest::DeviceCountChanged. |
504 switch (step_) { | 479 switch (step_) { |
505 case 0: | 480 case 0: |
506 // No devices. | 481 // No devices. |
507 break; | 482 break; |
508 case 1: | 483 case 1: |
509 // Android device. | 484 // Android device. |
510 devices->push_back(new MockUsbDevice<AndroidTraits>()); | 485 devices.push_back(new MockUsbDevice<AndroidTraits>()); |
511 break; | 486 break; |
512 case 2: | 487 case 2: |
513 // Android and non-android device. | 488 // Android and non-android device. |
514 devices->push_back(new MockUsbDevice<AndroidTraits>()); | 489 devices.push_back(new MockUsbDevice<AndroidTraits>()); |
515 devices->push_back(new MockUsbDevice<NonAndroidTraits>()); | 490 devices.push_back(new MockUsbDevice<NonAndroidTraits>()); |
516 break; | 491 break; |
517 case 3: | 492 case 3: |
518 // Non-android device. | 493 // Non-android device. |
519 devices->push_back(new MockUsbDevice<NonAndroidTraits>()); | 494 devices.push_back(new MockUsbDevice<NonAndroidTraits>()); |
520 break; | 495 break; |
521 } | 496 } |
522 step_++; | 497 step_++; |
498 callback.Run(devices); | |
523 } | 499 } |
524 | 500 |
525 private: | 501 private: |
526 int step_; | 502 int step_; |
527 }; | 503 }; |
528 | 504 |
529 class DevToolsAndroidBridgeWarmUp | 505 class DevToolsAndroidBridgeWarmUp |
530 : public DevToolsAndroidBridge::DeviceCountListener { | 506 : public DevToolsAndroidBridge::DeviceCountListener { |
531 public: | 507 public: |
532 DevToolsAndroidBridgeWarmUp(base::Closure closure, | 508 DevToolsAndroidBridgeWarmUp(base::Closure closure, |
533 DevToolsAndroidBridge* adb_bridge) | 509 DevToolsAndroidBridge* adb_bridge) |
534 : closure_(closure), adb_bridge_(adb_bridge) {} | 510 : closure_(closure), adb_bridge_(adb_bridge) {} |
535 | 511 |
536 void DeviceCountChanged(int count) override { | 512 void DeviceCountChanged(int count) override { |
537 adb_bridge_->RemoveDeviceCountListener(this); | 513 adb_bridge_->RemoveDeviceCountListener(this); |
538 closure_.Run(); | 514 closure_.Run(); |
539 } | 515 } |
540 | 516 |
541 base::Closure closure_; | 517 base::Closure closure_; |
542 DevToolsAndroidBridge* adb_bridge_; | 518 DevToolsAndroidBridge* adb_bridge_; |
543 }; | 519 }; |
544 | 520 |
545 class AndroidUsbDiscoveryTest : public InProcessBrowserTest { | 521 class AndroidUsbDiscoveryTest : public InProcessBrowserTest { |
546 protected: | 522 protected: |
547 AndroidUsbDiscoveryTest() | 523 AndroidUsbDiscoveryTest() |
548 : scheduler_invoked_(0) { | 524 : scheduler_invoked_(0) { |
549 } | 525 } |
550 void SetUpOnMainThread() override { | 526 void SetUpOnMainThread() override { |
551 scoped_refptr<content::MessageLoopRunner> runner = | 527 mock_usb_service_.reset(CreateMockService()); |
552 new content::MessageLoopRunner; | |
553 | |
554 BrowserThread::PostTaskAndReply( | |
555 BrowserThread::FILE, | |
556 FROM_HERE, | |
557 base::Bind(&AndroidUsbDiscoveryTest::SetUpService, this), | |
558 runner->QuitClosure()); | |
559 runner->Run(); | |
560 | 528 |
561 adb_bridge_ = | 529 adb_bridge_ = |
562 DevToolsAndroidBridge::Factory::GetForProfile(browser()->profile()); | 530 DevToolsAndroidBridge::Factory::GetForProfile(browser()->profile()); |
563 DCHECK(adb_bridge_); | 531 DCHECK(adb_bridge_); |
564 adb_bridge_->set_task_scheduler_for_test(base::Bind( | 532 adb_bridge_->set_task_scheduler_for_test(base::Bind( |
565 &AndroidUsbDiscoveryTest::ScheduleDeviceCountRequest, this)); | 533 &AndroidUsbDiscoveryTest::ScheduleDeviceCountRequest, this)); |
566 | 534 |
567 scoped_refptr<UsbDeviceProvider> provider = | 535 scoped_refptr<UsbDeviceProvider> provider = |
568 new UsbDeviceProvider(browser()->profile()); | 536 new UsbDeviceProvider(browser()->profile()); |
569 | 537 |
570 AndroidDeviceManager::DeviceProviders providers; | 538 AndroidDeviceManager::DeviceProviders providers; |
571 providers.push_back(provider); | 539 providers.push_back(provider); |
572 adb_bridge_->set_device_providers_for_test(providers); | 540 adb_bridge_->set_device_providers_for_test(providers); |
573 runner_ = new content::MessageLoopRunner; | 541 runner_ = new content::MessageLoopRunner; |
574 } | 542 } |
575 | 543 |
576 void ScheduleDeviceCountRequest(const base::Closure& request) { | 544 void ScheduleDeviceCountRequest(const base::Closure& request) { |
577 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 545 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
578 scheduler_invoked_++; | 546 scheduler_invoked_++; |
579 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, request); | 547 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, request); |
580 } | 548 } |
581 | 549 |
582 virtual void SetUpService() { | 550 virtual MockUsbService* CreateMockService() { return new MockUsbService(); } |
583 UsbService::SetInstanceForTest(new MockUsbService()); | |
584 } | |
585 | |
586 void TearDownOnMainThread() override { | |
587 scoped_refptr<content::MessageLoopRunner> runner = | |
588 new content::MessageLoopRunner; | |
589 UsbService* service = nullptr; | |
590 BrowserThread::PostTaskAndReply( | |
591 BrowserThread::FILE, | |
592 FROM_HERE, | |
593 base::Bind(&UsbService::SetInstanceForTest, service), | |
594 runner->QuitClosure()); | |
595 runner->Run(); | |
596 } | |
597 | 551 |
598 scoped_refptr<content::MessageLoopRunner> runner_; | 552 scoped_refptr<content::MessageLoopRunner> runner_; |
553 scoped_ptr<MockUsbService> mock_usb_service_; | |
599 DevToolsAndroidBridge* adb_bridge_; | 554 DevToolsAndroidBridge* adb_bridge_; |
600 int scheduler_invoked_; | 555 int scheduler_invoked_; |
601 }; | 556 }; |
602 | 557 |
603 class AndroidUsbCountTest : public AndroidUsbDiscoveryTest { | 558 class AndroidUsbCountTest : public AndroidUsbDiscoveryTest { |
604 protected: | 559 protected: |
605 void SetUpOnMainThread() override { | 560 void SetUpOnMainThread() override { |
606 AndroidUsbDiscoveryTest::SetUpOnMainThread(); | 561 AndroidUsbDiscoveryTest::SetUpOnMainThread(); |
607 DevToolsAndroidBridgeWarmUp warmup(runner_->QuitClosure(), adb_bridge_); | 562 DevToolsAndroidBridgeWarmUp warmup(runner_->QuitClosure(), adb_bridge_); |
608 adb_bridge_->AddDeviceCountListener(&warmup); | 563 adb_bridge_->AddDeviceCountListener(&warmup); |
609 runner_->Run(); | 564 runner_->Run(); |
610 runner_ = new content::MessageLoopRunner; | 565 runner_ = new content::MessageLoopRunner; |
611 } | 566 } |
612 }; | 567 }; |
613 | 568 |
614 class AndroidUsbTraitsTest : public AndroidUsbDiscoveryTest { | 569 class AndroidUsbTraitsTest : public AndroidUsbDiscoveryTest { |
615 protected: | 570 protected: |
616 void SetUpService() override { | 571 MockUsbService* CreateMockService() override { |
617 UsbService::SetInstanceForTest(new MockUsbServiceForCheckingTraits()); | 572 return new MockUsbServiceForCheckingTraits(); |
618 } | 573 } |
619 }; | 574 }; |
620 | 575 |
621 class AndroidBreakingUsbTest : public AndroidUsbDiscoveryTest { | 576 class AndroidBreakingUsbTest : public AndroidUsbDiscoveryTest { |
622 protected: | 577 protected: |
623 void SetUpService() override { | 578 MockUsbService* CreateMockService() override { |
624 UsbService::SetInstanceForTest(new MockBreakingUsbService()); | 579 return new MockBreakingUsbService(); |
625 } | 580 } |
626 }; | 581 }; |
627 | 582 |
628 class AndroidNoConfigUsbTest : public AndroidUsbDiscoveryTest { | 583 class AndroidNoConfigUsbTest : public AndroidUsbDiscoveryTest { |
629 protected: | 584 protected: |
630 void SetUpService() override { | 585 MockUsbService* CreateMockService() override { |
631 UsbService::SetInstanceForTest(new MockNoConfigUsbService()); | 586 return new MockNoConfigUsbService(); |
632 } | 587 } |
633 }; | 588 }; |
634 | 589 |
635 class MockListListener : public DevToolsAndroidBridge::DeviceListListener { | 590 class MockListListener : public DevToolsAndroidBridge::DeviceListListener { |
636 public: | 591 public: |
637 MockListListener(DevToolsAndroidBridge* adb_bridge, | 592 MockListListener(DevToolsAndroidBridge* adb_bridge, |
638 const base::Closure& callback) | 593 const base::Closure& callback) |
639 : adb_bridge_(adb_bridge), | 594 : adb_bridge_(adb_bridge), |
640 callback_(callback) { | 595 callback_(callback) { |
641 } | 596 } |
(...skipping 13 matching lines...) Expand all Loading... | |
655 } | 610 } |
656 } | 611 } |
657 | 612 |
658 DevToolsAndroidBridge* adb_bridge_; | 613 DevToolsAndroidBridge* adb_bridge_; |
659 base::Closure callback_; | 614 base::Closure callback_; |
660 }; | 615 }; |
661 | 616 |
662 class MockCountListener : public DevToolsAndroidBridge::DeviceCountListener { | 617 class MockCountListener : public DevToolsAndroidBridge::DeviceCountListener { |
663 public: | 618 public: |
664 explicit MockCountListener(DevToolsAndroidBridge* adb_bridge) | 619 explicit MockCountListener(DevToolsAndroidBridge* adb_bridge) |
665 : adb_bridge_(adb_bridge), | 620 : adb_bridge_(adb_bridge), invoked_(0) {} |
666 reposts_left_(10), | |
667 invoked_(0) { | |
668 } | |
669 | 621 |
670 void DeviceCountChanged(int count) override { | 622 void DeviceCountChanged(int count) override { |
671 ++invoked_; | 623 ++invoked_; |
672 adb_bridge_->RemoveDeviceCountListener(this); | 624 adb_bridge_->RemoveDeviceCountListener(this); |
673 Shutdown(); | 625 Shutdown(); |
674 } | 626 } |
675 | 627 |
676 void Shutdown() { | 628 void Shutdown() { base::MessageLoop::current()->Quit(); } |
vkuzkokov
2015/04/15 14:15:46
Thread-hopping serves a purpose in test. We check
Reilly Grant (use Gerrit)
2015/04/15 20:03:47
I think this is tested by the AndroidUsbCountTests
vkuzkokov
2015/04/15 21:58:06
That last check is enough. Bouncing is needed in c
Reilly Grant (use Gerrit)
2015/04/15 22:26:44
The FILE thread isn't used anymore so I can just u
| |
677 ShutdownOnUIThread(); | |
678 }; | |
679 | |
680 void ShutdownOnUIThread() { | |
681 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
682 if (reposts_left_-- == 0) { | |
683 base::MessageLoop::current()->Quit(); | |
684 } else { | |
685 BrowserThread::PostTask( | |
686 BrowserThread::FILE, | |
687 FROM_HERE, | |
688 base::Bind(&MockCountListener::ShutdownOnFileThread, | |
689 base::Unretained(this))); | |
690 } | |
691 } | |
692 | |
693 void ShutdownOnFileThread() { | |
694 DCHECK_CURRENTLY_ON(BrowserThread::FILE); | |
695 BrowserThread::PostTask(BrowserThread::UI, | |
696 FROM_HERE, | |
697 base::Bind(&MockCountListener::ShutdownOnUIThread, | |
698 base::Unretained(this))); | |
699 } | |
700 | 629 |
701 DevToolsAndroidBridge* adb_bridge_; | 630 DevToolsAndroidBridge* adb_bridge_; |
702 int reposts_left_; | |
703 int invoked_; | 631 int invoked_; |
704 }; | 632 }; |
705 | 633 |
706 class MockCountListenerWithReAdd : public MockCountListener { | 634 class MockCountListenerWithReAdd : public MockCountListener { |
707 public: | 635 public: |
708 explicit MockCountListenerWithReAdd( | 636 explicit MockCountListenerWithReAdd( |
709 DevToolsAndroidBridge* adb_bridge) | 637 DevToolsAndroidBridge* adb_bridge) |
710 : MockCountListener(adb_bridge), | 638 : MockCountListener(adb_bridge), |
711 readd_count_(2) { | 639 readd_count_(2) { |
712 } | 640 } |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
849 runner_->Run(); | 777 runner_->Run(); |
850 EXPECT_EQ(2, listener.invoked_); | 778 EXPECT_EQ(2, listener.invoked_); |
851 EXPECT_EQ(listener.invoked_ - 1, scheduler_invoked_); | 779 EXPECT_EQ(listener.invoked_ - 1, scheduler_invoked_); |
852 } | 780 } |
853 | 781 |
854 IN_PROC_BROWSER_TEST_F(AndroidUsbTraitsTest, TestDeviceCounting) { | 782 IN_PROC_BROWSER_TEST_F(AndroidUsbTraitsTest, TestDeviceCounting) { |
855 MockCountListenerForCheckingTraits listener(adb_bridge_); | 783 MockCountListenerForCheckingTraits listener(adb_bridge_); |
856 adb_bridge_->AddDeviceCountListener(&listener); | 784 adb_bridge_->AddDeviceCountListener(&listener); |
857 runner_->Run(); | 785 runner_->Run(); |
858 } | 786 } |
OLD | NEW |