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