| 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 |