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

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: Allow USB transfer calls from any thread again. 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 { 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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698