| 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 <set> | 5 #include <set> |
| 6 | 6 |
| 7 #include "base/run_loop.h" | 7 #include "base/run_loop.h" |
| 8 #include "base/strings/string_number_conversions.h" | 8 #include "base/strings/string_number_conversions.h" |
| 9 #include "chrome/browser/extensions/extension_browsertest.h" | 9 #include "chrome/browser/extensions/extension_browsertest.h" |
| 10 #include "chrome/browser/extensions/extension_service.h" | 10 #include "chrome/browser/extensions/extension_service.h" |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 90 ExtensionStorageMonitor* monitor() { | 90 ExtensionStorageMonitor* monitor() { |
| 91 CHECK(storage_monitor_); | 91 CHECK(storage_monitor_); |
| 92 return storage_monitor_; | 92 return storage_monitor_; |
| 93 } | 93 } |
| 94 | 94 |
| 95 int64 GetInitialExtensionThreshold() { | 95 int64 GetInitialExtensionThreshold() { |
| 96 CHECK(storage_monitor_); | 96 CHECK(storage_monitor_); |
| 97 return storage_monitor_->initial_extension_threshold_; | 97 return storage_monitor_->initial_extension_threshold_; |
| 98 } | 98 } |
| 99 | 99 |
| 100 int64 GetInitialEphemeralThreshold() { | |
| 101 CHECK(storage_monitor_); | |
| 102 return storage_monitor_->initial_ephemeral_threshold_; | |
| 103 } | |
| 104 | |
| 105 void DisableForInstalledExtensions() { | 100 void DisableForInstalledExtensions() { |
| 106 CHECK(storage_monitor_); | 101 CHECK(storage_monitor_); |
| 107 storage_monitor_->enable_for_all_extensions_ = false; | 102 storage_monitor_->enable_for_all_extensions_ = false; |
| 108 } | 103 } |
| 109 | 104 |
| 110 const Extension* InitWriteDataApp() { | 105 const Extension* InitWriteDataApp() { |
| 111 base::FilePath path = test_data_dir_.AppendASCII(kWriteDataApp); | 106 base::FilePath path = test_data_dir_.AppendASCII(kWriteDataApp); |
| 112 const Extension* extension = InstallExtension(path, 1); | 107 const Extension* extension = InstallExtension(path, 1); |
| 113 EXPECT_TRUE(extension); | 108 EXPECT_TRUE(extension); |
| 114 return extension; | 109 return extension; |
| 115 } | 110 } |
| 116 | 111 |
| 117 const Extension* InitWriteDataEphemeralApp() { | |
| 118 // The threshold for installed extensions should be higher than ephemeral | |
| 119 // apps. | |
| 120 storage_monitor_->initial_extension_threshold_ = | |
| 121 storage_monitor_->initial_ephemeral_threshold_ * 4; | |
| 122 | |
| 123 base::FilePath path = test_data_dir_.AppendASCII(kWriteDataApp); | |
| 124 const Extension* extension = InstallEphemeralAppWithSourceAndFlags( | |
| 125 path, 1, Manifest::INTERNAL, Extension::NO_FLAGS); | |
| 126 EXPECT_TRUE(extension); | |
| 127 return extension; | |
| 128 } | |
| 129 | |
| 130 std::string GetNotificationId(const std::string& extension_id) { | 112 std::string GetNotificationId(const std::string& extension_id) { |
| 131 return monitor()->GetNotificationId(extension_id); | 113 return monitor()->GetNotificationId(extension_id); |
| 132 } | 114 } |
| 133 | 115 |
| 134 bool IsStorageNotificationEnabled(const std::string& extension_id) { | 116 bool IsStorageNotificationEnabled(const std::string& extension_id) { |
| 135 return monitor()->IsStorageNotificationEnabled(extension_id); | 117 return monitor()->IsStorageNotificationEnabled(extension_id); |
| 136 } | 118 } |
| 137 | 119 |
| 138 int64 GetNextStorageThreshold(const std::string& extension_id) { | 120 int64 GetNextStorageThreshold(const std::string& extension_id) { |
| 139 return monitor()->GetNextStorageThreshold(extension_id); | 121 return monitor()->GetNextStorageThreshold(extension_id); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 153 | 135 |
| 154 private: | 136 private: |
| 155 void InitStorageMonitor() { | 137 void InitStorageMonitor() { |
| 156 storage_monitor_ = ExtensionStorageMonitor::Get(profile()); | 138 storage_monitor_ = ExtensionStorageMonitor::Get(profile()); |
| 157 ASSERT_TRUE(storage_monitor_); | 139 ASSERT_TRUE(storage_monitor_); |
| 158 | 140 |
| 159 // Override thresholds so that we don't have to write a huge amount of data | 141 // Override thresholds so that we don't have to write a huge amount of data |
| 160 // to trigger notifications in these tests. | 142 // to trigger notifications in these tests. |
| 161 storage_monitor_->enable_for_all_extensions_ = true; | 143 storage_monitor_->enable_for_all_extensions_ = true; |
| 162 storage_monitor_->initial_extension_threshold_ = kInitialUsageThreshold; | 144 storage_monitor_->initial_extension_threshold_ = kInitialUsageThreshold; |
| 163 storage_monitor_->initial_ephemeral_threshold_ = kInitialUsageThreshold; | |
| 164 | 145 |
| 165 // To ensure storage events are dispatched from QuotaManager immediately. | 146 // To ensure storage events are dispatched from QuotaManager immediately. |
| 166 storage_monitor_->observer_rate_ = base::TimeDelta(); | 147 storage_monitor_->observer_rate_ = base::TimeDelta(); |
| 167 } | 148 } |
| 168 | 149 |
| 169 // Write a number of bytes to persistent storage. | 150 // Write a number of bytes to persistent storage. |
| 170 void WriteBytes(const Extension* extension, | 151 void WriteBytes(const Extension* extension, |
| 171 int num_bytes, | 152 int num_bytes, |
| 172 bool expected_notification) { | 153 bool expected_notification) { |
| 173 ExtensionTestMessageListener launched_listener("launched", true); | 154 ExtensionTestMessageListener launched_listener("launched", true); |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 250 | 231 |
| 251 // Expect to receive no further notifications when usage continues to | 232 // Expect to receive no further notifications when usage continues to |
| 252 // increase. | 233 // increase. |
| 253 int64 next_threshold = GetNextStorageThreshold(extension->id()); | 234 int64 next_threshold = GetNextStorageThreshold(extension->id()); |
| 254 int64 next_data_size = next_threshold - GetInitialExtensionThreshold(); | 235 int64 next_data_size = next_threshold - GetInitialExtensionThreshold(); |
| 255 ASSERT_GT(next_data_size, 0); | 236 ASSERT_GT(next_data_size, 0); |
| 256 | 237 |
| 257 WriteBytesNotExpectingNotification(extension, next_data_size); | 238 WriteBytesNotExpectingNotification(extension, next_data_size); |
| 258 } | 239 } |
| 259 | 240 |
| 260 // Verify that thresholds for ephemeral apps are reset when they are | |
| 261 // promoted to regular installed apps. | |
| 262 IN_PROC_BROWSER_TEST_F(ExtensionStorageMonitorTest, EphemeralAppLowUsage) { | |
| 263 const Extension* extension = InitWriteDataEphemeralApp(); | |
| 264 ASSERT_TRUE(extension); | |
| 265 WriteBytesExpectingNotification(extension, GetInitialEphemeralThreshold()); | |
| 266 | |
| 267 // Store the number of bytes until the next threshold is reached. | |
| 268 int64 next_threshold = GetNextStorageThreshold(extension->id()); | |
| 269 int64 next_data_size = next_threshold - GetInitialEphemeralThreshold(); | |
| 270 ASSERT_GT(next_data_size, 0); | |
| 271 EXPECT_GE(GetInitialExtensionThreshold(), next_threshold); | |
| 272 | |
| 273 // Promote the ephemeral app. | |
| 274 ExtensionService* service = | |
| 275 ExtensionSystem::Get(profile())->extension_service(); | |
| 276 service->PromoteEphemeralApp(extension, false); | |
| 277 | |
| 278 // The next threshold should now be equal to the initial threshold for | |
| 279 // extensions (which is higher than the initial threshold for ephemeral apps). | |
| 280 EXPECT_EQ(GetInitialExtensionThreshold(), | |
| 281 GetNextStorageThreshold(extension->id())); | |
| 282 | |
| 283 // Since the threshold was increased, a notification should not be | |
| 284 // triggered. | |
| 285 WriteBytesNotExpectingNotification(extension, next_data_size); | |
| 286 } | |
| 287 | |
| 288 // Verify that thresholds for ephemeral apps are not reset when they are | |
| 289 // promoted to regular installed apps if their usage is higher than the initial | |
| 290 // threshold for installed extensions. | |
| 291 IN_PROC_BROWSER_TEST_F(ExtensionStorageMonitorTest, EphemeralAppWithHighUsage) { | |
| 292 const Extension* extension = InitWriteDataEphemeralApp(); | |
| 293 ASSERT_TRUE(extension); | |
| 294 WriteBytesExpectingNotification(extension, GetInitialExtensionThreshold()); | |
| 295 int64 saved_next_threshold = GetNextStorageThreshold(extension->id()); | |
| 296 | |
| 297 // Promote the ephemeral app. | |
| 298 ExtensionService* service = | |
| 299 ExtensionSystem::Get(profile())->extension_service(); | |
| 300 service->PromoteEphemeralApp(extension, false); | |
| 301 | |
| 302 // The next threshold should not have changed. | |
| 303 EXPECT_EQ(saved_next_threshold, GetNextStorageThreshold(extension->id())); | |
| 304 } | |
| 305 | |
| 306 // Ensure that monitoring is disabled for installed extensions if | 241 // Ensure that monitoring is disabled for installed extensions if |
| 307 // |enable_for_all_extensions_| is false. This test can be removed if monitoring | 242 // |enable_for_all_extensions_| is false. This test can be removed if monitoring |
| 308 // is eventually enabled for all extensions. | 243 // is eventually enabled for all extensions. |
| 309 IN_PROC_BROWSER_TEST_F(ExtensionStorageMonitorTest, | 244 IN_PROC_BROWSER_TEST_F(ExtensionStorageMonitorTest, |
| 310 DisableForInstalledExtensions) { | 245 DisableForInstalledExtensions) { |
| 311 DisableForInstalledExtensions(); | 246 DisableForInstalledExtensions(); |
| 312 | 247 |
| 313 const Extension* extension = InitWriteDataApp(); | 248 const Extension* extension = InitWriteDataApp(); |
| 314 ASSERT_TRUE(extension); | 249 ASSERT_TRUE(extension); |
| 315 WriteBytesNotExpectingNotification(extension, GetInitialExtensionThreshold()); | 250 WriteBytesNotExpectingNotification(extension, GetInitialExtensionThreshold()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 328 ScopedTestDialogAutoConfirm::ACCEPT); | 263 ScopedTestDialogAutoConfirm::ACCEPT); |
| 329 TestExtensionRegistryObserver observer(ExtensionRegistry::Get(profile()), | 264 TestExtensionRegistryObserver observer(ExtensionRegistry::Get(profile()), |
| 330 extension->id()); | 265 extension->id()); |
| 331 message_center::MessageCenter::Get()->ClickOnNotificationButton( | 266 message_center::MessageCenter::Get()->ClickOnNotificationButton( |
| 332 GetNotificationId(extension->id()), | 267 GetNotificationId(extension->id()), |
| 333 ExtensionStorageMonitor::BUTTON_UNINSTALL); | 268 ExtensionStorageMonitor::BUTTON_UNINSTALL); |
| 334 observer.WaitForExtensionUninstalled(); | 269 observer.WaitForExtensionUninstalled(); |
| 335 } | 270 } |
| 336 | 271 |
| 337 } // namespace extensions | 272 } // namespace extensions |
| OLD | NEW |