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/usb/mojo/device_manager_impl.h" | 5 #include "device/usb/mojo/device_manager_impl.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 #include <set> | 10 #include <set> |
(...skipping 12 matching lines...) Expand all Loading... |
23 #include "device/usb/mock_usb_service.h" | 23 #include "device/usb/mock_usb_service.h" |
24 #include "device/usb/mojo/device_impl.h" | 24 #include "device/usb/mojo/device_impl.h" |
25 #include "device/usb/mojo/mock_permission_provider.h" | 25 #include "device/usb/mojo/mock_permission_provider.h" |
26 #include "mojo/public/cpp/bindings/binding.h" | 26 #include "mojo/public/cpp/bindings/binding.h" |
27 #include "testing/gtest/include/gtest/gtest.h" | 27 #include "testing/gtest/include/gtest/gtest.h" |
28 | 28 |
29 using ::testing::Invoke; | 29 using ::testing::Invoke; |
30 using ::testing::_; | 30 using ::testing::_; |
31 | 31 |
32 namespace device { | 32 namespace device { |
| 33 |
| 34 using mojom::UsbDevicePtr; |
| 35 using mojom::UsbDeviceInfoPtr; |
| 36 using mojom::UsbDeviceManagerClientPtr; |
| 37 using mojom::UsbDeviceManagerPtr; |
| 38 using mojom::UsbEnumerationOptionsPtr; |
| 39 |
33 namespace usb { | 40 namespace usb { |
34 | 41 |
35 namespace { | 42 namespace { |
36 | 43 |
37 ACTION_P2(ExpectGuidAndThen, expected_guid, callback) { | 44 ACTION_P2(ExpectGuidAndThen, expected_guid, callback) { |
38 ASSERT_TRUE(arg0); | 45 ASSERT_TRUE(arg0); |
39 EXPECT_EQ(expected_guid, arg0->guid); | 46 EXPECT_EQ(expected_guid, arg0->guid); |
40 if (!callback.is_null()) | 47 if (!callback.is_null()) |
41 callback.Run(); | 48 callback.Run(); |
42 }; | 49 }; |
43 | 50 |
44 class USBDeviceManagerImplTest : public testing::Test { | 51 class USBDeviceManagerImplTest : public testing::Test { |
45 public: | 52 public: |
46 USBDeviceManagerImplTest() : message_loop_(new base::MessageLoop) {} | 53 USBDeviceManagerImplTest() : message_loop_(new base::MessageLoop) {} |
47 ~USBDeviceManagerImplTest() override {} | 54 ~USBDeviceManagerImplTest() override {} |
48 | 55 |
49 protected: | 56 protected: |
50 DeviceManagerPtr ConnectToDeviceManager() { | 57 UsbDeviceManagerPtr ConnectToDeviceManager() { |
51 DeviceManagerPtr device_manager; | 58 UsbDeviceManagerPtr device_manager; |
52 DeviceManagerImpl::Create(permission_provider_.GetWeakPtr(), | 59 DeviceManagerImpl::Create(permission_provider_.GetWeakPtr(), |
53 mojo::MakeRequest(&device_manager)); | 60 mojo::MakeRequest(&device_manager)); |
54 return device_manager; | 61 return device_manager; |
55 } | 62 } |
56 | 63 |
57 MockDeviceClient device_client_; | 64 MockDeviceClient device_client_; |
58 | 65 |
59 private: | 66 private: |
60 MockPermissionProvider permission_provider_; | 67 MockPermissionProvider permission_provider_; |
61 std::unique_ptr<base::MessageLoop> message_loop_; | 68 std::unique_ptr<base::MessageLoop> message_loop_; |
62 }; | 69 }; |
63 | 70 |
64 class MockDeviceManagerClient : public DeviceManagerClient { | 71 class MockDeviceManagerClient : public mojom::UsbDeviceManagerClient { |
65 public: | 72 public: |
66 MockDeviceManagerClient() : binding_(this) {} | 73 MockDeviceManagerClient() : binding_(this) {} |
67 ~MockDeviceManagerClient() {} | 74 ~MockDeviceManagerClient() {} |
68 | 75 |
69 DeviceManagerClientPtr CreateInterfacePtrAndBind() { | 76 UsbDeviceManagerClientPtr CreateInterfacePtrAndBind() { |
70 return binding_.CreateInterfacePtrAndBind(); | 77 return binding_.CreateInterfacePtrAndBind(); |
71 } | 78 } |
72 | 79 |
73 MOCK_METHOD1(DoOnDeviceAdded, void(DeviceInfo*)); | 80 MOCK_METHOD1(DoOnDeviceAdded, void(mojom::UsbDeviceInfo*)); |
74 void OnDeviceAdded(DeviceInfoPtr device_info) { | 81 void OnDeviceAdded(UsbDeviceInfoPtr device_info) { |
75 DoOnDeviceAdded(device_info.get()); | 82 DoOnDeviceAdded(device_info.get()); |
76 } | 83 } |
77 | 84 |
78 MOCK_METHOD1(DoOnDeviceRemoved, void(DeviceInfo*)); | 85 MOCK_METHOD1(DoOnDeviceRemoved, void(mojom::UsbDeviceInfo*)); |
79 void OnDeviceRemoved(DeviceInfoPtr device_info) { | 86 void OnDeviceRemoved(UsbDeviceInfoPtr device_info) { |
80 DoOnDeviceRemoved(device_info.get()); | 87 DoOnDeviceRemoved(device_info.get()); |
81 } | 88 } |
82 | 89 |
83 private: | 90 private: |
84 mojo::Binding<DeviceManagerClient> binding_; | 91 mojo::Binding<mojom::UsbDeviceManagerClient> binding_; |
85 }; | 92 }; |
86 | 93 |
87 void ExpectDevicesAndThen(const std::set<std::string>& expected_guids, | 94 void ExpectDevicesAndThen(const std::set<std::string>& expected_guids, |
88 const base::Closure& continuation, | 95 const base::Closure& continuation, |
89 std::vector<DeviceInfoPtr> results) { | 96 std::vector<UsbDeviceInfoPtr> results) { |
90 EXPECT_EQ(expected_guids.size(), results.size()); | 97 EXPECT_EQ(expected_guids.size(), results.size()); |
91 std::set<std::string> actual_guids; | 98 std::set<std::string> actual_guids; |
92 for (size_t i = 0; i < results.size(); ++i) | 99 for (size_t i = 0; i < results.size(); ++i) |
93 actual_guids.insert(results[i]->guid); | 100 actual_guids.insert(results[i]->guid); |
94 EXPECT_EQ(expected_guids, actual_guids); | 101 EXPECT_EQ(expected_guids, actual_guids); |
95 continuation.Run(); | 102 continuation.Run(); |
96 } | 103 } |
97 | 104 |
98 } // namespace | 105 } // namespace |
99 | 106 |
100 // Test basic GetDevices functionality to ensure that all mock devices are | 107 // Test basic GetDevices functionality to ensure that all mock devices are |
101 // returned by the service. | 108 // returned by the service. |
102 TEST_F(USBDeviceManagerImplTest, GetDevices) { | 109 TEST_F(USBDeviceManagerImplTest, GetDevices) { |
103 scoped_refptr<MockUsbDevice> device0 = | 110 scoped_refptr<MockUsbDevice> device0 = |
104 new MockUsbDevice(0x1234, 0x5678, "ACME", "Frobinator", "ABCDEF"); | 111 new MockUsbDevice(0x1234, 0x5678, "ACME", "Frobinator", "ABCDEF"); |
105 scoped_refptr<MockUsbDevice> device1 = | 112 scoped_refptr<MockUsbDevice> device1 = |
106 new MockUsbDevice(0x1234, 0x5679, "ACME", "Frobinator+", "GHIJKL"); | 113 new MockUsbDevice(0x1234, 0x5679, "ACME", "Frobinator+", "GHIJKL"); |
107 scoped_refptr<MockUsbDevice> device2 = | 114 scoped_refptr<MockUsbDevice> device2 = |
108 new MockUsbDevice(0x1234, 0x567a, "ACME", "Frobinator Mk II", "MNOPQR"); | 115 new MockUsbDevice(0x1234, 0x567a, "ACME", "Frobinator Mk II", "MNOPQR"); |
109 | 116 |
110 device_client_.usb_service()->AddDevice(device0); | 117 device_client_.usb_service()->AddDevice(device0); |
111 device_client_.usb_service()->AddDevice(device1); | 118 device_client_.usb_service()->AddDevice(device1); |
112 device_client_.usb_service()->AddDevice(device2); | 119 device_client_.usb_service()->AddDevice(device2); |
113 | 120 |
114 DeviceManagerPtr device_manager = ConnectToDeviceManager(); | 121 UsbDeviceManagerPtr device_manager = ConnectToDeviceManager(); |
115 | 122 |
116 EnumerationOptionsPtr options = EnumerationOptions::New(); | 123 UsbEnumerationOptionsPtr options = mojom::UsbEnumerationOptions::New(); |
117 UsbDeviceFilter filter; | 124 UsbDeviceFilter filter; |
118 filter.vendor_id = 0x1234; | 125 filter.vendor_id = 0x1234; |
119 options->filters.emplace(); | 126 options->filters.emplace(); |
120 options->filters->push_back(filter); | 127 options->filters->push_back(filter); |
121 | 128 |
122 std::set<std::string> guids; | 129 std::set<std::string> guids; |
123 guids.insert(device0->guid()); | 130 guids.insert(device0->guid()); |
124 guids.insert(device1->guid()); | 131 guids.insert(device1->guid()); |
125 guids.insert(device2->guid()); | 132 guids.insert(device2->guid()); |
126 | 133 |
127 base::RunLoop loop; | 134 base::RunLoop loop; |
128 device_manager->GetDevices( | 135 device_manager->GetDevices( |
129 std::move(options), | 136 std::move(options), |
130 base::Bind(&ExpectDevicesAndThen, guids, loop.QuitClosure())); | 137 base::Bind(&ExpectDevicesAndThen, guids, loop.QuitClosure())); |
131 loop.Run(); | 138 loop.Run(); |
132 } | 139 } |
133 | 140 |
134 // Test requesting a single Device by GUID. | 141 // Test requesting a single Device by GUID. |
135 TEST_F(USBDeviceManagerImplTest, GetDevice) { | 142 TEST_F(USBDeviceManagerImplTest, GetDevice) { |
136 scoped_refptr<MockUsbDevice> mock_device = | 143 scoped_refptr<MockUsbDevice> mock_device = |
137 new MockUsbDevice(0x1234, 0x5678, "ACME", "Frobinator", "ABCDEF"); | 144 new MockUsbDevice(0x1234, 0x5678, "ACME", "Frobinator", "ABCDEF"); |
138 | 145 |
139 device_client_.usb_service()->AddDevice(mock_device); | 146 device_client_.usb_service()->AddDevice(mock_device); |
140 | 147 |
141 DeviceManagerPtr device_manager = ConnectToDeviceManager(); | 148 UsbDeviceManagerPtr device_manager = ConnectToDeviceManager(); |
142 | 149 |
143 { | 150 { |
144 base::RunLoop loop; | 151 base::RunLoop loop; |
145 DevicePtr device; | 152 UsbDevicePtr device; |
146 device_manager->GetDevice(mock_device->guid(), mojo::MakeRequest(&device)); | 153 device_manager->GetDevice(mock_device->guid(), mojo::MakeRequest(&device)); |
147 // Close is a no-op if the device hasn't been opened but ensures that the | 154 // Close is a no-op if the device hasn't been opened but ensures that the |
148 // pipe was successfully connected. | 155 // pipe was successfully connected. |
149 device->Close(loop.QuitClosure()); | 156 device->Close(loop.QuitClosure()); |
150 loop.Run(); | 157 loop.Run(); |
151 } | 158 } |
152 | 159 |
153 DevicePtr bad_device; | 160 UsbDevicePtr bad_device; |
154 device_manager->GetDevice("not a real guid", mojo::MakeRequest(&bad_device)); | 161 device_manager->GetDevice("not a real guid", mojo::MakeRequest(&bad_device)); |
155 | 162 |
156 { | 163 { |
157 base::RunLoop loop; | 164 base::RunLoop loop; |
158 bad_device.set_connection_error_handler(loop.QuitClosure()); | 165 bad_device.set_connection_error_handler(loop.QuitClosure()); |
159 loop.Run(); | 166 loop.Run(); |
160 } | 167 } |
161 } | 168 } |
162 | 169 |
163 // Test requesting device enumeration updates with GetDeviceChanges. | 170 // Test requesting device enumeration updates with GetDeviceChanges. |
164 TEST_F(USBDeviceManagerImplTest, Client) { | 171 TEST_F(USBDeviceManagerImplTest, Client) { |
165 scoped_refptr<MockUsbDevice> device0 = | 172 scoped_refptr<MockUsbDevice> device0 = |
166 new MockUsbDevice(0x1234, 0x5678, "ACME", "Frobinator", "ABCDEF"); | 173 new MockUsbDevice(0x1234, 0x5678, "ACME", "Frobinator", "ABCDEF"); |
167 scoped_refptr<MockUsbDevice> device1 = | 174 scoped_refptr<MockUsbDevice> device1 = |
168 new MockUsbDevice(0x1234, 0x5679, "ACME", "Frobinator+", "GHIJKL"); | 175 new MockUsbDevice(0x1234, 0x5679, "ACME", "Frobinator+", "GHIJKL"); |
169 scoped_refptr<MockUsbDevice> device2 = | 176 scoped_refptr<MockUsbDevice> device2 = |
170 new MockUsbDevice(0x1234, 0x567a, "ACME", "Frobinator Mk II", "MNOPQR"); | 177 new MockUsbDevice(0x1234, 0x567a, "ACME", "Frobinator Mk II", "MNOPQR"); |
171 scoped_refptr<MockUsbDevice> device3 = | 178 scoped_refptr<MockUsbDevice> device3 = |
172 new MockUsbDevice(0x1234, 0x567b, "ACME", "Frobinator Xtreme", "STUVWX"); | 179 new MockUsbDevice(0x1234, 0x567b, "ACME", "Frobinator Xtreme", "STUVWX"); |
173 | 180 |
174 device_client_.usb_service()->AddDevice(device0); | 181 device_client_.usb_service()->AddDevice(device0); |
175 | 182 |
176 DeviceManagerPtr device_manager = ConnectToDeviceManager(); | 183 UsbDeviceManagerPtr device_manager = ConnectToDeviceManager(); |
177 MockDeviceManagerClient mock_client; | 184 MockDeviceManagerClient mock_client; |
178 device_manager->SetClient(mock_client.CreateInterfacePtrAndBind()); | 185 device_manager->SetClient(mock_client.CreateInterfacePtrAndBind()); |
179 | 186 |
180 { | 187 { |
181 // Call GetDevices once to make sure the device manager is up and running | 188 // Call GetDevices once to make sure the device manager is up and running |
182 // and the client is set or else we could block forever waiting for calls. | 189 // and the client is set or else we could block forever waiting for calls. |
183 std::set<std::string> guids; | 190 std::set<std::string> guids; |
184 guids.insert(device0->guid()); | 191 guids.insert(device0->guid()); |
185 base::RunLoop loop; | 192 base::RunLoop loop; |
186 device_manager->GetDevices( | 193 device_manager->GetDevices( |
(...skipping 20 matching lines...) Expand all Loading... |
207 .WillOnce(ExpectGuidAndThen(device0->guid(), barrier)) | 214 .WillOnce(ExpectGuidAndThen(device0->guid(), barrier)) |
208 .WillOnce(ExpectGuidAndThen(device2->guid(), barrier)); | 215 .WillOnce(ExpectGuidAndThen(device2->guid(), barrier)); |
209 EXPECT_CALL(mock_client, DoOnDeviceAdded(_)) | 216 EXPECT_CALL(mock_client, DoOnDeviceAdded(_)) |
210 .WillOnce(ExpectGuidAndThen(device3->guid(), barrier)); | 217 .WillOnce(ExpectGuidAndThen(device3->guid(), barrier)); |
211 loop.Run(); | 218 loop.Run(); |
212 } | 219 } |
213 } | 220 } |
214 | 221 |
215 } // namespace usb | 222 } // namespace usb |
216 } // namespace device | 223 } // namespace device |
OLD | NEW |