Home | History | Annotate | Download | only in test
      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 #ifndef BASE_TEST_TEST_REG_UTIL_H_
      6 #define BASE_TEST_TEST_REG_UTIL_H_
      7 
      8 // Registry utility functions used only by tests.
      9 
     10 #include "base/basictypes.h"
     11 #include "base/memory/scoped_vector.h"
     12 #include "base/strings/string16.h"
     13 #include "base/time/time.h"
     14 #include "base/win/registry.h"
     15 
     16 namespace registry_util {
     17 
     18 // Allows a test to easily override registry hives so that it can start from a
     19 // known good state, or make sure to not leave any side effects once the test
     20 // completes. This supports parallel tests. All the overrides are scoped to the
     21 // lifetime of the override manager. Destroy the manager to undo the overrides.
     22 //
     23 // Overridden hives use keys stored at, for instance:
     24 //   HKCU\Software\Chromium\TempTestKeys\
     25 //       13028145911617809$02AB211C-CF73-478D-8D91-618E11998AED
     26 // The key path are comprises of:
     27 //   - The test key root, HKCU\Software\Chromium\TempTestKeys\
     28 //   - The base::Time::ToInternalValue of the creation time. This is used to
     29 //     delete stale keys left over from crashed tests.
     30 //   - A GUID used for preventing name collisions (although unlikely) between
     31 //     two RegistryOverrideManagers created with the same timestamp.
     32 class RegistryOverrideManager {
     33  public:
     34   RegistryOverrideManager();
     35   ~RegistryOverrideManager();
     36 
     37   // Override the given registry hive using a temporary key named by temp_name
     38   // under the temporary test key path. There is no need to randomize
     39   // |override_name|, as a random parent key is generated. Multiple overrides to
     40   // the same hive are not supported and lead to undefined behavior.
     41   void OverrideRegistry(HKEY override, const base::string16& override_name);
     42 
     43  private:
     44   friend class RegistryOverrideManagerTest;
     45 
     46   // Keeps track of one override.
     47   class ScopedRegistryKeyOverride {
     48    public:
     49     ScopedRegistryKeyOverride(HKEY override, const base::string16& key_path);
     50     ~ScopedRegistryKeyOverride();
     51 
     52    private:
     53     HKEY override_;
     54     base::win::RegKey temp_key_;
     55 
     56     DISALLOW_COPY_AND_ASSIGN(ScopedRegistryKeyOverride);
     57   };
     58 
     59   // Used for testing only.
     60   RegistryOverrideManager(const base::Time& timestamp,
     61                           const base::string16& test_key_root);
     62 
     63   base::Time timestamp_;
     64   base::string16 guid_;
     65 
     66   base::string16 test_key_root_;
     67   ScopedVector<ScopedRegistryKeyOverride> overrides_;
     68 
     69   DISALLOW_COPY_AND_ASSIGN(RegistryOverrideManager);
     70 };
     71 
     72 // Generates a temporary key path that will be eventually deleted
     73 // automatically if the process crashes.
     74 base::string16 GenerateTempKeyPath();
     75 
     76 }  // namespace registry_util
     77 
     78 #endif  // BASE_TEST_TEST_REG_UTIL_H_
     79