| Index: chrome/installer/util/work_item_list_unittest.cc
|
| diff --git a/chrome/installer/util/work_item_list_unittest.cc b/chrome/installer/util/work_item_list_unittest.cc
|
| index c0592f9f9e360c99afedd43bd3f705367d02c188..2d028eb5efce0fee0a2861791cea2afb63142cfc 100644
|
| --- a/chrome/installer/util/work_item_list_unittest.cc
|
| +++ b/chrome/installer/util/work_item_list_unittest.cc
|
| @@ -4,284 +4,73 @@
|
|
|
| #include "chrome/installer/util/work_item_list.h"
|
|
|
| -#include <windows.h>
|
| -
|
| #include <memory>
|
|
|
| -#include "base/base_paths.h"
|
| -#include "base/files/file_util.h"
|
| -#include "base/files/scoped_temp_dir.h"
|
| -#include "base/strings/string_util.h"
|
| -#include "base/test/test_reg_util_win.h"
|
| -#include "base/win/registry.h"
|
| -#include "chrome/installer/util/conditional_work_item_list.h"
|
| +#include "base/macros.h"
|
| #include "chrome/installer/util/work_item.h"
|
| +#include "chrome/installer/util/work_item_mocks.h"
|
| +#include "testing/gmock/include/gmock/gmock.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| -using base::win::RegKey;
|
| -
|
| -namespace {
|
| -
|
| -const wchar_t kTestRoot[] = L"ListList";
|
| -const wchar_t kDataStr[] = L"data_111";
|
| -const wchar_t kName[] = L"name";
|
| -
|
| -class WorkItemListTest : public testing::Test {
|
| - protected:
|
| - void SetUp() override {
|
| - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
|
| - registry_override_manager_.OverrideRegistry(HKEY_CURRENT_USER);
|
| - }
|
| -
|
| - void TearDown() override { logging::CloseLogFile(); }
|
| -
|
| - base::ScopedTempDir temp_dir_;
|
| - registry_util::RegistryOverrideManager registry_override_manager_;
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -// Execute a WorkItem list successfully and then rollback.
|
| -TEST_F(WorkItemListTest, ExecutionSuccess) {
|
| - std::unique_ptr<WorkItemList> work_item_list(WorkItem::CreateWorkItemList());
|
| - std::unique_ptr<WorkItem> work_item;
|
| -
|
| - base::FilePath top_dir_to_create(temp_dir_.path());
|
| - top_dir_to_create = top_dir_to_create.AppendASCII("a");
|
| - base::FilePath dir_to_create(top_dir_to_create);
|
| - dir_to_create = dir_to_create.AppendASCII("b");
|
| - ASSERT_FALSE(base::PathExists(dir_to_create));
|
| -
|
| - work_item.reset(reinterpret_cast<WorkItem*>(
|
| - WorkItem::CreateCreateDirWorkItem(dir_to_create)));
|
| - work_item_list->AddWorkItem(work_item.release());
|
| -
|
| - std::wstring key_to_create(kTestRoot);
|
| - key_to_create.push_back(base::FilePath::kSeparators[0]);
|
| - key_to_create.append(L"ExecutionSuccess");
|
| -
|
| - work_item.reset(
|
| - reinterpret_cast<WorkItem*>(WorkItem::CreateCreateRegKeyWorkItem(
|
| - HKEY_CURRENT_USER, key_to_create, WorkItem::kWow64Default)));
|
| - work_item_list->AddWorkItem(work_item.release());
|
| -
|
| - std::wstring name(kName);
|
| - std::wstring data(kDataStr);
|
| - work_item.reset(reinterpret_cast<WorkItem*>(
|
| - WorkItem::CreateSetRegValueWorkItem(HKEY_CURRENT_USER,
|
| - key_to_create,
|
| - WorkItem::kWow64Default,
|
| - name,
|
| - data,
|
| - false)));
|
| - work_item_list->AddWorkItem(work_item.release());
|
| -
|
| - EXPECT_TRUE(work_item_list->Do());
|
| -
|
| - // Verify all WorkItems have been executed.
|
| - RegKey key;
|
| - EXPECT_EQ(ERROR_SUCCESS,
|
| - key.Open(HKEY_CURRENT_USER, key_to_create.c_str(), KEY_READ));
|
| - std::wstring read_out;
|
| - EXPECT_EQ(ERROR_SUCCESS, key.ReadValue(name.c_str(), &read_out));
|
| - EXPECT_EQ(0, read_out.compare(kDataStr));
|
| - key.Close();
|
| - EXPECT_TRUE(base::PathExists(dir_to_create));
|
| -
|
| - work_item_list->Rollback();
|
| -
|
| - // Verify everything is rolled back.
|
| - // The value must have been deleted first in roll back otherwise the key
|
| - // can not be deleted.
|
| - EXPECT_NE(ERROR_SUCCESS,
|
| - key.Open(HKEY_CURRENT_USER, key_to_create.c_str(), KEY_READ));
|
| - EXPECT_FALSE(base::PathExists(top_dir_to_create));
|
| -}
|
| -
|
| -// Execute a WorkItem list. Fail in the middle. Rollback what has been done.
|
| -TEST_F(WorkItemListTest, ExecutionFailAndRollback) {
|
| - std::unique_ptr<WorkItemList> work_item_list(WorkItem::CreateWorkItemList());
|
| - std::unique_ptr<WorkItem> work_item;
|
| -
|
| - base::FilePath top_dir_to_create(temp_dir_.path());
|
| - top_dir_to_create = top_dir_to_create.AppendASCII("a");
|
| - base::FilePath dir_to_create(top_dir_to_create);
|
| - dir_to_create = dir_to_create.AppendASCII("b");
|
| - ASSERT_FALSE(base::PathExists(dir_to_create));
|
| -
|
| - work_item.reset(reinterpret_cast<WorkItem*>(
|
| - WorkItem::CreateCreateDirWorkItem(dir_to_create)));
|
| - work_item_list->AddWorkItem(work_item.release());
|
| +using testing::InSequence;
|
| +using testing::Return;
|
|
|
| - std::wstring key_to_create(kTestRoot);
|
| - key_to_create.push_back(base::FilePath::kSeparators[0]);
|
| - key_to_create.append(L"ExecutionFail");
|
| +// Execute a WorkItemList successfully and then rollback.
|
| +TEST(WorkItemListTest, ExecutionSuccess) {
|
| + std::unique_ptr<WorkItemList> list(WorkItem::CreateWorkItemList());
|
|
|
| - work_item.reset(
|
| - reinterpret_cast<WorkItem*>(WorkItem::CreateCreateRegKeyWorkItem(
|
| - HKEY_CURRENT_USER, key_to_create, WorkItem::kWow64Default)));
|
| - work_item_list->AddWorkItem(work_item.release());
|
| + // Create the mock work items.
|
| + std::unique_ptr<StrictMockWorkItem> item1(new StrictMockWorkItem);
|
| + std::unique_ptr<StrictMockWorkItem> item2(new StrictMockWorkItem);
|
| + std::unique_ptr<StrictMockWorkItem> item3(new StrictMockWorkItem);
|
|
|
| - std::wstring not_created_key(kTestRoot);
|
| - not_created_key.push_back(base::FilePath::kSeparators[0]);
|
| - not_created_key.append(L"NotCreated");
|
| - std::wstring name(kName);
|
| - std::wstring data(kDataStr);
|
| - work_item.reset(reinterpret_cast<WorkItem*>(
|
| - WorkItem::CreateSetRegValueWorkItem(HKEY_CURRENT_USER,
|
| - not_created_key,
|
| - WorkItem::kWow64Default,
|
| - name,
|
| - data,
|
| - false)));
|
| - work_item_list->AddWorkItem(work_item.release());
|
| + {
|
| + // Expect all three items to be done in order then undone.
|
| + InSequence s;
|
|
|
| - // This one will not be executed because we will fail early.
|
| - work_item.reset(
|
| - reinterpret_cast<WorkItem*>(WorkItem::CreateCreateRegKeyWorkItem(
|
| - HKEY_CURRENT_USER, not_created_key, WorkItem::kWow64Default)));
|
| - work_item_list->AddWorkItem(work_item.release());
|
| -
|
| - EXPECT_FALSE(work_item_list->Do());
|
| -
|
| - // Verify the first 2 WorkItems have been executed.
|
| - RegKey key;
|
| - EXPECT_EQ(ERROR_SUCCESS,
|
| - key.Open(HKEY_CURRENT_USER, key_to_create.c_str(), KEY_READ));
|
| - key.Close();
|
| - EXPECT_TRUE(base::PathExists(dir_to_create));
|
| - // The last one should not be there.
|
| - EXPECT_NE(ERROR_SUCCESS,
|
| - key.Open(HKEY_CURRENT_USER, not_created_key.c_str(), KEY_READ));
|
| -
|
| - work_item_list->Rollback();
|
| -
|
| - // Verify everything is rolled back.
|
| - EXPECT_NE(ERROR_SUCCESS,
|
| - key.Open(HKEY_CURRENT_USER, key_to_create.c_str(), KEY_READ));
|
| - EXPECT_FALSE(base::PathExists(top_dir_to_create));
|
| -}
|
| -
|
| -TEST_F(WorkItemListTest, ConditionalExecutionSuccess) {
|
| - std::unique_ptr<WorkItemList> work_item_list(WorkItem::CreateWorkItemList());
|
| - std::unique_ptr<WorkItem> work_item;
|
| -
|
| - base::FilePath top_dir_to_create(temp_dir_.path());
|
| - top_dir_to_create = top_dir_to_create.AppendASCII("a");
|
| - base::FilePath dir_to_create(top_dir_to_create);
|
| - dir_to_create = dir_to_create.AppendASCII("b");
|
| - ASSERT_FALSE(base::PathExists(dir_to_create));
|
| -
|
| - work_item.reset(reinterpret_cast<WorkItem*>(
|
| - WorkItem::CreateCreateDirWorkItem(dir_to_create)));
|
| - work_item_list->AddWorkItem(work_item.release());
|
| -
|
| - std::unique_ptr<WorkItemList> conditional_work_item_list(
|
| - WorkItem::CreateConditionalWorkItemList(
|
| - new ConditionRunIfFileExists(dir_to_create)));
|
| -
|
| - std::wstring key_to_create(kTestRoot);
|
| - key_to_create.push_back(base::FilePath::kSeparators[0]);
|
| - key_to_create.append(L"ExecutionSuccess");
|
| - work_item.reset(
|
| - reinterpret_cast<WorkItem*>(WorkItem::CreateCreateRegKeyWorkItem(
|
| - HKEY_CURRENT_USER, key_to_create, WorkItem::kWow64Default)));
|
| - conditional_work_item_list->AddWorkItem(work_item.release());
|
| -
|
| - std::wstring name(kName);
|
| - std::wstring data(kDataStr);
|
| - work_item.reset(reinterpret_cast<WorkItem*>(
|
| - WorkItem::CreateSetRegValueWorkItem(HKEY_CURRENT_USER,
|
| - key_to_create,
|
| - WorkItem::kWow64Default,
|
| - name,
|
| - data,
|
| - false)));
|
| - conditional_work_item_list->AddWorkItem(work_item.release());
|
| -
|
| - work_item_list->AddWorkItem(conditional_work_item_list.release());
|
| -
|
| - EXPECT_TRUE(work_item_list->Do());
|
| -
|
| - // Verify all WorkItems have been executed.
|
| - RegKey key;
|
| - EXPECT_EQ(ERROR_SUCCESS,
|
| - key.Open(HKEY_CURRENT_USER, key_to_create.c_str(), KEY_READ));
|
| - std::wstring read_out;
|
| - EXPECT_EQ(ERROR_SUCCESS, key.ReadValue(name.c_str(), &read_out));
|
| - EXPECT_EQ(0, read_out.compare(kDataStr));
|
| - key.Close();
|
| - EXPECT_TRUE(base::PathExists(dir_to_create));
|
| + EXPECT_CALL(*item1, Do()).WillOnce(Return(true));
|
| + EXPECT_CALL(*item2, Do()).WillOnce(Return(true));
|
| + EXPECT_CALL(*item3, Do()).WillOnce(Return(true));
|
| + EXPECT_CALL(*item3, Rollback());
|
| + EXPECT_CALL(*item2, Rollback());
|
| + EXPECT_CALL(*item1, Rollback());
|
| + }
|
|
|
| - work_item_list->Rollback();
|
| + // Add the items to the list.
|
| + list->AddWorkItem(item1.release());
|
| + list->AddWorkItem(item2.release());
|
| + list->AddWorkItem(item3.release());
|
|
|
| - // Verify everything is rolled back.
|
| - // The value must have been deleted first in roll back otherwise the key
|
| - // can not be deleted.
|
| - EXPECT_NE(ERROR_SUCCESS,
|
| - key.Open(HKEY_CURRENT_USER, key_to_create.c_str(), KEY_READ));
|
| - EXPECT_FALSE(base::PathExists(top_dir_to_create));
|
| + // Do and rollback the list.
|
| + EXPECT_TRUE(list->Do());
|
| + list->Rollback();
|
| }
|
|
|
| -TEST_F(WorkItemListTest, ConditionalExecutionConditionFailure) {
|
| - std::unique_ptr<WorkItemList> work_item_list(WorkItem::CreateWorkItemList());
|
| - std::unique_ptr<WorkItem> work_item;
|
| -
|
| - base::FilePath top_dir_to_create(temp_dir_.path());
|
| - top_dir_to_create = top_dir_to_create.AppendASCII("a");
|
| - base::FilePath dir_to_create(top_dir_to_create);
|
| - dir_to_create = dir_to_create.AppendASCII("b");
|
| - ASSERT_FALSE(base::PathExists(dir_to_create));
|
| -
|
| - work_item.reset(reinterpret_cast<WorkItem*>(
|
| - WorkItem::CreateCreateDirWorkItem(dir_to_create)));
|
| - work_item_list->AddWorkItem(work_item.release());
|
| +// Execute a WorkItemList. Fail in the middle. Rollback what has been done.
|
| +TEST(WorkItemListTest, ExecutionFailAndRollback) {
|
| + std::unique_ptr<WorkItemList> list(WorkItem::CreateWorkItemList());
|
|
|
| - std::unique_ptr<WorkItemList> conditional_work_item_list(
|
| - WorkItem::CreateConditionalWorkItemList(
|
| - new ConditionRunIfFileExists(dir_to_create.AppendASCII("c"))));
|
| + // Create the mock work items.
|
| + std::unique_ptr<StrictMockWorkItem> item1(new StrictMockWorkItem);
|
| + std::unique_ptr<StrictMockWorkItem> item2(new StrictMockWorkItem);
|
| + std::unique_ptr<StrictMockWorkItem> item3(new StrictMockWorkItem);
|
|
|
| - std::wstring key_to_create(kTestRoot);
|
| - key_to_create.push_back(base::FilePath::kSeparators[0]);
|
| - key_to_create.append(L"ExecutionSuccess");
|
| - work_item.reset(
|
| - reinterpret_cast<WorkItem*>(WorkItem::CreateCreateRegKeyWorkItem(
|
| - HKEY_CURRENT_USER, key_to_create, WorkItem::kWow64Default)));
|
| - conditional_work_item_list->AddWorkItem(work_item.release());
|
| + {
|
| + // Expect the two first work items to be done in order then undone.
|
| + InSequence s;
|
|
|
| - std::wstring name(kName);
|
| - std::wstring data(kDataStr);
|
| - work_item.reset(reinterpret_cast<WorkItem*>(
|
| - WorkItem::CreateSetRegValueWorkItem(HKEY_CURRENT_USER,
|
| - key_to_create,
|
| - WorkItem::kWow64Default,
|
| - name,
|
| - data,
|
| - false)));
|
| - conditional_work_item_list->AddWorkItem(work_item.release());
|
| -
|
| - work_item_list->AddWorkItem(conditional_work_item_list.release());
|
| -
|
| - EXPECT_TRUE(work_item_list->Do());
|
| -
|
| - // Verify that the WorkItems added as part of the conditional list have NOT
|
| - // been executed.
|
| - RegKey key;
|
| - EXPECT_NE(ERROR_SUCCESS,
|
| - key.Open(HKEY_CURRENT_USER, key_to_create.c_str(), KEY_READ));
|
| - std::wstring read_out;
|
| - EXPECT_NE(ERROR_SUCCESS, key.ReadValue(name.c_str(), &read_out));
|
| - key.Close();
|
| -
|
| - // Verify that the other work item was executed.
|
| - EXPECT_TRUE(base::PathExists(dir_to_create));
|
| + EXPECT_CALL(*item1, Do()).WillOnce(Return(true));
|
| + EXPECT_CALL(*item2, Do()).WillOnce(Return(false));
|
| + EXPECT_CALL(*item2, Rollback());
|
| + EXPECT_CALL(*item1, Rollback());
|
| + }
|
|
|
| - work_item_list->Rollback();
|
| + // Add the items to the list.
|
| + list->AddWorkItem(item1.release());
|
| + list->AddWorkItem(item2.release());
|
| + list->AddWorkItem(item3.release());
|
|
|
| - // Verify everything is rolled back.
|
| - // The value must have been deleted first in roll back otherwise the key
|
| - // can not be deleted.
|
| - EXPECT_NE(ERROR_SUCCESS,
|
| - key.Open(HKEY_CURRENT_USER, key_to_create.c_str(), KEY_READ));
|
| - EXPECT_FALSE(base::PathExists(top_dir_to_create));
|
| + // Do and rollback the list.
|
| + EXPECT_FALSE(list->Do());
|
| + list->Rollback();
|
| }
|
|
|