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

Unified Diff: chrome/browser/extensions/default_apps_provider_unittest.cc

Issue 8245018: Remove race condition when installing default apps into a new profile. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Addressing review comments Created 9 years, 2 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/default_apps_provider_unittest.cc
===================================================================
--- chrome/browser/extensions/default_apps_provider_unittest.cc (revision 0)
+++ chrome/browser/extensions/default_apps_provider_unittest.cc (revision 0)
@@ -0,0 +1,193 @@
+// Copyright (c) 2011 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 <string>
+
+#include "base/logging.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/message_loop.h"
+#include "base/values.h"
+#include "base/version.h"
+#include "chrome/browser/extensions/crx_installer.h"
+#include "chrome/browser/extensions/default_apps_provider.h"
+#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/external_extension_provider_interface.h"
+#include "chrome/browser/extensions/external_policy_extension_loader.h"
+#include "chrome/common/chrome_notification_types.h"
+#include "chrome/common/extensions/extension.h"
+#include "chrome/common/pref_names.h"
+#include "chrome/test/base/testing_pref_service.h"
+#include "chrome/test/base/testing_profile.h"
+#include "content/browser/browser_thread.h"
+#include "content/common/notification_service.h"
+#include "content/public/browser/notification_details.h"
+#include "content/public/browser/notification_source.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+class MockExternalExtensionLoader : public ExternalExtensionLoader {
+ public:
+ MockExternalExtensionLoader() {}
+
+ void SetPrefs(const base::DictionaryValue& prefs) {
+ prefs_.reset(prefs.DeepCopy());
+ }
+
+ private:
+ virtual void StartLoading() {
+ // No actual loading to be done, simply use the prefs given.
+ LoadFinished();
+ }
+
+ virtual const FilePath GetBaseCrxFilePath() {
+ return FilePath(FILE_PATH_LITERAL("/tmp"));
+ }
+
+ DISALLOW_COPY_AND_ASSIGN(MockExternalExtensionLoader);
+};
+
+class MockExternalPolicyExtensionProviderVisitor
+ : public ExternalExtensionProviderInterface::VisitorInterface {
+ public:
+ MockExternalPolicyExtensionProviderVisitor() {
+ profile_.reset(new TestingProfile);
+ profile_->CreateExtensionService(CommandLine::ForCurrentProcess(),
+ FilePath(FILE_PATH_LITERAL("/tmp")), false);
+
+ // The provider owns the loader.
+ loader_ = new MockExternalExtensionLoader();
+ provider_.reset(new DefaultAppsProvider(this, loader_, profile_.get()));
+ }
+
+ virtual void OnExternalExtensionFileFound(const std::string& id,
+ const Version* version,
+ const FilePath& path,
+ Extension::Location unused) {
+ }
+
+ virtual void OnExternalExtensionUpdateUrlFound(
+ const std::string& id, const GURL& update_url,
+ Extension::Location location) {
+ ADD_FAILURE() << "There should be no external extensions from URLs.";
+ }
+
+ virtual void OnExternalProviderReady() {
+ EXPECT_TRUE(provider_->IsReady());
+ }
+
+ TestingProfile* profile() const { return profile_.get(); }
+ DefaultAppsProvider* provider() const { return provider_.get(); }
+ MockExternalExtensionLoader* loader() const { return loader_; }
+
+ private:
+ scoped_ptr<TestingProfile> profile_;
+ scoped_ptr<DefaultAppsProvider> provider_;
+ MockExternalExtensionLoader* loader_;
+
+ DISALLOW_COPY_AND_ASSIGN(MockExternalPolicyExtensionProviderVisitor);
+};
+
+class DefaultAppsProviderTest : public testing::Test {
+ public:
+ DefaultAppsProviderTest()
+ : loop_(MessageLoop::TYPE_IO),
+ ui_thread_(BrowserThread::UI, &loop_) {
+ }
+
+ virtual ~DefaultAppsProviderTest() {}
+
+ MockExternalPolicyExtensionProviderVisitor* visitor() {
+ return &visitor_;
+ }
+
+ int GetProviderState();
+
+ void AddExtensionToDictionary(base::DictionaryValue* prefs,
+ const char* id,
+ const char* name,
+ const char* version);
+
+ private:
+ // We need these to satisfy BrowserThread::CurrentlyOn(BrowserThread::UI)
+ // checks in ExternalExtensionProviderImpl.
+ MessageLoop loop_;
+ BrowserThread ui_thread_;
+ MockExternalPolicyExtensionProviderVisitor visitor_;
+};
+
+int DefaultAppsProviderTest::GetProviderState() {
+ return visitor()->profile()->GetPrefs()->GetInteger(
+ prefs::kDefaultAppsInstallState);
+}
+
+void DefaultAppsProviderTest::AddExtensionToDictionary(
+ base::DictionaryValue* prefs,
+ const char* id,
+ const char* name,
+ const char* version) {
+ scoped_ptr<base::DictionaryValue> extension(new base::DictionaryValue);
+
+ extension->SetString("external_crx", name);
+ extension->SetString("external_version", version);
+
+ prefs->Set(id, extension.release());
+}
+
+} // anonymous namespace
+
+TEST_F(DefaultAppsProviderTest, NoExtensions) {
+ // Setup the loader to provide nothing.
+ base::DictionaryValue prefs;
+ visitor()->loader()->SetPrefs(prefs);
+
+ visitor()->provider()->VisitRegisteredExtension();
+
+ EXPECT_EQ(0u, visitor()->provider()->invalid_extensions().size());
+ EXPECT_EQ(0u, visitor()->provider()->install_error_extensions().size());
+ EXPECT_EQ(DefaultAppsProvider::kInstallDone, GetProviderState());
+}
+
+TEST_F(DefaultAppsProviderTest, InvalidExtension) {
+ // Setup the loader to one invalid extension.
+ base::DictionaryValue prefs;
+ prefs.SetInteger("bad_id", 0);
+ visitor()->loader()->SetPrefs(prefs);
+
+ // Run the provider.
+ visitor()->provider()->VisitRegisteredExtension();
+
+ // Make sure state is "done".
+ EXPECT_EQ(1u, visitor()->provider()->invalid_extensions().size());
+ EXPECT_EQ(0u, visitor()->provider()->install_error_extensions().size());
+ EXPECT_EQ(DefaultAppsProvider::kInstallDone, GetProviderState());
+}
+
+TEST_F(DefaultAppsProviderTest, InstallErrorExtension) {
+ // Setup the loader to one valid extension that fails to load.
+ base::DictionaryValue prefs;
+ AddExtensionToDictionary(&prefs, "blpcfgokakmgnkcojhhkbfbldkacnbeo",
+ "dummy.crx", "1.0.0.0");
+ visitor()->loader()->SetPrefs(prefs);
+
+ // Run the provider.
+ visitor()->provider()->VisitRegisteredExtension();
+
+ EXPECT_EQ(0u, visitor()->provider()->invalid_extensions().size());
+ EXPECT_EQ(0u, visitor()->provider()->install_error_extensions().size());
+ EXPECT_EQ(DefaultAppsProvider::kInstalling, GetProviderState());
+
+ // Pretend the load failed.
+ ExtensionService* service = visitor()->profile()->GetExtensionService();
+ scoped_refptr<CrxInstaller> crx_installer(service->MakeCrxInstaller(NULL));
+ crx_installer->set_expected_id("blpcfgokakmgnkcojhhkbfbldkacnbeo");
+ visitor()->provider()->Observe(
+ chrome::NOTIFICATION_EXTENSION_INSTALL_ERROR,
+ content::Source<CrxInstaller>(crx_installer.get()),
+ NotificationService::NoDetails());
+
+ EXPECT_EQ(0u, visitor()->provider()->invalid_extensions().size());
+ EXPECT_EQ(1u, visitor()->provider()->install_error_extensions().size());
+ EXPECT_EQ(DefaultAppsProvider::kInstallDone, GetProviderState());
+}
Property changes on: chrome\browser\extensions\default_apps_provider_unittest.cc
___________________________________________________________________
Added: svn:eol-style
+ LF

Powered by Google App Engine
This is Rietveld 408576698