// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/common/importer/importer_test_registry_overrider_win.h"

#include <windows.h>

#include <memory>
#include <string>

#include "base/environment.h"
#include "base/guid.h"
#include "base/strings/utf_string_conversions.h"
#include "base/win/registry.h"

namespace {

// The key to which a random subkey will be appended. This key itself will never
// be deleted.
const wchar_t kTestHKCUOverrideKeyPrefix[] = L"SOFTWARE\\Chromium Unit Tests\\";
const char kTestHKCUOverrideEnvironmentVariable[] =
    "IE_IMPORTER_TEST_OVERRIDE_HKCU";

// Reads the environment variable set by a previous call to
// SetTestRegistryOverride() into |key| if it exists and |key| is not NULL.
// Returns true if the variable was successfully read.
bool GetTestKeyFromEnvironment(base::string16* key) {
  std::unique_ptr<base::Environment> env(base::Environment::Create());
  std::string value;
  bool result = env->GetVar(kTestHKCUOverrideEnvironmentVariable, &value);
  if (result)
    *key = base::UTF8ToUTF16(value);
  return result;
}

}  // namespace

////////////////////////////////////////////////////////////////////////////////
// ImporterTestRegistryOverrider, public:

ImporterTestRegistryOverrider::ImporterTestRegistryOverrider()
    : temporary_key_(kTestHKCUOverrideKeyPrefix +
                     base::UTF8ToUTF16(base::GenerateGUID())) {
  DCHECK(!GetTestKeyFromEnvironment(NULL));

  std::unique_ptr<base::Environment> env(base::Environment::Create());
  bool success = env->SetVar(kTestHKCUOverrideEnvironmentVariable,
                             base::UTF16ToUTF8(temporary_key_));
  DCHECK(success);
}

ImporterTestRegistryOverrider::~ImporterTestRegistryOverrider() {
  base::win::RegKey reg_key(HKEY_CURRENT_USER, temporary_key_.c_str(),
                            KEY_ALL_ACCESS);
  DCHECK(reg_key.Valid());
  reg_key.DeleteKey(L"");

  std::unique_ptr<base::Environment> env(base::Environment::Create());
  bool success = env->UnSetVar(kTestHKCUOverrideEnvironmentVariable);
  DCHECK(success);
}

// static
base::string16 ImporterTestRegistryOverrider::GetTestRegistryOverride() {
  base::string16 key;
  if (!GetTestKeyFromEnvironment(&key))
    return base::string16();
  return key;
}
