OLD | NEW |
1 // Copyright (c) 2011 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 "chrome/installer/util/move_tree_work_item.h" |
| 6 |
5 #include <windows.h> | 7 #include <windows.h> |
6 | 8 |
7 #include <fstream> | 9 #include <fstream> |
| 10 #include <memory> |
8 | 11 |
9 #include "base/base_paths.h" | 12 #include "base/base_paths.h" |
10 #include "base/files/file_util.h" | 13 #include "base/files/file_util.h" |
11 #include "base/files/memory_mapped_file.h" | 14 #include "base/files/memory_mapped_file.h" |
12 #include "base/macros.h" | 15 #include "base/macros.h" |
13 #include "base/memory/scoped_ptr.h" | |
14 #include "base/strings/string_util.h" | 16 #include "base/strings/string_util.h" |
15 #include "base/strings/utf_string_conversions.h" | 17 #include "base/strings/utf_string_conversions.h" |
16 #include "chrome/installer/util/installer_util_test_common.h" | 18 #include "chrome/installer/util/installer_util_test_common.h" |
17 #include "chrome/installer/util/move_tree_work_item.h" | |
18 #include "chrome/installer/util/work_item.h" | 19 #include "chrome/installer/util/work_item.h" |
19 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
20 | 21 |
21 namespace { | 22 namespace { |
22 class MoveTreeWorkItemTest : public testing::Test { | 23 class MoveTreeWorkItemTest : public testing::Test { |
23 protected: | 24 protected: |
24 void SetUp() override { | 25 void SetUp() override { |
25 ASSERT_TRUE(temp_from_dir_.CreateUniqueTempDir()); | 26 ASSERT_TRUE(temp_from_dir_.CreateUniqueTempDir()); |
26 ASSERT_TRUE(temp_to_dir_.CreateUniqueTempDir()); | 27 ASSERT_TRUE(temp_to_dir_.CreateUniqueTempDir()); |
27 } | 28 } |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 base::FilePath to_dir(temp_from_dir_.path()); | 79 base::FilePath to_dir(temp_from_dir_.path()); |
79 to_dir = to_dir.AppendASCII("To_Dir"); | 80 to_dir = to_dir.AppendASCII("To_Dir"); |
80 ASSERT_FALSE(base::PathExists(to_dir)); | 81 ASSERT_FALSE(base::PathExists(to_dir)); |
81 | 82 |
82 base::FilePath to_file(to_dir); | 83 base::FilePath to_file(to_dir); |
83 to_file = to_file.AppendASCII("From_Dir2"); | 84 to_file = to_file.AppendASCII("From_Dir2"); |
84 to_file = to_file.AppendASCII("From_File"); | 85 to_file = to_file.AppendASCII("From_File"); |
85 ASSERT_FALSE(base::PathExists(to_file)); | 86 ASSERT_FALSE(base::PathExists(to_file)); |
86 | 87 |
87 // test Do() | 88 // test Do() |
88 scoped_ptr<MoveTreeWorkItem> work_item( | 89 std::unique_ptr<MoveTreeWorkItem> work_item(WorkItem::CreateMoveTreeWorkItem( |
89 WorkItem::CreateMoveTreeWorkItem(from_dir1, | 90 from_dir1, to_dir, temp_to_dir_.path(), WorkItem::ALWAYS_MOVE)); |
90 to_dir, | |
91 temp_to_dir_.path(), | |
92 WorkItem::ALWAYS_MOVE)); | |
93 EXPECT_TRUE(work_item->Do()); | 91 EXPECT_TRUE(work_item->Do()); |
94 | 92 |
95 EXPECT_FALSE(base::PathExists(from_dir1)); | 93 EXPECT_FALSE(base::PathExists(from_dir1)); |
96 EXPECT_TRUE(base::PathExists(to_dir)); | 94 EXPECT_TRUE(base::PathExists(to_dir)); |
97 EXPECT_TRUE(base::PathExists(to_file)); | 95 EXPECT_TRUE(base::PathExists(to_file)); |
98 | 96 |
99 // test rollback() | 97 // test rollback() |
100 work_item->Rollback(); | 98 work_item->Rollback(); |
101 | 99 |
102 EXPECT_TRUE(base::PathExists(from_dir1)); | 100 EXPECT_TRUE(base::PathExists(from_dir1)); |
(...skipping 30 matching lines...) Expand all Loading... |
133 orig_to_file = orig_to_file.AppendASCII("To_File"); | 131 orig_to_file = orig_to_file.AppendASCII("To_File"); |
134 CreateTextFile(orig_to_file.value(), kTextContent2); | 132 CreateTextFile(orig_to_file.value(), kTextContent2); |
135 ASSERT_TRUE(base::PathExists(orig_to_file)); | 133 ASSERT_TRUE(base::PathExists(orig_to_file)); |
136 | 134 |
137 base::FilePath new_to_file(to_dir); | 135 base::FilePath new_to_file(to_dir); |
138 new_to_file = new_to_file.AppendASCII("From_Dir2"); | 136 new_to_file = new_to_file.AppendASCII("From_Dir2"); |
139 new_to_file = new_to_file.AppendASCII("From_File"); | 137 new_to_file = new_to_file.AppendASCII("From_File"); |
140 ASSERT_FALSE(base::PathExists(new_to_file)); | 138 ASSERT_FALSE(base::PathExists(new_to_file)); |
141 | 139 |
142 // test Do(), don't check for duplicates. | 140 // test Do(), don't check for duplicates. |
143 scoped_ptr<MoveTreeWorkItem> work_item( | 141 std::unique_ptr<MoveTreeWorkItem> work_item(WorkItem::CreateMoveTreeWorkItem( |
144 WorkItem::CreateMoveTreeWorkItem(from_dir1, | 142 from_dir1, to_dir, temp_to_dir_.path(), WorkItem::ALWAYS_MOVE)); |
145 to_dir, | |
146 temp_to_dir_.path(), | |
147 WorkItem::ALWAYS_MOVE)); | |
148 EXPECT_TRUE(work_item->Do()); | 143 EXPECT_TRUE(work_item->Do()); |
149 | 144 |
150 EXPECT_FALSE(base::PathExists(from_dir1)); | 145 EXPECT_FALSE(base::PathExists(from_dir1)); |
151 EXPECT_TRUE(base::PathExists(to_dir)); | 146 EXPECT_TRUE(base::PathExists(to_dir)); |
152 EXPECT_TRUE(base::PathExists(new_to_file)); | 147 EXPECT_TRUE(base::PathExists(new_to_file)); |
153 EXPECT_FALSE(base::PathExists(orig_to_file)); | 148 EXPECT_FALSE(base::PathExists(orig_to_file)); |
154 | 149 |
155 // test rollback() | 150 // test rollback() |
156 work_item->Rollback(); | 151 work_item->Rollback(); |
157 | 152 |
(...skipping 18 matching lines...) Expand all Loading... |
176 from_file = from_file.AppendASCII("From_File"); | 171 from_file = from_file.AppendASCII("From_File"); |
177 CreateTextFile(from_file.value(), kTextContent1); | 172 CreateTextFile(from_file.value(), kTextContent1); |
178 ASSERT_TRUE(base::PathExists(from_file)); | 173 ASSERT_TRUE(base::PathExists(from_file)); |
179 | 174 |
180 // Generate destination file name | 175 // Generate destination file name |
181 base::FilePath to_file(temp_from_dir_.path()); | 176 base::FilePath to_file(temp_from_dir_.path()); |
182 to_file = to_file.AppendASCII("To_File"); | 177 to_file = to_file.AppendASCII("To_File"); |
183 ASSERT_FALSE(base::PathExists(to_file)); | 178 ASSERT_FALSE(base::PathExists(to_file)); |
184 | 179 |
185 // test Do() | 180 // test Do() |
186 scoped_ptr<MoveTreeWorkItem> work_item( | 181 std::unique_ptr<MoveTreeWorkItem> work_item(WorkItem::CreateMoveTreeWorkItem( |
187 WorkItem::CreateMoveTreeWorkItem(from_file, | 182 from_file, to_file, temp_to_dir_.path(), WorkItem::ALWAYS_MOVE)); |
188 to_file, | |
189 temp_to_dir_.path(), | |
190 WorkItem::ALWAYS_MOVE)); | |
191 EXPECT_TRUE(work_item->Do()); | 183 EXPECT_TRUE(work_item->Do()); |
192 | 184 |
193 EXPECT_TRUE(base::PathExists(from_dir)); | 185 EXPECT_TRUE(base::PathExists(from_dir)); |
194 EXPECT_FALSE(base::PathExists(from_file)); | 186 EXPECT_FALSE(base::PathExists(from_file)); |
195 EXPECT_TRUE(base::PathExists(to_file)); | 187 EXPECT_TRUE(base::PathExists(to_file)); |
196 EXPECT_EQ(0, ReadTextFile(to_file).compare(kTextContent1)); | 188 EXPECT_EQ(0, ReadTextFile(to_file).compare(kTextContent1)); |
197 | 189 |
198 // test rollback() | 190 // test rollback() |
199 work_item->Rollback(); | 191 work_item->Rollback(); |
200 | 192 |
(...skipping 22 matching lines...) Expand all Loading... |
223 to_dir = to_dir.AppendASCII("To_Dir"); | 215 to_dir = to_dir.AppendASCII("To_Dir"); |
224 base::CreateDirectory(to_dir); | 216 base::CreateDirectory(to_dir); |
225 ASSERT_TRUE(base::PathExists(to_dir)); | 217 ASSERT_TRUE(base::PathExists(to_dir)); |
226 | 218 |
227 base::FilePath to_file(to_dir); | 219 base::FilePath to_file(to_dir); |
228 to_file = to_file.AppendASCII("To_File"); | 220 to_file = to_file.AppendASCII("To_File"); |
229 CreateTextFile(to_file.value(), kTextContent2); | 221 CreateTextFile(to_file.value(), kTextContent2); |
230 ASSERT_TRUE(base::PathExists(to_file)); | 222 ASSERT_TRUE(base::PathExists(to_file)); |
231 | 223 |
232 // test Do() | 224 // test Do() |
233 scoped_ptr<MoveTreeWorkItem> work_item( | 225 std::unique_ptr<MoveTreeWorkItem> work_item(WorkItem::CreateMoveTreeWorkItem( |
234 WorkItem::CreateMoveTreeWorkItem(from_file, | 226 from_file, to_dir, temp_to_dir_.path(), WorkItem::ALWAYS_MOVE)); |
235 to_dir, | |
236 temp_to_dir_.path(), | |
237 WorkItem::ALWAYS_MOVE)); | |
238 EXPECT_TRUE(work_item->Do()); | 227 EXPECT_TRUE(work_item->Do()); |
239 | 228 |
240 EXPECT_TRUE(base::PathExists(from_dir)); | 229 EXPECT_TRUE(base::PathExists(from_dir)); |
241 EXPECT_FALSE(base::PathExists(from_file)); | 230 EXPECT_FALSE(base::PathExists(from_file)); |
242 EXPECT_TRUE(base::PathExists(to_dir)); | 231 EXPECT_TRUE(base::PathExists(to_dir)); |
243 EXPECT_FALSE(base::PathExists(to_file)); | 232 EXPECT_FALSE(base::PathExists(to_file)); |
244 EXPECT_EQ(0, ReadTextFile(to_dir).compare(kTextContent1)); | 233 EXPECT_EQ(0, ReadTextFile(to_dir).compare(kTextContent1)); |
245 | 234 |
246 // test rollback() | 235 // test rollback() |
247 work_item->Rollback(); | 236 work_item->Rollback(); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
283 // Run the executable in destination path | 272 // Run the executable in destination path |
284 STARTUPINFOW si = {sizeof(si)}; | 273 STARTUPINFOW si = {sizeof(si)}; |
285 PROCESS_INFORMATION pi = {0}; | 274 PROCESS_INFORMATION pi = {0}; |
286 ASSERT_TRUE(::CreateProcess(NULL, | 275 ASSERT_TRUE(::CreateProcess(NULL, |
287 const_cast<wchar_t*>(to_file.value().c_str()), | 276 const_cast<wchar_t*>(to_file.value().c_str()), |
288 NULL, NULL, FALSE, | 277 NULL, NULL, FALSE, |
289 CREATE_NO_WINDOW | CREATE_SUSPENDED, | 278 CREATE_NO_WINDOW | CREATE_SUSPENDED, |
290 NULL, NULL, &si, &pi)); | 279 NULL, NULL, &si, &pi)); |
291 | 280 |
292 // test Do() | 281 // test Do() |
293 scoped_ptr<MoveTreeWorkItem> work_item( | 282 std::unique_ptr<MoveTreeWorkItem> work_item(WorkItem::CreateMoveTreeWorkItem( |
294 WorkItem::CreateMoveTreeWorkItem(from_file, | 283 from_file, to_file, temp_to_dir_.path(), WorkItem::ALWAYS_MOVE)); |
295 to_file, | |
296 temp_to_dir_.path(), | |
297 WorkItem::ALWAYS_MOVE)); | |
298 EXPECT_TRUE(work_item->Do()); | 284 EXPECT_TRUE(work_item->Do()); |
299 | 285 |
300 EXPECT_TRUE(base::PathExists(from_dir)); | 286 EXPECT_TRUE(base::PathExists(from_dir)); |
301 EXPECT_FALSE(base::PathExists(from_file)); | 287 EXPECT_FALSE(base::PathExists(from_file)); |
302 EXPECT_TRUE(base::PathExists(to_dir)); | 288 EXPECT_TRUE(base::PathExists(to_dir)); |
303 EXPECT_EQ(0, ReadTextFile(to_file).compare(kTextContent1)); | 289 EXPECT_EQ(0, ReadTextFile(to_file).compare(kTextContent1)); |
304 | 290 |
305 // test rollback() | 291 // test rollback() |
306 work_item->Rollback(); | 292 work_item->Rollback(); |
307 | 293 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
346 // Run the executable in source path | 332 // Run the executable in source path |
347 STARTUPINFOW si = {sizeof(si)}; | 333 STARTUPINFOW si = {sizeof(si)}; |
348 PROCESS_INFORMATION pi = {0}; | 334 PROCESS_INFORMATION pi = {0}; |
349 ASSERT_TRUE(::CreateProcess(NULL, | 335 ASSERT_TRUE(::CreateProcess(NULL, |
350 const_cast<wchar_t*>(from_file.value().c_str()), | 336 const_cast<wchar_t*>(from_file.value().c_str()), |
351 NULL, NULL, FALSE, | 337 NULL, NULL, FALSE, |
352 CREATE_NO_WINDOW | CREATE_SUSPENDED, | 338 CREATE_NO_WINDOW | CREATE_SUSPENDED, |
353 NULL, NULL, &si, &pi)); | 339 NULL, NULL, &si, &pi)); |
354 | 340 |
355 // test Do() | 341 // test Do() |
356 scoped_ptr<MoveTreeWorkItem> work_item( | 342 std::unique_ptr<MoveTreeWorkItem> work_item(WorkItem::CreateMoveTreeWorkItem( |
357 WorkItem::CreateMoveTreeWorkItem(from_file, | 343 from_file, to_file, temp_to_dir_.path(), WorkItem::ALWAYS_MOVE)); |
358 to_file, | |
359 temp_to_dir_.path(), | |
360 WorkItem::ALWAYS_MOVE)); | |
361 EXPECT_TRUE(work_item->Do()); | 344 EXPECT_TRUE(work_item->Do()); |
362 | 345 |
363 EXPECT_TRUE(base::PathExists(from_dir)); | 346 EXPECT_TRUE(base::PathExists(from_dir)); |
364 EXPECT_FALSE(base::PathExists(from_file)); | 347 EXPECT_FALSE(base::PathExists(from_file)); |
365 EXPECT_TRUE(base::PathExists(to_dir)); | 348 EXPECT_TRUE(base::PathExists(to_dir)); |
366 EXPECT_TRUE(base::ContentsEqual(exe_full_path, to_file)); | 349 EXPECT_TRUE(base::ContentsEqual(exe_full_path, to_file)); |
367 | 350 |
368 // Close the process and make sure all the conditions after Do() are | 351 // Close the process and make sure all the conditions after Do() are |
369 // still true. | 352 // still true. |
370 TerminateProcess(pi.hProcess, 0); | 353 TerminateProcess(pi.hProcess, 0); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
410 to_dir = to_dir.AppendASCII("To_Dir"); | 393 to_dir = to_dir.AppendASCII("To_Dir"); |
411 ASSERT_TRUE(installer::test::CopyFileHierarchy(from_dir1, to_dir)); | 394 ASSERT_TRUE(installer::test::CopyFileHierarchy(from_dir1, to_dir)); |
412 | 395 |
413 // Lock one of the files in the to destination directory to prevent moves. | 396 // Lock one of the files in the to destination directory to prevent moves. |
414 base::FilePath orig_to_file( | 397 base::FilePath orig_to_file( |
415 to_dir.AppendASCII("From_Dir2").AppendASCII("From_File")); | 398 to_dir.AppendASCII("From_Dir2").AppendASCII("From_File")); |
416 base::MemoryMappedFile mapped_file; | 399 base::MemoryMappedFile mapped_file; |
417 EXPECT_TRUE(mapped_file.Initialize(orig_to_file)); | 400 EXPECT_TRUE(mapped_file.Initialize(orig_to_file)); |
418 | 401 |
419 // First check that we can't do the regular Move(). | 402 // First check that we can't do the regular Move(). |
420 scoped_ptr<MoveTreeWorkItem> work_item( | 403 std::unique_ptr<MoveTreeWorkItem> work_item(WorkItem::CreateMoveTreeWorkItem( |
421 WorkItem::CreateMoveTreeWorkItem(from_dir1, | 404 from_dir1, to_dir, temp_to_dir_.path(), WorkItem::ALWAYS_MOVE)); |
422 to_dir, | |
423 temp_to_dir_.path(), | |
424 WorkItem::ALWAYS_MOVE)); | |
425 EXPECT_FALSE(work_item->Do()); | 405 EXPECT_FALSE(work_item->Do()); |
426 work_item->Rollback(); | 406 work_item->Rollback(); |
427 | 407 |
428 // Now test Do() with the check for duplicates. This should pass. | 408 // Now test Do() with the check for duplicates. This should pass. |
429 work_item.reset( | 409 work_item.reset( |
430 WorkItem::CreateMoveTreeWorkItem(from_dir1, | 410 WorkItem::CreateMoveTreeWorkItem(from_dir1, |
431 to_dir, | 411 to_dir, |
432 temp_to_dir_.path(), | 412 temp_to_dir_.path(), |
433 WorkItem::CHECK_DUPLICATES)); | 413 WorkItem::CHECK_DUPLICATES)); |
434 EXPECT_TRUE(work_item->Do()); | 414 EXPECT_TRUE(work_item->Do()); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
495 base::CreateDirectory(to_dir2); | 475 base::CreateDirectory(to_dir2); |
496 ASSERT_TRUE(base::PathExists(to_dir2)); | 476 ASSERT_TRUE(base::PathExists(to_dir2)); |
497 | 477 |
498 // Create one of the files in the to sub-directory, but not the other. | 478 // Create one of the files in the to sub-directory, but not the other. |
499 base::FilePath orig_to_file(to_dir2); | 479 base::FilePath orig_to_file(to_dir2); |
500 orig_to_file = orig_to_file.AppendASCII("From_File"); | 480 orig_to_file = orig_to_file.AppendASCII("From_File"); |
501 CreateTextFile(orig_to_file.value(), kTextContent1); | 481 CreateTextFile(orig_to_file.value(), kTextContent1); |
502 ASSERT_TRUE(base::PathExists(orig_to_file)); | 482 ASSERT_TRUE(base::PathExists(orig_to_file)); |
503 | 483 |
504 // test Do(), check for duplicates. | 484 // test Do(), check for duplicates. |
505 scoped_ptr<MoveTreeWorkItem> work_item( | 485 std::unique_ptr<MoveTreeWorkItem> work_item(WorkItem::CreateMoveTreeWorkItem( |
506 WorkItem::CreateMoveTreeWorkItem(from_dir1, | 486 from_dir1, to_dir, temp_to_dir_.path(), WorkItem::CHECK_DUPLICATES)); |
507 to_dir, | |
508 temp_to_dir_.path(), | |
509 WorkItem::CHECK_DUPLICATES)); | |
510 EXPECT_TRUE(work_item->Do()); | 487 EXPECT_TRUE(work_item->Do()); |
511 | 488 |
512 // Make sure that we "moved" the files, i.e. that the source directory isn't | 489 // Make sure that we "moved" the files, i.e. that the source directory isn't |
513 // there anymore, | 490 // there anymore, |
514 EXPECT_FALSE(base::PathExists(from_dir1)); | 491 EXPECT_FALSE(base::PathExists(from_dir1)); |
515 // Make sure that the original directory structure and file are still present. | 492 // Make sure that the original directory structure and file are still present. |
516 EXPECT_TRUE(base::PathExists(to_dir)); | 493 EXPECT_TRUE(base::PathExists(to_dir)); |
517 EXPECT_TRUE(base::PathExists(orig_to_file)); | 494 EXPECT_TRUE(base::PathExists(orig_to_file)); |
518 // Make sure that the backup path is not empty. | 495 // Make sure that the backup path is not empty. |
519 EXPECT_FALSE(base::IsDirectoryEmpty(temp_to_dir_.path())); | 496 EXPECT_FALSE(base::IsDirectoryEmpty(temp_to_dir_.path())); |
(...skipping 14 matching lines...) Expand all Loading... |
534 // the source files. | 511 // the source files. |
535 EXPECT_TRUE(base::PathExists(from_dir1)); | 512 EXPECT_TRUE(base::PathExists(from_dir1)); |
536 EXPECT_TRUE(base::PathExists(to_dir)); | 513 EXPECT_TRUE(base::PathExists(to_dir)); |
537 EXPECT_TRUE(base::PathExists(orig_to_file)); | 514 EXPECT_TRUE(base::PathExists(orig_to_file)); |
538 EXPECT_EQ(0, ReadTextFile(orig_to_file).compare(kTextContent1)); | 515 EXPECT_EQ(0, ReadTextFile(orig_to_file).compare(kTextContent1)); |
539 EXPECT_EQ(0, ReadTextFile(from_file).compare(kTextContent1)); | 516 EXPECT_EQ(0, ReadTextFile(from_file).compare(kTextContent1)); |
540 | 517 |
541 // Also, after rollback the new "to" file should be gone. | 518 // Also, after rollback the new "to" file should be gone. |
542 EXPECT_FALSE(base::PathExists(new_to_file2)); | 519 EXPECT_FALSE(base::PathExists(new_to_file2)); |
543 } | 520 } |
OLD | NEW |