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

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: Assert UI message loop is idle. 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 11 matching lines...) Expand all
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
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
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 {
418 *manufacturer = base::UTF8ToUTF16(kDeviceManufacturer);
419 return true; 428 return true;
420 } 429 }
421 430
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
436 std::set<int> claimed_interfaces_; 431 std::set<int> claimed_interfaces_;
437 432
438 protected: 433 protected:
439 virtual ~MockUsbDevice() {} 434 virtual ~MockUsbDevice() {}
440 435
441 private: 436 private:
442 UsbConfigDescriptor config_desc_; 437 UsbConfigDescriptor config_desc_;
443 }; 438 };
444 439
445 class MockUsbService : public UsbService { 440 class MockUsbService : public UsbService {
446 public: 441 public:
447 MockUsbService() { 442 MockUsbService() {
448 devices_.push_back(new MockUsbDevice<AndroidTraits>()); 443 devices_.push_back(new MockUsbDevice<AndroidTraits>());
449 } 444 }
450 445
451 scoped_refptr<UsbDevice> GetDeviceById(uint32 unique_id) override { 446 scoped_refptr<UsbDevice> GetDeviceById(uint32 unique_id) override {
452 NOTIMPLEMENTED(); 447 NOTIMPLEMENTED();
453 return nullptr; 448 return nullptr;
454 } 449 }
455 450
456 void GetDevices(std::vector<scoped_refptr<UsbDevice>>* devices) override { 451 void GetDevices(const GetDevicesCallback& callback) override {
457 STLClearObject(devices); 452 callback.Run(devices_);
458 std::copy(devices_.begin(), devices_.end(), back_inserter(*devices));
459 } 453 }
460 454
461 std::vector<scoped_refptr<UsbDevice> > devices_; 455 std::vector<scoped_refptr<UsbDevice> > devices_;
462 }; 456 };
463 457
464 class MockBreakingUsbService : public UsbService { 458 class MockBreakingUsbService : public MockUsbService {
465 public: 459 public:
466 scoped_refptr<UsbDevice> GetDeviceById(uint32 unique_id) override { 460 MockBreakingUsbService() {
467 NOTIMPLEMENTED(); 461 devices_.clear();
468 return nullptr; 462 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 } 463 }
475 }; 464 };
476 465
477 class MockNoConfigUsbService : public UsbService { 466 class MockNoConfigUsbService : public MockUsbService {
478 public: 467 public:
479 scoped_refptr<UsbDevice> GetDeviceById(uint32 unique_id) override { 468 MockNoConfigUsbService() {
480 NOTIMPLEMENTED(); 469 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 } 470 }
489 }; 471 };
490 472
491 class MockUsbServiceForCheckingTraits : public UsbService { 473 class MockUsbServiceForCheckingTraits : public MockUsbService {
492 public: 474 public:
493 MockUsbServiceForCheckingTraits() : step_(0) {} 475 MockUsbServiceForCheckingTraits() : step_(0) {}
494 476
495 scoped_refptr<UsbDevice> GetDeviceById(uint32 unique_id) override { 477 void GetDevices(const GetDevicesCallback& callback) override {
496 NOTIMPLEMENTED(); 478 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 479 // This switch should be kept in sync with
503 // AndroidUsbBrowserTest::DeviceCountChanged. 480 // AndroidUsbBrowserTest::DeviceCountChanged.
504 switch (step_) { 481 switch (step_) {
505 case 0: 482 case 0:
506 // No devices. 483 // No devices.
507 break; 484 break;
508 case 1: 485 case 1:
509 // Android device. 486 // Android device.
510 devices->push_back(new MockUsbDevice<AndroidTraits>()); 487 devices.push_back(new MockUsbDevice<AndroidTraits>());
511 break; 488 break;
512 case 2: 489 case 2:
513 // Android and non-android device. 490 // Android and non-android device.
514 devices->push_back(new MockUsbDevice<AndroidTraits>()); 491 devices.push_back(new MockUsbDevice<AndroidTraits>());
515 devices->push_back(new MockUsbDevice<NonAndroidTraits>()); 492 devices.push_back(new MockUsbDevice<NonAndroidTraits>());
516 break; 493 break;
517 case 3: 494 case 3:
518 // Non-android device. 495 // Non-android device.
519 devices->push_back(new MockUsbDevice<NonAndroidTraits>()); 496 devices.push_back(new MockUsbDevice<NonAndroidTraits>());
520 break; 497 break;
521 } 498 }
522 step_++; 499 step_++;
500 callback.Run(devices);
523 } 501 }
524 502
525 private: 503 private:
526 int step_; 504 int step_;
527 }; 505 };
528 506
529 class DevToolsAndroidBridgeWarmUp 507 class DevToolsAndroidBridgeWarmUp
530 : public DevToolsAndroidBridge::DeviceCountListener { 508 : public DevToolsAndroidBridge::DeviceCountListener {
531 public: 509 public:
532 DevToolsAndroidBridgeWarmUp(base::Closure closure, 510 DevToolsAndroidBridgeWarmUp(base::Closure closure,
533 DevToolsAndroidBridge* adb_bridge) 511 DevToolsAndroidBridge* adb_bridge)
534 : closure_(closure), adb_bridge_(adb_bridge) {} 512 : closure_(closure), adb_bridge_(adb_bridge) {}
535 513
536 void DeviceCountChanged(int count) override { 514 void DeviceCountChanged(int count) override {
537 adb_bridge_->RemoveDeviceCountListener(this); 515 adb_bridge_->RemoveDeviceCountListener(this);
538 closure_.Run(); 516 closure_.Run();
539 } 517 }
540 518
541 base::Closure closure_; 519 base::Closure closure_;
542 DevToolsAndroidBridge* adb_bridge_; 520 DevToolsAndroidBridge* adb_bridge_;
543 }; 521 };
544 522
545 class AndroidUsbDiscoveryTest : public InProcessBrowserTest { 523 class AndroidUsbDiscoveryTest : public InProcessBrowserTest {
546 protected: 524 protected:
547 AndroidUsbDiscoveryTest() 525 AndroidUsbDiscoveryTest()
548 : scheduler_invoked_(0) { 526 : scheduler_invoked_(0) {
549 } 527 }
550 void SetUpOnMainThread() override { 528 void SetUpOnMainThread() override {
551 scoped_refptr<content::MessageLoopRunner> runner = 529 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 530
561 adb_bridge_ = 531 adb_bridge_ =
562 DevToolsAndroidBridge::Factory::GetForProfile(browser()->profile()); 532 DevToolsAndroidBridge::Factory::GetForProfile(browser()->profile());
563 DCHECK(adb_bridge_); 533 DCHECK(adb_bridge_);
564 adb_bridge_->set_task_scheduler_for_test(base::Bind( 534 adb_bridge_->set_task_scheduler_for_test(base::Bind(
565 &AndroidUsbDiscoveryTest::ScheduleDeviceCountRequest, this)); 535 &AndroidUsbDiscoveryTest::ScheduleDeviceCountRequest, this));
566 536
567 scoped_refptr<UsbDeviceProvider> provider = 537 scoped_refptr<UsbDeviceProvider> provider =
568 new UsbDeviceProvider(browser()->profile()); 538 new UsbDeviceProvider(browser()->profile());
569 539
570 AndroidDeviceManager::DeviceProviders providers; 540 AndroidDeviceManager::DeviceProviders providers;
571 providers.push_back(provider); 541 providers.push_back(provider);
572 adb_bridge_->set_device_providers_for_test(providers); 542 adb_bridge_->set_device_providers_for_test(providers);
573 runner_ = new content::MessageLoopRunner; 543 runner_ = new content::MessageLoopRunner;
574 } 544 }
575 545
576 void ScheduleDeviceCountRequest(const base::Closure& request) { 546 void ScheduleDeviceCountRequest(const base::Closure& request) {
577 DCHECK_CURRENTLY_ON(BrowserThread::UI); 547 DCHECK_CURRENTLY_ON(BrowserThread::UI);
578 scheduler_invoked_++; 548 scheduler_invoked_++;
579 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, request); 549 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, request);
580 } 550 }
581 551
582 virtual void SetUpService() { 552 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 553
598 scoped_refptr<content::MessageLoopRunner> runner_; 554 scoped_refptr<content::MessageLoopRunner> runner_;
555 scoped_ptr<MockUsbService> mock_usb_service_;
599 DevToolsAndroidBridge* adb_bridge_; 556 DevToolsAndroidBridge* adb_bridge_;
600 int scheduler_invoked_; 557 int scheduler_invoked_;
601 }; 558 };
602 559
603 class AndroidUsbCountTest : public AndroidUsbDiscoveryTest { 560 class AndroidUsbCountTest : public AndroidUsbDiscoveryTest {
604 protected: 561 protected:
605 void SetUpOnMainThread() override { 562 void SetUpOnMainThread() override {
606 AndroidUsbDiscoveryTest::SetUpOnMainThread(); 563 AndroidUsbDiscoveryTest::SetUpOnMainThread();
607 DevToolsAndroidBridgeWarmUp warmup(runner_->QuitClosure(), adb_bridge_); 564 DevToolsAndroidBridgeWarmUp warmup(runner_->QuitClosure(), adb_bridge_);
608 adb_bridge_->AddDeviceCountListener(&warmup); 565 adb_bridge_->AddDeviceCountListener(&warmup);
609 runner_->Run(); 566 runner_->Run();
610 runner_ = new content::MessageLoopRunner; 567 runner_ = new content::MessageLoopRunner;
611 } 568 }
612 }; 569 };
613 570
614 class AndroidUsbTraitsTest : public AndroidUsbDiscoveryTest { 571 class AndroidUsbTraitsTest : public AndroidUsbDiscoveryTest {
615 protected: 572 protected:
616 void SetUpService() override { 573 MockUsbService* CreateMockService() override {
617 UsbService::SetInstanceForTest(new MockUsbServiceForCheckingTraits()); 574 return new MockUsbServiceForCheckingTraits();
618 } 575 }
619 }; 576 };
620 577
621 class AndroidBreakingUsbTest : public AndroidUsbDiscoveryTest { 578 class AndroidBreakingUsbTest : public AndroidUsbDiscoveryTest {
622 protected: 579 protected:
623 void SetUpService() override { 580 MockUsbService* CreateMockService() override {
624 UsbService::SetInstanceForTest(new MockBreakingUsbService()); 581 return new MockBreakingUsbService();
625 } 582 }
626 }; 583 };
627 584
628 class AndroidNoConfigUsbTest : public AndroidUsbDiscoveryTest { 585 class AndroidNoConfigUsbTest : public AndroidUsbDiscoveryTest {
629 protected: 586 protected:
630 void SetUpService() override { 587 MockUsbService* CreateMockService() override {
631 UsbService::SetInstanceForTest(new MockNoConfigUsbService()); 588 return new MockNoConfigUsbService();
632 } 589 }
633 }; 590 };
634 591
635 class MockListListener : public DevToolsAndroidBridge::DeviceListListener { 592 class MockListListener : public DevToolsAndroidBridge::DeviceListListener {
636 public: 593 public:
637 MockListListener(DevToolsAndroidBridge* adb_bridge, 594 MockListListener(DevToolsAndroidBridge* adb_bridge,
638 const base::Closure& callback) 595 const base::Closure& callback)
639 : adb_bridge_(adb_bridge), 596 : adb_bridge_(adb_bridge),
640 callback_(callback) { 597 callback_(callback) {
641 } 598 }
(...skipping 13 matching lines...) Expand all
655 } 612 }
656 } 613 }
657 614
658 DevToolsAndroidBridge* adb_bridge_; 615 DevToolsAndroidBridge* adb_bridge_;
659 base::Closure callback_; 616 base::Closure callback_;
660 }; 617 };
661 618
662 class MockCountListener : public DevToolsAndroidBridge::DeviceCountListener { 619 class MockCountListener : public DevToolsAndroidBridge::DeviceCountListener {
663 public: 620 public:
664 explicit MockCountListener(DevToolsAndroidBridge* adb_bridge) 621 explicit MockCountListener(DevToolsAndroidBridge* adb_bridge)
665 : adb_bridge_(adb_bridge), 622 : adb_bridge_(adb_bridge), invoked_(0) {}
666 reposts_left_(10),
667 invoked_(0) {
668 }
669 623
670 void DeviceCountChanged(int count) override { 624 void DeviceCountChanged(int count) override {
671 ++invoked_; 625 ++invoked_;
672 adb_bridge_->RemoveDeviceCountListener(this); 626 adb_bridge_->RemoveDeviceCountListener(this);
673 Shutdown(); 627 Shutdown();
674 } 628 }
675 629
676 void Shutdown() { 630 void Shutdown() { base::MessageLoop::current()->Quit(); }
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 631
701 DevToolsAndroidBridge* adb_bridge_; 632 DevToolsAndroidBridge* adb_bridge_;
702 int reposts_left_;
703 int invoked_; 633 int invoked_;
704 }; 634 };
705 635
706 class MockCountListenerWithReAdd : public MockCountListener { 636 class MockCountListenerWithReAdd : public MockCountListener {
707 public: 637 public:
708 explicit MockCountListenerWithReAdd( 638 explicit MockCountListenerWithReAdd(
709 DevToolsAndroidBridge* adb_bridge) 639 DevToolsAndroidBridge* adb_bridge)
710 : MockCountListener(adb_bridge), 640 : MockCountListener(adb_bridge),
711 readd_count_(2) { 641 readd_count_(2) {
712 } 642 }
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
813 runner_->Run(); 743 runner_->Run();
814 } 744 }
815 745
816 IN_PROC_BROWSER_TEST_F(AndroidUsbCountTest, 746 IN_PROC_BROWSER_TEST_F(AndroidUsbCountTest,
817 TestNoMultipleCallsRemoveInCallback) { 747 TestNoMultipleCallsRemoveInCallback) {
818 MockCountListener listener(adb_bridge_); 748 MockCountListener listener(adb_bridge_);
819 adb_bridge_->AddDeviceCountListener(&listener); 749 adb_bridge_->AddDeviceCountListener(&listener);
820 runner_->Run(); 750 runner_->Run();
821 EXPECT_EQ(1, listener.invoked_); 751 EXPECT_EQ(1, listener.invoked_);
822 EXPECT_EQ(listener.invoked_ - 1, scheduler_invoked_); 752 EXPECT_EQ(listener.invoked_ - 1, scheduler_invoked_);
753 EXPECT_TRUE(base::MessageLoop::current()->IsIdleForTesting());
823 } 754 }
824 755
825 IN_PROC_BROWSER_TEST_F(AndroidUsbCountTest, 756 IN_PROC_BROWSER_TEST_F(AndroidUsbCountTest,
826 TestNoMultipleCallsRemoveAddInCallback) { 757 TestNoMultipleCallsRemoveAddInCallback) {
827 MockCountListenerWithReAdd listener(adb_bridge_); 758 MockCountListenerWithReAdd listener(adb_bridge_);
828 adb_bridge_->AddDeviceCountListener(&listener); 759 adb_bridge_->AddDeviceCountListener(&listener);
829 runner_->Run(); 760 runner_->Run();
830 EXPECT_EQ(3, listener.invoked_); 761 EXPECT_EQ(3, listener.invoked_);
831 EXPECT_EQ(listener.invoked_ - 1, scheduler_invoked_); 762 EXPECT_EQ(listener.invoked_ - 1, scheduler_invoked_);
763 EXPECT_TRUE(base::MessageLoop::current()->IsIdleForTesting());
832 } 764 }
833 765
834 IN_PROC_BROWSER_TEST_F(AndroidUsbCountTest, 766 IN_PROC_BROWSER_TEST_F(AndroidUsbCountTest,
835 TestNoMultipleCallsRemoveAddOnStart) { 767 TestNoMultipleCallsRemoveAddOnStart) {
836 MockCountListener listener(adb_bridge_); 768 MockCountListener listener(adb_bridge_);
837 adb_bridge_->AddDeviceCountListener(&listener); 769 adb_bridge_->AddDeviceCountListener(&listener);
838 adb_bridge_->RemoveDeviceCountListener(&listener); 770 adb_bridge_->RemoveDeviceCountListener(&listener);
839 adb_bridge_->AddDeviceCountListener(&listener); 771 adb_bridge_->AddDeviceCountListener(&listener);
840 runner_->Run(); 772 runner_->Run();
841 EXPECT_EQ(1, listener.invoked_); 773 EXPECT_EQ(1, listener.invoked_);
842 EXPECT_EQ(listener.invoked_ - 1, scheduler_invoked_); 774 EXPECT_EQ(listener.invoked_ - 1, scheduler_invoked_);
775 EXPECT_TRUE(base::MessageLoop::current()->IsIdleForTesting());
843 } 776 }
844 777
845 IN_PROC_BROWSER_TEST_F(AndroidUsbCountTest, 778 IN_PROC_BROWSER_TEST_F(AndroidUsbCountTest,
846 TestNoMultipleCallsRemoveAddWhileQueued) { 779 TestNoMultipleCallsRemoveAddWhileQueued) {
847 MockCountListenerWithReAddWhileQueued listener(adb_bridge_); 780 MockCountListenerWithReAddWhileQueued listener(adb_bridge_);
848 adb_bridge_->AddDeviceCountListener(&listener); 781 adb_bridge_->AddDeviceCountListener(&listener);
849 runner_->Run(); 782 runner_->Run();
850 EXPECT_EQ(2, listener.invoked_); 783 EXPECT_EQ(2, listener.invoked_);
851 EXPECT_EQ(listener.invoked_ - 1, scheduler_invoked_); 784 EXPECT_EQ(listener.invoked_ - 1, scheduler_invoked_);
785 EXPECT_TRUE(base::MessageLoop::current()->IsIdleForTesting());
852 } 786 }
853 787
854 IN_PROC_BROWSER_TEST_F(AndroidUsbTraitsTest, TestDeviceCounting) { 788 IN_PROC_BROWSER_TEST_F(AndroidUsbTraitsTest, TestDeviceCounting) {
855 MockCountListenerForCheckingTraits listener(adb_bridge_); 789 MockCountListenerForCheckingTraits listener(adb_bridge_);
856 adb_bridge_->AddDeviceCountListener(&listener); 790 adb_bridge_->AddDeviceCountListener(&listener);
857 runner_->Run(); 791 runner_->Run();
858 } 792 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698