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

Unified Diff: chrome/installer/util/delete_tree_work_item_unittest.cc

Issue 1882923003: Add best-effort/allow rollback flags on WorkItem. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@simple_list_tests
Patch Set: fix build error Created 4 years, 7 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/installer/util/delete_tree_work_item_unittest.cc
diff --git a/chrome/installer/util/delete_tree_work_item_unittest.cc b/chrome/installer/util/delete_tree_work_item_unittest.cc
index cc7ae2d1a2a78e53a334bf4051381108ec61b800..43a456d65829b96d8cd3f5f89c4b449cc3eb54a8 100644
--- a/chrome/installer/util/delete_tree_work_item_unittest.cc
+++ b/chrome/installer/util/delete_tree_work_item_unittest.cc
@@ -4,230 +4,108 @@
#include "chrome/installer/util/delete_tree_work_item.h"
-#include <windows.h>
-
-#include <fstream>
#include <memory>
-#include "base/base_paths.h"
+#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/files/scoped_temp_dir.h"
-#include "base/logging.h"
-#include "base/strings/string_util.h"
+#include "base/macros.h"
#include "chrome/installer/util/work_item.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
+constexpr char kTextContent[] = "delete me";
+
class DeleteTreeWorkItemTest : public testing::Test {
protected:
- void SetUp() override { ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); }
+ DeleteTreeWorkItemTest() = default;
+
+ void SetUp() override {
+ ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
+
+ dir_name_ = temp_dir_.path().Append(FILE_PATH_LITERAL("to_be_deleted"));
+ ASSERT_TRUE(base::CreateDirectory(dir_name_));
+ ASSERT_TRUE(base::PathExists(dir_name_));
+
+ dir_name_1_ = dir_name_.Append(FILE_PATH_LITERAL("1"));
+ ASSERT_TRUE(base::CreateDirectory(dir_name_1_));
+ ASSERT_TRUE(base::PathExists(dir_name_1_));
+
+ dir_name_2_ = dir_name_.Append(FILE_PATH_LITERAL("2"));
+ ASSERT_TRUE(base::CreateDirectory(dir_name_2_));
+ ASSERT_TRUE(base::PathExists(dir_name_2_));
+
+ file_name_1_ = dir_name_1_.Append(FILE_PATH_LITERAL("File_1.txt"));
+ ASSERT_TRUE(
+ base::WriteFile(file_name_1_, kTextContent, sizeof(kTextContent)));
+ ASSERT_TRUE(base::PathExists(file_name_1_));
+
+ file_name_2_ = dir_name_2_.Append(FILE_PATH_LITERAL("File_2.txt"));
+ ASSERT_TRUE(
+ base::WriteFile(file_name_2_, kTextContent, sizeof(kTextContent)));
+ ASSERT_TRUE(base::PathExists(file_name_2_));
+ }
+
+ void ExpectAllFilesExist() {
+ EXPECT_TRUE(base::PathExists(dir_name_));
+ EXPECT_TRUE(base::PathExists(dir_name_1_));
+ EXPECT_TRUE(base::PathExists(dir_name_2_));
+ EXPECT_TRUE(base::PathExists(file_name_1_));
+ EXPECT_TRUE(base::PathExists(file_name_2_));
+ }
+
+ void ExpectAllFilesDeleted() {
+ EXPECT_FALSE(base::PathExists(dir_name_));
+ EXPECT_FALSE(base::PathExists(dir_name_1_));
+ EXPECT_FALSE(base::PathExists(dir_name_2_));
+ EXPECT_FALSE(base::PathExists(file_name_1_));
+ EXPECT_FALSE(base::PathExists(file_name_2_));
+ }
// The temporary directory used to contain the test operations.
base::ScopedTempDir temp_dir_;
-};
-// Simple function to dump some text into a new file.
-void CreateTextFile(const std::wstring& filename,
- const std::wstring& contents) {
- std::ofstream file;
- file.open(filename.c_str());
- ASSERT_TRUE(file.is_open());
- file << contents;
- file.close();
-}
+ base::FilePath dir_name_;
+ base::FilePath dir_name_1_;
+ base::FilePath dir_name_2_;
+ base::FilePath file_name_1_;
+ base::FilePath file_name_2_;
-const wchar_t text_content_1[] = L"delete me";
+ DISALLOW_COPY_AND_ASSIGN(DeleteTreeWorkItemTest);
+};
} // namespace
-// Delete a tree without key path. Everything should be deleted.
-TEST_F(DeleteTreeWorkItemTest, DeleteTreeNoKeyPath) {
- // Create tree to be deleted.
- base::FilePath dir_name_delete(temp_dir_.path());
- dir_name_delete = dir_name_delete.AppendASCII("to_be_delete");
- base::CreateDirectory(dir_name_delete);
- ASSERT_TRUE(base::PathExists(dir_name_delete));
-
- base::FilePath dir_name_delete_1(dir_name_delete);
- dir_name_delete_1 = dir_name_delete_1.AppendASCII("1");
- base::CreateDirectory(dir_name_delete_1);
- ASSERT_TRUE(base::PathExists(dir_name_delete_1));
-
- base::FilePath dir_name_delete_2(dir_name_delete);
- dir_name_delete_2 = dir_name_delete_2.AppendASCII("2");
- base::CreateDirectory(dir_name_delete_2);
- ASSERT_TRUE(base::PathExists(dir_name_delete_2));
-
- base::FilePath file_name_delete_1(dir_name_delete_1);
- file_name_delete_1 = file_name_delete_1.AppendASCII("File_1.txt");
- CreateTextFile(file_name_delete_1.value(), text_content_1);
- ASSERT_TRUE(base::PathExists(file_name_delete_1));
-
- base::FilePath file_name_delete_2(dir_name_delete_2);
- file_name_delete_2 = file_name_delete_2.AppendASCII("File_2.txt");
- CreateTextFile(file_name_delete_2.value(), text_content_1);
- ASSERT_TRUE(base::PathExists(file_name_delete_2));
-
- // Test Do().
+// Delete a tree with rollback enabled and no file in use. Do() should delete
+// everything and Rollback() should bring back everything.
+TEST_F(DeleteTreeWorkItemTest, Delete) {
base::ScopedTempDir temp_dir;
ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
- std::vector<base::FilePath> key_files;
std::unique_ptr<DeleteTreeWorkItem> work_item(
- WorkItem::CreateDeleteTreeWorkItem(dir_name_delete, temp_dir.path(),
- key_files));
- EXPECT_TRUE(work_item->Do());
+ WorkItem::CreateDeleteTreeWorkItem(dir_name_, temp_dir.path()));
- // everything should be gone
- EXPECT_FALSE(base::PathExists(file_name_delete_1));
- EXPECT_FALSE(base::PathExists(file_name_delete_2));
- EXPECT_FALSE(base::PathExists(dir_name_delete));
+ EXPECT_TRUE(work_item->Do());
+ ExpectAllFilesDeleted();
work_item->Rollback();
- // everything should come back
- EXPECT_TRUE(base::PathExists(file_name_delete_1));
- EXPECT_TRUE(base::PathExists(file_name_delete_2));
- EXPECT_TRUE(base::PathExists(dir_name_delete));
+ ExpectAllFilesExist();
}
-
-// Delete a tree with keypath but not in use. Everything should be gone.
-// Rollback should bring back everything
-TEST_F(DeleteTreeWorkItemTest, DeleteTree) {
- // Create tree to be deleted
- base::FilePath dir_name_delete(temp_dir_.path());
- dir_name_delete = dir_name_delete.AppendASCII("to_be_delete");
- base::CreateDirectory(dir_name_delete);
- ASSERT_TRUE(base::PathExists(dir_name_delete));
-
- base::FilePath dir_name_delete_1(dir_name_delete);
- dir_name_delete_1 = dir_name_delete_1.AppendASCII("1");
- base::CreateDirectory(dir_name_delete_1);
- ASSERT_TRUE(base::PathExists(dir_name_delete_1));
-
- base::FilePath dir_name_delete_2(dir_name_delete);
- dir_name_delete_2 = dir_name_delete_2.AppendASCII("2");
- base::CreateDirectory(dir_name_delete_2);
- ASSERT_TRUE(base::PathExists(dir_name_delete_2));
-
- base::FilePath file_name_delete_1(dir_name_delete_1);
- file_name_delete_1 = file_name_delete_1.AppendASCII("File_1.txt");
- CreateTextFile(file_name_delete_1.value(), text_content_1);
- ASSERT_TRUE(base::PathExists(file_name_delete_1));
-
- base::FilePath file_name_delete_2(dir_name_delete_2);
- file_name_delete_2 = file_name_delete_2.AppendASCII("File_2.txt");
- CreateTextFile(file_name_delete_2.value(), text_content_1);
- ASSERT_TRUE(base::PathExists(file_name_delete_2));
-
- // test Do()
+// Delete a tree with rollback disabled and no file in use. Do() should delete
+// everything and Rollback() shouldn't bring back anything.
+TEST_F(DeleteTreeWorkItemTest, DeleteRollbackDisabled) {
base::ScopedTempDir temp_dir;
ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
- std::vector<base::FilePath> key_files(1, file_name_delete_1);
std::unique_ptr<DeleteTreeWorkItem> work_item(
- WorkItem::CreateDeleteTreeWorkItem(dir_name_delete, temp_dir.path(),
- key_files));
- EXPECT_TRUE(work_item->Do());
+ WorkItem::CreateDeleteTreeWorkItem(dir_name_, temp_dir.path()));
+ work_item->set_rollback_enabled(false);
- // everything should be gone
- EXPECT_FALSE(base::PathExists(file_name_delete_1));
- EXPECT_FALSE(base::PathExists(file_name_delete_2));
- EXPECT_FALSE(base::PathExists(dir_name_delete));
+ EXPECT_TRUE(work_item->Do());
+ ExpectAllFilesDeleted();
work_item->Rollback();
- // everything should come back
- EXPECT_TRUE(base::PathExists(file_name_delete_1));
- EXPECT_TRUE(base::PathExists(file_name_delete_2));
- EXPECT_TRUE(base::PathExists(dir_name_delete));
-}
-
-// Delete a tree with key_path in use. Everything should still be there.
-TEST_F(DeleteTreeWorkItemTest, DeleteTreeInUse) {
- // Create tree to be deleted
- base::FilePath dir_name_delete(temp_dir_.path());
- dir_name_delete = dir_name_delete.AppendASCII("to_be_delete");
- base::CreateDirectory(dir_name_delete);
- ASSERT_TRUE(base::PathExists(dir_name_delete));
-
- base::FilePath dir_name_delete_1(dir_name_delete);
- dir_name_delete_1 = dir_name_delete_1.AppendASCII("1");
- base::CreateDirectory(dir_name_delete_1);
- ASSERT_TRUE(base::PathExists(dir_name_delete_1));
-
- base::FilePath dir_name_delete_2(dir_name_delete);
- dir_name_delete_2 = dir_name_delete_2.AppendASCII("2");
- base::CreateDirectory(dir_name_delete_2);
- ASSERT_TRUE(base::PathExists(dir_name_delete_2));
-
- base::FilePath file_name_delete_1(dir_name_delete_1);
- file_name_delete_1 = file_name_delete_1.AppendASCII("File_1.txt");
- CreateTextFile(file_name_delete_1.value(), text_content_1);
- ASSERT_TRUE(base::PathExists(file_name_delete_1));
-
- base::FilePath file_name_delete_2(dir_name_delete_2);
- file_name_delete_2 = file_name_delete_2.AppendASCII("File_2.txt");
- CreateTextFile(file_name_delete_2.value(), text_content_1);
- ASSERT_TRUE(base::PathExists(file_name_delete_2));
-
- // Create a key path file.
- base::FilePath key_path(dir_name_delete);
- key_path = key_path.AppendASCII("key_file.exe");
-
- wchar_t exe_full_path_str[MAX_PATH];
- ::GetModuleFileNameW(NULL, exe_full_path_str, MAX_PATH);
- base::FilePath exe_full_path(exe_full_path_str);
-
- base::CopyFile(exe_full_path, key_path);
- ASSERT_TRUE(base::PathExists(key_path));
-
- VLOG(1) << "copy ourself from " << exe_full_path.value()
- << " to " << key_path.value();
-
- // Run the key path file to keep it in use.
- STARTUPINFOW si = {sizeof(si)};
- PROCESS_INFORMATION pi = {0};
- base::FilePath::StringType writable_key_path = key_path.value();
- ASSERT_TRUE(
- ::CreateProcessW(NULL, &writable_key_path[0],
- NULL, NULL, FALSE, CREATE_NO_WINDOW | CREATE_SUSPENDED,
- NULL, NULL, &si, &pi));
-
- // test Do().
- {
- base::ScopedTempDir temp_dir;
- ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-
- std::vector<base::FilePath> key_paths(1, key_path);
- std::unique_ptr<DeleteTreeWorkItem> work_item(
- WorkItem::CreateDeleteTreeWorkItem(dir_name_delete, temp_dir.path(),
- key_paths));
-
- // delete should fail as file in use.
- EXPECT_FALSE(work_item->Do());
- }
-
- {
- base::ScopedTempDir temp_dir;
- ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-
- // No key paths, the deletion should succeed.
- std::vector<base::FilePath> key_paths;
- std::unique_ptr<DeleteTreeWorkItem> work_item(
- WorkItem::CreateDeleteTreeWorkItem(dir_name_delete, temp_dir.path(),
- key_paths));
-
- EXPECT_TRUE(work_item->Do());
- work_item->Rollback();
- }
-
- // verify everything is still there.
- EXPECT_TRUE(base::PathExists(key_path));
- EXPECT_TRUE(base::PathExists(file_name_delete_1));
- EXPECT_TRUE(base::PathExists(file_name_delete_2));
-
- TerminateProcess(pi.hProcess, 0);
- // make sure the handle is closed.
- WaitForSingleObject(pi.hProcess, INFINITE);
+ ExpectAllFilesDeleted();
}

Powered by Google App Engine
This is Rietveld 408576698