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

Side by Side 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 unified diff | Download patch
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "base/files/file_path.h"
6 #include "chrome/browser/extensions/install_tracker.h"
7 #include "chrome/test/base/testing_profile.h"
8 #include "extensions/browser/extension_registry.h"
9 #include "extensions/common/extension.h"
10 #include "extensions/common/manifest_constants.h"
11 #include "testing/gtest/include/gtest/gtest.h"
12
13 using extensions::Extension;
14 using extensions::ExtensionRegistry;
15 using extensions::InstallTracker;
16 using extensions::InstallObserver;
17
18 namespace {
19
20 // Random extension ids for testing.
21 const char kExtensionId1[] = "oochhailbdickimldhhodijaldpllppf";
22 const char kExtensionId2[] = "ahionppacfhbbmpmlcbkdgcpokfpflji";
23 const char kExtensionId3[] = "ladmcjmmmmgonboiadnaindoekpbljde";
24
25 scoped_refptr<Extension> CreateDummyExtension(const std::string& id) {
26 base::DictionaryValue manifest;
27 manifest.SetString(extensions::manifest_keys::kVersion, "1.0");
28 manifest.SetString(extensions::manifest_keys::kName, "Dummy name");
29
30 std::string error;
31 scoped_refptr<Extension> extension;
32 extension = Extension::Create(
33 base::FilePath(),
34 extensions::Manifest::INTERNAL,
35 manifest,
36 Extension::NO_FLAGS,
37 id,
38 &error);
39 EXPECT_TRUE(extension.get()) << "Error creating extension: " << error;
40 return extension;
41 }
42
43 } // namespace
44
45 class InstallTrackerTest : public testing::Test {
46 public:
47 InstallTrackerTest() {
48 profile_.reset(new TestingProfile());
49 tracker_.reset(new InstallTracker(profile_.get(), NULL));
50 }
51
52 virtual ~InstallTrackerTest() {}
53
54 protected:
55 void VerifyInstallData(const InstallTracker::InstallProgressData& original,
56 const InstallTracker::InstallProgressData& retrieved) {
57 EXPECT_EQ(original.extension_id, retrieved.extension_id);
58 EXPECT_EQ(original.is_ephemeral, retrieved.is_ephemeral);
59 EXPECT_EQ(original.percent_downloaded, retrieved.percent_downloaded);
60 }
61
62 scoped_ptr<TestingProfile> profile_;
63 scoped_ptr<InstallTracker> tracker_;
64 };
65
66 // Verifies that active installs are registered and deregistered correctly.
67 TEST_F(InstallTrackerTest, AddAndRemoveActiveInstalls) {
68 InstallTracker::InstallProgressData install_data1(kExtensionId1);
69 install_data1.percent_downloaded = 76;
70 InstallTracker::InstallProgressData install_data2(kExtensionId2);
71 install_data2.is_ephemeral = true;
72
73 tracker_->AddActiveInstall(install_data1);
74 tracker_->AddActiveInstall(install_data2);
75
76 const InstallTracker::InstallProgressData* retrieved_data1 =
77 tracker_->GetActiveInstall(kExtensionId1);
78 const InstallTracker::InstallProgressData* retrieved_data2 =
79 tracker_->GetActiveInstall(kExtensionId2);
80 const InstallTracker::InstallProgressData* retrieved_data3 =
81 tracker_->GetActiveInstall(kExtensionId3);
82 ASSERT_TRUE(retrieved_data1);
83 ASSERT_TRUE(retrieved_data2);
84 ASSERT_FALSE(retrieved_data3);
85 VerifyInstallData(install_data1, *retrieved_data1);
86 VerifyInstallData(install_data2, *retrieved_data2);
87 retrieved_data1 = NULL;
88 retrieved_data2 = NULL;
89
90 tracker_->RemoveActiveInstall(kExtensionId1);
91 EXPECT_FALSE(tracker_->GetActiveInstall(kExtensionId1));
92 EXPECT_TRUE(tracker_->GetActiveInstall(kExtensionId2));
93 EXPECT_FALSE(tracker_->GetActiveInstall(kExtensionId3));
94 }
95
96 // Verifies that the download progress is updated correctly.
97 TEST_F(InstallTrackerTest, DownloadProgressUpdated) {
98 InstallTracker::InstallProgressData install_data(kExtensionId1);
99 tracker_->AddActiveInstall(install_data);
100
101 const InstallTracker::InstallProgressData* retrieved_data =
102 tracker_->GetActiveInstall(kExtensionId1);
103 ASSERT_TRUE(retrieved_data);
104 EXPECT_EQ(0, retrieved_data->percent_downloaded);
105
106 const int kUpdatedDownloadProgress = 23;
107 tracker_->OnDownloadProgress(kExtensionId1, kUpdatedDownloadProgress);
108
109 retrieved_data = tracker_->GetActiveInstall(kExtensionId1);
110 ASSERT_TRUE(retrieved_data);
111 EXPECT_EQ(kUpdatedDownloadProgress, retrieved_data->percent_downloaded);
112 }
113
114 // Verifies that OnBeginExtensionInstall() registers an active install and
115 // OnInstallFailure() removes an active install.
116 TEST_F(InstallTrackerTest, ExtensionInstallFailure) {
117 InstallObserver::ExtensionInstallParams install_params(
118 kExtensionId1, std::string(), gfx::ImageSkia(), false, false);
119 install_params.is_ephemeral = true;
120 tracker_->OnBeginExtensionInstall(install_params);
121
122 const InstallTracker::InstallProgressData* retrieved_data =
123 tracker_->GetActiveInstall(kExtensionId1);
124 ASSERT_TRUE(retrieved_data);
125 EXPECT_EQ(0, retrieved_data->percent_downloaded);
126 EXPECT_EQ(install_params.extension_id, retrieved_data->extension_id);
127 EXPECT_EQ(install_params.is_ephemeral, retrieved_data->is_ephemeral);
128 retrieved_data = NULL;
129
130 tracker_->OnInstallFailure(kExtensionId1);
131 EXPECT_FALSE(tracker_->GetActiveInstall(kExtensionId1));
132 }
133
134 // Verifies that OnExtensionInstalled() notification removes an active install.
135 TEST_F(InstallTrackerTest, ExtensionInstalledEvent) {
136 InstallObserver::ExtensionInstallParams install_params(
137 kExtensionId1, std::string(), gfx::ImageSkia(), false, false);
138 tracker_->OnBeginExtensionInstall(install_params);
139
140 const InstallTracker::InstallProgressData* retrieved_data =
141 tracker_->GetActiveInstall(kExtensionId1);
142 ASSERT_TRUE(retrieved_data);
143 EXPECT_EQ(0, retrieved_data->percent_downloaded);
144 EXPECT_EQ(install_params.extension_id, retrieved_data->extension_id);
145 EXPECT_EQ(install_params.is_ephemeral, retrieved_data->is_ephemeral);
146 retrieved_data = NULL;
147
148 // Simulate an extension install.
149 scoped_refptr<Extension> extension = CreateDummyExtension(kExtensionId1);
150 ASSERT_TRUE(extension.get());
151 ExtensionRegistry* registry = ExtensionRegistry::Get(profile_.get());
152 ASSERT_TRUE(registry);
153 registry->AddEnabled(extension);
154 registry->TriggerOnInstalled(extension.get());
155
156 EXPECT_FALSE(tracker_->GetActiveInstall(kExtensionId1));
157 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698