Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1271)

Side by Side Diff: chrome/browser/extensions/api/device_permissions_manager_unittest.cc

Issue 809743006: Add an Observer interface to UsbService for device add/remove. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Clarify comment. Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | device/usb/usb_device.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "base/run_loop.h" 5 #include "base/run_loop.h"
6 #include "base/strings/utf_string_conversions.h" 6 #include "base/strings/utf_string_conversions.h"
7 #include "base/test/values_test_util.h" 7 #include "base/test/values_test_util.h"
8 #include "chrome/browser/extensions/test_extension_environment.h" 8 #include "chrome/browser/extensions/test_extension_environment.h"
9 #include "chrome/test/base/testing_profile.h" 9 #include "chrome/test/base/testing_profile.h"
10 #include "device/core/device_client.h"
10 #include "device/usb/usb_device.h" 11 #include "device/usb/usb_device.h"
11 #include "device/usb/usb_device_handle.h" 12 #include "device/usb/usb_device_handle.h"
12 #include "extensions/browser/api/device_permissions_manager.h" 13 #include "extensions/browser/api/device_permissions_manager.h"
13 #include "extensions/browser/extension_prefs.h" 14 #include "extensions/browser/extension_prefs.h"
14 #include "extensions/common/extension.h" 15 #include "extensions/common/extension.h"
15 #include "testing/gmock/include/gmock/gmock.h" 16 #include "testing/gmock/include/gmock/gmock.h"
16 #include "testing/gtest/include/gtest/gtest.h" 17 #include "testing/gtest/include/gtest/gtest.h"
17 18
18 namespace extensions { 19 namespace extensions {
19 20
20 namespace { 21 namespace {
21 22
22 using device::UsbDevice; 23 using device::UsbDevice;
23 using device::UsbDeviceHandle; 24 using device::UsbDeviceHandle;
25 using device::UsbService;
24 using testing::Return; 26 using testing::Return;
25 27
28 class MockUsbService : public UsbService {
29 public:
30 MockUsbService() : mock_device_client(this) {}
31
32 MOCK_METHOD1(GetDeviceById, scoped_refptr<UsbDevice>(uint32));
33 MOCK_METHOD1(GetDevices, void(std::vector<scoped_refptr<UsbDevice>>*));
34
35 // Public wrapper for the protected NotifyDeviceRemove function.
36 void NotifyDeviceRemoved(scoped_refptr<UsbDevice> device) {
37 UsbService::NotifyDeviceRemoved(device);
38 }
39
40 private:
41 class MockDeviceClient : device::DeviceClient {
42 public:
43 explicit MockDeviceClient(UsbService* usb_service)
44 : usb_service_(usb_service) {}
45
46 UsbService* GetUsbService() override { return usb_service_; }
47
48 private:
49 UsbService* usb_service_;
50 };
51
52 MockDeviceClient mock_device_client;
53 };
54
26 class MockUsbDevice : public UsbDevice { 55 class MockUsbDevice : public UsbDevice {
27 public: 56 public:
28 MockUsbDevice(const std::string& serial_number, uint32 unique_id) 57 MockUsbDevice(const std::string& serial_number, uint32 unique_id)
29 : UsbDevice(0, 0, unique_id), serial_number_(serial_number) {} 58 : UsbDevice(0, 0, unique_id), serial_number_(serial_number) {}
30 59
31 MOCK_METHOD0(Open, scoped_refptr<UsbDeviceHandle>()); 60 MOCK_METHOD0(Open, scoped_refptr<UsbDeviceHandle>());
32 MOCK_METHOD1(Close, bool(scoped_refptr<UsbDeviceHandle>)); 61 MOCK_METHOD1(Close, bool(scoped_refptr<UsbDeviceHandle>));
33 #if defined(OS_CHROMEOS) 62 #if defined(OS_CHROMEOS)
34 MOCK_METHOD2(RequestUsbAccess, void(int, const base::Callback<void(bool)>&)); 63 MOCK_METHOD2(RequestUsbAccess, void(int, const base::Callback<void(bool)>&));
35 #endif 64 #endif
(...skipping 13 matching lines...) Expand all
49 if (serial_number_.empty()) { 78 if (serial_number_.empty()) {
50 // Return false as if the device does not have or failed to return its 79 // Return false as if the device does not have or failed to return its
51 // serial number. 80 // serial number.
52 return false; 81 return false;
53 } 82 }
54 83
55 *serial_number = base::UTF8ToUTF16(serial_number_); 84 *serial_number = base::UTF8ToUTF16(serial_number_);
56 return true; 85 return true;
57 } 86 }
58 87
59 void NotifyDisconnect() { UsbDevice::NotifyDisconnect(); }
60
61 private: 88 private:
62 virtual ~MockUsbDevice() {} 89 virtual ~MockUsbDevice() {}
63 90
64 const std::string serial_number_; 91 const std::string serial_number_;
65 }; 92 };
66 93
67 void AllowUsbDevice(DevicePermissionsManager* manager, 94 void AllowUsbDevice(DevicePermissionsManager* manager,
68 const Extension* extension, 95 const Extension* extension,
69 scoped_refptr<UsbDevice> device) { 96 scoped_refptr<UsbDevice> device) {
70 // If the device cannot provide any of these strings they will simply by 97 // If the device cannot provide any of these strings they will simply by
71 // empty. 98 // empty.
72 base::string16 product; 99 base::string16 product;
73 device->GetProduct(&product); 100 device->GetProduct(&product);
74 base::string16 manufacturer; 101 base::string16 manufacturer;
75 device->GetManufacturer(&manufacturer); 102 device->GetManufacturer(&manufacturer);
76 base::string16 serial_number; 103 base::string16 serial_number;
77 device->GetSerialNumber(&serial_number); 104 device->GetSerialNumber(&serial_number);
78 105
79 manager->AllowUsbDevice( 106 manager->AllowUsbDevice(
80 extension->id(), device, product, manufacturer, serial_number); 107 extension->id(), device, product, manufacturer, serial_number);
81 } 108 }
82 109
83 } // namespace 110 } // namespace
84 111
85 class DevicePermissionsManagerTest : public testing::Test { 112 class DevicePermissionsManagerTest : public testing::Test {
86 protected: 113 protected:
87 void SetUp() override { 114 void SetUp() override {
88 testing::Test::SetUp(); 115 testing::Test::SetUp();
89 env_.GetExtensionPrefs(); // Force creation before adding extensions. 116 env_.reset(new TestExtensionEnvironment());
90 extension_ = env_.MakeExtension(*base::test::ParseJson( 117 env_->GetExtensionPrefs(); // Force creation before adding extensions.
91 "{" 118 extension_ =
92 " \"app\": {" 119 env_->MakeExtension(*base::test::ParseJson(
93 " \"background\": {" 120 "{"
94 " \"scripts\": [\"background.js\"]" 121 " \"app\": {"
95 " }" 122 " \"background\": {"
96 " }," 123 " \"scripts\": [\"background.js\"]"
97 " \"permissions\": [" 124 " }"
98 " \"usb\"" 125 " },"
99 " ]" 126 " \"permissions\": ["
100 "}")); 127 " \"usb\""
128 " ]"
129 "}"));
101 device0 = new MockUsbDevice("ABCDE", 0); 130 device0 = new MockUsbDevice("ABCDE", 0);
102 device1 = new MockUsbDevice("", 1); 131 device1 = new MockUsbDevice("", 1);
103 device2 = new MockUsbDevice("12345", 2); 132 device2 = new MockUsbDevice("12345", 2);
104 device3 = new MockUsbDevice("", 3); 133 device3 = new MockUsbDevice("", 3);
134 usb_service_ = new MockUsbService();
135 UsbService::SetInstanceForTest(usb_service_);
105 } 136 }
106 137
107 extensions::TestExtensionEnvironment env_; 138 void TearDown() override {
139 env_.reset(nullptr);
140 UsbService::SetInstanceForTest(nullptr);
141 }
142
143 scoped_ptr<extensions::TestExtensionEnvironment> env_;
108 const extensions::Extension* extension_; 144 const extensions::Extension* extension_;
145 MockUsbService* usb_service_;
109 scoped_refptr<MockUsbDevice> device0; 146 scoped_refptr<MockUsbDevice> device0;
110 scoped_refptr<MockUsbDevice> device1; 147 scoped_refptr<MockUsbDevice> device1;
111 scoped_refptr<MockUsbDevice> device2; 148 scoped_refptr<MockUsbDevice> device2;
112 scoped_refptr<MockUsbDevice> device3; 149 scoped_refptr<MockUsbDevice> device3;
113 }; 150 };
114 151
115 TEST_F(DevicePermissionsManagerTest, AllowAndClearDevices) { 152 TEST_F(DevicePermissionsManagerTest, AllowAndClearDevices) {
116 DevicePermissionsManager* manager = 153 DevicePermissionsManager* manager =
117 DevicePermissionsManager::Get(env_.profile()); 154 DevicePermissionsManager::Get(env_->profile());
118 AllowUsbDevice(manager, extension_, device0); 155 AllowUsbDevice(manager, extension_, device0);
119 AllowUsbDevice(manager, extension_, device1); 156 AllowUsbDevice(manager, extension_, device1);
120 157
121 scoped_ptr<DevicePermissions> device_permissions = 158 scoped_ptr<DevicePermissions> device_permissions =
122 manager->GetForExtension(extension_->id()); 159 manager->GetForExtension(extension_->id());
123 scoped_refptr<DevicePermissionEntry> device0_entry = 160 scoped_refptr<DevicePermissionEntry> device0_entry =
124 device_permissions->FindEntry(device0); 161 device_permissions->FindEntry(device0);
125 ASSERT_TRUE(device0_entry.get()); 162 ASSERT_TRUE(device0_entry.get());
126 scoped_refptr<DevicePermissionEntry> device1_entry = 163 scoped_refptr<DevicePermissionEntry> device1_entry =
127 device_permissions->FindEntry(device1); 164 device_permissions->FindEntry(device1);
(...skipping 23 matching lines...) Expand all
151 188
152 device_permissions = manager->GetForExtension(extension_->id()); 189 device_permissions = manager->GetForExtension(extension_->id());
153 ASSERT_TRUE(device_permissions->FindEntry(device0).get()); 190 ASSERT_TRUE(device_permissions->FindEntry(device0).get());
154 ASSERT_TRUE(device_permissions->FindEntry(device1).get()); 191 ASSERT_TRUE(device_permissions->FindEntry(device1).get());
155 ASSERT_FALSE(device_permissions->FindEntry(device2).get()); 192 ASSERT_FALSE(device_permissions->FindEntry(device2).get());
156 ASSERT_FALSE(device_permissions->FindEntry(device3).get()); 193 ASSERT_FALSE(device_permissions->FindEntry(device3).get());
157 } 194 }
158 195
159 TEST_F(DevicePermissionsManagerTest, SuspendExtension) { 196 TEST_F(DevicePermissionsManagerTest, SuspendExtension) {
160 DevicePermissionsManager* manager = 197 DevicePermissionsManager* manager =
161 DevicePermissionsManager::Get(env_.profile()); 198 DevicePermissionsManager::Get(env_->profile());
162 AllowUsbDevice(manager, extension_, device0); 199 AllowUsbDevice(manager, extension_, device0);
163 AllowUsbDevice(manager, extension_, device1); 200 AllowUsbDevice(manager, extension_, device1);
164 201
165 scoped_ptr<DevicePermissions> device_permissions = 202 scoped_ptr<DevicePermissions> device_permissions =
166 manager->GetForExtension(extension_->id()); 203 manager->GetForExtension(extension_->id());
167 ASSERT_TRUE(device_permissions->FindEntry(device0).get()); 204 ASSERT_TRUE(device_permissions->FindEntry(device0).get());
168 ASSERT_TRUE(device_permissions->FindEntry(device1).get()); 205 ASSERT_TRUE(device_permissions->FindEntry(device1).get());
169 ASSERT_FALSE(device_permissions->FindEntry(device2).get()); 206 ASSERT_FALSE(device_permissions->FindEntry(device2).get());
170 ASSERT_FALSE(device_permissions->FindEntry(device3).get()); 207 ASSERT_FALSE(device_permissions->FindEntry(device3).get());
171 208
172 manager->OnBackgroundHostClose(extension_->id()); 209 manager->OnBackgroundHostClose(extension_->id());
173 210
174 device_permissions = manager->GetForExtension(extension_->id()); 211 device_permissions = manager->GetForExtension(extension_->id());
175 // Device 0 is still registered because its serial number has been stored in 212 // Device 0 is still registered because its serial number has been stored in
176 // ExtensionPrefs, it is "persistent". 213 // ExtensionPrefs, it is "persistent".
177 ASSERT_TRUE(device_permissions->FindEntry(device0).get()); 214 ASSERT_TRUE(device_permissions->FindEntry(device0).get());
178 // Device 1 does not have uniquely identifying traits and so permission to 215 // Device 1 does not have uniquely identifying traits and so permission to
179 // open it has been dropped when the app's windows have closed and the 216 // open it has been dropped when the app's windows have closed and the
180 // background page has been suspended. 217 // background page has been suspended.
181 ASSERT_FALSE(device_permissions->FindEntry(device1).get()); 218 ASSERT_FALSE(device_permissions->FindEntry(device1).get());
182 ASSERT_FALSE(device_permissions->FindEntry(device2).get()); 219 ASSERT_FALSE(device_permissions->FindEntry(device2).get());
183 ASSERT_FALSE(device_permissions->FindEntry(device3).get()); 220 ASSERT_FALSE(device_permissions->FindEntry(device3).get());
184 } 221 }
185 222
186 TEST_F(DevicePermissionsManagerTest, DisconnectDevice) { 223 TEST_F(DevicePermissionsManagerTest, DisconnectDevice) {
187 DevicePermissionsManager* manager = 224 DevicePermissionsManager* manager =
188 DevicePermissionsManager::Get(env_.profile()); 225 DevicePermissionsManager::Get(env_->profile());
189 AllowUsbDevice(manager, extension_, device0); 226 AllowUsbDevice(manager, extension_, device0);
190 AllowUsbDevice(manager, extension_, device1); 227 AllowUsbDevice(manager, extension_, device1);
191 228
192 scoped_ptr<DevicePermissions> device_permissions = 229 scoped_ptr<DevicePermissions> device_permissions =
193 manager->GetForExtension(extension_->id()); 230 manager->GetForExtension(extension_->id());
194 ASSERT_TRUE(device_permissions->FindEntry(device0).get()); 231 ASSERT_TRUE(device_permissions->FindEntry(device0).get());
195 ASSERT_TRUE(device_permissions->FindEntry(device1).get()); 232 ASSERT_TRUE(device_permissions->FindEntry(device1).get());
196 ASSERT_FALSE(device_permissions->FindEntry(device2).get()); 233 ASSERT_FALSE(device_permissions->FindEntry(device2).get());
197 ASSERT_FALSE(device_permissions->FindEntry(device3).get()); 234 ASSERT_FALSE(device_permissions->FindEntry(device3).get());
198 235
199 device0->NotifyDisconnect(); 236 usb_service_->NotifyDeviceRemoved(device0);
200 device1->NotifyDisconnect(); 237 usb_service_->NotifyDeviceRemoved(device1);
201 238
202 device_permissions = manager->GetForExtension(extension_->id()); 239 device_permissions = manager->GetForExtension(extension_->id());
203 // Device 0 will be accessible when it is reconnected because it can be 240 // Device 0 will be accessible when it is reconnected because it can be
204 // recognized by its serial number. 241 // recognized by its serial number.
205 ASSERT_TRUE(device_permissions->FindEntry(device0).get()); 242 ASSERT_TRUE(device_permissions->FindEntry(device0).get());
206 // Device 1 does not have a serial number and cannot be distinguished from 243 // Device 1 does not have a serial number and cannot be distinguished from
207 // any other device of the same model so the app must request permission again 244 // any other device of the same model so the app must request permission again
208 // when it is reconnected. 245 // when it is reconnected.
209 ASSERT_FALSE(device_permissions->FindEntry(device1).get()); 246 ASSERT_FALSE(device_permissions->FindEntry(device1).get());
210 ASSERT_FALSE(device_permissions->FindEntry(device2).get()); 247 ASSERT_FALSE(device_permissions->FindEntry(device2).get());
211 ASSERT_FALSE(device_permissions->FindEntry(device3).get()); 248 ASSERT_FALSE(device_permissions->FindEntry(device3).get());
212 } 249 }
213 250
214 TEST_F(DevicePermissionsManagerTest, RevokeAndRegrantAccess) { 251 TEST_F(DevicePermissionsManagerTest, RevokeAndRegrantAccess) {
215 DevicePermissionsManager* manager = 252 DevicePermissionsManager* manager =
216 DevicePermissionsManager::Get(env_.profile()); 253 DevicePermissionsManager::Get(env_->profile());
217 AllowUsbDevice(manager, extension_, device0); 254 AllowUsbDevice(manager, extension_, device0);
218 AllowUsbDevice(manager, extension_, device1); 255 AllowUsbDevice(manager, extension_, device1);
219 256
220 scoped_ptr<DevicePermissions> device_permissions = 257 scoped_ptr<DevicePermissions> device_permissions =
221 manager->GetForExtension(extension_->id()); 258 manager->GetForExtension(extension_->id());
222 scoped_refptr<DevicePermissionEntry> device0_entry = 259 scoped_refptr<DevicePermissionEntry> device0_entry =
223 device_permissions->FindEntry(device0); 260 device_permissions->FindEntry(device0);
224 ASSERT_TRUE(device0_entry.get()); 261 ASSERT_TRUE(device0_entry.get());
225 scoped_refptr<DevicePermissionEntry> device1_entry = 262 scoped_refptr<DevicePermissionEntry> device1_entry =
226 device_permissions->FindEntry(device1); 263 device_permissions->FindEntry(device1);
(...skipping 15 matching lines...) Expand all
242 ASSERT_FALSE(device_permissions->FindEntry(device1).get()); 279 ASSERT_FALSE(device_permissions->FindEntry(device1).get());
243 280
244 AllowUsbDevice(manager, extension_, device1); 281 AllowUsbDevice(manager, extension_, device1);
245 device_permissions = manager->GetForExtension(extension_->id()); 282 device_permissions = manager->GetForExtension(extension_->id());
246 ASSERT_TRUE(device_permissions->FindEntry(device0).get()); 283 ASSERT_TRUE(device_permissions->FindEntry(device0).get());
247 ASSERT_TRUE(device_permissions->FindEntry(device1).get()); 284 ASSERT_TRUE(device_permissions->FindEntry(device1).get());
248 } 285 }
249 286
250 TEST_F(DevicePermissionsManagerTest, UpdateLastUsed) { 287 TEST_F(DevicePermissionsManagerTest, UpdateLastUsed) {
251 DevicePermissionsManager* manager = 288 DevicePermissionsManager* manager =
252 DevicePermissionsManager::Get(env_.profile()); 289 DevicePermissionsManager::Get(env_->profile());
253 AllowUsbDevice(manager, extension_, device0); 290 AllowUsbDevice(manager, extension_, device0);
254 291
255 scoped_ptr<DevicePermissions> device_permissions = 292 scoped_ptr<DevicePermissions> device_permissions =
256 manager->GetForExtension(extension_->id()); 293 manager->GetForExtension(extension_->id());
257 scoped_refptr<DevicePermissionEntry> device0_entry = 294 scoped_refptr<DevicePermissionEntry> device0_entry =
258 device_permissions->FindEntry(device0); 295 device_permissions->FindEntry(device0);
259 ASSERT_TRUE(device0_entry->last_used().is_null()); 296 ASSERT_TRUE(device0_entry->last_used().is_null());
260 297
261 manager->UpdateLastUsed(extension_->id(), device0_entry); 298 manager->UpdateLastUsed(extension_->id(), device0_entry);
262 device_permissions = manager->GetForExtension(extension_->id()); 299 device_permissions = manager->GetForExtension(extension_->id());
263 device0_entry = device_permissions->FindEntry(device0); 300 device0_entry = device_permissions->FindEntry(device0);
264 ASSERT_FALSE(device0_entry->last_used().is_null()); 301 ASSERT_FALSE(device0_entry->last_used().is_null());
265 } 302 }
266 303
267 TEST_F(DevicePermissionsManagerTest, LoadPrefs) { 304 TEST_F(DevicePermissionsManagerTest, LoadPrefs) {
268 scoped_ptr<base::Value> prefs_value = base::test::ParseJson( 305 scoped_ptr<base::Value> prefs_value = base::test::ParseJson(
269 "[" 306 "["
270 " {" 307 " {"
271 " \"product_id\": 0," 308 " \"product_id\": 0,"
272 " \"serial_number\": \"ABCDE\"," 309 " \"serial_number\": \"ABCDE\","
273 " \"type\": \"usb\"," 310 " \"type\": \"usb\","
274 " \"vendor_id\": 0" 311 " \"vendor_id\": 0"
275 " }" 312 " }"
276 "]"); 313 "]");
277 env_.GetExtensionPrefs()->UpdateExtensionPref( 314 env_->GetExtensionPrefs()->UpdateExtensionPref(extension_->id(), "devices",
278 extension_->id(), "devices", prefs_value.release()); 315 prefs_value.release());
279 316
280 DevicePermissionsManager* manager = 317 DevicePermissionsManager* manager =
281 DevicePermissionsManager::Get(env_.profile()); 318 DevicePermissionsManager::Get(env_->profile());
282 scoped_ptr<DevicePermissions> device_permissions = 319 scoped_ptr<DevicePermissions> device_permissions =
283 manager->GetForExtension(extension_->id()); 320 manager->GetForExtension(extension_->id());
284 ASSERT_TRUE(device_permissions->FindEntry(device0).get()); 321 ASSERT_TRUE(device_permissions->FindEntry(device0).get());
285 ASSERT_FALSE(device_permissions->FindEntry(device1).get()); 322 ASSERT_FALSE(device_permissions->FindEntry(device1).get());
286 ASSERT_FALSE(device_permissions->FindEntry(device2).get()); 323 ASSERT_FALSE(device_permissions->FindEntry(device2).get());
287 ASSERT_FALSE(device_permissions->FindEntry(device3).get()); 324 ASSERT_FALSE(device_permissions->FindEntry(device3).get());
288 } 325 }
289 326
290 } // namespace extensions 327 } // namespace extensions
OLDNEW
« no previous file with comments | « no previous file | device/usb/usb_device.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698