| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <algorithm> | 5 #include <algorithm> |
| 6 | 6 |
| 7 #include "base/containers/scoped_ptr_hash_map.h" | 7 #include "base/containers/scoped_ptr_hash_map.h" |
| 8 #include "base/strings/utf_string_conversions.h" | 8 #include "base/strings/utf_string_conversions.h" |
| 9 #include "chrome/browser/devtools/device/adb/mock_adb_server.h" | 9 #include "chrome/browser/devtools/device/adb/mock_adb_server.h" |
| 10 #include "chrome/browser/devtools/device/devtools_android_bridge.h" | 10 #include "chrome/browser/devtools/device/devtools_android_bridge.h" |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 | 22 |
| 23 using content::BrowserThread; | 23 using content::BrowserThread; |
| 24 using device::UsbConfigDescriptor; | 24 using device::UsbConfigDescriptor; |
| 25 using device::UsbDevice; | 25 using device::UsbDevice; |
| 26 using device::UsbDeviceHandle; | 26 using device::UsbDeviceHandle; |
| 27 using device::UsbEndpointDescriptor; | 27 using device::UsbEndpointDescriptor; |
| 28 using device::UsbEndpointDirection; | 28 using device::UsbEndpointDirection; |
| 29 using device::UsbInterfaceDescriptor; | 29 using device::UsbInterfaceDescriptor; |
| 30 using device::UsbService; | 30 using device::UsbService; |
| 31 using device::UsbSynchronizationType; | 31 using device::UsbSynchronizationType; |
| 32 using device::UsbTransferCallback; | |
| 33 using device::UsbTransferType; | 32 using device::UsbTransferType; |
| 34 using device::UsbUsageType; | 33 using device::UsbUsageType; |
| 35 | 34 |
| 36 namespace { | 35 namespace { |
| 37 | 36 |
| 38 struct NoConfigTraits { | 37 struct NoConfigTraits { |
| 39 static const int kClass = 0xff; | 38 static const int kClass = 0xff; |
| 40 static const int kSubclass = 0x42; | 39 static const int kSubclass = 0x42; |
| 41 static const int kProtocol = 0x1; | 40 static const int kProtocol = 0x1; |
| 42 static const bool kBreaks = false; | 41 static const bool kBreaks = false; |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 120 last_local_socket_(0), | 119 last_local_socket_(0), |
| 121 broken_(false) { | 120 broken_(false) { |
| 122 } | 121 } |
| 123 | 122 |
| 124 virtual scoped_refptr<UsbDevice> GetDevice() const override { | 123 virtual scoped_refptr<UsbDevice> GetDevice() const override { |
| 125 return device_; | 124 return device_; |
| 126 } | 125 } |
| 127 | 126 |
| 128 virtual void Close() override { device_ = nullptr; } | 127 virtual void Close() override { device_ = nullptr; } |
| 129 | 128 |
| 130 bool SetConfiguration(int configuration_value) override { return true; } | 129 void SetConfiguration(int configuration_value, |
| 130 const ResultCallback& callback) override { |
| 131 NOTIMPLEMENTED(); |
| 132 } |
| 131 | 133 |
| 132 bool ClaimInterface(int interface_number) override { | 134 void ClaimInterface(int interface_number, |
| 133 if (device_->claimed_interfaces_.find(interface_number) != | 135 const ResultCallback& callback) override { |
| 134 device_->claimed_interfaces_.end()) | 136 bool success = false; |
| 135 return false; | 137 if (device_->claimed_interfaces_.find(interface_number) == |
| 138 device_->claimed_interfaces_.end()) { |
| 139 device_->claimed_interfaces_.insert(interface_number); |
| 140 success = true; |
| 141 } |
| 136 | 142 |
| 137 device_->claimed_interfaces_.insert(interface_number); | 143 base::MessageLoop::current()->PostTask(FROM_HERE, |
| 138 return true; | 144 base::Bind(callback, success)); |
| 139 } | 145 } |
| 140 | 146 |
| 141 bool ReleaseInterface(int interface_number) override { | 147 bool ReleaseInterface(int interface_number) override { |
| 142 if (device_->claimed_interfaces_.find(interface_number) == | 148 if (device_->claimed_interfaces_.find(interface_number) == |
| 143 device_->claimed_interfaces_.end()) | 149 device_->claimed_interfaces_.end()) |
| 144 return false; | 150 return false; |
| 145 | 151 |
| 146 device_->claimed_interfaces_.erase(interface_number); | 152 device_->claimed_interfaces_.erase(interface_number); |
| 147 return true; | 153 return true; |
| 148 } | 154 } |
| 149 | 155 |
| 150 virtual bool SetInterfaceAlternateSetting(int interface_number, | 156 void SetInterfaceAlternateSetting(int interface_number, |
| 151 int alternate_setting) override { | 157 int alternate_setting, |
| 152 return true; | 158 const ResultCallback& callback) override { |
| 159 NOTIMPLEMENTED(); |
| 153 } | 160 } |
| 154 | 161 |
| 155 virtual bool ResetDevice() override { return true; } | 162 void ResetDevice(const ResultCallback& callback) override { |
| 156 bool GetStringDescriptor(uint8_t string_id, | 163 NOTIMPLEMENTED(); |
| 157 base::string16* content) override { | |
| 158 return false; | |
| 159 } | 164 } |
| 160 | 165 |
| 161 // Async IO. Can be called on any thread. | 166 // Async IO. Can be called on any thread. |
| 162 virtual void ControlTransfer(UsbEndpointDirection direction, | 167 void ControlTransfer(UsbEndpointDirection direction, |
| 163 TransferRequestType request_type, | 168 TransferRequestType request_type, |
| 164 TransferRecipient recipient, | 169 TransferRecipient recipient, |
| 165 uint8 request, | 170 uint8 request, |
| 166 uint16 value, | 171 uint16 value, |
| 167 uint16 index, | 172 uint16 index, |
| 168 net::IOBuffer* buffer, | 173 scoped_refptr<net::IOBuffer> buffer, |
| 169 size_t length, | 174 size_t length, |
| 170 unsigned int timeout, | 175 unsigned int timeout, |
| 171 const UsbTransferCallback& callback) override {} | 176 const TransferCallback& callback) override {} |
| 172 | 177 |
| 173 virtual void BulkTransfer(UsbEndpointDirection direction, | 178 void BulkTransfer(UsbEndpointDirection direction, |
| 174 uint8 endpoint, | 179 uint8 endpoint, |
| 175 net::IOBuffer* buffer, | 180 scoped_refptr<net::IOBuffer> buffer, |
| 176 size_t length, | 181 size_t length, |
| 177 unsigned int timeout, | 182 unsigned int timeout, |
| 178 const UsbTransferCallback& callback) override { | 183 const TransferCallback& callback) override { |
| 179 if (direction == device::USB_DIRECTION_OUTBOUND) { | 184 if (direction == device::USB_DIRECTION_OUTBOUND) { |
| 180 if (remaining_body_length_ == 0) { | 185 if (remaining_body_length_ == 0) { |
| 181 std::vector<uint32> header(6); | 186 std::vector<uint32> header(6); |
| 182 memcpy(&header[0], buffer->data(), length); | 187 memcpy(&header[0], buffer->data(), length); |
| 183 current_message_.reset( | 188 current_message_.reset( |
| 184 new AdbMessage(header[0], header[1], header[2], std::string())); | 189 new AdbMessage(header[0], header[1], header[2], std::string())); |
| 185 remaining_body_length_ = header[3]; | 190 remaining_body_length_ = header[3]; |
| 186 uint32 magic = header[5]; | 191 uint32 magic = header[5]; |
| 187 if ((current_message_->command ^ 0xffffffff) != magic) { | 192 if ((current_message_->command ^ 0xffffffff) != magic) { |
| 188 DCHECK(false) << "Header checksum error"; | 193 DCHECK(false) << "Header checksum error"; |
| 189 return; | 194 return; |
| 190 } | 195 } |
| 191 } else { | 196 } else { |
| 192 DCHECK(current_message_.get()); | 197 DCHECK(current_message_.get()); |
| 193 current_message_->body += std::string(buffer->data(), length); | 198 current_message_->body += std::string(buffer->data(), length); |
| 194 remaining_body_length_ -= length; | 199 remaining_body_length_ -= length; |
| 195 } | 200 } |
| 196 | 201 |
| 197 if (remaining_body_length_ == 0) { | 202 if (remaining_body_length_ == 0) { |
| 198 ProcessIncoming(); | 203 ProcessIncoming(); |
| 199 } | 204 } |
| 200 | 205 |
| 201 device::UsbTransferStatus status = | 206 device::UsbTransferStatus status = |
| 202 broken_ ? device::USB_TRANSFER_ERROR : device::USB_TRANSFER_COMPLETED; | 207 broken_ ? device::USB_TRANSFER_ERROR : device::USB_TRANSFER_COMPLETED; |
| 203 base::MessageLoop::current()->PostTask( | 208 base::MessageLoop::current()->PostTask( |
| 204 FROM_HERE, | 209 FROM_HERE, base::Bind(callback, status, nullptr, 0)); |
| 205 base::Bind(callback, status, scoped_refptr<net::IOBuffer>(), 0)); | |
| 206 ProcessQueries(); | 210 ProcessQueries(); |
| 207 } else if (direction == device::USB_DIRECTION_INBOUND) { | 211 } else if (direction == device::USB_DIRECTION_INBOUND) { |
| 208 queries_.push(Query(callback, make_scoped_refptr(buffer), length)); | 212 queries_.push(Query(callback, buffer, length)); |
| 209 ProcessQueries(); | 213 ProcessQueries(); |
| 210 } | 214 } |
| 211 } | 215 } |
| 212 | 216 |
| 213 template <class D> | 217 template <class D> |
| 214 void append(D data) { | 218 void append(D data) { |
| 215 std::copy(reinterpret_cast<char*>(&data), | 219 std::copy(reinterpret_cast<char*>(&data), |
| 216 (reinterpret_cast<char*>(&data)) + sizeof(D), | 220 (reinterpret_cast<char*>(&data)) + sizeof(D), |
| 217 std::back_inserter(output_buffer_)); | 221 std::back_inserter(output_buffer_)); |
| 218 } | 222 } |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 329 output_buffer_.begin() + query.size); | 333 output_buffer_.begin() + query.size); |
| 330 base::MessageLoop::current()->PostTask( | 334 base::MessageLoop::current()->PostTask( |
| 331 FROM_HERE, | 335 FROM_HERE, |
| 332 base::Bind(query.callback, | 336 base::Bind(query.callback, |
| 333 device::USB_TRANSFER_COMPLETED, | 337 device::USB_TRANSFER_COMPLETED, |
| 334 query.buffer, | 338 query.buffer, |
| 335 query.size)); | 339 query.size)); |
| 336 | 340 |
| 337 } | 341 } |
| 338 | 342 |
| 339 virtual void InterruptTransfer(UsbEndpointDirection direction, | 343 void InterruptTransfer(UsbEndpointDirection direction, |
| 340 uint8 endpoint, | 344 uint8 endpoint, |
| 341 net::IOBuffer* buffer, | 345 scoped_refptr<net::IOBuffer> buffer, |
| 342 size_t length, | 346 size_t length, |
| 343 unsigned int timeout, | 347 unsigned int timeout, |
| 344 const UsbTransferCallback& callback) override { | 348 const TransferCallback& callback) override {} |
| 345 } | |
| 346 | 349 |
| 347 virtual void IsochronousTransfer( | 350 void IsochronousTransfer(UsbEndpointDirection direction, |
| 348 UsbEndpointDirection direction, | 351 uint8 endpoint, |
| 349 uint8 endpoint, | 352 scoped_refptr<net::IOBuffer> buffer, |
| 350 net::IOBuffer* buffer, | 353 size_t length, |
| 351 size_t length, | 354 unsigned int packets, |
| 352 unsigned int packets, | 355 unsigned int packet_length, |
| 353 unsigned int packet_length, | 356 unsigned int timeout, |
| 354 unsigned int timeout, | 357 const TransferCallback& callback) override {} |
| 355 const UsbTransferCallback& callback) override {} | |
| 356 | 358 |
| 357 protected: | 359 protected: |
| 358 virtual ~MockUsbDeviceHandle() {} | 360 virtual ~MockUsbDeviceHandle() {} |
| 359 | 361 |
| 360 struct Query { | 362 struct Query { |
| 361 UsbTransferCallback callback; | 363 TransferCallback callback; |
| 362 scoped_refptr<net::IOBuffer> buffer; | 364 scoped_refptr<net::IOBuffer> buffer; |
| 363 size_t size; | 365 size_t size; |
| 364 | 366 |
| 365 Query(UsbTransferCallback callback, | 367 Query(TransferCallback callback, |
| 366 scoped_refptr<net::IOBuffer> buffer, | 368 scoped_refptr<net::IOBuffer> buffer, |
| 367 int size) | 369 int size) |
| 368 : callback(callback), buffer(buffer), size(size) {}; | 370 : callback(callback), buffer(buffer), size(size) {} |
| 369 }; | 371 }; |
| 370 | 372 |
| 371 scoped_refptr<MockUsbDevice<T> > device_; | 373 scoped_refptr<MockUsbDevice<T> > device_; |
| 372 uint32 remaining_body_length_; | 374 uint32 remaining_body_length_; |
| 373 scoped_ptr<AdbMessage> current_message_; | 375 scoped_ptr<AdbMessage> current_message_; |
| 374 std::vector<char> output_buffer_; | 376 std::vector<char> output_buffer_; |
| 375 std::queue<Query> queries_; | 377 std::queue<Query> queries_; |
| 376 base::ScopedPtrHashMap<int, MockLocalSocket> local_sockets_; | 378 base::ScopedPtrHashMap<int, MockLocalSocket> local_sockets_; |
| 377 int last_local_socket_; | 379 int last_local_socket_; |
| 378 bool broken_; | 380 bool broken_; |
| 379 }; | 381 }; |
| 380 | 382 |
| 381 template <class T> | 383 template <class T> |
| 382 class MockUsbDevice : public UsbDevice { | 384 class MockUsbDevice : public UsbDevice { |
| 383 public: | 385 public: |
| 384 MockUsbDevice() : UsbDevice(0, 0, 0) { | 386 MockUsbDevice() |
| 387 : UsbDevice(0, |
| 388 0, |
| 389 0, |
| 390 base::UTF8ToUTF16(kDeviceManufacturer), |
| 391 base::UTF8ToUTF16(kDeviceModel), |
| 392 base::UTF8ToUTF16(kDeviceSerial)) { |
| 385 UsbEndpointDescriptor bulk_in; | 393 UsbEndpointDescriptor bulk_in; |
| 386 bulk_in.address = 0x81; | 394 bulk_in.address = 0x81; |
| 387 bulk_in.direction = device::USB_DIRECTION_INBOUND; | 395 bulk_in.direction = device::USB_DIRECTION_INBOUND; |
| 388 bulk_in.maximum_packet_size = 512; | 396 bulk_in.maximum_packet_size = 512; |
| 389 bulk_in.transfer_type = device::USB_TRANSFER_BULK; | 397 bulk_in.transfer_type = device::USB_TRANSFER_BULK; |
| 390 | 398 |
| 391 UsbEndpointDescriptor bulk_out; | 399 UsbEndpointDescriptor bulk_out; |
| 392 bulk_out.address = 0x01; | 400 bulk_out.address = 0x01; |
| 393 bulk_out.direction = device::USB_DIRECTION_OUTBOUND; | 401 bulk_out.direction = device::USB_DIRECTION_OUTBOUND; |
| 394 bulk_out.maximum_packet_size = 512; | 402 bulk_out.maximum_packet_size = 512; |
| 395 bulk_out.transfer_type = device::USB_TRANSFER_BULK; | 403 bulk_out.transfer_type = device::USB_TRANSFER_BULK; |
| 396 | 404 |
| 397 UsbInterfaceDescriptor interface_desc; | 405 UsbInterfaceDescriptor interface_desc; |
| 398 interface_desc.interface_number = 0; | 406 interface_desc.interface_number = 0; |
| 399 interface_desc.alternate_setting = 0; | 407 interface_desc.alternate_setting = 0; |
| 400 interface_desc.interface_class = T::kClass; | 408 interface_desc.interface_class = T::kClass; |
| 401 interface_desc.interface_subclass = T::kSubclass; | 409 interface_desc.interface_subclass = T::kSubclass; |
| 402 interface_desc.interface_protocol = T::kProtocol; | 410 interface_desc.interface_protocol = T::kProtocol; |
| 403 interface_desc.endpoints.push_back(bulk_in); | 411 interface_desc.endpoints.push_back(bulk_in); |
| 404 interface_desc.endpoints.push_back(bulk_out); | 412 interface_desc.endpoints.push_back(bulk_out); |
| 405 | 413 |
| 406 config_desc_.interfaces.push_back(interface_desc); | 414 config_desc_.interfaces.push_back(interface_desc); |
| 407 } | 415 } |
| 408 | 416 |
| 409 virtual scoped_refptr<UsbDeviceHandle> Open() override { | 417 void Open(const OpenCallback& callback) override { |
| 410 return new MockUsbDeviceHandle<T>(this); | 418 base::MessageLoop::current()->PostTask( |
| 419 FROM_HERE, base::Bind(callback, make_scoped_refptr( |
| 420 new MockUsbDeviceHandle<T>(this)))); |
| 411 } | 421 } |
| 412 | 422 |
| 413 virtual const UsbConfigDescriptor* GetConfiguration() override { | 423 const UsbConfigDescriptor* GetConfiguration() override { |
| 414 return T::kConfigured ? &config_desc_ : nullptr; | 424 return T::kConfigured ? &config_desc_ : nullptr; |
| 415 } | 425 } |
| 416 | 426 |
| 417 virtual bool GetManufacturer(base::string16* manufacturer) override { | 427 bool Close(scoped_refptr<UsbDeviceHandle> handle) override { |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |