Chromium Code Reviews| 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 1a2eb3d3060e9b7316061070c476ff7cdfc9884e..873678ec662e51f7ecf3884ffe5b4631e2889cfe 100644 |
| --- a/chrome/installer/util/work_item_list_unittest.cc |
| +++ b/chrome/installer/util/work_item_list_unittest.cc |
| @@ -2,284 +2,90 @@ |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| -#include <windows.h> |
| +#include "chrome/installer/util/work_item_list.h" |
| + |
| +#include <memory> |
| -#include "base/base_paths.h" |
| -#include "base/files/file_util.h" |
| -#include "base/files/scoped_temp_dir.h" |
| -#include "base/memory/scoped_ptr.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_list.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); |
| - } |
| +class MockWorkItem : public WorkItem { |
|
grt (UTC plus 2)
2016/04/14 14:42:22
how about pulling this out into something like wor
fdoray
2016/04/18 13:04:46
Done.
|
| + public: |
| + MockWorkItem() = default; |
| - void TearDown() override { logging::CloseLogFile(); } |
| + MOCK_METHOD0(Do, bool()); |
| + MOCK_METHOD0(Rollback, void()); |
| - base::ScopedTempDir temp_dir_; |
| - registry_util::RegistryOverrideManager registry_override_manager_; |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(MockWorkItem); |
| }; |
| -} // namespace |
| - |
| -// Execute a WorkItem list successfully and then rollback. |
| -TEST_F(WorkItemListTest, ExecutionSuccess) { |
| - scoped_ptr<WorkItemList> work_item_list(WorkItem::CreateWorkItemList()); |
| - scoped_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) { |
| - scoped_ptr<WorkItemList> work_item_list(WorkItem::CreateWorkItemList()); |
| - scoped_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"ExecutionFail"); |
| - |
| - work_item.reset( |
| - reinterpret_cast<WorkItem*>(WorkItem::CreateCreateRegKeyWorkItem( |
| - HKEY_CURRENT_USER, key_to_create, WorkItem::kWow64Default))); |
| - work_item_list->AddWorkItem(work_item.release()); |
| +using StrictMockWorkItem = testing::StrictMock<MockWorkItem>; |
| +using testing::InSequence; |
| +using testing::Return; |
| - 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()); |
| - |
| - // 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) { |
| - scoped_ptr<WorkItemList> work_item_list(WorkItem::CreateWorkItemList()); |
| - scoped_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()); |
| - |
| - scoped_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()); |
| +} // namespace |
| - // 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)); |
| +// Execute a WorkItemList successfully and then rollback. |
| +TEST(WorkItemListTest, ExecutionSuccess) { |
| + std::unique_ptr<WorkItemList> list(WorkItem::CreateWorkItemList()); |
| + |
| + // 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); |
| + |
| + { |
| + // Expect all three items to be done in order then undone. |
| + InSequence s; |
| + |
| + 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) { |
| - scoped_ptr<WorkItemList> work_item_list(WorkItem::CreateWorkItemList()); |
| - scoped_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()); |
| - scoped_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(); |
| } |