| OLD | NEW |
| 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/core/device_client.h" |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 116 | 116 |
| 117 return device_permissions->FindEntry(device, serial_number); | 117 return device_permissions->FindEntry(device, serial_number); |
| 118 } | 118 } |
| 119 | 119 |
| 120 } // namespace | 120 } // namespace |
| 121 | 121 |
| 122 class DevicePermissionsManagerTest : public testing::Test { | 122 class DevicePermissionsManagerTest : public testing::Test { |
| 123 protected: | 123 protected: |
| 124 void SetUp() override { | 124 void SetUp() override { |
| 125 testing::Test::SetUp(); | 125 testing::Test::SetUp(); |
| 126 env_.reset(new TestExtensionEnvironment()); | 126 env_.GetExtensionPrefs(); // Force creation before adding extensions. |
| 127 env_->GetExtensionPrefs(); // Force creation before adding extensions. | 127 extension_ = env_.MakeExtension(*base::test::ParseJson( |
| 128 extension_ = | 128 "{" |
| 129 env_->MakeExtension(*base::test::ParseJson( | 129 " \"app\": {" |
| 130 "{" | 130 " \"background\": {" |
| 131 " \"app\": {" | 131 " \"scripts\": [\"background.js\"]" |
| 132 " \"background\": {" | 132 " }" |
| 133 " \"scripts\": [\"background.js\"]" | 133 " }," |
| 134 " }" | 134 " \"permissions\": [" |
| 135 " }," | 135 " \"usb\"" |
| 136 " \"permissions\": [" | 136 " ]" |
| 137 " \"usb\"" | 137 "}")); |
| 138 " ]" | |
| 139 "}")); | |
| 140 device0_ = new MockUsbDevice("ABCDE"); | 138 device0_ = new MockUsbDevice("ABCDE"); |
| 141 device1_ = new MockUsbDevice(""); | 139 device1_ = new MockUsbDevice(""); |
| 142 device2_ = new MockUsbDevice("12345"); | 140 device2_ = new MockUsbDevice("12345"); |
| 143 device3_ = new MockUsbDevice(""); | 141 device3_ = new MockUsbDevice(""); |
| 144 usb_service_ = new MockUsbService(); | 142 usb_service_ = new MockUsbService(); |
| 145 UsbService::SetInstanceForTest(usb_service_); | 143 UsbService::SetInstanceForTest(usb_service_); |
| 146 } | 144 } |
| 147 | 145 |
| 148 void TearDown() override { | 146 extensions::TestExtensionEnvironment env_; |
| 149 env_.reset(nullptr); | |
| 150 UsbService::SetInstanceForTest(nullptr); | |
| 151 } | |
| 152 | |
| 153 scoped_ptr<extensions::TestExtensionEnvironment> env_; | |
| 154 const extensions::Extension* extension_; | 147 const extensions::Extension* extension_; |
| 155 MockUsbService* usb_service_; | 148 MockUsbService* usb_service_; |
| 156 scoped_refptr<MockUsbDevice> device0_; | 149 scoped_refptr<MockUsbDevice> device0_; |
| 157 scoped_refptr<MockUsbDevice> device1_; | 150 scoped_refptr<MockUsbDevice> device1_; |
| 158 scoped_refptr<MockUsbDevice> device2_; | 151 scoped_refptr<MockUsbDevice> device2_; |
| 159 scoped_refptr<MockUsbDevice> device3_; | 152 scoped_refptr<MockUsbDevice> device3_; |
| 160 }; | 153 }; |
| 161 | 154 |
| 162 TEST_F(DevicePermissionsManagerTest, AllowAndClearDevices) { | 155 TEST_F(DevicePermissionsManagerTest, AllowAndClearDevices) { |
| 163 DevicePermissionsManager* manager = | 156 DevicePermissionsManager* manager = |
| 164 DevicePermissionsManager::Get(env_->profile()); | 157 DevicePermissionsManager::Get(env_.profile()); |
| 165 AllowUsbDevice(manager, extension_, device0_); | 158 AllowUsbDevice(manager, extension_, device0_); |
| 166 AllowUsbDevice(manager, extension_, device1_); | 159 AllowUsbDevice(manager, extension_, device1_); |
| 167 | 160 |
| 168 scoped_ptr<DevicePermissions> device_permissions = | 161 scoped_ptr<DevicePermissions> device_permissions = |
| 169 manager->GetForExtension(extension_->id()); | 162 manager->GetForExtension(extension_->id()); |
| 170 scoped_refptr<DevicePermissionEntry> device0_entry = | 163 scoped_refptr<DevicePermissionEntry> device0_entry = |
| 171 FindEntry(device_permissions.get(), device0_); | 164 FindEntry(device_permissions.get(), device0_); |
| 172 ASSERT_TRUE(device0_entry.get()); | 165 ASSERT_TRUE(device0_entry.get()); |
| 173 scoped_refptr<DevicePermissionEntry> device1_entry = | 166 scoped_refptr<DevicePermissionEntry> device1_entry = |
| 174 FindEntry(device_permissions.get(), device1_); | 167 FindEntry(device_permissions.get(), device1_); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 198 | 191 |
| 199 device_permissions = manager->GetForExtension(extension_->id()); | 192 device_permissions = manager->GetForExtension(extension_->id()); |
| 200 ASSERT_TRUE(FindEntry(device_permissions.get(), device0_).get()); | 193 ASSERT_TRUE(FindEntry(device_permissions.get(), device0_).get()); |
| 201 ASSERT_TRUE(FindEntry(device_permissions.get(), device1_).get()); | 194 ASSERT_TRUE(FindEntry(device_permissions.get(), device1_).get()); |
| 202 ASSERT_FALSE(FindEntry(device_permissions.get(), device2_).get()); | 195 ASSERT_FALSE(FindEntry(device_permissions.get(), device2_).get()); |
| 203 ASSERT_FALSE(FindEntry(device_permissions.get(), device3_).get()); | 196 ASSERT_FALSE(FindEntry(device_permissions.get(), device3_).get()); |
| 204 } | 197 } |
| 205 | 198 |
| 206 TEST_F(DevicePermissionsManagerTest, SuspendExtension) { | 199 TEST_F(DevicePermissionsManagerTest, SuspendExtension) { |
| 207 DevicePermissionsManager* manager = | 200 DevicePermissionsManager* manager = |
| 208 DevicePermissionsManager::Get(env_->profile()); | 201 DevicePermissionsManager::Get(env_.profile()); |
| 209 AllowUsbDevice(manager, extension_, device0_); | 202 AllowUsbDevice(manager, extension_, device0_); |
| 210 AllowUsbDevice(manager, extension_, device1_); | 203 AllowUsbDevice(manager, extension_, device1_); |
| 211 | 204 |
| 212 scoped_ptr<DevicePermissions> device_permissions = | 205 scoped_ptr<DevicePermissions> device_permissions = |
| 213 manager->GetForExtension(extension_->id()); | 206 manager->GetForExtension(extension_->id()); |
| 214 ASSERT_TRUE(FindEntry(device_permissions.get(), device0_).get()); | 207 ASSERT_TRUE(FindEntry(device_permissions.get(), device0_).get()); |
| 215 ASSERT_TRUE(FindEntry(device_permissions.get(), device1_).get()); | 208 ASSERT_TRUE(FindEntry(device_permissions.get(), device1_).get()); |
| 216 ASSERT_FALSE(FindEntry(device_permissions.get(), device2_).get()); | 209 ASSERT_FALSE(FindEntry(device_permissions.get(), device2_).get()); |
| 217 ASSERT_FALSE(FindEntry(device_permissions.get(), device3_).get()); | 210 ASSERT_FALSE(FindEntry(device_permissions.get(), device3_).get()); |
| 218 | 211 |
| 219 manager->OnBackgroundHostClose(extension_->id()); | 212 manager->OnBackgroundHostClose(extension_->id()); |
| 220 | 213 |
| 221 device_permissions = manager->GetForExtension(extension_->id()); | 214 device_permissions = manager->GetForExtension(extension_->id()); |
| 222 // Device 0 is still registered because its serial number has been stored in | 215 // Device 0 is still registered because its serial number has been stored in |
| 223 // ExtensionPrefs, it is "persistent". | 216 // ExtensionPrefs, it is "persistent". |
| 224 ASSERT_TRUE(FindEntry(device_permissions.get(), device0_).get()); | 217 ASSERT_TRUE(FindEntry(device_permissions.get(), device0_).get()); |
| 225 // Device 1 does not have uniquely identifying traits and so permission to | 218 // Device 1 does not have uniquely identifying traits and so permission to |
| 226 // open it has been dropped when the app's windows have closed and the | 219 // open it has been dropped when the app's windows have closed and the |
| 227 // background page has been suspended. | 220 // background page has been suspended. |
| 228 ASSERT_FALSE(FindEntry(device_permissions.get(), device1_).get()); | 221 ASSERT_FALSE(FindEntry(device_permissions.get(), device1_).get()); |
| 229 ASSERT_FALSE(FindEntry(device_permissions.get(), device2_).get()); | 222 ASSERT_FALSE(FindEntry(device_permissions.get(), device2_).get()); |
| 230 ASSERT_FALSE(FindEntry(device_permissions.get(), device3_).get()); | 223 ASSERT_FALSE(FindEntry(device_permissions.get(), device3_).get()); |
| 231 } | 224 } |
| 232 | 225 |
| 233 TEST_F(DevicePermissionsManagerTest, DisconnectDevice) { | 226 TEST_F(DevicePermissionsManagerTest, DisconnectDevice) { |
| 234 DevicePermissionsManager* manager = | 227 DevicePermissionsManager* manager = |
| 235 DevicePermissionsManager::Get(env_->profile()); | 228 DevicePermissionsManager::Get(env_.profile()); |
| 236 AllowUsbDevice(manager, extension_, device0_); | 229 AllowUsbDevice(manager, extension_, device0_); |
| 237 AllowUsbDevice(manager, extension_, device1_); | 230 AllowUsbDevice(manager, extension_, device1_); |
| 238 | 231 |
| 239 scoped_ptr<DevicePermissions> device_permissions = | 232 scoped_ptr<DevicePermissions> device_permissions = |
| 240 manager->GetForExtension(extension_->id()); | 233 manager->GetForExtension(extension_->id()); |
| 241 ASSERT_TRUE(FindEntry(device_permissions.get(), device0_).get()); | 234 ASSERT_TRUE(FindEntry(device_permissions.get(), device0_).get()); |
| 242 ASSERT_TRUE(FindEntry(device_permissions.get(), device1_).get()); | 235 ASSERT_TRUE(FindEntry(device_permissions.get(), device1_).get()); |
| 243 ASSERT_FALSE(FindEntry(device_permissions.get(), device2_).get()); | 236 ASSERT_FALSE(FindEntry(device_permissions.get(), device2_).get()); |
| 244 ASSERT_FALSE(FindEntry(device_permissions.get(), device3_).get()); | 237 ASSERT_FALSE(FindEntry(device_permissions.get(), device3_).get()); |
| 245 | 238 |
| 246 usb_service_->NotifyDeviceRemoved(device0_); | 239 usb_service_->NotifyDeviceRemoved(device0_); |
| 247 usb_service_->NotifyDeviceRemoved(device1_); | 240 usb_service_->NotifyDeviceRemoved(device1_); |
| 248 | 241 |
| 249 device_permissions = manager->GetForExtension(extension_->id()); | 242 device_permissions = manager->GetForExtension(extension_->id()); |
| 250 // Device 0 will be accessible when it is reconnected because it can be | 243 // Device 0 will be accessible when it is reconnected because it can be |
| 251 // recognized by its serial number. | 244 // recognized by its serial number. |
| 252 ASSERT_TRUE(FindEntry(device_permissions.get(), device0_).get()); | 245 ASSERT_TRUE(FindEntry(device_permissions.get(), device0_).get()); |
| 253 // Device 1 does not have a serial number and cannot be distinguished from | 246 // Device 1 does not have a serial number and cannot be distinguished from |
| 254 // any other device of the same model so the app must request permission again | 247 // any other device of the same model so the app must request permission again |
| 255 // when it is reconnected. | 248 // when it is reconnected. |
| 256 ASSERT_FALSE(FindEntry(device_permissions.get(), device1_).get()); | 249 ASSERT_FALSE(FindEntry(device_permissions.get(), device1_).get()); |
| 257 ASSERT_FALSE(FindEntry(device_permissions.get(), device2_).get()); | 250 ASSERT_FALSE(FindEntry(device_permissions.get(), device2_).get()); |
| 258 ASSERT_FALSE(FindEntry(device_permissions.get(), device3_).get()); | 251 ASSERT_FALSE(FindEntry(device_permissions.get(), device3_).get()); |
| 259 } | 252 } |
| 260 | 253 |
| 261 TEST_F(DevicePermissionsManagerTest, RevokeAndRegrantAccess) { | 254 TEST_F(DevicePermissionsManagerTest, RevokeAndRegrantAccess) { |
| 262 DevicePermissionsManager* manager = | 255 DevicePermissionsManager* manager = |
| 263 DevicePermissionsManager::Get(env_->profile()); | 256 DevicePermissionsManager::Get(env_.profile()); |
| 264 AllowUsbDevice(manager, extension_, device0_); | 257 AllowUsbDevice(manager, extension_, device0_); |
| 265 AllowUsbDevice(manager, extension_, device1_); | 258 AllowUsbDevice(manager, extension_, device1_); |
| 266 | 259 |
| 267 scoped_ptr<DevicePermissions> device_permissions = | 260 scoped_ptr<DevicePermissions> device_permissions = |
| 268 manager->GetForExtension(extension_->id()); | 261 manager->GetForExtension(extension_->id()); |
| 269 scoped_refptr<DevicePermissionEntry> device0_entry = | 262 scoped_refptr<DevicePermissionEntry> device0_entry = |
| 270 FindEntry(device_permissions.get(), device0_); | 263 FindEntry(device_permissions.get(), device0_); |
| 271 ASSERT_TRUE(device0_entry.get()); | 264 ASSERT_TRUE(device0_entry.get()); |
| 272 scoped_refptr<DevicePermissionEntry> device1_entry = | 265 scoped_refptr<DevicePermissionEntry> device1_entry = |
| 273 FindEntry(device_permissions.get(), device1_); | 266 FindEntry(device_permissions.get(), device1_); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 289 ASSERT_FALSE(FindEntry(device_permissions.get(), device1_).get()); | 282 ASSERT_FALSE(FindEntry(device_permissions.get(), device1_).get()); |
| 290 | 283 |
| 291 AllowUsbDevice(manager, extension_, device1_); | 284 AllowUsbDevice(manager, extension_, device1_); |
| 292 device_permissions = manager->GetForExtension(extension_->id()); | 285 device_permissions = manager->GetForExtension(extension_->id()); |
| 293 ASSERT_TRUE(FindEntry(device_permissions.get(), device0_).get()); | 286 ASSERT_TRUE(FindEntry(device_permissions.get(), device0_).get()); |
| 294 ASSERT_TRUE(FindEntry(device_permissions.get(), device1_).get()); | 287 ASSERT_TRUE(FindEntry(device_permissions.get(), device1_).get()); |
| 295 } | 288 } |
| 296 | 289 |
| 297 TEST_F(DevicePermissionsManagerTest, UpdateLastUsed) { | 290 TEST_F(DevicePermissionsManagerTest, UpdateLastUsed) { |
| 298 DevicePermissionsManager* manager = | 291 DevicePermissionsManager* manager = |
| 299 DevicePermissionsManager::Get(env_->profile()); | 292 DevicePermissionsManager::Get(env_.profile()); |
| 300 AllowUsbDevice(manager, extension_, device0_); | 293 AllowUsbDevice(manager, extension_, device0_); |
| 301 | 294 |
| 302 scoped_ptr<DevicePermissions> device_permissions = | 295 scoped_ptr<DevicePermissions> device_permissions = |
| 303 manager->GetForExtension(extension_->id()); | 296 manager->GetForExtension(extension_->id()); |
| 304 scoped_refptr<DevicePermissionEntry> device0_entry = | 297 scoped_refptr<DevicePermissionEntry> device0_entry = |
| 305 FindEntry(device_permissions.get(), device0_); | 298 FindEntry(device_permissions.get(), device0_); |
| 306 ASSERT_TRUE(device0_entry->last_used().is_null()); | 299 ASSERT_TRUE(device0_entry->last_used().is_null()); |
| 307 | 300 |
| 308 manager->UpdateLastUsed(extension_->id(), device0_entry); | 301 manager->UpdateLastUsed(extension_->id(), device0_entry); |
| 309 device_permissions = manager->GetForExtension(extension_->id()); | 302 device_permissions = manager->GetForExtension(extension_->id()); |
| 310 device0_entry = FindEntry(device_permissions.get(), device0_); | 303 device0_entry = FindEntry(device_permissions.get(), device0_); |
| 311 ASSERT_FALSE(device0_entry->last_used().is_null()); | 304 ASSERT_FALSE(device0_entry->last_used().is_null()); |
| 312 } | 305 } |
| 313 | 306 |
| 314 TEST_F(DevicePermissionsManagerTest, LoadPrefs) { | 307 TEST_F(DevicePermissionsManagerTest, LoadPrefs) { |
| 315 scoped_ptr<base::Value> prefs_value = base::test::ParseJson( | 308 scoped_ptr<base::Value> prefs_value = base::test::ParseJson( |
| 316 "[" | 309 "[" |
| 317 " {" | 310 " {" |
| 318 " \"product_id\": 0," | 311 " \"product_id\": 0," |
| 319 " \"serial_number\": \"ABCDE\"," | 312 " \"serial_number\": \"ABCDE\"," |
| 320 " \"type\": \"usb\"," | 313 " \"type\": \"usb\"," |
| 321 " \"vendor_id\": 0" | 314 " \"vendor_id\": 0" |
| 322 " }" | 315 " }" |
| 323 "]"); | 316 "]"); |
| 324 env_->GetExtensionPrefs()->UpdateExtensionPref(extension_->id(), "devices", | 317 env_.GetExtensionPrefs()->UpdateExtensionPref(extension_->id(), "devices", |
| 325 prefs_value.release()); | 318 prefs_value.release()); |
| 326 | 319 |
| 327 DevicePermissionsManager* manager = | 320 DevicePermissionsManager* manager = |
| 328 DevicePermissionsManager::Get(env_->profile()); | 321 DevicePermissionsManager::Get(env_.profile()); |
| 329 scoped_ptr<DevicePermissions> device_permissions = | 322 scoped_ptr<DevicePermissions> device_permissions = |
| 330 manager->GetForExtension(extension_->id()); | 323 manager->GetForExtension(extension_->id()); |
| 331 ASSERT_TRUE(FindEntry(device_permissions.get(), device0_).get()); | 324 ASSERT_TRUE(FindEntry(device_permissions.get(), device0_).get()); |
| 332 ASSERT_FALSE(FindEntry(device_permissions.get(), device1_).get()); | 325 ASSERT_FALSE(FindEntry(device_permissions.get(), device1_).get()); |
| 333 ASSERT_FALSE(FindEntry(device_permissions.get(), device2_).get()); | 326 ASSERT_FALSE(FindEntry(device_permissions.get(), device2_).get()); |
| 334 ASSERT_FALSE(FindEntry(device_permissions.get(), device3_).get()); | 327 ASSERT_FALSE(FindEntry(device_permissions.get(), device3_).get()); |
| 335 } | 328 } |
| 336 | 329 |
| 337 } // namespace extensions | 330 } // namespace extensions |
| OLD | NEW |