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

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

Issue 980023002: Move device/usb classes from the FILE thread to UI thread. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 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
OLDNEW
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
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698