15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 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)
7a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "base/files/file_path.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_util.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/registry.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/create_reg_key_work_item.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/work_item.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::win::RegKey;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)wchar_t test_root[] = L"TmpTmp";
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CreateRegKeyWorkItemTest : public testing::Test {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create a temporary key for testing
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegKey key(HKEY_CURRENT_USER, L"", KEY_ALL_ACCESS);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    key.DeleteKey(test_root);
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NE(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, test_root, KEY_READ));
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(ERROR_SUCCESS, key.Create(HKEY_CURRENT_USER, test_root,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        KEY_READ));
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    logging::CloseLogFile();
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Clean up the temporary key
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegKey key(HKEY_CURRENT_USER, L"", KEY_ALL_ACCESS);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(ERROR_SUCCESS, key.DeleteKey(test_root));
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CreateRegKeyWorkItemTest, CreateKey) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegKey key;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath parent_key(test_root);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  parent_key = parent_key.AppendASCII("a");
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(ERROR_SUCCESS,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key.Create(HKEY_CURRENT_USER, parent_key.value().c_str(), KEY_READ));
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath top_key_to_create(parent_key);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  top_key_to_create = top_key_to_create.AppendASCII("b");
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath key_to_create(top_key_to_create);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  key_to_create = key_to_create.AppendASCII("c");
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  key_to_create = key_to_create.AppendASCII("d");
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<CreateRegKeyWorkItem> work_item(
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WorkItem::CreateCreateRegKeyWorkItem(HKEY_CURRENT_USER,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           key_to_create.value()));
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(work_item->Do());
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key.Open(HKEY_CURRENT_USER, key_to_create.value().c_str(), KEY_READ));
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  work_item->Rollback();
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Rollback should delete all the keys up to top_key_to_create.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(ERROR_SUCCESS,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key.Open(HKEY_CURRENT_USER, top_key_to_create.value().c_str(), KEY_READ));
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key.Open(HKEY_CURRENT_USER, parent_key.value().c_str(), KEY_READ));
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CreateRegKeyWorkItemTest, CreateExistingKey) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegKey key;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath key_to_create(test_root);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  key_to_create = key_to_create.AppendASCII("aa");
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(ERROR_SUCCESS,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key.Create(HKEY_CURRENT_USER, key_to_create.value().c_str(), KEY_READ));
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<CreateRegKeyWorkItem> work_item(
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WorkItem::CreateCreateRegKeyWorkItem(HKEY_CURRENT_USER,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           key_to_create.value()));
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(work_item->Do());
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key.Open(HKEY_CURRENT_USER, key_to_create.value().c_str(), KEY_READ));
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  work_item->Rollback();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Rollback should not remove the key since it exists before
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the CreateRegKeyWorkItem is called.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key.Open(HKEY_CURRENT_USER, key_to_create.value().c_str(), KEY_READ));
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CreateRegKeyWorkItemTest, CreateSharedKey) {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegKey key;
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath key_to_create_1(test_root);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  key_to_create_1 = key_to_create_1.AppendASCII("aaa");
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath key_to_create_2(key_to_create_1);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  key_to_create_2 = key_to_create_2.AppendASCII("bbb");
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath key_to_create_3(key_to_create_2);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  key_to_create_3 = key_to_create_3.AppendASCII("ccc");
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<CreateRegKeyWorkItem> work_item(
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WorkItem::CreateCreateRegKeyWorkItem(HKEY_CURRENT_USER,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           key_to_create_3.value()));
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(work_item->Do());
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key.Open(HKEY_CURRENT_USER, key_to_create_3.value().c_str(), KEY_READ));
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create another key under key_to_create_2
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath key_to_create_4(key_to_create_2);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  key_to_create_4 = key_to_create_4.AppendASCII("ddd");
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(ERROR_SUCCESS,
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key.Create(HKEY_CURRENT_USER, key_to_create_4.value().c_str(), KEY_READ));
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  work_item->Rollback();
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Rollback should delete key_to_create_3.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(ERROR_SUCCESS,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key.Open(HKEY_CURRENT_USER, key_to_create_3.value().c_str(), KEY_READ));
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Rollback should not delete key_to_create_2 as it is shared.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key.Open(HKEY_CURRENT_USER, key_to_create_2.value().c_str(), KEY_READ));
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key.Open(HKEY_CURRENT_USER, key_to_create_4.value().c_str(), KEY_READ));
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CreateRegKeyWorkItemTest, RollbackWithMissingKey) {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegKey key;
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath key_to_create_1(test_root);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  key_to_create_1 = key_to_create_1.AppendASCII("aaaa");
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath key_to_create_2(key_to_create_1);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  key_to_create_2 = key_to_create_2.AppendASCII("bbbb");
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath key_to_create_3(key_to_create_2);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  key_to_create_3 = key_to_create_3.AppendASCII("cccc");
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<CreateRegKeyWorkItem> work_item(
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WorkItem::CreateCreateRegKeyWorkItem(HKEY_CURRENT_USER,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           key_to_create_3.value()));
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(work_item->Do());
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key.Open(HKEY_CURRENT_USER, key_to_create_3.value().c_str(), KEY_READ));
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  key.Close();
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // now delete key_to_create_3
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(ERROR_SUCCESS,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RegDeleteKey(HKEY_CURRENT_USER, key_to_create_3.value().c_str()));
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(ERROR_SUCCESS,
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key.Open(HKEY_CURRENT_USER, key_to_create_3.value().c_str(), KEY_READ));
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  work_item->Rollback();
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // key_to_create_3 has already been deleted, Rollback should delete
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the rest.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(ERROR_SUCCESS,
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key.Open(HKEY_CURRENT_USER, key_to_create_1.value().c_str(), KEY_READ));
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CreateRegKeyWorkItemTest, RollbackWithSetValue) {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegKey key;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath key_to_create(test_root);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  key_to_create = key_to_create.AppendASCII("aaaaa");
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<CreateRegKeyWorkItem> work_item(
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WorkItem::CreateCreateRegKeyWorkItem(HKEY_CURRENT_USER,
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           key_to_create.value()));
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(work_item->Do());
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Write a value under the key we just created.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER,
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key_to_create.value().c_str(), KEY_READ | KEY_SET_VALUE));
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS, key.WriteValue(L"name", L"value"));
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  key.Close();
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  work_item->Rollback();
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Rollback should not remove the key.
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERROR_SUCCESS,
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key.Open(HKEY_CURRENT_USER, key_to_create.value().c_str(), KEY_READ));
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
197