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 10 matching lines...) Expand all Loading... |
21 #include "testing/gtest/include/gtest/gtest.h" | 21 #include "testing/gtest/include/gtest/gtest.h" |
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::UsbSuccessCallback; |
31 using device::UsbSynchronizationType; | 32 using device::UsbSynchronizationType; |
32 using device::UsbTransferCallback; | 33 using device::UsbTransferCallback; |
33 using device::UsbTransferType; | 34 using device::UsbTransferType; |
34 using device::UsbUsageType; | 35 using device::UsbUsageType; |
35 | 36 |
36 namespace { | 37 namespace { |
37 | 38 |
38 struct NoConfigTraits { | 39 struct NoConfigTraits { |
39 static const int kClass = 0xff; | 40 static const int kClass = 0xff; |
40 static const int kSubclass = 0x42; | 41 static const int kSubclass = 0x42; |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
120 last_local_socket_(0), | 121 last_local_socket_(0), |
121 broken_(false) { | 122 broken_(false) { |
122 } | 123 } |
123 | 124 |
124 virtual scoped_refptr<UsbDevice> GetDevice() const override { | 125 virtual scoped_refptr<UsbDevice> GetDevice() const override { |
125 return device_; | 126 return device_; |
126 } | 127 } |
127 | 128 |
128 virtual void Close() override { device_ = nullptr; } | 129 virtual void Close() override { device_ = nullptr; } |
129 | 130 |
130 bool SetConfiguration(int configuration_value) override { return true; } | 131 void SetConfiguration(int configuration_value, |
| 132 const UsbSuccessCallback& callback) override { |
| 133 NOTIMPLEMENTED(); |
| 134 } |
131 | 135 |
132 bool ClaimInterface(int interface_number) override { | 136 void ClaimInterface(int interface_number, |
133 if (device_->claimed_interfaces_.find(interface_number) != | 137 const UsbSuccessCallback& callback) override { |
134 device_->claimed_interfaces_.end()) | 138 bool success = false; |
135 return false; | 139 if (device_->claimed_interfaces_.find(interface_number) == |
| 140 device_->claimed_interfaces_.end()) { |
| 141 device_->claimed_interfaces_.insert(interface_number); |
| 142 success = true; |
| 143 } |
136 | 144 |
137 device_->claimed_interfaces_.insert(interface_number); | 145 base::MessageLoop::current()->PostTask(FROM_HERE, |
138 return true; | 146 base::Bind(callback, success)); |
139 } | 147 } |
140 | 148 |
141 bool ReleaseInterface(int interface_number) override { | 149 bool ReleaseInterface(int interface_number) override { |
142 if (device_->claimed_interfaces_.find(interface_number) == | 150 if (device_->claimed_interfaces_.find(interface_number) == |
143 device_->claimed_interfaces_.end()) | 151 device_->claimed_interfaces_.end()) |
144 return false; | 152 return false; |
145 | 153 |
146 device_->claimed_interfaces_.erase(interface_number); | 154 device_->claimed_interfaces_.erase(interface_number); |
147 return true; | 155 return true; |
148 } | 156 } |
149 | 157 |
150 virtual bool SetInterfaceAlternateSetting(int interface_number, | 158 void SetInterfaceAlternateSetting( |
151 int alternate_setting) override { | 159 int interface_number, |
152 return true; | 160 int alternate_setting, |
| 161 const UsbSuccessCallback& callback) override { |
| 162 NOTIMPLEMENTED(); |
153 } | 163 } |
154 | 164 |
155 virtual bool ResetDevice() override { return true; } | 165 void ResetDevice(const UsbSuccessCallback& callback) override { |
156 bool GetStringDescriptor(uint8_t string_id, | 166 NOTIMPLEMENTED(); |
157 base::string16* content) override { | |
158 return false; | |
159 } | 167 } |
160 | 168 |
161 // Async IO. Can be called on any thread. | 169 // Async IO. Can be called on any thread. |
162 virtual void ControlTransfer(UsbEndpointDirection direction, | 170 void ControlTransfer(UsbEndpointDirection direction, |
163 TransferRequestType request_type, | 171 TransferRequestType request_type, |
164 TransferRecipient recipient, | 172 TransferRecipient recipient, |
165 uint8 request, | 173 uint8 request, |
166 uint16 value, | 174 uint16 value, |
167 uint16 index, | 175 uint16 index, |
168 net::IOBuffer* buffer, | 176 net::IOBuffer* buffer, |
169 size_t length, | 177 size_t length, |
170 unsigned int timeout, | 178 unsigned int timeout, |
171 const UsbTransferCallback& callback) override {} | 179 const UsbTransferCallback& callback) override {} |
172 | 180 |
173 virtual void BulkTransfer(UsbEndpointDirection direction, | 181 void BulkTransfer(UsbEndpointDirection direction, |
174 uint8 endpoint, | 182 uint8 endpoint, |
175 net::IOBuffer* buffer, | 183 net::IOBuffer* buffer, |
176 size_t length, | 184 size_t length, |
177 unsigned int timeout, | 185 unsigned int timeout, |
178 const UsbTransferCallback& callback) override { | 186 const UsbTransferCallback& callback) override { |
179 if (direction == device::USB_DIRECTION_OUTBOUND) { | 187 if (direction == device::USB_DIRECTION_OUTBOUND) { |
180 if (remaining_body_length_ == 0) { | 188 if (remaining_body_length_ == 0) { |
181 std::vector<uint32> header(6); | 189 std::vector<uint32> header(6); |
182 memcpy(&header[0], buffer->data(), length); | 190 memcpy(&header[0], buffer->data(), length); |
183 current_message_.reset( | 191 current_message_.reset( |
184 new AdbMessage(header[0], header[1], header[2], std::string())); | 192 new AdbMessage(header[0], header[1], header[2], std::string())); |
185 remaining_body_length_ = header[3]; | 193 remaining_body_length_ = header[3]; |
186 uint32 magic = header[5]; | 194 uint32 magic = header[5]; |
187 if ((current_message_->command ^ 0xffffffff) != magic) { | 195 if ((current_message_->command ^ 0xffffffff) != magic) { |
188 DCHECK(false) << "Header checksum error"; | 196 DCHECK(false) << "Header checksum error"; |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
329 output_buffer_.begin() + query.size); | 337 output_buffer_.begin() + query.size); |
330 base::MessageLoop::current()->PostTask( | 338 base::MessageLoop::current()->PostTask( |
331 FROM_HERE, | 339 FROM_HERE, |
332 base::Bind(query.callback, | 340 base::Bind(query.callback, |
333 device::USB_TRANSFER_COMPLETED, | 341 device::USB_TRANSFER_COMPLETED, |
334 query.buffer, | 342 query.buffer, |
335 query.size)); | 343 query.size)); |
336 | 344 |
337 } | 345 } |
338 | 346 |
339 virtual void InterruptTransfer(UsbEndpointDirection direction, | 347 void InterruptTransfer(UsbEndpointDirection direction, |
340 uint8 endpoint, | 348 uint8 endpoint, |
341 net::IOBuffer* buffer, | 349 net::IOBuffer* buffer, |
342 size_t length, | 350 size_t length, |
343 unsigned int timeout, | 351 unsigned int timeout, |
344 const UsbTransferCallback& callback) override { | 352 const UsbTransferCallback& callback) override {} |
345 } | |
346 | 353 |
347 virtual void IsochronousTransfer( | 354 void IsochronousTransfer(UsbEndpointDirection direction, |
348 UsbEndpointDirection direction, | 355 uint8 endpoint, |
349 uint8 endpoint, | 356 net::IOBuffer* buffer, |
350 net::IOBuffer* buffer, | 357 size_t length, |
351 size_t length, | 358 unsigned int packets, |
352 unsigned int packets, | 359 unsigned int packet_length, |
353 unsigned int packet_length, | 360 unsigned int timeout, |
354 unsigned int timeout, | 361 const UsbTransferCallback& callback) override {} |
355 const UsbTransferCallback& callback) override {} | |
356 | 362 |
357 protected: | 363 protected: |
358 virtual ~MockUsbDeviceHandle() {} | 364 virtual ~MockUsbDeviceHandle() {} |
359 | 365 |
360 struct Query { | 366 struct Query { |
361 UsbTransferCallback callback; | 367 UsbTransferCallback callback; |
362 scoped_refptr<net::IOBuffer> buffer; | 368 scoped_refptr<net::IOBuffer> buffer; |
363 size_t size; | 369 size_t size; |
364 | 370 |
365 Query(UsbTransferCallback callback, | 371 Query(UsbTransferCallback callback, |
366 scoped_refptr<net::IOBuffer> buffer, | 372 scoped_refptr<net::IOBuffer> buffer, |
367 int size) | 373 int size) |
368 : callback(callback), buffer(buffer), size(size) {}; | 374 : callback(callback), buffer(buffer), size(size) {} |
369 }; | 375 }; |
370 | 376 |
371 scoped_refptr<MockUsbDevice<T> > device_; | 377 scoped_refptr<MockUsbDevice<T> > device_; |
372 uint32 remaining_body_length_; | 378 uint32 remaining_body_length_; |
373 scoped_ptr<AdbMessage> current_message_; | 379 scoped_ptr<AdbMessage> current_message_; |
374 std::vector<char> output_buffer_; | 380 std::vector<char> output_buffer_; |
375 std::queue<Query> queries_; | 381 std::queue<Query> queries_; |
376 base::ScopedPtrHashMap<int, MockLocalSocket> local_sockets_; | 382 base::ScopedPtrHashMap<int, MockLocalSocket> local_sockets_; |
377 int last_local_socket_; | 383 int last_local_socket_; |
378 bool broken_; | 384 bool broken_; |
379 }; | 385 }; |
380 | 386 |
381 template <class T> | 387 template <class T> |
382 class MockUsbDevice : public UsbDevice { | 388 class MockUsbDevice : public UsbDevice { |
383 public: | 389 public: |
384 MockUsbDevice() : UsbDevice(0, 0, 0) { | 390 MockUsbDevice() |
| 391 : UsbDevice(0, |
| 392 0, |
| 393 0, |
| 394 base::UTF8ToUTF16(kDeviceManufacturer), |
| 395 base::UTF8ToUTF16(kDeviceModel), |
| 396 base::UTF8ToUTF16(kDeviceSerial)) { |
385 UsbEndpointDescriptor bulk_in; | 397 UsbEndpointDescriptor bulk_in; |
386 bulk_in.address = 0x81; | 398 bulk_in.address = 0x81; |
387 bulk_in.direction = device::USB_DIRECTION_INBOUND; | 399 bulk_in.direction = device::USB_DIRECTION_INBOUND; |
388 bulk_in.maximum_packet_size = 512; | 400 bulk_in.maximum_packet_size = 512; |
389 bulk_in.transfer_type = device::USB_TRANSFER_BULK; | 401 bulk_in.transfer_type = device::USB_TRANSFER_BULK; |
390 | 402 |
391 UsbEndpointDescriptor bulk_out; | 403 UsbEndpointDescriptor bulk_out; |
392 bulk_out.address = 0x01; | 404 bulk_out.address = 0x01; |
393 bulk_out.direction = device::USB_DIRECTION_OUTBOUND; | 405 bulk_out.direction = device::USB_DIRECTION_OUTBOUND; |
394 bulk_out.maximum_packet_size = 512; | 406 bulk_out.maximum_packet_size = 512; |
395 bulk_out.transfer_type = device::USB_TRANSFER_BULK; | 407 bulk_out.transfer_type = device::USB_TRANSFER_BULK; |
396 | 408 |
397 UsbInterfaceDescriptor interface_desc; | 409 UsbInterfaceDescriptor interface_desc; |
398 interface_desc.interface_number = 0; | 410 interface_desc.interface_number = 0; |
399 interface_desc.alternate_setting = 0; | 411 interface_desc.alternate_setting = 0; |
400 interface_desc.interface_class = T::kClass; | 412 interface_desc.interface_class = T::kClass; |
401 interface_desc.interface_subclass = T::kSubclass; | 413 interface_desc.interface_subclass = T::kSubclass; |
402 interface_desc.interface_protocol = T::kProtocol; | 414 interface_desc.interface_protocol = T::kProtocol; |
403 interface_desc.endpoints.push_back(bulk_in); | 415 interface_desc.endpoints.push_back(bulk_in); |
404 interface_desc.endpoints.push_back(bulk_out); | 416 interface_desc.endpoints.push_back(bulk_out); |
405 | 417 |
406 config_desc_.interfaces.push_back(interface_desc); | 418 config_desc_.interfaces.push_back(interface_desc); |
407 } | 419 } |
408 | 420 |
409 virtual scoped_refptr<UsbDeviceHandle> Open() override { | 421 void Open(const OpenCallback& callback) override { |
410 return new MockUsbDeviceHandle<T>(this); | 422 base::MessageLoop::current()->PostTask( |
| 423 FROM_HERE, base::Bind(callback, make_scoped_refptr( |
| 424 new MockUsbDeviceHandle<T>(this)))); |
411 } | 425 } |
412 | 426 |
413 virtual const UsbConfigDescriptor* GetConfiguration() override { | 427 const UsbConfigDescriptor* GetConfiguration() override { |
414 return T::kConfigured ? &config_desc_ : nullptr; | 428 return T::kConfigured ? &config_desc_ : nullptr; |
415 } | 429 } |
416 | 430 |
417 virtual bool GetManufacturer(base::string16* manufacturer) override { | 431 bool Close(scoped_refptr<UsbDeviceHandle> handle) override { return true; } |
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 | 432 |
436 #if defined(OS_CHROMEOS) | 433 #if defined(OS_CHROMEOS) |
437 // On ChromeOS, if an interface of a claimed device is not claimed, the | 434 // On ChromeOS, if an interface of a claimed device is not claimed, the |
438 // permission broker can change the owner of the device so that the unclaimed | 435 // permission broker can change the owner of the device so that the unclaimed |
439 // interfaces can be used. If this argument is missing, permission broker will | 436 // interfaces can be used. If this argument is missing, permission broker will |
440 // not be used and this method fails if the device is claimed. | 437 // not be used and this method fails if the device is claimed. |
441 virtual void RequestUsbAccess( | 438 void RequestUsbAccess( |
442 int interface_id, | 439 int interface_id, |
443 const base::Callback<void(bool success)>& callback) override { | 440 const base::Callback<void(bool success)>& callback) override { |
444 callback.Run(true); | 441 callback.Run(true); |
445 } | 442 } |
446 #endif // OS_CHROMEOS | 443 #endif // OS_CHROMEOS |
447 | 444 |
448 std::set<int> claimed_interfaces_; | 445 std::set<int> claimed_interfaces_; |
449 | 446 |
450 protected: | 447 protected: |
451 virtual ~MockUsbDevice() {} | 448 virtual ~MockUsbDevice() {} |
452 | 449 |
453 private: | 450 private: |
454 UsbConfigDescriptor config_desc_; | 451 UsbConfigDescriptor config_desc_; |
455 }; | 452 }; |
456 | 453 |
457 class MockUsbService : public UsbService { | 454 class MockUsbService : public UsbService { |
458 public: | 455 public: |
459 MockUsbService() { | 456 MockUsbService() { |
460 devices_.push_back(new MockUsbDevice<AndroidTraits>()); | 457 devices_.push_back(new MockUsbDevice<AndroidTraits>()); |
461 } | 458 } |
462 | 459 |
463 scoped_refptr<UsbDevice> GetDeviceById(uint32 unique_id) override { | 460 scoped_refptr<UsbDevice> GetDeviceById(uint32 unique_id) override { |
464 NOTIMPLEMENTED(); | 461 NOTIMPLEMENTED(); |
465 return nullptr; | 462 return nullptr; |
466 } | 463 } |
467 | 464 |
468 void GetDevices(std::vector<scoped_refptr<UsbDevice>>* devices) override { | 465 void GetDevices(const GetDevicesCallback& callback) override { |
469 STLClearObject(devices); | 466 callback.Run(devices_); |
470 std::copy(devices_.begin(), devices_.end(), back_inserter(*devices)); | |
471 } | 467 } |
472 | 468 |
473 std::vector<scoped_refptr<UsbDevice> > devices_; | 469 std::vector<scoped_refptr<UsbDevice> > devices_; |
474 }; | 470 }; |
475 | 471 |
476 class MockBreakingUsbService : public UsbService { | 472 class MockBreakingUsbService : public MockUsbService { |
477 public: | 473 public: |
478 scoped_refptr<UsbDevice> GetDeviceById(uint32 unique_id) override { | 474 MockBreakingUsbService() { |
479 NOTIMPLEMENTED(); | 475 devices_.clear(); |
480 return nullptr; | 476 devices_.push_back(new MockUsbDevice<BreakingAndroidTraits>()); |
481 } | |
482 | |
483 void GetDevices(std::vector<scoped_refptr<UsbDevice>>* devices) override { | |
484 STLClearObject(devices); | |
485 devices->push_back(new MockUsbDevice<BreakingAndroidTraits>()); | |
486 } | 477 } |
487 }; | 478 }; |
488 | 479 |
489 class MockNoConfigUsbService : public UsbService { | 480 class MockNoConfigUsbService : public MockUsbService { |
490 public: | 481 public: |
491 scoped_refptr<UsbDevice> GetDeviceById(uint32 unique_id) override { | 482 MockNoConfigUsbService() { |
492 NOTIMPLEMENTED(); | 483 devices_.push_back(new MockUsbDevice<NoConfigTraits>()); |
493 return nullptr; | |
494 } | |
495 | |
496 void GetDevices(std::vector<scoped_refptr<UsbDevice>>* devices) override { | |
497 STLClearObject(devices); | |
498 devices->push_back(new MockUsbDevice<AndroidTraits>()); | |
499 devices->push_back(new MockUsbDevice<NoConfigTraits>()); | |
500 } | 484 } |
501 }; | 485 }; |
502 | 486 |
503 class MockUsbServiceForCheckingTraits : public UsbService { | 487 class MockUsbServiceForCheckingTraits : public MockUsbService { |
504 public: | 488 public: |
505 MockUsbServiceForCheckingTraits() : step_(0) {} | 489 MockUsbServiceForCheckingTraits() : step_(0) {} |
506 | 490 |
507 scoped_refptr<UsbDevice> GetDeviceById(uint32 unique_id) override { | 491 void GetDevices(const GetDevicesCallback& callback) override { |
508 NOTIMPLEMENTED(); | 492 std::vector<scoped_refptr<UsbDevice>> devices; |
509 return nullptr; | |
510 } | |
511 | |
512 void GetDevices(std::vector<scoped_refptr<UsbDevice>>* devices) override { | |
513 STLClearObject(devices); | |
514 // This switch should be kept in sync with | 493 // This switch should be kept in sync with |
515 // AndroidUsbBrowserTest::DeviceCountChanged. | 494 // AndroidUsbBrowserTest::DeviceCountChanged. |
516 switch (step_) { | 495 switch (step_) { |
517 case 0: | 496 case 0: |
518 // No devices. | 497 // No devices. |
519 break; | 498 break; |
520 case 1: | 499 case 1: |
521 // Android device. | 500 // Android device. |
522 devices->push_back(new MockUsbDevice<AndroidTraits>()); | 501 devices.push_back(new MockUsbDevice<AndroidTraits>()); |
523 break; | 502 break; |
524 case 2: | 503 case 2: |
525 // Android and non-android device. | 504 // Android and non-android device. |
526 devices->push_back(new MockUsbDevice<AndroidTraits>()); | 505 devices.push_back(new MockUsbDevice<AndroidTraits>()); |
527 devices->push_back(new MockUsbDevice<NonAndroidTraits>()); | 506 devices.push_back(new MockUsbDevice<NonAndroidTraits>()); |
528 break; | 507 break; |
529 case 3: | 508 case 3: |
530 // Non-android device. | 509 // Non-android device. |
531 devices->push_back(new MockUsbDevice<NonAndroidTraits>()); | 510 devices.push_back(new MockUsbDevice<NonAndroidTraits>()); |
532 break; | 511 break; |
533 } | 512 } |
534 step_++; | 513 step_++; |
| 514 callback.Run(devices); |
535 } | 515 } |
536 | 516 |
537 private: | 517 private: |
538 int step_; | 518 int step_; |
539 }; | 519 }; |
540 | 520 |
541 class DevToolsAndroidBridgeWarmUp | 521 class DevToolsAndroidBridgeWarmUp |
542 : public DevToolsAndroidBridge::DeviceCountListener { | 522 : public DevToolsAndroidBridge::DeviceCountListener { |
543 public: | 523 public: |
544 DevToolsAndroidBridgeWarmUp(base::Closure closure, | 524 DevToolsAndroidBridgeWarmUp(base::Closure closure, |
545 DevToolsAndroidBridge* adb_bridge) | 525 DevToolsAndroidBridge* adb_bridge) |
546 : closure_(closure), adb_bridge_(adb_bridge) {} | 526 : closure_(closure), adb_bridge_(adb_bridge) {} |
547 | 527 |
548 void DeviceCountChanged(int count) override { | 528 void DeviceCountChanged(int count) override { |
549 adb_bridge_->RemoveDeviceCountListener(this); | 529 adb_bridge_->RemoveDeviceCountListener(this); |
550 closure_.Run(); | 530 closure_.Run(); |
551 } | 531 } |
552 | 532 |
553 base::Closure closure_; | 533 base::Closure closure_; |
554 DevToolsAndroidBridge* adb_bridge_; | 534 DevToolsAndroidBridge* adb_bridge_; |
555 }; | 535 }; |
556 | 536 |
557 class AndroidUsbDiscoveryTest : public InProcessBrowserTest { | 537 class AndroidUsbDiscoveryTest : public InProcessBrowserTest { |
558 protected: | 538 protected: |
559 AndroidUsbDiscoveryTest() | 539 AndroidUsbDiscoveryTest() |
560 : scheduler_invoked_(0) { | 540 : scheduler_invoked_(0) { |
561 } | 541 } |
562 void SetUpOnMainThread() override { | 542 void SetUpOnMainThread() override { |
563 scoped_refptr<content::MessageLoopRunner> runner = | 543 mock_usb_service_.reset(CreateMockService()); |
564 new content::MessageLoopRunner; | |
565 | |
566 BrowserThread::PostTaskAndReply( | |
567 BrowserThread::FILE, | |
568 FROM_HERE, | |
569 base::Bind(&AndroidUsbDiscoveryTest::SetUpService, this), | |
570 runner->QuitClosure()); | |
571 runner->Run(); | |
572 | 544 |
573 adb_bridge_ = | 545 adb_bridge_ = |
574 DevToolsAndroidBridge::Factory::GetForProfile(browser()->profile()); | 546 DevToolsAndroidBridge::Factory::GetForProfile(browser()->profile()); |
575 DCHECK(adb_bridge_); | 547 DCHECK(adb_bridge_); |
576 adb_bridge_->set_task_scheduler_for_test(base::Bind( | 548 adb_bridge_->set_task_scheduler_for_test(base::Bind( |
577 &AndroidUsbDiscoveryTest::ScheduleDeviceCountRequest, this)); | 549 &AndroidUsbDiscoveryTest::ScheduleDeviceCountRequest, this)); |
578 | 550 |
579 scoped_refptr<UsbDeviceProvider> provider = | 551 scoped_refptr<UsbDeviceProvider> provider = |
580 new UsbDeviceProvider(browser()->profile()); | 552 new UsbDeviceProvider(browser()->profile()); |
581 | 553 |
582 AndroidDeviceManager::DeviceProviders providers; | 554 AndroidDeviceManager::DeviceProviders providers; |
583 providers.push_back(provider); | 555 providers.push_back(provider); |
584 adb_bridge_->set_device_providers_for_test(providers); | 556 adb_bridge_->set_device_providers_for_test(providers); |
585 runner_ = new content::MessageLoopRunner; | 557 runner_ = new content::MessageLoopRunner; |
586 } | 558 } |
587 | 559 |
588 void ScheduleDeviceCountRequest(const base::Closure& request) { | 560 void ScheduleDeviceCountRequest(const base::Closure& request) { |
589 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 561 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
590 scheduler_invoked_++; | 562 scheduler_invoked_++; |
591 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, request); | 563 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, request); |
592 } | 564 } |
593 | 565 |
594 virtual void SetUpService() { | 566 virtual MockUsbService* CreateMockService() { return new MockUsbService(); } |
595 UsbService::SetInstanceForTest(new MockUsbService()); | |
596 } | |
597 | |
598 void TearDownOnMainThread() override { | |
599 scoped_refptr<content::MessageLoopRunner> runner = | |
600 new content::MessageLoopRunner; | |
601 UsbService* service = nullptr; | |
602 BrowserThread::PostTaskAndReply( | |
603 BrowserThread::FILE, | |
604 FROM_HERE, | |
605 base::Bind(&UsbService::SetInstanceForTest, service), | |
606 runner->QuitClosure()); | |
607 runner->Run(); | |
608 } | |
609 | 567 |
610 scoped_refptr<content::MessageLoopRunner> runner_; | 568 scoped_refptr<content::MessageLoopRunner> runner_; |
| 569 scoped_ptr<MockUsbService> mock_usb_service_; |
611 DevToolsAndroidBridge* adb_bridge_; | 570 DevToolsAndroidBridge* adb_bridge_; |
612 int scheduler_invoked_; | 571 int scheduler_invoked_; |
613 }; | 572 }; |
614 | 573 |
615 class AndroidUsbCountTest : public AndroidUsbDiscoveryTest { | 574 class AndroidUsbCountTest : public AndroidUsbDiscoveryTest { |
616 protected: | 575 protected: |
617 void SetUpOnMainThread() override { | 576 void SetUpOnMainThread() override { |
618 AndroidUsbDiscoveryTest::SetUpOnMainThread(); | 577 AndroidUsbDiscoveryTest::SetUpOnMainThread(); |
619 DevToolsAndroidBridgeWarmUp warmup(runner_->QuitClosure(), adb_bridge_); | 578 DevToolsAndroidBridgeWarmUp warmup(runner_->QuitClosure(), adb_bridge_); |
620 adb_bridge_->AddDeviceCountListener(&warmup); | 579 adb_bridge_->AddDeviceCountListener(&warmup); |
621 runner_->Run(); | 580 runner_->Run(); |
622 runner_ = new content::MessageLoopRunner; | 581 runner_ = new content::MessageLoopRunner; |
623 } | 582 } |
624 }; | 583 }; |
625 | 584 |
626 class AndroidUsbTraitsTest : public AndroidUsbDiscoveryTest { | 585 class AndroidUsbTraitsTest : public AndroidUsbDiscoveryTest { |
627 protected: | 586 protected: |
628 void SetUpService() override { | 587 MockUsbService* CreateMockService() override { |
629 UsbService::SetInstanceForTest(new MockUsbServiceForCheckingTraits()); | 588 return new MockUsbServiceForCheckingTraits(); |
630 } | 589 } |
631 }; | 590 }; |
632 | 591 |
633 class AndroidBreakingUsbTest : public AndroidUsbDiscoveryTest { | 592 class AndroidBreakingUsbTest : public AndroidUsbDiscoveryTest { |
634 protected: | 593 protected: |
635 void SetUpService() override { | 594 MockUsbService* CreateMockService() override { |
636 UsbService::SetInstanceForTest(new MockBreakingUsbService()); | 595 return new MockBreakingUsbService(); |
637 } | 596 } |
638 }; | 597 }; |
639 | 598 |
640 class AndroidNoConfigUsbTest : public AndroidUsbDiscoveryTest { | 599 class AndroidNoConfigUsbTest : public AndroidUsbDiscoveryTest { |
641 protected: | 600 protected: |
642 void SetUpService() override { | 601 MockUsbService* CreateMockService() override { |
643 UsbService::SetInstanceForTest(new MockNoConfigUsbService()); | 602 return new MockNoConfigUsbService(); |
644 } | 603 } |
645 }; | 604 }; |
646 | 605 |
647 class MockListListener : public DevToolsAndroidBridge::DeviceListListener { | 606 class MockListListener : public DevToolsAndroidBridge::DeviceListListener { |
648 public: | 607 public: |
649 MockListListener(DevToolsAndroidBridge* adb_bridge, | 608 MockListListener(DevToolsAndroidBridge* adb_bridge, |
650 const base::Closure& callback) | 609 const base::Closure& callback) |
651 : adb_bridge_(adb_bridge), | 610 : adb_bridge_(adb_bridge), |
652 callback_(callback) { | 611 callback_(callback) { |
653 } | 612 } |
(...skipping 13 matching lines...) Expand all Loading... |
667 } | 626 } |
668 } | 627 } |
669 | 628 |
670 DevToolsAndroidBridge* adb_bridge_; | 629 DevToolsAndroidBridge* adb_bridge_; |
671 base::Closure callback_; | 630 base::Closure callback_; |
672 }; | 631 }; |
673 | 632 |
674 class MockCountListener : public DevToolsAndroidBridge::DeviceCountListener { | 633 class MockCountListener : public DevToolsAndroidBridge::DeviceCountListener { |
675 public: | 634 public: |
676 explicit MockCountListener(DevToolsAndroidBridge* adb_bridge) | 635 explicit MockCountListener(DevToolsAndroidBridge* adb_bridge) |
677 : adb_bridge_(adb_bridge), | 636 : adb_bridge_(adb_bridge), invoked_(0) {} |
678 reposts_left_(10), | |
679 invoked_(0) { | |
680 } | |
681 | 637 |
682 void DeviceCountChanged(int count) override { | 638 void DeviceCountChanged(int count) override { |
683 ++invoked_; | 639 ++invoked_; |
684 adb_bridge_->RemoveDeviceCountListener(this); | 640 adb_bridge_->RemoveDeviceCountListener(this); |
685 Shutdown(); | 641 Shutdown(); |
686 } | 642 } |
687 | 643 |
688 void Shutdown() { | 644 void Shutdown() { base::MessageLoop::current()->Quit(); } |
689 ShutdownOnUIThread(); | |
690 }; | |
691 | |
692 void ShutdownOnUIThread() { | |
693 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
694 if (reposts_left_-- == 0) { | |
695 base::MessageLoop::current()->Quit(); | |
696 } else { | |
697 BrowserThread::PostTask( | |
698 BrowserThread::FILE, | |
699 FROM_HERE, | |
700 base::Bind(&MockCountListener::ShutdownOnFileThread, | |
701 base::Unretained(this))); | |
702 } | |
703 } | |
704 | |
705 void ShutdownOnFileThread() { | |
706 DCHECK_CURRENTLY_ON(BrowserThread::FILE); | |
707 BrowserThread::PostTask(BrowserThread::UI, | |
708 FROM_HERE, | |
709 base::Bind(&MockCountListener::ShutdownOnUIThread, | |
710 base::Unretained(this))); | |
711 } | |
712 | 645 |
713 DevToolsAndroidBridge* adb_bridge_; | 646 DevToolsAndroidBridge* adb_bridge_; |
714 int reposts_left_; | |
715 int invoked_; | 647 int invoked_; |
716 }; | 648 }; |
717 | 649 |
718 class MockCountListenerWithReAdd : public MockCountListener { | 650 class MockCountListenerWithReAdd : public MockCountListener { |
719 public: | 651 public: |
720 explicit MockCountListenerWithReAdd( | 652 explicit MockCountListenerWithReAdd( |
721 DevToolsAndroidBridge* adb_bridge) | 653 DevToolsAndroidBridge* adb_bridge) |
722 : MockCountListener(adb_bridge), | 654 : MockCountListener(adb_bridge), |
723 readd_count_(2) { | 655 readd_count_(2) { |
724 } | 656 } |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
861 runner_->Run(); | 793 runner_->Run(); |
862 EXPECT_EQ(2, listener.invoked_); | 794 EXPECT_EQ(2, listener.invoked_); |
863 EXPECT_EQ(listener.invoked_ - 1, scheduler_invoked_); | 795 EXPECT_EQ(listener.invoked_ - 1, scheduler_invoked_); |
864 } | 796 } |
865 | 797 |
866 IN_PROC_BROWSER_TEST_F(AndroidUsbTraitsTest, TestDeviceCounting) { | 798 IN_PROC_BROWSER_TEST_F(AndroidUsbTraitsTest, TestDeviceCounting) { |
867 MockCountListenerForCheckingTraits listener(adb_bridge_); | 799 MockCountListenerForCheckingTraits listener(adb_bridge_); |
868 adb_bridge_->AddDeviceCountListener(&listener); | 800 adb_bridge_->AddDeviceCountListener(&listener); |
869 runner_->Run(); | 801 runner_->Run(); |
870 } | 802 } |
OLD | NEW |