| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/browser/extensions/api/usb/usb_api.h" | |
| 6 #include "chrome/browser/extensions/extension_apitest.h" | 5 #include "chrome/browser/extensions/extension_apitest.h" |
| 7 #include "chrome/browser/ui/browser.h" | 6 #include "chrome/browser/ui/browser.h" |
| 8 #include "content/public/browser/browser_thread.h" | 7 #include "content/public/browser/browser_thread.h" |
| 8 #include "extensions/browser/api/usb/usb_api.h" |
| 9 #include "net/base/io_buffer.h" | 9 #include "net/base/io_buffer.h" |
| 10 #include "testing/gmock/include/gmock/gmock.h" | 10 #include "testing/gmock/include/gmock/gmock.h" |
| 11 | 11 |
| 12 using testing::AnyNumber; | 12 using testing::AnyNumber; |
| 13 using testing::_; | 13 using testing::_; |
| 14 using testing::Return; | 14 using testing::Return; |
| 15 using content::BrowserThread; | 15 using content::BrowserThread; |
| 16 using usb_service::UsbConfigDescriptor; | 16 using usb_service::UsbConfigDescriptor; |
| 17 using usb_service::UsbDevice; | 17 using usb_service::UsbDevice; |
| 18 using usb_service::UsbDeviceHandle; | 18 using usb_service::UsbDeviceHandle; |
| 19 using usb_service::UsbEndpointDirection; | 19 using usb_service::UsbEndpointDirection; |
| 20 using usb_service::UsbTransferCallback; | 20 using usb_service::UsbTransferCallback; |
| 21 | 21 |
| 22 namespace { | 22 namespace { |
| 23 | 23 |
| 24 ACTION_TEMPLATE(InvokeUsbTransferCallback, | 24 ACTION_TEMPLATE(InvokeUsbTransferCallback, |
| 25 HAS_1_TEMPLATE_PARAMS(int, k), | 25 HAS_1_TEMPLATE_PARAMS(int, k), |
| 26 AND_1_VALUE_PARAMS(p1)) { | 26 AND_1_VALUE_PARAMS(p1)) { |
| 27 ::std::tr1::get<k>(args).Run(p1, new net::IOBuffer(1), 1); | 27 ::std::tr1::get<k>(args).Run(p1, new net::IOBuffer(1), 1); |
| 28 } | 28 } |
| 29 | 29 |
| 30 // MSVC erroneously thinks that at least one of the arguments for the transfer | 30 // MSVC erroneously thinks that at least one of the arguments for the transfer |
| 31 // methods differ by const or volatility and emits a warning about the old | 31 // methods differ by const or volatility and emits a warning about the old |
| 32 // standards-noncompliant behaviour of their compiler. | 32 // standards-noncompliant behaviour of their compiler. |
| 33 #if defined(OS_WIN) | 33 #if defined(OS_WIN) |
| 34 #pragma warning(push) | 34 #pragma warning(push) |
| 35 #pragma warning(disable:4373) | 35 #pragma warning(disable : 4373) |
| 36 #endif | 36 #endif |
| 37 | 37 |
| 38 class MockUsbDeviceHandle : public UsbDeviceHandle { | 38 class MockUsbDeviceHandle : public UsbDeviceHandle { |
| 39 public: | 39 public: |
| 40 MockUsbDeviceHandle() : UsbDeviceHandle() {} | 40 MockUsbDeviceHandle() : UsbDeviceHandle() {} |
| 41 | 41 |
| 42 MOCK_METHOD0(Close, void()); | 42 MOCK_METHOD0(Close, void()); |
| 43 | 43 |
| 44 MOCK_METHOD10(ControlTransfer, void(const UsbEndpointDirection direction, | 44 MOCK_METHOD10(ControlTransfer, |
| 45 const TransferRequestType request_type, const TransferRecipient recipient, | 45 void(const UsbEndpointDirection direction, |
| 46 const uint8 request, const uint16 value, const uint16 index, | 46 const TransferRequestType request_type, |
| 47 net::IOBuffer* buffer, const size_t length, const unsigned int timeout, | 47 const TransferRecipient recipient, |
| 48 const UsbTransferCallback& callback)); | 48 const uint8 request, |
| 49 const uint16 value, |
| 50 const uint16 index, |
| 51 net::IOBuffer* buffer, |
| 52 const size_t length, |
| 53 const unsigned int timeout, |
| 54 const UsbTransferCallback& callback)); |
| 49 | 55 |
| 50 MOCK_METHOD6(BulkTransfer, void(const UsbEndpointDirection direction, | 56 MOCK_METHOD6(BulkTransfer, |
| 51 const uint8 endpoint, net::IOBuffer* buffer, const size_t length, | 57 void(const UsbEndpointDirection direction, |
| 52 const unsigned int timeout, const UsbTransferCallback& callback)); | 58 const uint8 endpoint, |
| 59 net::IOBuffer* buffer, |
| 60 const size_t length, |
| 61 const unsigned int timeout, |
| 62 const UsbTransferCallback& callback)); |
| 53 | 63 |
| 54 MOCK_METHOD6(InterruptTransfer, void(const UsbEndpointDirection direction, | 64 MOCK_METHOD6(InterruptTransfer, |
| 55 const uint8 endpoint, net::IOBuffer* buffer, const size_t length, | 65 void(const UsbEndpointDirection direction, |
| 56 const unsigned int timeout, const UsbTransferCallback& callback)); | 66 const uint8 endpoint, |
| 67 net::IOBuffer* buffer, |
| 68 const size_t length, |
| 69 const unsigned int timeout, |
| 70 const UsbTransferCallback& callback)); |
| 57 | 71 |
| 58 MOCK_METHOD8(IsochronousTransfer, void(const UsbEndpointDirection direction, | 72 MOCK_METHOD8(IsochronousTransfer, |
| 59 const uint8 endpoint, net::IOBuffer* buffer, const size_t length, | 73 void(const UsbEndpointDirection direction, |
| 60 const unsigned int packets, const unsigned int packet_length, | 74 const uint8 endpoint, |
| 61 const unsigned int timeout, const UsbTransferCallback& callback)); | 75 net::IOBuffer* buffer, |
| 76 const size_t length, |
| 77 const unsigned int packets, |
| 78 const unsigned int packet_length, |
| 79 const unsigned int timeout, |
| 80 const UsbTransferCallback& callback)); |
| 62 | 81 |
| 63 MOCK_METHOD0(ResetDevice, bool()); | 82 MOCK_METHOD0(ResetDevice, bool()); |
| 64 | 83 |
| 65 void set_device(UsbDevice* device) { device_ = device; } | 84 void set_device(UsbDevice* device) { device_ = device; } |
| 66 | 85 |
| 67 protected: | 86 protected: |
| 68 virtual ~MockUsbDeviceHandle() {} | 87 virtual ~MockUsbDeviceHandle() {} |
| 69 }; | 88 }; |
| 70 | 89 |
| 71 class MockUsbDevice : public UsbDevice { | 90 class MockUsbDevice : public UsbDevice { |
| 72 public: | 91 public: |
| 73 explicit MockUsbDevice(MockUsbDeviceHandle* mock_handle) | 92 explicit MockUsbDevice(MockUsbDeviceHandle* mock_handle) |
| 74 : UsbDevice(), | 93 : UsbDevice(), mock_handle_(mock_handle) { |
| 75 mock_handle_(mock_handle) { | |
| 76 mock_handle->set_device(this); | 94 mock_handle->set_device(this); |
| 77 } | 95 } |
| 78 | 96 |
| 79 virtual scoped_refptr<UsbDeviceHandle> Open() OVERRIDE { | 97 virtual scoped_refptr<UsbDeviceHandle> Open() OVERRIDE { |
| 80 return mock_handle_; | 98 return mock_handle_; |
| 81 } | 99 } |
| 82 | 100 |
| 83 virtual bool Close(scoped_refptr<UsbDeviceHandle> handle) OVERRIDE { | 101 virtual bool Close(scoped_refptr<UsbDeviceHandle> handle) OVERRIDE { |
| 84 EXPECT_TRUE(false) << "Should not be reached"; | 102 EXPECT_TRUE(false) << "Should not be reached"; |
| 85 return false; | 103 return false; |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 .WillOnce(Return(scoped_refptr<UsbConfigDescriptor>())); | 152 .WillOnce(Return(scoped_refptr<UsbConfigDescriptor>())); |
| 135 EXPECT_CALL(*mock_device_handle_.get(), Close()).Times(AnyNumber()); | 153 EXPECT_CALL(*mock_device_handle_.get(), Close()).Times(AnyNumber()); |
| 136 ASSERT_TRUE(RunExtensionTest("usb/list_interfaces")); | 154 ASSERT_TRUE(RunExtensionTest("usb/list_interfaces")); |
| 137 } | 155 } |
| 138 | 156 |
| 139 IN_PROC_BROWSER_TEST_F(UsbApiTest, TransferEvent) { | 157 IN_PROC_BROWSER_TEST_F(UsbApiTest, TransferEvent) { |
| 140 EXPECT_CALL(*mock_device_handle_.get(), | 158 EXPECT_CALL(*mock_device_handle_.get(), |
| 141 ControlTransfer(usb_service::USB_DIRECTION_OUTBOUND, | 159 ControlTransfer(usb_service::USB_DIRECTION_OUTBOUND, |
| 142 UsbDeviceHandle::STANDARD, | 160 UsbDeviceHandle::STANDARD, |
| 143 UsbDeviceHandle::DEVICE, | 161 UsbDeviceHandle::DEVICE, |
| 144 1, 2, 3, _, 1, _, _)) | 162 1, |
| 163 2, |
| 164 3, |
| 165 _, |
| 166 1, |
| 167 _, |
| 168 _)) |
| 145 .WillOnce( | 169 .WillOnce( |
| 146 InvokeUsbTransferCallback<9>(usb_service::USB_TRANSFER_COMPLETED)); | 170 InvokeUsbTransferCallback<9>(usb_service::USB_TRANSFER_COMPLETED)); |
| 147 EXPECT_CALL(*mock_device_handle_.get(), | 171 EXPECT_CALL(*mock_device_handle_.get(), |
| 148 BulkTransfer(usb_service::USB_DIRECTION_OUTBOUND, 1, _, 1, _, _)) | 172 BulkTransfer(usb_service::USB_DIRECTION_OUTBOUND, 1, _, 1, _, _)) |
| 149 .WillOnce( | 173 .WillOnce( |
| 150 InvokeUsbTransferCallback<5>(usb_service::USB_TRANSFER_COMPLETED)); | 174 InvokeUsbTransferCallback<5>(usb_service::USB_TRANSFER_COMPLETED)); |
| 151 EXPECT_CALL( | 175 EXPECT_CALL( |
| 152 *mock_device_handle_.get(), | 176 *mock_device_handle_.get(), |
| 153 InterruptTransfer(usb_service::USB_DIRECTION_OUTBOUND, 2, _, 1, _, _)) | 177 InterruptTransfer(usb_service::USB_DIRECTION_OUTBOUND, 2, _, 1, _, _)) |
| 154 .WillOnce( | 178 .WillOnce( |
| (...skipping 23 matching lines...) Expand all Loading... |
| 178 .WillOnce( | 202 .WillOnce( |
| 179 InvokeUsbTransferCallback<5>(usb_service::USB_TRANSFER_TIMEOUT)); | 203 InvokeUsbTransferCallback<5>(usb_service::USB_TRANSFER_TIMEOUT)); |
| 180 EXPECT_CALL(*mock_device_handle_.get(), Close()).Times(AnyNumber()); | 204 EXPECT_CALL(*mock_device_handle_.get(), Close()).Times(AnyNumber()); |
| 181 ASSERT_TRUE(RunExtensionTest("usb/transfer_failure")); | 205 ASSERT_TRUE(RunExtensionTest("usb/transfer_failure")); |
| 182 } | 206 } |
| 183 | 207 |
| 184 IN_PROC_BROWSER_TEST_F(UsbApiTest, InvalidLengthTransfer) { | 208 IN_PROC_BROWSER_TEST_F(UsbApiTest, InvalidLengthTransfer) { |
| 185 EXPECT_CALL(*mock_device_handle_.get(), Close()).Times(AnyNumber()); | 209 EXPECT_CALL(*mock_device_handle_.get(), Close()).Times(AnyNumber()); |
| 186 ASSERT_TRUE(RunExtensionTest("usb/invalid_length_transfer")); | 210 ASSERT_TRUE(RunExtensionTest("usb/invalid_length_transfer")); |
| 187 } | 211 } |
| OLD | NEW |