| 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" |    5 #include "device/devices_app/usb/device_impl.h" | 
|    6  |    6  | 
|    7 #include <stddef.h> |    7 #include <stddef.h> | 
|    8 #include <stdint.h> |    8 #include <stdint.h> | 
 |    9  | 
|    9 #include <map> |   10 #include <map> | 
 |   11 #include <numeric> | 
|   10 #include <queue> |   12 #include <queue> | 
|   11 #include <set> |   13 #include <set> | 
 |   14 #include <string> | 
|   12 #include <utility> |   15 #include <utility> | 
|   13 #include <vector> |   16 #include <vector> | 
|   14  |   17  | 
|   15 #include "base/bind.h" |   18 #include "base/bind.h" | 
|   16 #include "base/macros.h" |   19 #include "base/macros.h" | 
|   17 #include "base/message_loop/message_loop.h" |   20 #include "base/message_loop/message_loop.h" | 
|   18 #include "base/run_loop.h" |   21 #include "base/run_loop.h" | 
|   19 #include "base/stl_util.h" |   22 #include "base/stl_util.h" | 
|   20 #include "device/devices_app/usb/fake_permission_provider.h" |   23 #include "device/devices_app/usb/fake_permission_provider.h" | 
|   21 #include "device/usb/mock_usb_device.h" |   24 #include "device/usb/mock_usb_device.h" | 
|   22 #include "device/usb/mock_usb_device_handle.h" |   25 #include "device/usb/mock_usb_device_handle.h" | 
|   23 #include "mojo/public/cpp/bindings/interface_request.h" |   26 #include "mojo/public/cpp/bindings/interface_request.h" | 
|   24 #include "net/base/io_buffer.h" |   27 #include "net/base/io_buffer.h" | 
|   25 #include "testing/gtest/include/gtest/gtest.h" |   28 #include "testing/gtest/include/gtest/gtest.h" | 
|   26  |   29  | 
|   27 using ::testing::Invoke; |   30 using ::testing::Invoke; | 
|   28 using ::testing::_; |   31 using ::testing::_; | 
|   29  |   32  | 
|   30 namespace device { |   33 namespace device { | 
|   31 namespace usb { |   34 namespace usb { | 
|   32  |   35  | 
|   33 namespace { |   36 namespace { | 
|   34  |   37  | 
|   35 class ConfigBuilder { |   38 class ConfigBuilder { | 
|   36  public: |   39  public: | 
|   37   ConfigBuilder(uint8_t value) { config_.configuration_value = value; } |   40   explicit ConfigBuilder(uint8_t value) { config_.configuration_value = value; } | 
|   38  |   41  | 
|   39   ConfigBuilder& AddInterface(uint8_t interface_number, |   42   ConfigBuilder& AddInterface(uint8_t interface_number, | 
|   40                               uint8_t alternate_setting, |   43                               uint8_t alternate_setting, | 
|   41                               uint8_t class_code, |   44                               uint8_t class_code, | 
|   42                               uint8_t subclass_code, |   45                               uint8_t subclass_code, | 
|   43                               uint8_t protocol_code) { |   46                               uint8_t protocol_code) { | 
|   44     UsbInterfaceDescriptor interface; |   47     UsbInterfaceDescriptor interface; | 
|   45     interface.interface_number = interface_number; |   48     interface.interface_number = interface_number; | 
|   46     interface.alternate_setting = alternate_setting; |   49     interface.alternate_setting = alternate_setting; | 
|   47     interface.interface_class = class_code; |   50     interface.interface_class = class_code; | 
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   95                              mojo::Array<uint8_t> actual_bytes) { |   98                              mojo::Array<uint8_t> actual_bytes) { | 
|   96   EXPECT_EQ(expected_status, actual_status); |   99   EXPECT_EQ(expected_status, actual_status); | 
|   97   ASSERT_EQ(expected_bytes.size(), actual_bytes.size()); |  100   ASSERT_EQ(expected_bytes.size(), actual_bytes.size()); | 
|   98   for (size_t i = 0; i < actual_bytes.size(); ++i) { |  101   for (size_t i = 0; i < actual_bytes.size(); ++i) { | 
|   99     EXPECT_EQ(expected_bytes[i], actual_bytes[i]) |  102     EXPECT_EQ(expected_bytes[i], actual_bytes[i]) | 
|  100         << "Contents differ at index: " << i; |  103         << "Contents differ at index: " << i; | 
|  101   } |  104   } | 
|  102   continuation.Run(); |  105   continuation.Run(); | 
|  103 } |  106 } | 
|  104  |  107  | 
|  105 void ExpectPacketsAndThen( |  108 void ExpectPacketsOutAndThen(const std::vector<uint32_t>& expected_packets, | 
|  106     TransferStatus expected_status, |  109                              const base::Closure& continuation, | 
|  107     const std::vector<std::vector<uint8_t>>& expected_packets, |  110                              mojo::Array<IsochronousPacketPtr> actual_packets) { | 
|  108     const base::Closure& continuation, |  | 
|  109     TransferStatus actual_status, |  | 
|  110     mojo::Array<mojo::Array<uint8_t>> actual_packets) { |  | 
|  111   EXPECT_EQ(expected_status, actual_status); |  | 
|  112   ASSERT_EQ(expected_packets.size(), actual_packets.size()); |  111   ASSERT_EQ(expected_packets.size(), actual_packets.size()); | 
|  113   for (size_t i = 0; i < expected_packets.size(); ++i) { |  112   for (size_t i = 0; i < expected_packets.size(); ++i) { | 
|  114     EXPECT_EQ(expected_packets[i].size(), actual_packets[i].size()) |  113     EXPECT_EQ(expected_packets[i], actual_packets[i]->transferred_length) | 
|  115         << "Packet sizes differ at index: " << i; |  114         << "Packet lengths differ at index: " << i; | 
|  116     for (size_t j = 0; j < expected_packets[i].size(); ++j) { |  115     EXPECT_EQ(TransferStatus::COMPLETED, actual_packets[i]->status) | 
|  117       EXPECT_EQ(expected_packets[i][j], actual_packets[i][j]) |  116         << "Packet at index " << i << " not completed."; | 
|  118           << "Contents of packet " << i << " differ at index " << j; |  | 
|  119     } |  | 
|  120   } |  117   } | 
|  121   continuation.Run(); |  118   continuation.Run(); | 
|  122 } |  119 } | 
 |  120  | 
 |  121 void ExpectPacketsInAndThen(const std::vector<uint8_t>& expected_bytes, | 
 |  122                             const std::vector<uint32_t>& expected_packets, | 
 |  123                             const base::Closure& continuation, | 
 |  124                             mojo::Array<uint8_t> actual_bytes, | 
 |  125                             mojo::Array<IsochronousPacketPtr> actual_packets) { | 
 |  126   ASSERT_EQ(expected_packets.size(), actual_packets.size()); | 
 |  127   for (size_t i = 0; i < expected_packets.size(); ++i) { | 
 |  128     EXPECT_EQ(expected_packets[i], actual_packets[i]->transferred_length) | 
 |  129         << "Packet lengths differ at index: " << i; | 
 |  130     EXPECT_EQ(TransferStatus::COMPLETED, actual_packets[i]->status) | 
 |  131         << "Packet at index " << i << " not completed."; | 
 |  132   } | 
 |  133   ASSERT_EQ(expected_bytes.size(), actual_bytes.size()); | 
 |  134   for (size_t i = 0; i < expected_bytes.size(); ++i) { | 
 |  135     EXPECT_EQ(expected_bytes[i], actual_bytes[i]) | 
 |  136         << "Contents differ at index: " << i; | 
 |  137   } | 
 |  138   continuation.Run(); | 
 |  139 } | 
|  123  |  140  | 
|  124 void ExpectTransferStatusAndThen(TransferStatus expected_status, |  141 void ExpectTransferStatusAndThen(TransferStatus expected_status, | 
|  125                                  const base::Closure& continuation, |  142                                  const base::Closure& continuation, | 
|  126                                  TransferStatus actual_status) { |  143                                  TransferStatus actual_status) { | 
|  127   EXPECT_EQ(expected_status, actual_status); |  144   EXPECT_EQ(expected_status, actual_status); | 
|  128   continuation.Run(); |  145   continuation.Run(); | 
|  129 } |  146 } | 
|  130  |  147  | 
|  131 class USBDeviceImplTest : public testing::Test { |  148 class USBDeviceImplTest : public testing::Test { | 
|  132  public: |  149  public: | 
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  179         .WillByDefault(Invoke(this, &USBDeviceImplTest::ReleaseInterface)); |  196         .WillByDefault(Invoke(this, &USBDeviceImplTest::ReleaseInterface)); | 
|  180     ON_CALL(mock_handle(), SetInterfaceAlternateSetting(_, _, _)) |  197     ON_CALL(mock_handle(), SetInterfaceAlternateSetting(_, _, _)) | 
|  181         .WillByDefault( |  198         .WillByDefault( | 
|  182             Invoke(this, &USBDeviceImplTest::SetInterfaceAlternateSetting)); |  199             Invoke(this, &USBDeviceImplTest::SetInterfaceAlternateSetting)); | 
|  183     ON_CALL(mock_handle(), ResetDevice(_)) |  200     ON_CALL(mock_handle(), ResetDevice(_)) | 
|  184         .WillByDefault(Invoke(this, &USBDeviceImplTest::ResetDevice)); |  201         .WillByDefault(Invoke(this, &USBDeviceImplTest::ResetDevice)); | 
|  185     ON_CALL(mock_handle(), ControlTransfer(_, _, _, _, _, _, _, _, _, _)) |  202     ON_CALL(mock_handle(), ControlTransfer(_, _, _, _, _, _, _, _, _, _)) | 
|  186         .WillByDefault(Invoke(this, &USBDeviceImplTest::ControlTransfer)); |  203         .WillByDefault(Invoke(this, &USBDeviceImplTest::ControlTransfer)); | 
|  187     ON_CALL(mock_handle(), GenericTransfer(_, _, _, _, _, _)) |  204     ON_CALL(mock_handle(), GenericTransfer(_, _, _, _, _, _)) | 
|  188         .WillByDefault(Invoke(this, &USBDeviceImplTest::GenericTransfer)); |  205         .WillByDefault(Invoke(this, &USBDeviceImplTest::GenericTransfer)); | 
|  189     ON_CALL(mock_handle(), IsochronousTransfer(_, _, _, _, _, _, _, _)) |  206     ON_CALL(mock_handle(), IsochronousTransferIn(_, _, _, _)) | 
|  190         .WillByDefault(Invoke(this, &USBDeviceImplTest::IsochronousTransfer)); |  207         .WillByDefault(Invoke(this, &USBDeviceImplTest::IsochronousTransferIn)); | 
 |  208     ON_CALL(mock_handle(), IsochronousTransferOut(_, _, _, _, _)) | 
 |  209         .WillByDefault( | 
 |  210             Invoke(this, &USBDeviceImplTest::IsochronousTransferOut)); | 
|  191  |  211  | 
|  192     return proxy; |  212     return proxy; | 
|  193   } |  213   } | 
|  194  |  214  | 
|  195   DevicePtr GetMockDeviceProxy() { |  215   DevicePtr GetMockDeviceProxy() { | 
|  196     return GetMockDeviceProxy(0x1234, 0x5678, "ACME", "Frobinator", "ABCDEF"); |  216     return GetMockDeviceProxy(0x1234, 0x5678, "ACME", "Frobinator", "ABCDEF"); | 
|  197   } |  217   } | 
|  198  |  218  | 
|  199   void AddMockConfig(const ConfigBuilder& builder) { |  219   void AddMockConfig(const ConfigBuilder& builder) { | 
|  200     const UsbConfigDescriptor& config = builder.config(); |  220     const UsbConfigDescriptor& config = builder.config(); | 
|  201     DCHECK(!ContainsKey(mock_configs_, config.configuration_value)); |  221     DCHECK(!ContainsKey(mock_configs_, config.configuration_value)); | 
|  202     mock_configs_[config.configuration_value] = config; |  222     mock_configs_[config.configuration_value] = config; | 
|  203   } |  223   } | 
|  204  |  224  | 
|  205   void AddMockInboundData(const std::vector<uint8_t>& data) { |  225   void AddMockInboundData(const std::vector<uint8_t>& data) { | 
|  206     mock_inbound_data_.push(data); |  226     mock_inbound_data_.push(data); | 
|  207   } |  227   } | 
|  208  |  228  | 
 |  229   void AddMockInboundPackets( | 
 |  230       const std::vector<uint8_t>& data, | 
 |  231       const std::vector<UsbDeviceHandle::IsochronousPacket>& packets) { | 
 |  232     mock_inbound_data_.push(data); | 
 |  233     mock_inbound_packets_.push(packets); | 
 |  234   } | 
 |  235  | 
|  209   void AddMockOutboundData(const std::vector<uint8_t>& data) { |  236   void AddMockOutboundData(const std::vector<uint8_t>& data) { | 
|  210     mock_outbound_data_.push(data); |  237     mock_outbound_data_.push(data); | 
|  211   } |  238   } | 
|  212  |  239  | 
 |  240   void AddMockOutboundPackets( | 
 |  241       const std::vector<uint8_t>& data, | 
 |  242       const std::vector<UsbDeviceHandle::IsochronousPacket>& packets) { | 
 |  243     mock_outbound_data_.push(data); | 
 |  244     mock_outbound_packets_.push(packets); | 
 |  245   } | 
 |  246  | 
|  213  private: |  247  private: | 
|  214   void OpenMockHandle(const UsbDevice::OpenCallback& callback) { |  248   void OpenMockHandle(const UsbDevice::OpenCallback& callback) { | 
|  215     EXPECT_FALSE(is_device_open_); |  249     EXPECT_FALSE(is_device_open_); | 
|  216     is_device_open_ = true; |  250     is_device_open_ = true; | 
|  217     callback.Run(mock_handle_); |  251     callback.Run(mock_handle_); | 
|  218   } |  252   } | 
|  219  |  253  | 
|  220   void CloseMockHandle() { |  254   void CloseMockHandle() { | 
|  221     EXPECT_TRUE(is_device_open_); |  255     EXPECT_TRUE(is_device_open_); | 
|  222     is_device_open_ = false; |  256     is_device_open_ = false; | 
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  329                        scoped_refptr<net::IOBuffer> buffer, |  363                        scoped_refptr<net::IOBuffer> buffer, | 
|  330                        size_t length, |  364                        size_t length, | 
|  331                        unsigned int timeout, |  365                        unsigned int timeout, | 
|  332                        const UsbDeviceHandle::TransferCallback& callback) { |  366                        const UsbDeviceHandle::TransferCallback& callback) { | 
|  333     if (direction == USB_DIRECTION_INBOUND) |  367     if (direction == USB_DIRECTION_INBOUND) | 
|  334       InboundTransfer(callback); |  368       InboundTransfer(callback); | 
|  335     else |  369     else | 
|  336       OutboundTransfer(buffer, length, callback); |  370       OutboundTransfer(buffer, length, callback); | 
|  337   } |  371   } | 
|  338  |  372  | 
|  339   void IsochronousTransfer(UsbEndpointDirection direction, |  373   void IsochronousTransferIn( | 
|  340                            uint8_t endpoint, |  374       uint8_t endpoint_number, | 
|  341                            scoped_refptr<net::IOBuffer> buffer, |  375       const std::vector<uint32_t>& packet_lengths, | 
|  342                            size_t length, |  376       unsigned int timeout, | 
|  343                            unsigned int packets, |  377       const UsbDeviceHandle::IsochronousTransferCallback& callback) { | 
|  344                            unsigned int packet_length, |  378     ASSERT_FALSE(mock_inbound_data_.empty()); | 
|  345                            unsigned int timeout, |  379     const std::vector<uint8_t>& bytes = mock_inbound_data_.front(); | 
|  346                            const UsbDeviceHandle::TransferCallback& callback) { |  380     size_t length = bytes.size(); | 
|  347     if (direction == USB_DIRECTION_INBOUND) |  381     scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(length); | 
|  348       InboundTransfer(callback); |  382     std::copy(bytes.begin(), bytes.end(), buffer->data()); | 
|  349     else |  383     mock_inbound_data_.pop(); | 
|  350       OutboundTransfer(buffer, length, callback); |  384  | 
 |  385     ASSERT_FALSE(mock_inbound_packets_.empty()); | 
 |  386     std::vector<UsbDeviceHandle::IsochronousPacket> packets = | 
 |  387         mock_inbound_packets_.front(); | 
 |  388     ASSERT_EQ(packets.size(), packet_lengths.size()); | 
 |  389     for (size_t i = 0; i < packets.size(); ++i) { | 
 |  390       EXPECT_EQ(packets[i].length, packet_lengths[i]) | 
 |  391           << "Packet lengths differ at index: " << i; | 
 |  392     } | 
 |  393     mock_inbound_packets_.pop(); | 
 |  394  | 
 |  395     callback.Run(buffer, packets); | 
 |  396   } | 
 |  397  | 
 |  398   void IsochronousTransferOut( | 
 |  399       uint8_t endpoint_number, | 
 |  400       scoped_refptr<net::IOBuffer> buffer, | 
 |  401       const std::vector<uint32_t>& packet_lengths, | 
 |  402       unsigned int timeout, | 
 |  403       const UsbDeviceHandle::IsochronousTransferCallback& callback) { | 
 |  404     ASSERT_FALSE(mock_outbound_data_.empty()); | 
 |  405     const std::vector<uint8_t>& bytes = mock_outbound_data_.front(); | 
 |  406     size_t length = | 
 |  407         std::accumulate(packet_lengths.begin(), packet_lengths.end(), 0u); | 
 |  408     ASSERT_EQ(bytes.size(), length); | 
 |  409     for (size_t i = 0; i < length; ++i) { | 
 |  410       EXPECT_EQ(bytes[i], buffer->data()[i]) << "Contents differ at index: " | 
 |  411                                              << i; | 
 |  412     } | 
 |  413     mock_outbound_data_.pop(); | 
 |  414  | 
 |  415     ASSERT_FALSE(mock_outbound_packets_.empty()); | 
 |  416     std::vector<UsbDeviceHandle::IsochronousPacket> packets = | 
 |  417         mock_outbound_packets_.front(); | 
 |  418     ASSERT_EQ(packets.size(), packet_lengths.size()); | 
 |  419     for (size_t i = 0; i < packets.size(); ++i) { | 
 |  420       EXPECT_EQ(packets[i].length, packet_lengths[i]) | 
 |  421           << "Packet lengths differ at index: " << i; | 
 |  422     } | 
 |  423     mock_outbound_packets_.pop(); | 
 |  424  | 
 |  425     callback.Run(buffer, packets); | 
|  351   } |  426   } | 
|  352  |  427  | 
|  353   scoped_ptr<base::MessageLoop> message_loop_; |  428   scoped_ptr<base::MessageLoop> message_loop_; | 
|  354   scoped_refptr<MockUsbDevice> mock_device_; |  429   scoped_refptr<MockUsbDevice> mock_device_; | 
|  355   scoped_refptr<MockUsbDeviceHandle> mock_handle_; |  430   scoped_refptr<MockUsbDeviceHandle> mock_handle_; | 
|  356   bool is_device_open_; |  431   bool is_device_open_; | 
|  357   bool allow_reset_; |  432   bool allow_reset_; | 
|  358  |  433  | 
|  359   std::map<uint8_t, UsbConfigDescriptor> mock_configs_; |  434   std::map<uint8_t, UsbConfigDescriptor> mock_configs_; | 
|  360   uint8_t current_config_; |  435   uint8_t current_config_; | 
|  361  |  436  | 
|  362   std::queue<std::vector<uint8_t>> mock_inbound_data_; |  437   std::queue<std::vector<uint8_t>> mock_inbound_data_; | 
|  363   std::queue<std::vector<uint8_t>> mock_outbound_data_; |  438   std::queue<std::vector<uint8_t>> mock_outbound_data_; | 
 |  439   std::queue<std::vector<UsbDeviceHandle::IsochronousPacket>> | 
 |  440       mock_inbound_packets_; | 
 |  441   std::queue<std::vector<UsbDeviceHandle::IsochronousPacket>> | 
 |  442       mock_outbound_packets_; | 
|  364  |  443  | 
|  365   std::set<uint8_t> claimed_interfaces_; |  444   std::set<uint8_t> claimed_interfaces_; | 
|  366  |  445  | 
|  367   FakePermissionProvider permission_provider_; |  446   FakePermissionProvider permission_provider_; | 
|  368  |  447  | 
|  369   DISALLOW_COPY_AND_ASSIGN(USBDeviceImplTest); |  448   DISALLOW_COPY_AND_ASSIGN(USBDeviceImplTest); | 
|  370 }; |  449 }; | 
|  371  |  450  | 
|  372 }  // namespace |  451 }  // namespace | 
|  373  |  452  | 
| (...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  751  |  830  | 
|  752   EXPECT_CALL(mock_device(), Open(_)); |  831   EXPECT_CALL(mock_device(), Open(_)); | 
|  753  |  832  | 
|  754   { |  833   { | 
|  755     base::RunLoop loop; |  834     base::RunLoop loop; | 
|  756     device->Open(base::Bind(&ExpectOpenAndThen, OpenDeviceError::OK, |  835     device->Open(base::Bind(&ExpectOpenAndThen, OpenDeviceError::OK, | 
|  757                             loop.QuitClosure())); |  836                             loop.QuitClosure())); | 
|  758     loop.Run(); |  837     loop.Run(); | 
|  759   } |  838   } | 
|  760  |  839  | 
|  761   std::string outbound_packet_data = "aaaaaaaabbbbbbbbccccccccdddddddd"; |  840   std::vector<UsbDeviceHandle::IsochronousPacket> fake_packets(4); | 
|  762   std::vector<uint8_t> fake_outbound_packets(outbound_packet_data.size()); |  841   for (size_t i = 0; i < fake_packets.size(); ++i) { | 
|  763   std::copy(outbound_packet_data.begin(), outbound_packet_data.end(), |  842     fake_packets[i].length = 8; | 
|  764             fake_outbound_packets.begin()); |  843     fake_packets[i].transferred_length = 8; | 
 |  844     fake_packets[i].status = USB_TRANSFER_COMPLETED; | 
 |  845   } | 
 |  846   std::vector<uint32_t> fake_packet_lengths(4, 8); | 
|  765  |  847  | 
|  766   std::string inbound_packet_data = "ddddddddccccccccbbbbbbbbaaaaaaaa"; |  848   std::vector<uint32_t> expected_transferred_lengths(4, 8); | 
|  767   std::vector<uint8_t> fake_inbound_packets(inbound_packet_data.size()); |  849  | 
|  768   std::copy(inbound_packet_data.begin(), inbound_packet_data.end(), |  850   std::string outbound_data = "aaaaaaaabbbbbbbbccccccccdddddddd"; | 
|  769             fake_inbound_packets.begin()); |  851   std::vector<uint8_t> fake_outbound_data(outbound_data.size()); | 
 |  852   std::copy(outbound_data.begin(), outbound_data.end(), | 
 |  853             fake_outbound_data.begin()); | 
 |  854  | 
 |  855   std::string inbound_data = "ddddddddccccccccbbbbbbbbaaaaaaaa"; | 
 |  856   std::vector<uint8_t> fake_inbound_data(inbound_data.size()); | 
 |  857   std::copy(inbound_data.begin(), inbound_data.end(), | 
 |  858             fake_inbound_data.begin()); | 
|  770  |  859  | 
|  771   AddMockConfig(ConfigBuilder(1).AddInterface(7, 0, 1, 2, 3)); |  860   AddMockConfig(ConfigBuilder(1).AddInterface(7, 0, 1, 2, 3)); | 
|  772   AddMockOutboundData(fake_outbound_packets); |  861   AddMockOutboundPackets(fake_outbound_data, fake_packets); | 
|  773   AddMockInboundData(fake_inbound_packets); |  862   AddMockInboundPackets(fake_inbound_data, fake_packets); | 
|  774  |  863  | 
|  775   EXPECT_CALL(mock_handle(), |  864   EXPECT_CALL(mock_handle(), | 
|  776               IsochronousTransfer(USB_DIRECTION_OUTBOUND, 0x01, _, |  865               IsochronousTransferOut(0x01, _, fake_packet_lengths, 0, _)); | 
|  777                                   fake_outbound_packets.size(), 4, 8, 0, _)); |  | 
|  778  |  866  | 
|  779   { |  867   { | 
|  780     base::RunLoop loop; |  868     base::RunLoop loop; | 
|  781     mojo::Array<mojo::Array<uint8_t>> packets = |  | 
|  782         mojo::Array<mojo::Array<uint8_t>>::New(4); |  | 
|  783     for (size_t i = 0; i < 4; ++i) { |  | 
|  784       std::vector<uint8_t> bytes(8); |  | 
|  785       std::copy(outbound_packet_data.begin() + i * 8, |  | 
|  786                 outbound_packet_data.begin() + i * 8 + 8, bytes.begin()); |  | 
|  787       packets[i].Swap(&bytes); |  | 
|  788     } |  | 
|  789     device->IsochronousTransferOut( |  869     device->IsochronousTransferOut( | 
|  790         1, std::move(packets), 0, |  870         1, mojo::Array<uint8_t>::From(fake_outbound_data), | 
|  791         base::Bind(&ExpectTransferStatusAndThen, TransferStatus::COMPLETED, |  871         mojo::Array<uint32_t>::From(fake_packet_lengths), 0, | 
 |  872         base::Bind(&ExpectPacketsOutAndThen, expected_transferred_lengths, | 
|  792                    loop.QuitClosure())); |  873                    loop.QuitClosure())); | 
|  793     loop.Run(); |  874     loop.Run(); | 
|  794   } |  875   } | 
|  795  |  876  | 
|  796   EXPECT_CALL(mock_handle(), |  877   EXPECT_CALL(mock_handle(), | 
|  797               IsochronousTransfer(USB_DIRECTION_INBOUND, 0x81, _, |  878               IsochronousTransferIn(0x81, fake_packet_lengths, 0, _)); | 
|  798                                   fake_inbound_packets.size(), 4, 8, 0, _)); |  | 
|  799  |  879  | 
|  800   { |  880   { | 
|  801     base::RunLoop loop; |  881     base::RunLoop loop; | 
|  802     std::vector<std::vector<uint8_t>> packets(4); |  | 
|  803     for (size_t i = 0; i < 4; ++i) { |  | 
|  804       packets[i].resize(8); |  | 
|  805       std::copy(inbound_packet_data.begin() + i * 8, |  | 
|  806                 inbound_packet_data.begin() + i * 8 + 8, packets[i].begin()); |  | 
|  807     } |  | 
|  808     device->IsochronousTransferIn( |  882     device->IsochronousTransferIn( | 
|  809         1, 4, 8, 0, base::Bind(&ExpectPacketsAndThen, TransferStatus::COMPLETED, |  883         1, mojo::Array<uint32_t>::From(fake_packet_lengths), 0, | 
|  810                                packets, loop.QuitClosure())); |  884         base::Bind(&ExpectPacketsInAndThen, fake_inbound_data, | 
 |  885                    expected_transferred_lengths, loop.QuitClosure())); | 
|  811     loop.Run(); |  886     loop.Run(); | 
|  812   } |  887   } | 
|  813  |  888  | 
|  814   EXPECT_CALL(mock_handle(), Close()); |  889   EXPECT_CALL(mock_handle(), Close()); | 
|  815 } |  890 } | 
|  816  |  891  | 
|  817 }  // namespace usb |  892 }  // namespace usb | 
|  818 }  // namespace device |  893 }  // namespace device | 
| OLD | NEW |