OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 <map> | 5 #include <map> |
6 #include <queue> | 6 #include <queue> |
7 #include <set> | 7 #include <set> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
11 #include "base/macros.h" | 11 #include "base/macros.h" |
12 #include "base/message_loop/message_loop.h" | 12 #include "base/message_loop/message_loop.h" |
13 #include "base/run_loop.h" | 13 #include "base/run_loop.h" |
14 #include "base/stl_util.h" | 14 #include "base/stl_util.h" |
15 #include "device/devices_app/usb/device_impl.h" | 15 #include "device/devices_app/usb/device_impl.h" |
| 16 #include "device/devices_app/usb/fake_permission_provider.h" |
16 #include "device/usb/mock_usb_device.h" | 17 #include "device/usb/mock_usb_device.h" |
17 #include "device/usb/mock_usb_device_handle.h" | 18 #include "device/usb/mock_usb_device_handle.h" |
18 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
19 #include "third_party/mojo/src/mojo/public/cpp/bindings/interface_request.h" | 20 #include "third_party/mojo/src/mojo/public/cpp/bindings/interface_request.h" |
20 | 21 |
21 using ::testing::Invoke; | 22 using ::testing::Invoke; |
22 using ::testing::_; | 23 using ::testing::_; |
23 | 24 |
24 namespace device { | 25 namespace device { |
25 namespace usb { | 26 namespace usb { |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
143 // wrapping the mock device. | 144 // wrapping the mock device. |
144 DevicePtr GetMockDeviceProxy(uint16_t vendor_id, | 145 DevicePtr GetMockDeviceProxy(uint16_t vendor_id, |
145 uint16_t product_id, | 146 uint16_t product_id, |
146 const std::string& manufacturer, | 147 const std::string& manufacturer, |
147 const std::string& product, | 148 const std::string& product, |
148 const std::string& serial) { | 149 const std::string& serial) { |
149 mock_device_ = | 150 mock_device_ = |
150 new MockUsbDevice(vendor_id, product_id, manufacturer, product, serial); | 151 new MockUsbDevice(vendor_id, product_id, manufacturer, product, serial); |
151 mock_handle_ = new MockUsbDeviceHandle(mock_device_.get()); | 152 mock_handle_ = new MockUsbDeviceHandle(mock_device_.get()); |
152 | 153 |
| 154 PermissionProviderPtr permission_provider; |
| 155 permission_provider_.Bind(mojo::GetProxy(&permission_provider)); |
153 DevicePtr proxy; | 156 DevicePtr proxy; |
154 new DeviceImpl(mock_device_, mojo::GetProxy(&proxy)); | 157 new DeviceImpl(mock_device_, permission_provider.Pass(), |
| 158 mojo::GetProxy(&proxy)); |
155 | 159 |
156 // Set up mock handle calls to respond based on mock device configs | 160 // Set up mock handle calls to respond based on mock device configs |
157 // established by the test. | 161 // established by the test. |
158 ON_CALL(mock_device(), Open(_)) | 162 ON_CALL(mock_device(), Open(_)) |
159 .WillByDefault(Invoke(this, &USBDeviceImplTest::OpenMockHandle)); | 163 .WillByDefault(Invoke(this, &USBDeviceImplTest::OpenMockHandle)); |
| 164 ON_CALL(mock_device(), GetActiveConfiguration()) |
| 165 .WillByDefault( |
| 166 Invoke(this, &USBDeviceImplTest::GetActiveConfiguration)); |
160 ON_CALL(mock_handle(), Close()) | 167 ON_CALL(mock_handle(), Close()) |
161 .WillByDefault(Invoke(this, &USBDeviceImplTest::CloseMockHandle)); | 168 .WillByDefault(Invoke(this, &USBDeviceImplTest::CloseMockHandle)); |
162 ON_CALL(mock_handle(), SetConfiguration(_, _)) | 169 ON_CALL(mock_handle(), SetConfiguration(_, _)) |
163 .WillByDefault(Invoke(this, &USBDeviceImplTest::SetConfiguration)); | 170 .WillByDefault(Invoke(this, &USBDeviceImplTest::SetConfiguration)); |
164 ON_CALL(mock_handle(), ClaimInterface(_, _)) | 171 ON_CALL(mock_handle(), ClaimInterface(_, _)) |
165 .WillByDefault(Invoke(this, &USBDeviceImplTest::ClaimInterface)); | 172 .WillByDefault(Invoke(this, &USBDeviceImplTest::ClaimInterface)); |
166 ON_CALL(mock_handle(), ReleaseInterface(_)) | 173 ON_CALL(mock_handle(), ReleaseInterface(_)) |
167 .WillByDefault(Invoke(this, &USBDeviceImplTest::ReleaseInterface)); | 174 .WillByDefault(Invoke(this, &USBDeviceImplTest::ReleaseInterface)); |
168 ON_CALL(mock_handle(), SetInterfaceAlternateSetting(_, _, _)) | 175 ON_CALL(mock_handle(), SetInterfaceAlternateSetting(_, _, _)) |
169 .WillByDefault( | 176 .WillByDefault( |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 EXPECT_FALSE(is_device_open_); | 210 EXPECT_FALSE(is_device_open_); |
204 is_device_open_ = true; | 211 is_device_open_ = true; |
205 callback.Run(mock_handle_); | 212 callback.Run(mock_handle_); |
206 } | 213 } |
207 | 214 |
208 void CloseMockHandle() { | 215 void CloseMockHandle() { |
209 EXPECT_TRUE(is_device_open_); | 216 EXPECT_TRUE(is_device_open_); |
210 is_device_open_ = false; | 217 is_device_open_ = false; |
211 } | 218 } |
212 | 219 |
| 220 const UsbConfigDescriptor* GetActiveConfiguration() { |
| 221 if (current_config_ == 0) { |
| 222 return nullptr; |
| 223 } else { |
| 224 const auto it = mock_configs_.find(current_config_); |
| 225 EXPECT_TRUE(it != mock_configs_.end()); |
| 226 return &it->second; |
| 227 } |
| 228 } |
| 229 |
213 void SetConfiguration(uint8_t value, | 230 void SetConfiguration(uint8_t value, |
214 const UsbDeviceHandle::ResultCallback& callback) { | 231 const UsbDeviceHandle::ResultCallback& callback) { |
215 if (mock_configs_.find(value) != mock_configs_.end()) { | 232 if (mock_configs_.find(value) != mock_configs_.end()) { |
216 current_config_ = value; | 233 current_config_ = value; |
217 callback.Run(true); | 234 callback.Run(true); |
218 } else { | 235 } else { |
219 callback.Run(false); | 236 callback.Run(false); |
220 } | 237 } |
221 } | 238 } |
222 | 239 |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
335 bool allow_reset_; | 352 bool allow_reset_; |
336 | 353 |
337 std::map<uint8_t, UsbConfigDescriptor> mock_configs_; | 354 std::map<uint8_t, UsbConfigDescriptor> mock_configs_; |
338 uint8_t current_config_; | 355 uint8_t current_config_; |
339 | 356 |
340 std::queue<std::vector<uint8_t>> mock_inbound_data_; | 357 std::queue<std::vector<uint8_t>> mock_inbound_data_; |
341 std::queue<std::vector<uint8_t>> mock_outbound_data_; | 358 std::queue<std::vector<uint8_t>> mock_outbound_data_; |
342 | 359 |
343 std::set<uint8_t> claimed_interfaces_; | 360 std::set<uint8_t> claimed_interfaces_; |
344 | 361 |
| 362 FakePermissionProvider permission_provider_; |
| 363 |
345 DISALLOW_COPY_AND_ASSIGN(USBDeviceImplTest); | 364 DISALLOW_COPY_AND_ASSIGN(USBDeviceImplTest); |
346 }; | 365 }; |
347 | 366 |
348 } // namespace | 367 } // namespace |
349 | 368 |
350 TEST_F(USBDeviceImplTest, Open) { | 369 TEST_F(USBDeviceImplTest, Open) { |
351 DevicePtr device = GetMockDeviceProxy(); | 370 DevicePtr device = GetMockDeviceProxy(); |
352 | 371 |
353 EXPECT_FALSE(is_device_open()); | 372 EXPECT_FALSE(is_device_open()); |
354 | 373 |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
496 EXPECT_CALL(mock_device(), Open(_)); | 515 EXPECT_CALL(mock_device(), Open(_)); |
497 | 516 |
498 { | 517 { |
499 base::RunLoop loop; | 518 base::RunLoop loop; |
500 device->Open(base::Bind(&ExpectOpenAndThen, OPEN_DEVICE_ERROR_OK, | 519 device->Open(base::Bind(&ExpectOpenAndThen, OPEN_DEVICE_ERROR_OK, |
501 loop.QuitClosure())); | 520 loop.QuitClosure())); |
502 loop.Run(); | 521 loop.Run(); |
503 } | 522 } |
504 | 523 |
505 // Now add a mock interface #1. | 524 // Now add a mock interface #1. |
506 AddMockConfig(ConfigBuilder(0).AddInterface(1, 0, 1, 2, 3)); | 525 AddMockConfig(ConfigBuilder(1).AddInterface(1, 0, 1, 2, 3)); |
507 | 526 |
| 527 EXPECT_CALL(mock_handle(), SetConfiguration(1, _)); |
| 528 |
| 529 { |
| 530 base::RunLoop loop; |
| 531 device->SetConfiguration( |
| 532 1, base::Bind(&ExpectResultAndThen, true, loop.QuitClosure())); |
| 533 loop.Run(); |
| 534 } |
| 535 |
| 536 EXPECT_CALL(mock_device(), GetActiveConfiguration()); |
508 EXPECT_CALL(mock_handle(), ClaimInterface(2, _)); | 537 EXPECT_CALL(mock_handle(), ClaimInterface(2, _)); |
509 | 538 |
510 { | 539 { |
511 // Try to claim an invalid interface and expect failure. | 540 // Try to claim an invalid interface and expect failure. |
512 base::RunLoop loop; | 541 base::RunLoop loop; |
513 device->ClaimInterface( | 542 device->ClaimInterface( |
514 2, base::Bind(&ExpectResultAndThen, false, loop.QuitClosure())); | 543 2, base::Bind(&ExpectResultAndThen, false, loop.QuitClosure())); |
515 loop.Run(); | 544 loop.Run(); |
516 } | 545 } |
517 | 546 |
| 547 EXPECT_CALL(mock_device(), GetActiveConfiguration()); |
518 EXPECT_CALL(mock_handle(), ClaimInterface(1, _)); | 548 EXPECT_CALL(mock_handle(), ClaimInterface(1, _)); |
519 | 549 |
520 { | 550 { |
521 base::RunLoop loop; | 551 base::RunLoop loop; |
522 device->ClaimInterface( | 552 device->ClaimInterface( |
523 1, base::Bind(&ExpectResultAndThen, true, loop.QuitClosure())); | 553 1, base::Bind(&ExpectResultAndThen, true, loop.QuitClosure())); |
524 loop.Run(); | 554 loop.Run(); |
525 } | 555 } |
526 | 556 |
527 EXPECT_CALL(mock_handle(), ReleaseInterface(2)); | 557 EXPECT_CALL(mock_handle(), ReleaseInterface(2)); |
(...skipping 24 matching lines...) Expand all Loading... |
552 | 582 |
553 EXPECT_CALL(mock_device(), Open(_)); | 583 EXPECT_CALL(mock_device(), Open(_)); |
554 | 584 |
555 { | 585 { |
556 base::RunLoop loop; | 586 base::RunLoop loop; |
557 device->Open(base::Bind(&ExpectOpenAndThen, OPEN_DEVICE_ERROR_OK, | 587 device->Open(base::Bind(&ExpectOpenAndThen, OPEN_DEVICE_ERROR_OK, |
558 loop.QuitClosure())); | 588 loop.QuitClosure())); |
559 loop.Run(); | 589 loop.Run(); |
560 } | 590 } |
561 | 591 |
562 AddMockConfig(ConfigBuilder(0) | 592 AddMockConfig(ConfigBuilder(1) |
563 .AddInterface(1, 0, 1, 2, 3) | 593 .AddInterface(1, 0, 1, 2, 3) |
564 .AddInterface(1, 42, 1, 2, 3) | 594 .AddInterface(1, 42, 1, 2, 3) |
565 .AddInterface(2, 0, 1, 2, 3)); | 595 .AddInterface(2, 0, 1, 2, 3)); |
566 | 596 |
567 EXPECT_CALL(mock_handle(), SetInterfaceAlternateSetting(1, 42, _)); | 597 EXPECT_CALL(mock_handle(), SetInterfaceAlternateSetting(1, 42, _)); |
568 | 598 |
569 { | 599 { |
570 base::RunLoop loop; | 600 base::RunLoop loop; |
571 device->SetInterfaceAlternateSetting( | 601 device->SetInterfaceAlternateSetting( |
572 1, 42, base::Bind(&ExpectResultAndThen, true, loop.QuitClosure())); | 602 1, 42, base::Bind(&ExpectResultAndThen, true, loop.QuitClosure())); |
(...skipping 17 matching lines...) Expand all Loading... |
590 | 620 |
591 EXPECT_CALL(mock_device(), Open(_)); | 621 EXPECT_CALL(mock_device(), Open(_)); |
592 | 622 |
593 { | 623 { |
594 base::RunLoop loop; | 624 base::RunLoop loop; |
595 device->Open(base::Bind(&ExpectOpenAndThen, OPEN_DEVICE_ERROR_OK, | 625 device->Open(base::Bind(&ExpectOpenAndThen, OPEN_DEVICE_ERROR_OK, |
596 loop.QuitClosure())); | 626 loop.QuitClosure())); |
597 loop.Run(); | 627 loop.Run(); |
598 } | 628 } |
599 | 629 |
| 630 AddMockConfig(ConfigBuilder(1).AddInterface(7, 0, 1, 2, 3)); |
| 631 |
| 632 EXPECT_CALL(mock_device(), GetActiveConfiguration()); |
| 633 EXPECT_CALL(mock_handle(), SetConfiguration(1, _)); |
| 634 |
| 635 { |
| 636 base::RunLoop loop; |
| 637 device->SetConfiguration( |
| 638 1, base::Bind(&ExpectResultAndThen, true, loop.QuitClosure())); |
| 639 loop.Run(); |
| 640 } |
| 641 |
600 std::vector<uint8_t> fake_data; | 642 std::vector<uint8_t> fake_data; |
601 fake_data.push_back(41); | 643 fake_data.push_back(41); |
602 fake_data.push_back(42); | 644 fake_data.push_back(42); |
603 fake_data.push_back(43); | 645 fake_data.push_back(43); |
604 | 646 |
605 AddMockInboundData(fake_data); | 647 AddMockInboundData(fake_data); |
606 | 648 |
607 EXPECT_CALL(mock_handle(), | 649 EXPECT_CALL(mock_handle(), |
608 ControlTransfer(USB_DIRECTION_INBOUND, UsbDeviceHandle::STANDARD, | 650 ControlTransfer(USB_DIRECTION_INBOUND, UsbDeviceHandle::STANDARD, |
609 UsbDeviceHandle::DEVICE, 5, 6, 7, _, _, 0, _)); | 651 UsbDeviceHandle::DEVICE, 5, 6, 7, _, _, 0, _)); |
610 | 652 |
611 { | 653 { |
612 auto params = ControlTransferParams::New(); | 654 auto params = ControlTransferParams::New(); |
613 params->type = CONTROL_TRANSFER_TYPE_STANDARD; | 655 params->type = CONTROL_TRANSFER_TYPE_STANDARD; |
614 params->recipient = CONTROL_TRANSFER_RECIPIENT_DEVICE; | 656 params->recipient = CONTROL_TRANSFER_RECIPIENT_DEVICE; |
615 params->request = 5; | 657 params->request = 5; |
616 params->value = 6; | 658 params->value = 6; |
617 params->index = 7; | 659 params->index = 7; |
618 base::RunLoop loop; | 660 base::RunLoop loop; |
619 device->ControlTransferIn( | 661 device->ControlTransferIn( |
620 params.Pass(), static_cast<uint32_t>(fake_data.size()), 0, | 662 params.Pass(), static_cast<uint32_t>(fake_data.size()), 0, |
621 base::Bind(&ExpectTransferInAndThen, TRANSFER_STATUS_COMPLETED, | 663 base::Bind(&ExpectTransferInAndThen, TRANSFER_STATUS_COMPLETED, |
622 fake_data, loop.QuitClosure())); | 664 fake_data, loop.QuitClosure())); |
623 loop.Run(); | 665 loop.Run(); |
624 } | 666 } |
625 | 667 |
626 AddMockConfig(ConfigBuilder(0).AddInterface(7, 0, 1, 2, 3)); | |
627 AddMockOutboundData(fake_data); | 668 AddMockOutboundData(fake_data); |
628 | 669 |
| 670 EXPECT_CALL(mock_device(), GetActiveConfiguration()); |
629 EXPECT_CALL(mock_handle(), | 671 EXPECT_CALL(mock_handle(), |
630 ControlTransfer(USB_DIRECTION_OUTBOUND, UsbDeviceHandle::STANDARD, | 672 ControlTransfer(USB_DIRECTION_OUTBOUND, UsbDeviceHandle::STANDARD, |
631 UsbDeviceHandle::INTERFACE, 5, 6, 7, _, _, 0, _)); | 673 UsbDeviceHandle::INTERFACE, 5, 6, 7, _, _, 0, _)); |
632 | 674 |
633 { | 675 { |
634 auto params = ControlTransferParams::New(); | 676 auto params = ControlTransferParams::New(); |
635 params->type = CONTROL_TRANSFER_TYPE_STANDARD; | 677 params->type = CONTROL_TRANSFER_TYPE_STANDARD; |
636 params->recipient = CONTROL_TRANSFER_RECIPIENT_INTERFACE; | 678 params->recipient = CONTROL_TRANSFER_RECIPIENT_INTERFACE; |
637 params->request = 5; | 679 params->request = 5; |
638 params->value = 6; | 680 params->value = 6; |
(...skipping 22 matching lines...) Expand all Loading... |
661 } | 703 } |
662 | 704 |
663 std::string message1 = "say hello please"; | 705 std::string message1 = "say hello please"; |
664 std::vector<uint8_t> fake_outbound_data(message1.size()); | 706 std::vector<uint8_t> fake_outbound_data(message1.size()); |
665 std::copy(message1.begin(), message1.end(), fake_outbound_data.begin()); | 707 std::copy(message1.begin(), message1.end(), fake_outbound_data.begin()); |
666 | 708 |
667 std::string message2 = "hello world!"; | 709 std::string message2 = "hello world!"; |
668 std::vector<uint8_t> fake_inbound_data(message2.size()); | 710 std::vector<uint8_t> fake_inbound_data(message2.size()); |
669 std::copy(message2.begin(), message2.end(), fake_inbound_data.begin()); | 711 std::copy(message2.begin(), message2.end(), fake_inbound_data.begin()); |
670 | 712 |
671 AddMockConfig(ConfigBuilder(0).AddInterface(7, 0, 1, 2, 3)); | 713 AddMockConfig(ConfigBuilder(1).AddInterface(7, 0, 1, 2, 3)); |
672 AddMockOutboundData(fake_outbound_data); | 714 AddMockOutboundData(fake_outbound_data); |
673 AddMockInboundData(fake_inbound_data); | 715 AddMockInboundData(fake_inbound_data); |
674 | 716 |
675 EXPECT_CALL(mock_handle(), GenericTransfer(USB_DIRECTION_OUTBOUND, 0x01, _, | 717 EXPECT_CALL(mock_handle(), GenericTransfer(USB_DIRECTION_OUTBOUND, 0x01, _, |
676 fake_outbound_data.size(), 0, _)); | 718 fake_outbound_data.size(), 0, _)); |
677 | 719 |
678 { | 720 { |
679 base::RunLoop loop; | 721 base::RunLoop loop; |
680 device->GenericTransferOut( | 722 device->GenericTransferOut( |
681 1, mojo::Array<uint8_t>::From(fake_outbound_data), 0, | 723 1, mojo::Array<uint8_t>::From(fake_outbound_data), 0, |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
714 std::string outbound_packet_data = "aaaaaaaabbbbbbbbccccccccdddddddd"; | 756 std::string outbound_packet_data = "aaaaaaaabbbbbbbbccccccccdddddddd"; |
715 std::vector<uint8_t> fake_outbound_packets(outbound_packet_data.size()); | 757 std::vector<uint8_t> fake_outbound_packets(outbound_packet_data.size()); |
716 std::copy(outbound_packet_data.begin(), outbound_packet_data.end(), | 758 std::copy(outbound_packet_data.begin(), outbound_packet_data.end(), |
717 fake_outbound_packets.begin()); | 759 fake_outbound_packets.begin()); |
718 | 760 |
719 std::string inbound_packet_data = "ddddddddccccccccbbbbbbbbaaaaaaaa"; | 761 std::string inbound_packet_data = "ddddddddccccccccbbbbbbbbaaaaaaaa"; |
720 std::vector<uint8_t> fake_inbound_packets(inbound_packet_data.size()); | 762 std::vector<uint8_t> fake_inbound_packets(inbound_packet_data.size()); |
721 std::copy(inbound_packet_data.begin(), inbound_packet_data.end(), | 763 std::copy(inbound_packet_data.begin(), inbound_packet_data.end(), |
722 fake_inbound_packets.begin()); | 764 fake_inbound_packets.begin()); |
723 | 765 |
724 AddMockConfig(ConfigBuilder(0).AddInterface(7, 0, 1, 2, 3)); | 766 AddMockConfig(ConfigBuilder(1).AddInterface(7, 0, 1, 2, 3)); |
725 AddMockOutboundData(fake_outbound_packets); | 767 AddMockOutboundData(fake_outbound_packets); |
726 AddMockInboundData(fake_inbound_packets); | 768 AddMockInboundData(fake_inbound_packets); |
727 | 769 |
728 EXPECT_CALL(mock_handle(), | 770 EXPECT_CALL(mock_handle(), |
729 IsochronousTransfer(USB_DIRECTION_OUTBOUND, 0x01, _, | 771 IsochronousTransfer(USB_DIRECTION_OUTBOUND, 0x01, _, |
730 fake_outbound_packets.size(), 4, 8, 0, _)); | 772 fake_outbound_packets.size(), 4, 8, 0, _)); |
731 | 773 |
732 { | 774 { |
733 base::RunLoop loop; | 775 base::RunLoop loop; |
734 mojo::Array<mojo::Array<uint8_t>> packets = | 776 mojo::Array<mojo::Array<uint8_t>> packets = |
(...skipping 27 matching lines...) Expand all Loading... |
762 1, 4, 8, 0, base::Bind(&ExpectPacketsAndThen, TRANSFER_STATUS_COMPLETED, | 804 1, 4, 8, 0, base::Bind(&ExpectPacketsAndThen, TRANSFER_STATUS_COMPLETED, |
763 packets, loop.QuitClosure())); | 805 packets, loop.QuitClosure())); |
764 loop.Run(); | 806 loop.Run(); |
765 } | 807 } |
766 | 808 |
767 EXPECT_CALL(mock_handle(), Close()); | 809 EXPECT_CALL(mock_handle(), Close()); |
768 } | 810 } |
769 | 811 |
770 } // namespace usb | 812 } // namespace usb |
771 } // namespace device | 813 } // namespace device |
OLD | NEW |