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

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

Issue 389613006: Prevent duplicate concurrent installs of the same extension (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 5 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/install_tracker_unittest.cc
diff --git a/chrome/browser/extensions/install_tracker_unittest.cc b/chrome/browser/extensions/install_tracker_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..9f71f7ea313185edd0cd1b07604941f71f78dc58
--- /dev/null
+++ b/chrome/browser/extensions/install_tracker_unittest.cc
@@ -0,0 +1,157 @@
+// 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/files/file_path.h"
+#include "chrome/browser/extensions/install_tracker.h"
+#include "chrome/test/base/testing_profile.h"
+#include "extensions/browser/extension_registry.h"
+#include "extensions/common/extension.h"
+#include "extensions/common/manifest_constants.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using extensions::Extension;
+using extensions::ExtensionRegistry;
+using extensions::InstallTracker;
+using extensions::InstallObserver;
+
+namespace {
+
+// Random extension ids for testing.
+const char kExtensionId1[] = "oochhailbdickimldhhodijaldpllppf";
+const char kExtensionId2[] = "ahionppacfhbbmpmlcbkdgcpokfpflji";
+const char kExtensionId3[] = "ladmcjmmmmgonboiadnaindoekpbljde";
+
+scoped_refptr<Extension> CreateDummyExtension(const std::string& id) {
+ base::DictionaryValue manifest;
+ manifest.SetString(extensions::manifest_keys::kVersion, "1.0");
+ manifest.SetString(extensions::manifest_keys::kName, "Dummy name");
+
+ std::string error;
+ scoped_refptr<Extension> extension;
+ extension = Extension::Create(
+ base::FilePath(),
+ extensions::Manifest::INTERNAL,
+ manifest,
+ Extension::NO_FLAGS,
+ id,
+ &error);
+ EXPECT_TRUE(extension.get()) << "Error creating extension: " << error;
+ return extension;
+}
+
+} // namespace
+
+class InstallTrackerTest : public testing::Test {
+ public:
+ InstallTrackerTest() {
+ profile_.reset(new TestingProfile());
+ tracker_.reset(new InstallTracker(profile_.get(), NULL));
+ }
+
+ virtual ~InstallTrackerTest() {}
+
+ protected:
+ void VerifyInstallData(const InstallTracker::InstallProgressData& original,
+ const InstallTracker::InstallProgressData& retrieved) {
+ EXPECT_EQ(original.extension_id, retrieved.extension_id);
+ EXPECT_EQ(original.is_ephemeral, retrieved.is_ephemeral);
+ EXPECT_EQ(original.percent_downloaded, retrieved.percent_downloaded);
+ }
+
+ scoped_ptr<TestingProfile> profile_;
+ scoped_ptr<InstallTracker> tracker_;
+};
+
+// Verifies that active installs are registered and deregistered correctly.
+TEST_F(InstallTrackerTest, AddAndRemoveActiveInstalls) {
+ InstallTracker::InstallProgressData install_data1(kExtensionId1);
+ install_data1.percent_downloaded = 76;
+ InstallTracker::InstallProgressData install_data2(kExtensionId2);
+ install_data2.is_ephemeral = true;
+
+ tracker_->AddActiveInstall(install_data1);
+ tracker_->AddActiveInstall(install_data2);
+
+ const InstallTracker::InstallProgressData* retrieved_data1 =
+ tracker_->GetActiveInstall(kExtensionId1);
+ const InstallTracker::InstallProgressData* retrieved_data2 =
+ tracker_->GetActiveInstall(kExtensionId2);
+ const InstallTracker::InstallProgressData* retrieved_data3 =
+ tracker_->GetActiveInstall(kExtensionId3);
+ ASSERT_TRUE(retrieved_data1);
+ ASSERT_TRUE(retrieved_data2);
+ ASSERT_FALSE(retrieved_data3);
+ VerifyInstallData(install_data1, *retrieved_data1);
+ VerifyInstallData(install_data2, *retrieved_data2);
+ retrieved_data1 = NULL;
+ retrieved_data2 = NULL;
+
+ tracker_->RemoveActiveInstall(kExtensionId1);
+ EXPECT_FALSE(tracker_->GetActiveInstall(kExtensionId1));
+ EXPECT_TRUE(tracker_->GetActiveInstall(kExtensionId2));
+ EXPECT_FALSE(tracker_->GetActiveInstall(kExtensionId3));
+}
+
+// Verifies that the download progress is updated correctly.
+TEST_F(InstallTrackerTest, DownloadProgressUpdated) {
+ InstallTracker::InstallProgressData install_data(kExtensionId1);
+ tracker_->AddActiveInstall(install_data);
+
+ const InstallTracker::InstallProgressData* retrieved_data =
+ tracker_->GetActiveInstall(kExtensionId1);
+ ASSERT_TRUE(retrieved_data);
+ EXPECT_EQ(0, retrieved_data->percent_downloaded);
+
+ const int kUpdatedDownloadProgress = 23;
+ tracker_->OnDownloadProgress(kExtensionId1, kUpdatedDownloadProgress);
+
+ retrieved_data = tracker_->GetActiveInstall(kExtensionId1);
+ ASSERT_TRUE(retrieved_data);
+ EXPECT_EQ(kUpdatedDownloadProgress, retrieved_data->percent_downloaded);
+}
+
+// Verifies that OnBeginExtensionInstall() registers an active install and
+// OnInstallFailure() removes an active install.
+TEST_F(InstallTrackerTest, ExtensionInstallFailure) {
+ InstallObserver::ExtensionInstallParams install_params(
+ kExtensionId1, std::string(), gfx::ImageSkia(), false, false);
+ install_params.is_ephemeral = true;
+ tracker_->OnBeginExtensionInstall(install_params);
+
+ const InstallTracker::InstallProgressData* retrieved_data =
+ tracker_->GetActiveInstall(kExtensionId1);
+ ASSERT_TRUE(retrieved_data);
+ EXPECT_EQ(0, retrieved_data->percent_downloaded);
+ EXPECT_EQ(install_params.extension_id, retrieved_data->extension_id);
+ EXPECT_EQ(install_params.is_ephemeral, retrieved_data->is_ephemeral);
+ retrieved_data = NULL;
+
+ tracker_->OnInstallFailure(kExtensionId1);
+ EXPECT_FALSE(tracker_->GetActiveInstall(kExtensionId1));
+}
+
+// Verifies that OnExtensionInstalled() notification removes an active install.
+TEST_F(InstallTrackerTest, ExtensionInstalledEvent) {
+ InstallObserver::ExtensionInstallParams install_params(
+ kExtensionId1, std::string(), gfx::ImageSkia(), false, false);
+ tracker_->OnBeginExtensionInstall(install_params);
+
+ const InstallTracker::InstallProgressData* retrieved_data =
+ tracker_->GetActiveInstall(kExtensionId1);
+ ASSERT_TRUE(retrieved_data);
+ EXPECT_EQ(0, retrieved_data->percent_downloaded);
+ EXPECT_EQ(install_params.extension_id, retrieved_data->extension_id);
+ EXPECT_EQ(install_params.is_ephemeral, retrieved_data->is_ephemeral);
+ retrieved_data = NULL;
+
+ // Simulate an extension install.
+ scoped_refptr<Extension> extension = CreateDummyExtension(kExtensionId1);
+ ASSERT_TRUE(extension.get());
+ ExtensionRegistry* registry = ExtensionRegistry::Get(profile_.get());
+ ASSERT_TRUE(registry);
+ registry->AddEnabled(extension);
+ registry->TriggerOnInstalled(extension.get());
+
+ EXPECT_FALSE(tracker_->GetActiveInstall(kExtensionId1));
+}

Powered by Google App Engine
This is Rietveld 408576698