registry_test_data.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/installer/util/registry_test_data.h"
6
7#include "base/logging.h"
8#include "base/win/registry.h"
9#include "testing/gtest/include/gtest/gtest.h"
10
11using base::win::RegKey;
12
13RegistryTestData::RegistryTestData()
14    : root_key_(NULL) {
15}
16
17RegistryTestData::~RegistryTestData() {
18  Reset();
19}
20
21// static
22bool RegistryTestData::DeleteKey(HKEY root_key, const wchar_t* path) {
23  LONG result = ERROR_SUCCESS;
24  if (root_key != NULL && path != NULL && *path != L'\0') {
25    result = RegKey(root_key, L"", KEY_QUERY_VALUE).DeleteKey(path);
26    if (result == ERROR_FILE_NOT_FOUND) {
27      result = ERROR_SUCCESS;
28    } else {
29      DLOG_IF(DFATAL, result != ERROR_SUCCESS)
30          << "Failed to delete registry key " << path << ", result: " << result;
31    }
32  }
33  return result == ERROR_SUCCESS;
34}
35
36void RegistryTestData::Reset() {
37  // Clean up behind a previous use (ignore failures).
38  DeleteKey(root_key_, base_path_.c_str());
39
40  // Forget state.
41  root_key_ = NULL;
42  base_path_.clear();
43  empty_key_path_.clear();
44  non_empty_key_path_.clear();
45}
46
47bool RegistryTestData::Initialize(HKEY root_key, const wchar_t* base_path) {
48  LONG result = ERROR_SUCCESS;
49
50  Reset();
51
52  // Take over the new registry location.
53  if (DeleteKey(root_key, base_path)) {
54    // Take on the new values.
55    root_key_ = root_key;
56    base_path_.assign(base_path);
57
58    // Create our data.
59    empty_key_path_.assign(base_path_).append(L"\\EmptyKey");
60    non_empty_key_path_.assign(base_path_).append(L"\\NonEmptyKey");
61
62    RegKey key;
63
64    result = key.Create(root_key_, empty_key_path_.c_str(), KEY_QUERY_VALUE);
65    if (result == ERROR_SUCCESS)
66      result = key.Create(root_key_, non_empty_key_path_.c_str(), KEY_WRITE);
67    if (result == ERROR_SUCCESS)
68      result = key.WriteValue(NULL, non_empty_key_path_.c_str());
69    if (result == ERROR_SUCCESS)
70      result = key.CreateKey(L"SubKey", KEY_WRITE);
71    if (result == ERROR_SUCCESS)
72      result = key.WriteValue(L"SomeValue", 1UL);
73    DLOG_IF(DFATAL, result != ERROR_SUCCESS)
74        << "Failed to create test registry data based at " << base_path_
75        << ", result: " << result;
76  } else {
77    result = ERROR_INVALID_PARAMETER;
78  }
79
80  return result == ERROR_SUCCESS;
81}
82
83void RegistryTestData::ExpectMatchesNonEmptyKey(HKEY root_key,
84                                                const wchar_t* path) {
85  RegKey key;
86
87  EXPECT_EQ(ERROR_SUCCESS, key.Open(root_key, path, KEY_READ));
88  std::wstring str_value;
89  EXPECT_EQ(ERROR_SUCCESS, key.ReadValue(NULL, &str_value));
90  EXPECT_EQ(non_empty_key_path_, str_value);
91  EXPECT_EQ(ERROR_SUCCESS, key.OpenKey(L"Subkey", KEY_READ));
92  DWORD dw_value = 0;
93  EXPECT_EQ(ERROR_SUCCESS, key.ReadValueDW(L"SomeValue", &dw_value));
94  EXPECT_EQ(1UL, dw_value);
95}
96
97// static
98void RegistryTestData::ExpectEmptyKey(HKEY root_key, const wchar_t* path) {
99  DWORD num_subkeys = 0;
100  DWORD num_values = 0;
101  RegKey key;
102  EXPECT_EQ(ERROR_SUCCESS, key.Open(root_key, path, KEY_READ));
103  EXPECT_EQ(ERROR_SUCCESS,
104            RegQueryInfoKey(key.Handle(), NULL, NULL, NULL, &num_subkeys,
105                            NULL, NULL, &num_values, NULL, NULL, NULL, NULL));
106  EXPECT_EQ(0UL, num_subkeys);
107  EXPECT_EQ(0UL, num_values);
108}
109