OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "base/file_util.h" | 5 #include "base/file_util.h" |
6 #include "base/path_service.h" | 6 #include "base/path_service.h" |
7 #include "base/ref_counted.h" | 7 #include "base/ref_counted.h" |
8 #include "base/scoped_temp_dir.h" | 8 #include "base/scoped_temp_dir.h" |
9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
10 #include "chrome/browser/extensions/sandboxed_extension_unpacker.h" | 10 #include "chrome/browser/extensions/sandboxed_extension_unpacker.h" |
11 #include "chrome/common/chrome_paths.h" | 11 #include "chrome/common/chrome_paths.h" |
12 #include "chrome/common/extensions/extension.h" | 12 #include "chrome/common/extensions/extension.h" |
13 #include "chrome/common/extensions/extension_constants.h" | 13 #include "chrome/common/extensions/extension_constants.h" |
14 #include "chrome/common/extensions/extension_unpacker.h" | 14 #include "chrome/common/extensions/extension_unpacker.h" |
15 #include "testing/gmock/include/gmock/gmock.h" | 15 #include "testing/gmock/include/gmock/gmock.h" |
16 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
17 #include "third_party/skia/include/core/SkBitmap.h" | 17 #include "third_party/skia/include/core/SkBitmap.h" |
18 | 18 |
19 namespace errors = extension_manifest_errors; | 19 namespace errors = extension_manifest_errors; |
20 namespace keys = extension_manifest_keys; | 20 namespace keys = extension_manifest_keys; |
21 | 21 |
22 using testing::_; | 22 using testing::_; |
23 using testing::Invoke; | 23 using testing::Invoke; |
24 | 24 |
| 25 namespace { |
| 26 |
25 void OnUnpackSuccess(const FilePath& temp_dir, | 27 void OnUnpackSuccess(const FilePath& temp_dir, |
26 const FilePath& extension_root, | 28 const FilePath& extension_root, |
27 const Extension* extension) { | 29 const Extension* extension) { |
28 // Don't delete temp_dir here, we need to do some post op checking. | 30 // Don't delete temp_dir here, we need to do some post op checking. |
29 } | 31 } |
30 | 32 |
| 33 } // namespace |
| 34 |
31 class MockSandboxedExtensionUnpackerClient | 35 class MockSandboxedExtensionUnpackerClient |
32 : public SandboxedExtensionUnpackerClient { | 36 : public SandboxedExtensionUnpackerClient { |
33 public: | 37 public: |
34 virtual ~MockSandboxedExtensionUnpackerClient() {} | 38 virtual ~MockSandboxedExtensionUnpackerClient() {} |
35 | 39 |
36 MOCK_METHOD3(OnUnpackSuccess, | 40 MOCK_METHOD3(OnUnpackSuccess, |
37 void(const FilePath& temp_dir, | 41 void(const FilePath& temp_dir, |
38 const FilePath& extension_root, | 42 const FilePath& extension_root, |
39 const Extension* extension)); | 43 const Extension* extension)); |
40 | 44 |
(...skipping 30 matching lines...) Expand all Loading... |
71 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &original_path)); | 75 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &original_path)); |
72 original_path = original_path.AppendASCII("extensions") | 76 original_path = original_path.AppendASCII("extensions") |
73 .AppendASCII("unpacker") | 77 .AppendASCII("unpacker") |
74 .AppendASCII(crx_name); | 78 .AppendASCII(crx_name); |
75 ASSERT_TRUE(file_util::PathExists(original_path)) << original_path.value(); | 79 ASSERT_TRUE(file_util::PathExists(original_path)) << original_path.value(); |
76 | 80 |
77 // Try bots won't let us write into DIR_TEST_DATA, so we have to create | 81 // Try bots won't let us write into DIR_TEST_DATA, so we have to create |
78 // a temp folder to play in. | 82 // a temp folder to play in. |
79 ASSERT_TRUE(PathService::Get(base::DIR_TEMP, &install_dir_)); | 83 ASSERT_TRUE(PathService::Get(base::DIR_TEMP, &install_dir_)); |
80 install_dir_ = | 84 install_dir_ = |
81 install_dir_.AppendASCII("sandboxed_extension_unpacker_test"); | 85 install_dir_.AppendASCII("sandboxed_extension_unpacker_test"); |
82 file_util::Delete(install_dir_, true); | 86 file_util::Delete(install_dir_, true); |
83 file_util::CreateDirectory(install_dir_); | 87 file_util::CreateDirectory(install_dir_); |
84 | 88 |
85 FilePath crx_path = install_dir_.AppendASCII(crx_name); | 89 FilePath crx_path = install_dir_.AppendASCII(crx_name); |
86 ASSERT_TRUE(file_util::CopyFile(original_path, crx_path)) << | 90 ASSERT_TRUE(file_util::CopyFile(original_path, crx_path)) << |
87 "Original path: " << original_path.value() << | 91 "Original path: " << original_path.value() << |
88 ", Crx path: " << crx_path.value(); | 92 ", Crx path: " << crx_path.value(); |
89 | 93 |
90 unpacker_.reset(new ExtensionUnpacker(crx_path)); | 94 unpacker_.reset(new ExtensionUnpacker(crx_path)); |
91 | 95 |
92 | |
93 // Build a temp area where the extension will be unpacked. | 96 // Build a temp area where the extension will be unpacked. |
94 ASSERT_TRUE(PathService::Get(base::DIR_TEMP, &temp_dir_)); | 97 ASSERT_TRUE(PathService::Get(base::DIR_TEMP, &temp_dir_)); |
95 temp_dir_ = temp_dir_.AppendASCII("sandboxed_extension_unpacker_test_Temp"); | 98 temp_dir_ = temp_dir_.AppendASCII("sandboxed_extension_unpacker_test_Temp"); |
96 file_util::CreateDirectory(temp_dir_); | 99 ASSERT_TRUE(file_util::CreateDirectory(temp_dir_)); |
97 | 100 |
98 sandboxed_unpacker_ = | 101 sandboxed_unpacker_ = |
99 new SandboxedExtensionUnpacker(crx_path, temp_dir_, NULL, client_); | 102 new SandboxedExtensionUnpacker(crx_path, NULL, client_); |
| 103 |
100 // Hack since SandboxedExtensionUnpacker gets its background thread id from | 104 // Hack since SandboxedExtensionUnpacker gets its background thread id from |
101 // the Start call, but we don't call it here. | 105 // the Start call, but we don't call it here. |
102 sandboxed_unpacker_->thread_identifier_ = BrowserThread::FILE; | 106 sandboxed_unpacker_->thread_identifier_ = BrowserThread::FILE; |
103 EXPECT_TRUE(PrepareUnpackerEnv()); | 107 EXPECT_TRUE(PrepareUnpackerEnv()); |
104 } | 108 } |
105 | 109 |
106 bool PrepareUnpackerEnv() { | 110 bool PrepareUnpackerEnv() { |
107 sandboxed_unpacker_->extension_root_ = | 111 sandboxed_unpacker_->extension_root_ = |
108 install_dir_.AppendASCII(extension_filenames::kTempExtensionName); | 112 install_dir_.AppendASCII(extension_filenames::kTempExtensionName); |
109 | 113 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
152 FilePath temp_dir_; | 156 FilePath temp_dir_; |
153 MockSandboxedExtensionUnpackerClient* client_; | 157 MockSandboxedExtensionUnpackerClient* client_; |
154 scoped_ptr<ExtensionUnpacker> unpacker_; | 158 scoped_ptr<ExtensionUnpacker> unpacker_; |
155 scoped_refptr<SandboxedExtensionUnpacker> sandboxed_unpacker_; | 159 scoped_refptr<SandboxedExtensionUnpacker> sandboxed_unpacker_; |
156 MessageLoop loop_; | 160 MessageLoop loop_; |
157 scoped_ptr<BrowserThread> file_thread_; | 161 scoped_ptr<BrowserThread> file_thread_; |
158 }; | 162 }; |
159 | 163 |
160 TEST_F(SandboxedExtensionUnpackerTest, NoCatalogsSuccess) { | 164 TEST_F(SandboxedExtensionUnpackerTest, NoCatalogsSuccess) { |
161 EXPECT_CALL(*client_, OnUnpackSuccess(_, _, _)); | 165 EXPECT_CALL(*client_, OnUnpackSuccess(_, _, _)); |
| 166 EXPECT_CALL(*client_, OnUnpackFailure(_)).Times(0); |
162 | 167 |
163 SetupUnpacker("no_l10n.crx"); | 168 SetupUnpacker("no_l10n.crx"); |
164 ASSERT_TRUE(unpacker_->Run()); | 169 ASSERT_TRUE(unpacker_->Run()); |
165 ASSERT_TRUE(unpacker_->DumpImagesToFile()); | 170 ASSERT_TRUE(unpacker_->DumpImagesToFile()); |
166 ASSERT_TRUE(unpacker_->DumpMessageCatalogsToFile()); | 171 ASSERT_TRUE(unpacker_->DumpMessageCatalogsToFile()); |
167 | 172 |
168 // Check that there is no _locales folder. | 173 // Check that there is no _locales folder. |
169 FilePath install_path = | 174 FilePath install_path = |
170 GetInstallPath().Append(Extension::kLocaleFolder); | 175 GetInstallPath().Append(Extension::kLocaleFolder); |
171 EXPECT_FALSE(file_util::PathExists(install_path)); | 176 EXPECT_FALSE(file_util::PathExists(install_path)); |
172 | 177 |
173 OnUnpackSucceeded(); | 178 OnUnpackSucceeded(); |
174 | 179 |
175 // Check that there still is no _locales folder. | 180 // Check that there still is no _locales folder. |
176 EXPECT_FALSE(file_util::PathExists(install_path)); | 181 EXPECT_FALSE(file_util::PathExists(install_path)); |
177 | 182 |
178 ASSERT_TRUE(TempFilesRemoved()); | 183 ASSERT_TRUE(TempFilesRemoved()); |
179 } | 184 } |
180 | 185 |
181 TEST_F(SandboxedExtensionUnpackerTest, WithCatalogsSuccess) { | 186 TEST_F(SandboxedExtensionUnpackerTest, WithCatalogsSuccess) { |
182 EXPECT_CALL(*client_, OnUnpackSuccess(_, _, _)); | 187 EXPECT_CALL(*client_, OnUnpackSuccess(_, _, _)); |
| 188 EXPECT_CALL(*client_, OnUnpackFailure(_)).Times(0); |
183 | 189 |
184 SetupUnpacker("good_l10n.crx"); | 190 SetupUnpacker("good_l10n.crx"); |
185 ASSERT_TRUE(unpacker_->Run()); | 191 ASSERT_TRUE(unpacker_->Run()); |
186 ASSERT_TRUE(unpacker_->DumpImagesToFile()); | 192 ASSERT_TRUE(unpacker_->DumpImagesToFile()); |
187 ASSERT_TRUE(unpacker_->DumpMessageCatalogsToFile()); | 193 ASSERT_TRUE(unpacker_->DumpMessageCatalogsToFile()); |
188 | 194 |
189 // Set timestamp on _locales/en_US/messages.json into the past. | 195 // Set timestamp on _locales/en_US/messages.json into the past. |
190 FilePath messages_file; | 196 FilePath messages_file; |
191 messages_file = GetInstallPath().Append(Extension::kLocaleFolder) | 197 messages_file = GetInstallPath().Append(Extension::kLocaleFolder) |
192 .AppendASCII("en_US") | 198 .AppendASCII("en_US") |
193 .Append(Extension::kMessagesFilename); | 199 .Append(Extension::kMessagesFilename); |
194 base::PlatformFileInfo old_info; | 200 base::PlatformFileInfo old_info; |
195 EXPECT_TRUE(file_util::GetFileInfo(messages_file, &old_info)); | 201 EXPECT_TRUE(file_util::GetFileInfo(messages_file, &old_info)); |
196 base::Time old_time = | 202 base::Time old_time = |
197 old_info.last_modified - base::TimeDelta::FromSeconds(2); | 203 old_info.last_modified - base::TimeDelta::FromSeconds(2); |
198 EXPECT_TRUE(file_util::SetLastModifiedTime(messages_file, old_time)); | 204 EXPECT_TRUE(file_util::SetLastModifiedTime(messages_file, old_time)); |
199 // Refresh old_info, just to be sure. | 205 // Refresh old_info, just to be sure. |
200 EXPECT_TRUE(file_util::GetFileInfo(messages_file, &old_info)); | 206 EXPECT_TRUE(file_util::GetFileInfo(messages_file, &old_info)); |
201 | 207 |
202 OnUnpackSucceeded(); | 208 OnUnpackSucceeded(); |
203 | 209 |
204 // Check that there is newer _locales/en_US/messages.json file. | 210 // Check that there is newer _locales/en_US/messages.json file. |
205 base::PlatformFileInfo new_info; | 211 base::PlatformFileInfo new_info; |
206 EXPECT_TRUE(file_util::GetFileInfo(messages_file, &new_info)); | 212 EXPECT_TRUE(file_util::GetFileInfo(messages_file, &new_info)); |
207 | 213 |
208 EXPECT_TRUE(new_info.last_modified > old_info.last_modified); | 214 EXPECT_TRUE(new_info.last_modified > old_info.last_modified); |
209 | 215 |
210 ASSERT_TRUE(TempFilesRemoved()); | 216 ASSERT_TRUE(TempFilesRemoved()); |
211 } | 217 } |
OLD | NEW |