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" | 5 #include "chrome/browser/extensions/api/usb/usb_api.h" |
6 #include "chrome/browser/extensions/extension_apitest.h" | 6 #include "chrome/browser/extensions/extension_apitest.h" |
7 #include "chrome/browser/ui/browser.h" | 7 #include "chrome/browser/ui/browser.h" |
8 #include "chrome/browser/usb/usb_service.h" | 8 #include "chrome/browser/usb/usb_service.h" |
9 #include "chrome/browser/usb/usb_service_factory.h" | 9 #include "chrome/browser/usb/usb_service_factory.h" |
10 #include "chrome/common/chrome_switches.h" | 10 #include "chrome/common/chrome_switches.h" |
11 #include "net/base/io_buffer.h" | 11 #include "net/base/io_buffer.h" |
12 #include "testing/gmock/include/gmock/gmock.h" | 12 #include "testing/gmock/include/gmock/gmock.h" |
13 | 13 |
14 using testing::AnyNumber; | 14 using testing::AnyNumber; |
15 using testing::_; | 15 using testing::_; |
16 | 16 |
17 namespace { | 17 namespace { |
18 | 18 |
19 ACTION_TEMPLATE(InvokeUsbTransferCallback, | 19 ACTION_TEMPLATE(InvokeUsbTransferCallback, |
20 HAS_1_TEMPLATE_PARAMS(int, k), | 20 HAS_1_TEMPLATE_PARAMS(int, k), |
21 AND_1_VALUE_PARAMS(p1)) { | 21 AND_1_VALUE_PARAMS(p1)) { |
22 ::std::tr1::get<k>(args).Run(p1, new net::IOBuffer(1), 1); | 22 ::std::tr1::get<k>(args).Run(p1, new net::IOBuffer(1), 1); |
23 } | 23 } |
24 | 24 |
| 25 ACTION(InvokeUsbInterfaceCallback) { |
| 26 // TODO mock up PlatformUsbConfigDescriptor |
| 27 ::std::tr1::get<1>(args).Run(false); |
| 28 } |
| 29 |
25 // 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 |
26 // 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 |
27 // standards-noncompliant behaviour of their compiler. | 32 // standards-noncompliant behaviour of their compiler. |
28 #if defined(OS_WIN) | 33 #if defined(OS_WIN) |
29 #pragma warning(push) | 34 #pragma warning(push) |
30 #pragma warning(disable:4373) | 35 #pragma warning(disable:4373) |
31 #endif | 36 #endif |
32 class MockUsbDevice : public UsbDevice { | 37 class MockUsbDevice : public UsbDevice { |
33 public: | 38 public: |
34 MockUsbDevice() : UsbDevice() {} | 39 MockUsbDevice() : UsbDevice() {} |
35 | 40 |
36 MOCK_METHOD1(Close, void(const base::Callback<void()>& callback)); | 41 MOCK_METHOD1(Close, void(const base::Callback<void()>& callback)); |
37 | 42 |
38 MOCK_METHOD10(ControlTransfer, void(const TransferDirection direction, | 43 MOCK_METHOD10(ControlTransfer, void(const UsbEndpointDirection direction, |
39 const TransferRequestType request_type, const TransferRecipient recipient, | 44 const TransferRequestType request_type, const TransferRecipient recipient, |
40 const uint8 request, const uint16 value, const uint16 index, | 45 const uint8 request, const uint16 value, const uint16 index, |
41 net::IOBuffer* buffer, const size_t length, const unsigned int timeout, | 46 net::IOBuffer* buffer, const size_t length, const unsigned int timeout, |
42 const UsbTransferCallback& callback)); | 47 const UsbTransferCallback& callback)); |
43 | 48 |
44 MOCK_METHOD6(BulkTransfer, void(const TransferDirection direction, | 49 MOCK_METHOD6(BulkTransfer, void(const UsbEndpointDirection direction, |
45 const uint8 endpoint, net::IOBuffer* buffer, const size_t length, | 50 const uint8 endpoint, net::IOBuffer* buffer, const size_t length, |
46 const unsigned int timeout, const UsbTransferCallback& callback)); | 51 const unsigned int timeout, const UsbTransferCallback& callback)); |
47 | 52 |
48 MOCK_METHOD6(InterruptTransfer, void(const TransferDirection direction, | 53 MOCK_METHOD6(InterruptTransfer, void(const UsbEndpointDirection direction, |
49 const uint8 endpoint, net::IOBuffer* buffer, const size_t length, | 54 const uint8 endpoint, net::IOBuffer* buffer, const size_t length, |
50 const unsigned int timeout, const UsbTransferCallback& callback)); | 55 const unsigned int timeout, const UsbTransferCallback& callback)); |
51 | 56 |
52 MOCK_METHOD8(IsochronousTransfer, void(const TransferDirection direction, | 57 MOCK_METHOD8(IsochronousTransfer, void(const UsbEndpointDirection direction, |
53 const uint8 endpoint, net::IOBuffer* buffer, const size_t length, | 58 const uint8 endpoint, net::IOBuffer* buffer, const size_t length, |
54 const unsigned int packets, const unsigned int packet_length, | 59 const unsigned int packets, const unsigned int packet_length, |
55 const unsigned int timeout, const UsbTransferCallback& callback)); | 60 const unsigned int timeout, const UsbTransferCallback& callback)); |
56 | 61 |
| 62 MOCK_METHOD2(ListInterfaces, void(UsbConfigDescriptor* config, |
| 63 const UsbInterfaceCallback& callback)); |
| 64 |
57 protected: | 65 protected: |
58 virtual ~MockUsbDevice() {} | 66 virtual ~MockUsbDevice() {} |
59 }; | 67 }; |
60 #if defined(OS_WIN) | 68 #if defined(OS_WIN) |
61 #pragma warning(pop) | 69 #pragma warning(pop) |
62 #endif | 70 #endif |
63 | 71 |
64 class UsbApiTest : public ExtensionApiTest { | 72 class UsbApiTest : public ExtensionApiTest { |
65 public: | 73 public: |
66 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { | 74 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { |
(...skipping 10 matching lines...) Expand all Loading... |
77 scoped_refptr<MockUsbDevice> mock_device_; | 85 scoped_refptr<MockUsbDevice> mock_device_; |
78 }; | 86 }; |
79 | 87 |
80 } // namespace | 88 } // namespace |
81 | 89 |
82 IN_PROC_BROWSER_TEST_F(UsbApiTest, DeviceHandling) { | 90 IN_PROC_BROWSER_TEST_F(UsbApiTest, DeviceHandling) { |
83 EXPECT_CALL(*mock_device_, Close(_)).Times(1); | 91 EXPECT_CALL(*mock_device_, Close(_)).Times(1); |
84 ASSERT_TRUE(RunExtensionTest("usb/device_handling")); | 92 ASSERT_TRUE(RunExtensionTest("usb/device_handling")); |
85 } | 93 } |
86 | 94 |
| 95 IN_PROC_BROWSER_TEST_F(UsbApiTest, ListInterfaces) { |
| 96 EXPECT_CALL(*mock_device_, |
| 97 ListInterfaces(_, _)) |
| 98 .WillOnce(InvokeUsbInterfaceCallback()); |
| 99 EXPECT_CALL(*mock_device_, Close(_)).Times(AnyNumber()); |
| 100 ASSERT_TRUE(RunExtensionTest("usb/list_interfaces")); |
| 101 } |
| 102 |
87 IN_PROC_BROWSER_TEST_F(UsbApiTest, TransferEvent) { | 103 IN_PROC_BROWSER_TEST_F(UsbApiTest, TransferEvent) { |
88 EXPECT_CALL(*mock_device_, | 104 EXPECT_CALL(*mock_device_, |
89 ControlTransfer(UsbDevice::OUTBOUND, UsbDevice::STANDARD, | 105 ControlTransfer(USB_DIRECTION_OUTBOUND, UsbDevice::STANDARD, |
90 UsbDevice::DEVICE, 1, 2, 3, _, 1, _, _)) | 106 UsbDevice::DEVICE, 1, 2, 3, _, 1, _, _)) |
91 .WillOnce(InvokeUsbTransferCallback<9>(USB_TRANSFER_COMPLETED)); | 107 .WillOnce(InvokeUsbTransferCallback<9>(USB_TRANSFER_COMPLETED)); |
92 EXPECT_CALL(*mock_device_, | 108 EXPECT_CALL(*mock_device_, |
93 BulkTransfer(UsbDevice::OUTBOUND, 1, _, 1, _, _)) | 109 BulkTransfer(USB_DIRECTION_OUTBOUND, 1, _, 1, _, _)) |
94 .WillOnce(InvokeUsbTransferCallback<5>(USB_TRANSFER_COMPLETED)); | 110 .WillOnce(InvokeUsbTransferCallback<5>(USB_TRANSFER_COMPLETED)); |
95 EXPECT_CALL(*mock_device_, | 111 EXPECT_CALL(*mock_device_, |
96 InterruptTransfer(UsbDevice::OUTBOUND, 2, _, 1, _, _)) | 112 InterruptTransfer(USB_DIRECTION_OUTBOUND, 2, _, 1, _, _)) |
97 .WillOnce(InvokeUsbTransferCallback<5>(USB_TRANSFER_COMPLETED)); | 113 .WillOnce(InvokeUsbTransferCallback<5>(USB_TRANSFER_COMPLETED)); |
98 EXPECT_CALL(*mock_device_, | 114 EXPECT_CALL(*mock_device_, |
99 IsochronousTransfer(UsbDevice::OUTBOUND, 3, _, 1, 1, 1, _, _)) | 115 IsochronousTransfer(USB_DIRECTION_OUTBOUND, 3, _, 1, 1, 1, _, _)) |
100 .WillOnce(InvokeUsbTransferCallback<7>(USB_TRANSFER_COMPLETED)); | 116 .WillOnce(InvokeUsbTransferCallback<7>(USB_TRANSFER_COMPLETED)); |
101 EXPECT_CALL(*mock_device_, Close(_)).Times(AnyNumber()); | 117 EXPECT_CALL(*mock_device_, Close(_)).Times(AnyNumber()); |
102 ASSERT_TRUE(RunExtensionTest("usb/transfer_event")); | 118 ASSERT_TRUE(RunExtensionTest("usb/transfer_event")); |
103 } | 119 } |
104 | 120 |
105 IN_PROC_BROWSER_TEST_F(UsbApiTest, ZeroLengthTransfer) { | 121 IN_PROC_BROWSER_TEST_F(UsbApiTest, ZeroLengthTransfer) { |
106 EXPECT_CALL(*mock_device_, BulkTransfer(_, _, _, 0, _, _)) | 122 EXPECT_CALL(*mock_device_, BulkTransfer(_, _, _, 0, _, _)) |
107 .WillOnce(InvokeUsbTransferCallback<5>(USB_TRANSFER_COMPLETED)); | 123 .WillOnce(InvokeUsbTransferCallback<5>(USB_TRANSFER_COMPLETED)); |
108 EXPECT_CALL(*mock_device_, Close(_)).Times(AnyNumber()); | 124 EXPECT_CALL(*mock_device_, Close(_)).Times(AnyNumber()); |
109 ASSERT_TRUE(RunExtensionTest("usb/zero_length_transfer")); | 125 ASSERT_TRUE(RunExtensionTest("usb/zero_length_transfer")); |
110 } | 126 } |
111 | 127 |
112 IN_PROC_BROWSER_TEST_F(UsbApiTest, TransferFailure) { | 128 IN_PROC_BROWSER_TEST_F(UsbApiTest, TransferFailure) { |
113 EXPECT_CALL(*mock_device_, BulkTransfer(_, _, _, _, _, _)) | 129 EXPECT_CALL(*mock_device_, BulkTransfer(_, _, _, _, _, _)) |
114 .WillOnce(InvokeUsbTransferCallback<5>(USB_TRANSFER_COMPLETED)) | 130 .WillOnce(InvokeUsbTransferCallback<5>(USB_TRANSFER_COMPLETED)) |
115 .WillOnce(InvokeUsbTransferCallback<5>(USB_TRANSFER_ERROR)) | 131 .WillOnce(InvokeUsbTransferCallback<5>(USB_TRANSFER_ERROR)) |
116 .WillOnce(InvokeUsbTransferCallback<5>(USB_TRANSFER_TIMEOUT)); | 132 .WillOnce(InvokeUsbTransferCallback<5>(USB_TRANSFER_TIMEOUT)); |
117 EXPECT_CALL(*mock_device_, Close(_)).Times(AnyNumber()); | 133 EXPECT_CALL(*mock_device_, Close(_)).Times(AnyNumber()); |
118 ASSERT_TRUE(RunExtensionTest("usb/transfer_failure")); | 134 ASSERT_TRUE(RunExtensionTest("usb/transfer_failure")); |
119 } | 135 } |
120 | 136 |
121 IN_PROC_BROWSER_TEST_F(UsbApiTest, InvalidLengthTransfer) { | 137 IN_PROC_BROWSER_TEST_F(UsbApiTest, InvalidLengthTransfer) { |
122 EXPECT_CALL(*mock_device_, Close(_)).Times(AnyNumber()); | 138 EXPECT_CALL(*mock_device_, Close(_)).Times(AnyNumber()); |
123 ASSERT_TRUE(RunExtensionTest("usb/invalid_length_transfer")); | 139 ASSERT_TRUE(RunExtensionTest("usb/invalid_length_transfer")); |
124 } | 140 } |
125 | 141 |
OLD | NEW |