Home | History | Annotate | Download | only in util
      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 <windows.h>
      6 
      7 #include "base/logging.h"
      8 #include "base/memory/scoped_ptr.h"
      9 #include "base/win/registry.h"
     10 #include "chrome/installer/util/registry_key_backup.h"
     11 #include "chrome/installer/util/registry_test_data.h"
     12 #include "chrome/installer/util/work_item.h"
     13 #include "testing/gtest/include/gtest/gtest.h"
     14 
     15 using base::win::RegKey;
     16 
     17 class RegistryKeyBackupTest : public testing::Test {
     18  protected:
     19   static void TearDownTestCase() {
     20     logging::CloseLogFile();
     21   }
     22 
     23   virtual void SetUp() {
     24     ASSERT_TRUE(test_data_.Initialize(HKEY_CURRENT_USER, L"SOFTWARE\\TmpTmp"));
     25     destination_path_.assign(test_data_.base_path()).append(L"\\Destination");
     26   }
     27 
     28   RegistryTestData test_data_;
     29   std::wstring destination_path_;
     30 };
     31 
     32 // Test that writing an uninitialized backup does nothing.
     33 TEST_F(RegistryKeyBackupTest, Uninitialized) {
     34   RegistryKeyBackup backup;
     35 
     36   EXPECT_TRUE(backup.WriteTo(test_data_.root_key(), destination_path_.c_str()));
     37   EXPECT_FALSE(RegKey(test_data_.root_key(), destination_path_.c_str(),
     38                       KEY_READ).Valid());
     39 }
     40 
     41 // Test that initializing a backup with a non-existent key works, and that
     42 // writing it back out does nothing.
     43 TEST_F(RegistryKeyBackupTest, MissingKey) {
     44   std::wstring non_existent_key_path(test_data_.base_path() + L"\\NoKeyHere");
     45   RegistryKeyBackup backup;
     46 
     47   EXPECT_TRUE(backup.Initialize(test_data_.root_key(),
     48                                 non_existent_key_path.c_str()));
     49   EXPECT_TRUE(backup.WriteTo(test_data_.root_key(), destination_path_.c_str()));
     50   EXPECT_FALSE(RegKey(test_data_.root_key(), destination_path_.c_str(),
     51                       KEY_READ).Valid());
     52 }
     53 
     54 // Test that reading some data then writing it out does the right thing.
     55 TEST_F(RegistryKeyBackupTest, ReadWrite) {
     56   RegistryKeyBackup backup;
     57 
     58   EXPECT_TRUE(backup.Initialize(test_data_.root_key(),
     59                                 test_data_.non_empty_key_path().c_str()));
     60   EXPECT_TRUE(backup.WriteTo(test_data_.root_key(), destination_path_.c_str()));
     61   test_data_.ExpectMatchesNonEmptyKey(test_data_.root_key(),
     62                                       destination_path_.c_str());
     63 }
     64 
     65 // Test that reading some data, swapping, then writing it out does the right
     66 // thing.
     67 TEST_F(RegistryKeyBackupTest, Swap) {
     68   RegistryKeyBackup backup;
     69   RegistryKeyBackup other_backup;
     70 
     71   EXPECT_TRUE(backup.Initialize(test_data_.root_key(),
     72                                 test_data_.non_empty_key_path().c_str()));
     73   backup.swap(other_backup);
     74   EXPECT_TRUE(other_backup.WriteTo(test_data_.root_key(),
     75                                    destination_path_.c_str()));
     76 
     77   // Now make sure the one we started with is truly empty.
     78   EXPECT_EQ(ERROR_SUCCESS,
     79             RegKey(test_data_.root_key(), L"", KEY_QUERY_VALUE)
     80                 .DeleteKey(destination_path_.c_str()));
     81   EXPECT_TRUE(backup.WriteTo(test_data_.root_key(),
     82                              destination_path_.c_str()));
     83   EXPECT_FALSE(RegKey(test_data_.root_key(), destination_path_.c_str(),
     84                       KEY_READ).Valid());
     85 }
     86