15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base_paths.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/test/test_reg_util_win.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/registry.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/conditional_work_item_list.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/work_item.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/work_item_list.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::win::RegKey; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kTestRoot[] = L"ListList"; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kDataStr[] = L"data_111"; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kName[] = L"name"; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WorkItemListTest : public testing::Test { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci registry_override_manager_.OverrideRegistry(HKEY_CURRENT_USER); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) logging::CloseLogFile(); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir_; 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) registry_util::RegistryOverrideManager registry_override_manager_; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Execute a WorkItem list successfully and then rollback. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkItemListTest, ExecutionSuccess) { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkItemList> work_item_list(WorkItem::CreateWorkItemList()); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkItem> work_item; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath top_dir_to_create(temp_dir_.path()); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_dir_to_create = top_dir_to_create.AppendASCII("a"); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath dir_to_create(top_dir_to_create); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dir_to_create = dir_to_create.AppendASCII("b"); 547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_FALSE(base::PathExists(dir_to_create)); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_item.reset(reinterpret_cast<WorkItem*>( 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WorkItem::CreateCreateDirWorkItem(dir_to_create))); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_item_list->AddWorkItem(work_item.release()); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring key_to_create(kTestRoot); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key_to_create.push_back(base::FilePath::kSeparators[0]); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_to_create.append(L"ExecutionSuccess"); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) work_item.reset( 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) reinterpret_cast<WorkItem*>(WorkItem::CreateCreateRegKeyWorkItem( 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) HKEY_CURRENT_USER, key_to_create, WorkItem::kWow64Default))); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_item_list->AddWorkItem(work_item.release()); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring name(kName); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring data(kDataStr); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_item.reset(reinterpret_cast<WorkItem*>( 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) WorkItem::CreateSetRegValueWorkItem(HKEY_CURRENT_USER, 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) key_to_create, 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) WorkItem::kWow64Default, 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) name, 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) data, 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) false))); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_item_list->AddWorkItem(work_item.release()); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(work_item_list->Do()); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify all WorkItems have been executed. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegKey key; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERROR_SUCCESS, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key.Open(HKEY_CURRENT_USER, key_to_create.c_str(), KEY_READ)); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring read_out; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERROR_SUCCESS, key.ReadValue(name.c_str(), &read_out)); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, read_out.compare(kDataStr)); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key.Close(); 907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(base::PathExists(dir_to_create)); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_item_list->Rollback(); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify everything is rolled back. 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The value must have been deleted first in roll back otherwise the key 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can not be deleted. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(ERROR_SUCCESS, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key.Open(HKEY_CURRENT_USER, key_to_create.c_str(), KEY_READ)); 997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(top_dir_to_create)); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Execute a WorkItem list. Fail in the middle. Rollback what has been done. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkItemListTest, ExecutionFailAndRollback) { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkItemList> work_item_list(WorkItem::CreateWorkItemList()); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkItem> work_item; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath top_dir_to_create(temp_dir_.path()); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_dir_to_create = top_dir_to_create.AppendASCII("a"); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath dir_to_create(top_dir_to_create); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dir_to_create = dir_to_create.AppendASCII("b"); 1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_FALSE(base::PathExists(dir_to_create)); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_item.reset(reinterpret_cast<WorkItem*>( 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WorkItem::CreateCreateDirWorkItem(dir_to_create))); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_item_list->AddWorkItem(work_item.release()); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring key_to_create(kTestRoot); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key_to_create.push_back(base::FilePath::kSeparators[0]); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_to_create.append(L"ExecutionFail"); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) work_item.reset( 122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) reinterpret_cast<WorkItem*>(WorkItem::CreateCreateRegKeyWorkItem( 123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) HKEY_CURRENT_USER, key_to_create, WorkItem::kWow64Default))); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_item_list->AddWorkItem(work_item.release()); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring not_created_key(kTestRoot); 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) not_created_key.push_back(base::FilePath::kSeparators[0]); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) not_created_key.append(L"NotCreated"); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring name(kName); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring data(kDataStr); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_item.reset(reinterpret_cast<WorkItem*>( 132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) WorkItem::CreateSetRegValueWorkItem(HKEY_CURRENT_USER, 133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) not_created_key, 134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) WorkItem::kWow64Default, 135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) name, 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) data, 137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) false))); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_item_list->AddWorkItem(work_item.release()); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This one will not be executed because we will fail early. 141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) work_item.reset( 142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) reinterpret_cast<WorkItem*>(WorkItem::CreateCreateRegKeyWorkItem( 143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) HKEY_CURRENT_USER, not_created_key, WorkItem::kWow64Default))); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_item_list->AddWorkItem(work_item.release()); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(work_item_list->Do()); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify the first 2 WorkItems have been executed. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegKey key; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERROR_SUCCESS, 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key.Open(HKEY_CURRENT_USER, key_to_create.c_str(), KEY_READ)); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key.Close(); 1537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(base::PathExists(dir_to_create)); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The last one should not be there. 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(ERROR_SUCCESS, 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key.Open(HKEY_CURRENT_USER, not_created_key.c_str(), KEY_READ)); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_item_list->Rollback(); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify everything is rolled back. 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(ERROR_SUCCESS, 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key.Open(HKEY_CURRENT_USER, key_to_create.c_str(), KEY_READ)); 1637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(top_dir_to_create)); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkItemListTest, ConditionalExecutionSuccess) { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkItemList> work_item_list(WorkItem::CreateWorkItemList()); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkItem> work_item; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath top_dir_to_create(temp_dir_.path()); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_dir_to_create = top_dir_to_create.AppendASCII("a"); 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath dir_to_create(top_dir_to_create); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dir_to_create = dir_to_create.AppendASCII("b"); 1747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_FALSE(base::PathExists(dir_to_create)); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_item.reset(reinterpret_cast<WorkItem*>( 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WorkItem::CreateCreateDirWorkItem(dir_to_create))); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_item_list->AddWorkItem(work_item.release()); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkItemList> conditional_work_item_list( 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WorkItem::CreateConditionalWorkItemList( 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ConditionRunIfFileExists(dir_to_create))); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring key_to_create(kTestRoot); 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key_to_create.push_back(base::FilePath::kSeparators[0]); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_to_create.append(L"ExecutionSuccess"); 187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) work_item.reset( 188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) reinterpret_cast<WorkItem*>(WorkItem::CreateCreateRegKeyWorkItem( 189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) HKEY_CURRENT_USER, key_to_create, WorkItem::kWow64Default))); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) conditional_work_item_list->AddWorkItem(work_item.release()); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring name(kName); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring data(kDataStr); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_item.reset(reinterpret_cast<WorkItem*>( 195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) WorkItem::CreateSetRegValueWorkItem(HKEY_CURRENT_USER, 196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) key_to_create, 197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) WorkItem::kWow64Default, 198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) name, 199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) data, 200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) false))); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) conditional_work_item_list->AddWorkItem(work_item.release()); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_item_list->AddWorkItem(conditional_work_item_list.release()); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(work_item_list->Do()); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify all WorkItems have been executed. 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegKey key; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERROR_SUCCESS, 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key.Open(HKEY_CURRENT_USER, key_to_create.c_str(), KEY_READ)); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring read_out; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERROR_SUCCESS, key.ReadValue(name.c_str(), &read_out)); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, read_out.compare(kDataStr)); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key.Close(); 2157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(base::PathExists(dir_to_create)); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_item_list->Rollback(); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify everything is rolled back. 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The value must have been deleted first in roll back otherwise the key 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can not be deleted. 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(ERROR_SUCCESS, 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key.Open(HKEY_CURRENT_USER, key_to_create.c_str(), KEY_READ)); 2247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(top_dir_to_create)); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WorkItemListTest, ConditionalExecutionConditionFailure) { 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkItemList> work_item_list(WorkItem::CreateWorkItemList()); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkItem> work_item; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath top_dir_to_create(temp_dir_.path()); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_dir_to_create = top_dir_to_create.AppendASCII("a"); 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath dir_to_create(top_dir_to_create); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dir_to_create = dir_to_create.AppendASCII("b"); 2357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_FALSE(base::PathExists(dir_to_create)); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_item.reset(reinterpret_cast<WorkItem*>( 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WorkItem::CreateCreateDirWorkItem(dir_to_create))); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_item_list->AddWorkItem(work_item.release()); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WorkItemList> conditional_work_item_list( 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WorkItem::CreateConditionalWorkItemList( 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ConditionRunIfFileExists(dir_to_create.AppendASCII("c")))); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring key_to_create(kTestRoot); 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key_to_create.push_back(base::FilePath::kSeparators[0]); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_to_create.append(L"ExecutionSuccess"); 248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) work_item.reset( 249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) reinterpret_cast<WorkItem*>(WorkItem::CreateCreateRegKeyWorkItem( 250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) HKEY_CURRENT_USER, key_to_create, WorkItem::kWow64Default))); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) conditional_work_item_list->AddWorkItem(work_item.release()); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring name(kName); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring data(kDataStr); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_item.reset(reinterpret_cast<WorkItem*>( 256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) WorkItem::CreateSetRegValueWorkItem(HKEY_CURRENT_USER, 257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) key_to_create, 258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) WorkItem::kWow64Default, 259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) name, 260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) data, 261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) false))); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) conditional_work_item_list->AddWorkItem(work_item.release()); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_item_list->AddWorkItem(conditional_work_item_list.release()); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(work_item_list->Do()); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the WorkItems added as part of the conditional list have NOT 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // been executed. 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegKey key; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(ERROR_SUCCESS, 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key.Open(HKEY_CURRENT_USER, key_to_create.c_str(), KEY_READ)); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring read_out; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(ERROR_SUCCESS, key.ReadValue(name.c_str(), &read_out)); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key.Close(); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the other work item was executed. 2787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(base::PathExists(dir_to_create)); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_item_list->Rollback(); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify everything is rolled back. 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The value must have been deleted first in roll back otherwise the key 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can not be deleted. 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(ERROR_SUCCESS, 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key.Open(HKEY_CURRENT_USER, key_to_create.c_str(), KEY_READ)); 2877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(top_dir_to_create)); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 289