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 "device/devices_app/usb/device_impl.h" |
| 6 |
5 #include <stddef.h> | 7 #include <stddef.h> |
6 #include <stdint.h> | 8 #include <stdint.h> |
7 | |
8 #include <map> | 9 #include <map> |
9 #include <queue> | 10 #include <queue> |
10 #include <set> | 11 #include <set> |
| 12 #include <utility> |
11 #include <vector> | 13 #include <vector> |
12 | 14 |
13 #include "base/bind.h" | 15 #include "base/bind.h" |
14 #include "base/macros.h" | 16 #include "base/macros.h" |
15 #include "base/message_loop/message_loop.h" | 17 #include "base/message_loop/message_loop.h" |
16 #include "base/run_loop.h" | 18 #include "base/run_loop.h" |
17 #include "base/stl_util.h" | 19 #include "base/stl_util.h" |
18 #include "device/devices_app/usb/device_impl.h" | |
19 #include "device/devices_app/usb/fake_permission_provider.h" | 20 #include "device/devices_app/usb/fake_permission_provider.h" |
20 #include "device/usb/mock_usb_device.h" | 21 #include "device/usb/mock_usb_device.h" |
21 #include "device/usb/mock_usb_device_handle.h" | 22 #include "device/usb/mock_usb_device_handle.h" |
22 #include "mojo/public/cpp/bindings/interface_request.h" | 23 #include "mojo/public/cpp/bindings/interface_request.h" |
23 #include "testing/gtest/include/gtest/gtest.h" | 24 #include "testing/gtest/include/gtest/gtest.h" |
24 | 25 |
25 using ::testing::Invoke; | 26 using ::testing::Invoke; |
26 using ::testing::_; | 27 using ::testing::_; |
27 | 28 |
28 namespace device { | 29 namespace device { |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
150 const std::string& manufacturer, | 151 const std::string& manufacturer, |
151 const std::string& product, | 152 const std::string& product, |
152 const std::string& serial) { | 153 const std::string& serial) { |
153 mock_device_ = | 154 mock_device_ = |
154 new MockUsbDevice(vendor_id, product_id, manufacturer, product, serial); | 155 new MockUsbDevice(vendor_id, product_id, manufacturer, product, serial); |
155 mock_handle_ = new MockUsbDeviceHandle(mock_device_.get()); | 156 mock_handle_ = new MockUsbDeviceHandle(mock_device_.get()); |
156 | 157 |
157 PermissionProviderPtr permission_provider; | 158 PermissionProviderPtr permission_provider; |
158 permission_provider_.Bind(mojo::GetProxy(&permission_provider)); | 159 permission_provider_.Bind(mojo::GetProxy(&permission_provider)); |
159 DevicePtr proxy; | 160 DevicePtr proxy; |
160 new DeviceImpl(mock_device_, permission_provider.Pass(), | 161 new DeviceImpl(mock_device_, std::move(permission_provider), |
161 mojo::GetProxy(&proxy)); | 162 mojo::GetProxy(&proxy)); |
162 | 163 |
163 // Set up mock handle calls to respond based on mock device configs | 164 // Set up mock handle calls to respond based on mock device configs |
164 // established by the test. | 165 // established by the test. |
165 ON_CALL(mock_device(), Open(_)) | 166 ON_CALL(mock_device(), Open(_)) |
166 .WillByDefault(Invoke(this, &USBDeviceImplTest::OpenMockHandle)); | 167 .WillByDefault(Invoke(this, &USBDeviceImplTest::OpenMockHandle)); |
167 ON_CALL(mock_device(), GetActiveConfiguration()) | 168 ON_CALL(mock_device(), GetActiveConfiguration()) |
168 .WillByDefault( | 169 .WillByDefault( |
169 Invoke(this, &USBDeviceImplTest::GetActiveConfiguration)); | 170 Invoke(this, &USBDeviceImplTest::GetActiveConfiguration)); |
170 ON_CALL(mock_handle(), Close()) | 171 ON_CALL(mock_handle(), Close()) |
171 .WillByDefault(Invoke(this, &USBDeviceImplTest::CloseMockHandle)); | 172 .WillByDefault(Invoke(this, &USBDeviceImplTest::CloseMockHandle)); |
172 ON_CALL(mock_handle(), SetConfiguration(_, _)) | 173 ON_CALL(mock_handle(), SetConfiguration(_, _)) |
173 .WillByDefault(Invoke(this, &USBDeviceImplTest::SetConfiguration)); | 174 .WillByDefault(Invoke(this, &USBDeviceImplTest::SetConfiguration)); |
174 ON_CALL(mock_handle(), ClaimInterface(_, _)) | 175 ON_CALL(mock_handle(), ClaimInterface(_, _)) |
175 .WillByDefault(Invoke(this, &USBDeviceImplTest::ClaimInterface)); | 176 .WillByDefault(Invoke(this, &USBDeviceImplTest::ClaimInterface)); |
176 ON_CALL(mock_handle(), ReleaseInterface(_)) | 177 ON_CALL(mock_handle(), ReleaseInterface(_)) |
177 .WillByDefault(Invoke(this, &USBDeviceImplTest::ReleaseInterface)); | 178 .WillByDefault(Invoke(this, &USBDeviceImplTest::ReleaseInterface)); |
178 ON_CALL(mock_handle(), SetInterfaceAlternateSetting(_, _, _)) | 179 ON_CALL(mock_handle(), SetInterfaceAlternateSetting(_, _, _)) |
179 .WillByDefault( | 180 .WillByDefault( |
180 Invoke(this, &USBDeviceImplTest::SetInterfaceAlternateSetting)); | 181 Invoke(this, &USBDeviceImplTest::SetInterfaceAlternateSetting)); |
181 ON_CALL(mock_handle(), ResetDevice(_)) | 182 ON_CALL(mock_handle(), ResetDevice(_)) |
182 .WillByDefault(Invoke(this, &USBDeviceImplTest::ResetDevice)); | 183 .WillByDefault(Invoke(this, &USBDeviceImplTest::ResetDevice)); |
183 ON_CALL(mock_handle(), ControlTransfer(_, _, _, _, _, _, _, _, _, _)) | 184 ON_CALL(mock_handle(), ControlTransfer(_, _, _, _, _, _, _, _, _, _)) |
184 .WillByDefault(Invoke(this, &USBDeviceImplTest::ControlTransfer)); | 185 .WillByDefault(Invoke(this, &USBDeviceImplTest::ControlTransfer)); |
185 ON_CALL(mock_handle(), GenericTransfer(_, _, _, _, _, _)) | 186 ON_CALL(mock_handle(), GenericTransfer(_, _, _, _, _, _)) |
186 .WillByDefault(Invoke(this, &USBDeviceImplTest::GenericTransfer)); | 187 .WillByDefault(Invoke(this, &USBDeviceImplTest::GenericTransfer)); |
187 ON_CALL(mock_handle(), IsochronousTransfer(_, _, _, _, _, _, _, _)) | 188 ON_CALL(mock_handle(), IsochronousTransfer(_, _, _, _, _, _, _, _)) |
188 .WillByDefault(Invoke(this, &USBDeviceImplTest::IsochronousTransfer)); | 189 .WillByDefault(Invoke(this, &USBDeviceImplTest::IsochronousTransfer)); |
189 | 190 |
190 return proxy.Pass(); | 191 return proxy; |
191 } | 192 } |
192 | 193 |
193 DevicePtr GetMockDeviceProxy() { | 194 DevicePtr GetMockDeviceProxy() { |
194 return GetMockDeviceProxy(0x1234, 0x5678, "ACME", "Frobinator", "ABCDEF"); | 195 return GetMockDeviceProxy(0x1234, 0x5678, "ACME", "Frobinator", "ABCDEF"); |
195 } | 196 } |
196 | 197 |
197 void AddMockConfig(const ConfigBuilder& builder) { | 198 void AddMockConfig(const ConfigBuilder& builder) { |
198 const UsbConfigDescriptor& config = builder.config(); | 199 const UsbConfigDescriptor& config = builder.config(); |
199 DCHECK(!ContainsKey(mock_configs_, config.configuration_value)); | 200 DCHECK(!ContainsKey(mock_configs_, config.configuration_value)); |
200 mock_configs_[config.configuration_value] = config; | 201 mock_configs_[config.configuration_value] = config; |
(...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
655 | 656 |
656 { | 657 { |
657 auto params = ControlTransferParams::New(); | 658 auto params = ControlTransferParams::New(); |
658 params->type = CONTROL_TRANSFER_TYPE_STANDARD; | 659 params->type = CONTROL_TRANSFER_TYPE_STANDARD; |
659 params->recipient = CONTROL_TRANSFER_RECIPIENT_DEVICE; | 660 params->recipient = CONTROL_TRANSFER_RECIPIENT_DEVICE; |
660 params->request = 5; | 661 params->request = 5; |
661 params->value = 6; | 662 params->value = 6; |
662 params->index = 7; | 663 params->index = 7; |
663 base::RunLoop loop; | 664 base::RunLoop loop; |
664 device->ControlTransferIn( | 665 device->ControlTransferIn( |
665 params.Pass(), static_cast<uint32_t>(fake_data.size()), 0, | 666 std::move(params), static_cast<uint32_t>(fake_data.size()), 0, |
666 base::Bind(&ExpectTransferInAndThen, TRANSFER_STATUS_COMPLETED, | 667 base::Bind(&ExpectTransferInAndThen, TRANSFER_STATUS_COMPLETED, |
667 fake_data, loop.QuitClosure())); | 668 fake_data, loop.QuitClosure())); |
668 loop.Run(); | 669 loop.Run(); |
669 } | 670 } |
670 | 671 |
671 AddMockOutboundData(fake_data); | 672 AddMockOutboundData(fake_data); |
672 | 673 |
673 EXPECT_CALL(mock_device(), GetActiveConfiguration()); | 674 EXPECT_CALL(mock_device(), GetActiveConfiguration()); |
674 EXPECT_CALL(mock_handle(), | 675 EXPECT_CALL(mock_handle(), |
675 ControlTransfer(USB_DIRECTION_OUTBOUND, UsbDeviceHandle::STANDARD, | 676 ControlTransfer(USB_DIRECTION_OUTBOUND, UsbDeviceHandle::STANDARD, |
676 UsbDeviceHandle::INTERFACE, 5, 6, 7, _, _, 0, _)); | 677 UsbDeviceHandle::INTERFACE, 5, 6, 7, _, _, 0, _)); |
677 | 678 |
678 { | 679 { |
679 auto params = ControlTransferParams::New(); | 680 auto params = ControlTransferParams::New(); |
680 params->type = CONTROL_TRANSFER_TYPE_STANDARD; | 681 params->type = CONTROL_TRANSFER_TYPE_STANDARD; |
681 params->recipient = CONTROL_TRANSFER_RECIPIENT_INTERFACE; | 682 params->recipient = CONTROL_TRANSFER_RECIPIENT_INTERFACE; |
682 params->request = 5; | 683 params->request = 5; |
683 params->value = 6; | 684 params->value = 6; |
684 params->index = 7; | 685 params->index = 7; |
685 base::RunLoop loop; | 686 base::RunLoop loop; |
686 device->ControlTransferOut( | 687 device->ControlTransferOut( |
687 params.Pass(), mojo::Array<uint8_t>::From(fake_data), 0, | 688 std::move(params), mojo::Array<uint8_t>::From(fake_data), 0, |
688 base::Bind(&ExpectTransferStatusAndThen, TRANSFER_STATUS_COMPLETED, | 689 base::Bind(&ExpectTransferStatusAndThen, TRANSFER_STATUS_COMPLETED, |
689 loop.QuitClosure())); | 690 loop.QuitClosure())); |
690 loop.Run(); | 691 loop.Run(); |
691 } | 692 } |
692 | 693 |
693 EXPECT_CALL(mock_handle(), Close()); | 694 EXPECT_CALL(mock_handle(), Close()); |
694 } | 695 } |
695 | 696 |
696 TEST_F(USBDeviceImplTest, GenericTransfer) { | 697 TEST_F(USBDeviceImplTest, GenericTransfer) { |
697 DevicePtr device = GetMockDeviceProxy(); | 698 DevicePtr device = GetMockDeviceProxy(); |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
778 base::RunLoop loop; | 779 base::RunLoop loop; |
779 mojo::Array<mojo::Array<uint8_t>> packets = | 780 mojo::Array<mojo::Array<uint8_t>> packets = |
780 mojo::Array<mojo::Array<uint8_t>>::New(4); | 781 mojo::Array<mojo::Array<uint8_t>>::New(4); |
781 for (size_t i = 0; i < 4; ++i) { | 782 for (size_t i = 0; i < 4; ++i) { |
782 std::vector<uint8_t> bytes(8); | 783 std::vector<uint8_t> bytes(8); |
783 std::copy(outbound_packet_data.begin() + i * 8, | 784 std::copy(outbound_packet_data.begin() + i * 8, |
784 outbound_packet_data.begin() + i * 8 + 8, bytes.begin()); | 785 outbound_packet_data.begin() + i * 8 + 8, bytes.begin()); |
785 packets[i].Swap(&bytes); | 786 packets[i].Swap(&bytes); |
786 } | 787 } |
787 device->IsochronousTransferOut( | 788 device->IsochronousTransferOut( |
788 1, packets.Pass(), 0, | 789 1, std::move(packets), 0, |
789 base::Bind(&ExpectTransferStatusAndThen, TRANSFER_STATUS_COMPLETED, | 790 base::Bind(&ExpectTransferStatusAndThen, TRANSFER_STATUS_COMPLETED, |
790 loop.QuitClosure())); | 791 loop.QuitClosure())); |
791 loop.Run(); | 792 loop.Run(); |
792 } | 793 } |
793 | 794 |
794 EXPECT_CALL(mock_handle(), | 795 EXPECT_CALL(mock_handle(), |
795 IsochronousTransfer(USB_DIRECTION_INBOUND, 0x81, _, | 796 IsochronousTransfer(USB_DIRECTION_INBOUND, 0x81, _, |
796 fake_inbound_packets.size(), 4, 8, 0, _)); | 797 fake_inbound_packets.size(), 4, 8, 0, _)); |
797 | 798 |
798 { | 799 { |
799 base::RunLoop loop; | 800 base::RunLoop loop; |
800 std::vector<std::vector<uint8_t>> packets(4); | 801 std::vector<std::vector<uint8_t>> packets(4); |
801 for (size_t i = 0; i < 4; ++i) { | 802 for (size_t i = 0; i < 4; ++i) { |
802 packets[i].resize(8); | 803 packets[i].resize(8); |
803 std::copy(inbound_packet_data.begin() + i * 8, | 804 std::copy(inbound_packet_data.begin() + i * 8, |
804 inbound_packet_data.begin() + i * 8 + 8, packets[i].begin()); | 805 inbound_packet_data.begin() + i * 8 + 8, packets[i].begin()); |
805 } | 806 } |
806 device->IsochronousTransferIn( | 807 device->IsochronousTransferIn( |
807 1, 4, 8, 0, base::Bind(&ExpectPacketsAndThen, TRANSFER_STATUS_COMPLETED, | 808 1, 4, 8, 0, base::Bind(&ExpectPacketsAndThen, TRANSFER_STATUS_COMPLETED, |
808 packets, loop.QuitClosure())); | 809 packets, loop.QuitClosure())); |
809 loop.Run(); | 810 loop.Run(); |
810 } | 811 } |
811 | 812 |
812 EXPECT_CALL(mock_handle(), Close()); | 813 EXPECT_CALL(mock_handle(), Close()); |
813 } | 814 } |
814 | 815 |
815 } // namespace usb | 816 } // namespace usb |
816 } // namespace device | 817 } // namespace device |
OLD | NEW |