Index: chrome/browser/extensions/extension_garbage_collector_unittest.cc |
diff --git a/chrome/browser/extensions/extension_garbage_collector_unittest.cc b/chrome/browser/extensions/extension_garbage_collector_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..de8f78de4aa0f3ba39f6618e68ade9bc0d725008 |
--- /dev/null |
+++ b/chrome/browser/extensions/extension_garbage_collector_unittest.cc |
@@ -0,0 +1,142 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/file_util.h" |
+#include "base/files/file_enumerator.h" |
+#include "base/files/file_path.h" |
+#include "base/prefs/scoped_user_pref_update.h" |
+#include "base/values.h" |
+#include "chrome/browser/extensions/extension_garbage_collector.h" |
+#include "chrome/browser/extensions/extension_service_unittest.h" |
+#include "chrome/browser/profiles/profile.h" |
+#include "chrome/common/chrome_constants.h" |
+#include "chrome/test/base/testing_profile.h" |
+#include "content/public/browser/plugin_service.h" |
+ |
+namespace extensions { |
+ |
+class ExtensionGarbageCollectorUnitTest : public ExtensionServiceTestBase { |
+ protected: |
+ void InitPluginService() { |
+#if defined(ENABLE_PLUGINS) |
+ content::PluginService::GetInstance()->Init(); |
+#endif |
+ } |
+ |
+ // A delayed task to call GarbageCollectExtensions is posted by |
+ // ExtensionGarbageCollector's constructor. But, as the test won't wait for |
+ // the delayed task to be called, we have to call it manually instead. |
+ void GarbageCollectExtensions() { |
+ service_->garbage_collector()->GarbageCollectExtensionsForTest(); |
+ // Wait for GarbageCollectExtensions task to complete. |
+ base::RunLoop().RunUntilIdle(); |
+ } |
+}; |
+ |
+// Test that partially deleted extensions are cleaned up during startup |
+// Test loading bad extensions from the profile directory. |
+// Note: Was "ExtensionServiceTest.CleanupOnStartup" in a past life. |
Yoyo Zhou
2014/03/26 01:54:12
You don't need these historical footnotes.
Devlin
2014/03/26 23:56:32
Done.
|
+TEST_F(ExtensionGarbageCollectorUnitTest, CleanupOnStartup) { |
+ const std::string kExtensionId = "behllobkkfkfnphdnhnkndlbkcpglgmj"; |
+ |
+ InitPluginService(); |
+ InitializeGoodInstalledExtensionService(); |
+ |
+ // Simulate that one of them got partially deleted by clearing its pref. |
+ { |
+ DictionaryPrefUpdate update(profile_->GetPrefs(), "extensions.settings"); |
+ base::DictionaryValue* dict = update.Get(); |
+ ASSERT_TRUE(dict != NULL); |
+ dict->Remove(kExtensionId, NULL); |
+ } |
+ |
+ service_->Init(); |
+ GarbageCollectExtensions(); |
+ |
+ base::FileEnumerator dirs(extensions_install_dir_, |
+ false, // not recursive |
+ base::FileEnumerator::DIRECTORIES); |
+ size_t count = 0; |
+ while (!dirs.Next().empty()) |
+ count++; |
+ |
+ // We should have only gotten two extensions now. |
+ EXPECT_EQ(2u, count); |
+ |
+ // And extension1 dir should now be toast. |
+ base::FilePath extension_dir = |
+ extensions_install_dir_.AppendASCII(kExtensionId); |
+ ASSERT_FALSE(base::PathExists(extension_dir)); |
+} |
+ |
+// Test that GarbageCollectExtensions deletes the right versions of an |
+// extension. |
+// Note: Was "ExtensionServiceTest.GarbageCollectWithPendingUpdates" in a past |
+// life. |
+TEST_F(ExtensionGarbageCollectorUnitTest, GarbageCollectWithPendingUpdates) { |
+ InitPluginService(); |
+ |
+ base::FilePath source_install_dir = |
+ data_dir_.AppendASCII("pending_updates").AppendASCII("Extensions"); |
+ base::FilePath pref_path = |
+ source_install_dir.DirName().Append(chrome::kPreferencesFilename); |
+ |
+ InitializeInstalledExtensionService(pref_path, source_install_dir); |
+ |
+ // This is the directory that is going to be deleted, so make sure it actually |
+ // is there before the garbage collection. |
+ ASSERT_TRUE(base::PathExists(extensions_install_dir_.AppendASCII( |
+ "hpiknbiabeeppbpihjehijgoemciehgk/3"))); |
+ |
+ GarbageCollectExtensions(); |
+ |
+ // Verify that the pending update for the first extension didn't get |
+ // deleted. |
+ EXPECT_TRUE(base::PathExists(extensions_install_dir_.AppendASCII( |
+ "bjafgdebaacbbbecmhlhpofkepfkgcpa/1.0"))); |
+ EXPECT_TRUE(base::PathExists(extensions_install_dir_.AppendASCII( |
+ "bjafgdebaacbbbecmhlhpofkepfkgcpa/2.0"))); |
+ EXPECT_TRUE(base::PathExists(extensions_install_dir_.AppendASCII( |
+ "hpiknbiabeeppbpihjehijgoemciehgk/2"))); |
+ EXPECT_FALSE(base::PathExists(extensions_install_dir_.AppendASCII( |
+ "hpiknbiabeeppbpihjehijgoemciehgk/3"))); |
+} |
+ |
+// Test that pending updates are properly handled on startup. |
+// Note: This was "ExtensionServiceTest.UpdateOnStartup" in a past life. |
+TEST_F(ExtensionGarbageCollectorUnitTest, UpdateOnStartup) { |
+ InitPluginService(); |
+ |
+ base::FilePath source_install_dir = |
+ data_dir_.AppendASCII("pending_updates").AppendASCII("Extensions"); |
+ base::FilePath pref_path = |
+ source_install_dir.DirName().Append(chrome::kPreferencesFilename); |
+ |
+ InitializeInstalledExtensionService(pref_path, source_install_dir); |
+ |
+ // This is the directory that is going to be deleted, so make sure it actually |
+ // is there before the garbage collection. |
+ ASSERT_TRUE(base::PathExists(extensions_install_dir_.AppendASCII( |
+ "hpiknbiabeeppbpihjehijgoemciehgk/3"))); |
+ |
+ service_->Init(); |
+ GarbageCollectExtensions(); |
+ |
+ // Verify that the pending update for the first extension got installed. |
+ EXPECT_FALSE(base::PathExists(extensions_install_dir_.AppendASCII( |
+ "bjafgdebaacbbbecmhlhpofkepfkgcpa/1.0"))); |
+ EXPECT_TRUE(base::PathExists(extensions_install_dir_.AppendASCII( |
+ "bjafgdebaacbbbecmhlhpofkepfkgcpa/2.0"))); |
+ EXPECT_TRUE(base::PathExists(extensions_install_dir_.AppendASCII( |
+ "hpiknbiabeeppbpihjehijgoemciehgk/2"))); |
+ EXPECT_FALSE(base::PathExists(extensions_install_dir_.AppendASCII( |
+ "hpiknbiabeeppbpihjehijgoemciehgk/3"))); |
+ |
+ // Make sure update information got deleted. |
+ ExtensionPrefs* prefs = ExtensionPrefs::Get(profile_.get()); |
+ EXPECT_FALSE( |
+ prefs->GetDelayedInstallInfo("bjafgdebaacbbbecmhlhpofkepfkgcpa")); |
+} |
+ |
+} // namespace extensions |